/*!****************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[14].oneOf[10].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[14].oneOf[10].use[3]!./styles/globals.css ***!
  \****************************************************************************************************************************************************************************************************************************************************************/
/* styles.css — find.camp
 *
 * Responsive breakpoints — canonical set going forward:
 *   1100px  desktop → tablet (multi-col grids collapse to 2 / 1)
 *    760px  tablet  → mobile (drawers become bottom sheets,
 *                              admin low-priority columns hidden)
 *    480px  small phone (full-bleed cards, headlines tighten,
 *                        single-column grids)
 *
 * Older rules at 1180/980/720/420 still exist in this file and migrate
 * to the canonical set as their sections are touched. New rules should
 * use 1100 / 760 / 480 only.
 */

:root {
  color-scheme: light;
  /* Mobile-friendliness tokens — referenced by the @media blocks below
   * so every touch target / sheet shares the same baseline. */
  --tap-min: 44px;
  --sheet-radius: 16px;
  --mobile-pad: 16px;
  --bg: #faf6ee;
  --bg-alt: #f3ecdc;
  --ink: #1f2418;
  --ink-soft: #5a5e4d;
  --line: #e3dcc8;
  --primary: #2f5a3a;
  --primary-deep: #1f3f28;
  --accent: #e8693a;
  --accent-2: #e8a838;
  --map-bg: #e9ecdc;
  --map-land: #d4dcb8;
  --map-stroke: #9aa67a;
  --map-water: #8aaad0;
  /* Surface tokens — flip in dark mode. Use these for any "card"-like
     surface (nav, modals, cards, panels) instead of literal #fff. */
  --surface: #ffffff;
  --surface-2: var(--bg-alt);
  --surface-overlay: rgba(255,255,255,.97);
  --surface-overlay-strong: rgba(255,255,255,.92);
  --surface-overlay-soft: rgba(255,255,255,.7);
  /* Always-dark slab (footer, "Open map" CTA over light photo). */
  --surface-inverse: #1f2418;
  --on-inverse: #ffffff;
  /* Toggle "on" state — ink in light, accent-aware in dark. */
  --toggle-on-bg: var(--ink);
  --toggle-on-text: #ffffff;
  /* Modal scrim. */
  --scrim: rgba(20, 24, 16, 0.55);
  --radius: 14px;
  --radius-lg: 22px;
  --shadow-sm: 0 1px 2px rgba(20,30,15,.06), 0 4px 14px rgba(20,30,15,.05);
  --shadow-md: 0 4px 10px rgba(20,30,15,.08), 0 14px 30px rgba(20,30,15,.08);
  --display: 'Bricolage Grotesque', ui-serif, Georgia, serif;
  --sans: 'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif;
  --mono: 'JetBrains Mono', ui-monospace, monospace;
}

* { box-sizing: border-box; }
html, body, #root { height: 100%; }
/* Always reserve room for the vertical scrollbar so navigating between a
   short page (no scrollbar) and a tall one (scrollbar) doesn't shift the
   layout horizontally. On macOS where scrollbars overlay, this draws no
   visible track — it just stops the jump. */
html { scrollbar-gutter: stable; }
body {
  margin: 0;
  font-family: var(--sans);
  background: var(--bg);
  color: var(--ink);
  font-size: 15px;
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}
.home,
.dp,
.tp,
.mapview {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}
.home > .foot,
.dp > .foot,
.tp > .foot,
.mapview > .foot {
  margin-top: auto;
}
button { font-family: inherit; cursor: pointer; }
/* Anchors are never underlined. Site-wide rule — individual call-sites
   that need decoration should opt in explicitly. */
a { text-decoration: none; color: inherit; }
img { display: block; max-width: 100%; }

h1, h2, h3, h4 {
  font-family: var(--display);
  font-weight: 600;
  letter-spacing: -0.02em;
  margin: 0;
  color: var(--ink);
  text-wrap: balance;
}
h1 { font-size: clamp(48px, 7vw, 92px); line-height: 0.96; letter-spacing: -0.035em; }
h2 { font-size: clamp(28px, 3.4vw, 44px); line-height: 1.05; }
h3 { font-size: 18px; line-height: 1.25; }
h4 { font-size: 16px; line-height: 1.3; }
em { font-style: italic; font-family: 'Bricolage Grotesque', serif; color: var(--accent); }

.btn-primary, .btn-ghost {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 0; border-radius: 999px;
  font-weight: 600; font-size: 14px; padding: 10px 18px;
  display: inline-flex; align-items: center; gap: 6px;
  transition: transform .15s, background .15s, color .15s, border-color .15s;
}
.btn-primary { background: var(--primary); color: #fff; }
.btn-primary:hover { background: var(--primary-deep); }
.btn-primary.lg { padding: 14px 24px; font-size: 15px; border-radius: 999px; }
.btn-primary.sm { padding: 7px 12px; font-size: 13px; }
.btn-ghost { background: transparent; color: var(--ink); border: 1.5px solid transparent; }
.btn-ghost:hover { background: rgba(31,36,24,.06); }
.btn-ghost.sm { padding: 7px 12px; font-size: 13px; border: 1.5px solid var(--line); }
.btn-ghost.sm[data-on="true"] { color: var(--accent); border-color: var(--accent); background: var(--surface); }

/* ───────── Mobile touch targets ─────────
 * Lift compact buttons + icon-only triggers to >= 44 × 44 px on phones
 * without changing their desktop look. Inner padding rises with the
 * box so the icons stay centred. */
@media (max-width: 760px) {
  .btn-primary.sm,
  .btn-ghost.sm {
    min-height: var(--tap-min);
    padding: 10px 14px;
  }
  .modal-close,
  .nav-avatar {
    min-width: var(--tap-min);
    min-height: var(--tap-min);
  }
}

/* ───────── Auth card / form shell ─────────
 * Shared shell for the inline-form pages (sign-in, verify-request,
 * trips/new). Class-driven so the @media blocks below can flatten the
 * card on phones. Pages still render the headings + copy themselves
 * — only the shell + typography defaults live here. */
.auth-card {
  max-width: 440px;
  margin: 60px auto 80px;
  padding: 40px 32px;
  background: var(--bg-alt);
  border: 1px solid var(--line);
  border-radius: 16px;
}
.auth-card.center { text-align: center; }
.auth-card h1 {
  font-family: var(--display);
  font-size: 32px;
  font-weight: 600;
  letter-spacing: -0.02em;
  margin: 8px 0 12px;
}
.auth-card .auth-lead {
  color: var(--ink-soft);
  font-size: 14px;
  line-height: 1.55;
  margin: 0 0 24px;
}
.auth-card .auth-note {
  color: var(--ink-soft);
  font-size: 13px;
  line-height: 1.6;
  margin: 0;
}
.auth-card .auth-back {
  display: inline-block;
  margin-top: 24px;
  color: var(--ink-soft);
  font-size: 13px;
}
.auth-card .auth-icon-circle {
  display: inline-grid; place-items: center;
  width: 56px; height: 56px;
  border-radius: 50%;
  background: var(--surface);
  color: var(--primary);
  margin-bottom: 16px;
}
.auth-card label {
  display: block;
  font-size: 13px;
  font-weight: 600;
  color: var(--ink-soft);
  margin-bottom: 6px;
}
.auth-card input[type="email"],
.auth-card input[type="text"] {
  width: 100%;
  padding: 12px 14px;
  font-size: 15px;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: var(--bg);
  color: var(--ink);
  font-family: var(--sans);
  margin-bottom: 20px;
}

/* Form shell — wider page-level form container (e.g. trips/new). Same
 * mobile collapse story as .auth-card. */
.form-shell {
  max-width: 880px;
  margin: 40px auto 80px;
  padding: 0 32px;
}
.form-shell h1 {
  font-family: var(--display);
  font-size: 40px;
  font-weight: 600;
  letter-spacing: -0.02em;
  margin: 8px 0 12px;
}
.form-shell .form-lead {
  color: var(--ink-soft);
  font-size: 15px;
  line-height: 1.6;
  margin: 0 0 32px;
}

@media (max-width: 760px) {
  .auth-card {
    max-width: none;
    margin: 32px 16px 56px;
    padding: 28px 24px;
  }
  .auth-card h1 { font-size: 28px; }
  .form-shell { padding: 0 24px; margin-top: 32px; }
  .form-shell h1 { font-size: 32px; }
}
@media (max-width: 480px) {
  .auth-card {
    margin: 0;
    padding: 28px var(--mobile-pad) 36px;
    border-left: 0; border-right: 0;
    border-radius: 0;
    background: var(--bg);
  }
  .auth-card h1 { font-size: 26px; }
  .auth-card input[type="email"],
  .auth-card input[type="text"] {
    min-height: var(--tap-min);
  }
  .form-shell {
    padding: 0 var(--mobile-pad);
    margin: 24px 0 56px;
  }
  .form-shell h1 { font-size: 28px; }
}

.section-eyebrow {
  display: inline-flex; align-items: center; gap: 10px;
  font-size: 13px; font-weight: 600; color: var(--ink-soft);
  text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 14px;
}
.section-eyebrow .dash { width: 28px; height: 2px; background: var(--accent); border-radius: 2px; }

/* ───────── HERO ───────── */
.hero {
  position: relative; min-height: 760px; padding: 0 0 80px;
  overflow: hidden;
}
.hero-bg { position: absolute; inset: 0; z-index: 0; }
.hero-bg img { width: 100%; height: 100%; object-fit: cover; }
.hero-bg-tint {
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(31,63,40,.55) 0%, rgba(31,63,40,.35) 30%, var(--bg) 95%),
              linear-gradient(90deg, rgba(31,63,40,.4), rgba(31,63,40,.1));
}
.topo-overlay {
  position: absolute; inset: 0; pointer-events: none; opacity: 0.18; z-index: 1;
  background-image:
    repeating-radial-gradient(ellipse at 30% 60%, transparent 0 60px, rgba(255,255,255,.4) 60px 61px),
    repeating-radial-gradient(ellipse at 70% 30%, transparent 0 80px, rgba(255,255,255,.4) 80px 81px);
  mix-blend-mode: overlay;
}

.nav {
  position: relative; z-index: 5;
  display: grid; grid-template-columns: 1fr auto 1fr; align-items: center;
  padding: 18px 56px;
  color: var(--ink);
  background: var(--surface);
  border-bottom: 1px solid var(--line);
}
.nav-brand { display: flex; align-items: center; gap: 10px; justify-self: start; }
.brand-mark {
  width: 34px; height: 34px; border-radius: 10px;
  background: var(--accent); color: #fff;
  display: grid; place-items: center;
  box-shadow: inset 0 0 0 2px rgba(255,255,255,.25);
}
.brand-mark.sm { width: 26px; height: 26px; border-radius: 8px; }
.brand-name { font-family: var(--display); font-weight: 700; font-size: 22px; letter-spacing: -0.02em; color: var(--ink); }
.brand-name.sm { font-size: 16px; }
.brand-dot { color: var(--accent); }
.nav-links { display: flex; gap: 30px; justify-self: center; }
.nav-links a {
  color: var(--ink-soft); font-weight: 500; font-size: 14px;
  cursor: pointer; text-decoration: none;
}
.nav-links a:hover { color: var(--ink); }
.nav-links a.active { color: var(--ink); font-weight: 600; }
.nav-actions { display: flex; gap: 10px; align-items: center; justify-self: end; }
.nav-actions .btn-ghost { color: var(--ink); }
.nav-actions .btn-ghost:hover { background: var(--bg-alt); }
.nav-account { position: relative; }
.nav-account summary {
  list-style: none;
  display: inline-flex; align-items: center; justify-content: center;
  width: 38px; height: 38px; border: 1px solid var(--line);
  border-radius: 999px; background: rgba(255,255,255,.82);
  cursor: pointer;
}
.nav-account summary::-webkit-details-marker { display: none; }
.admin-edit-diff > summary::-webkit-details-marker { display: none; }
.admin-edit-diff > summary { list-style: none; }
.admin-edit-diff[open] > summary .admin-edit-diff-caret { transform: rotate(90deg); }
.nav-account summary:hover { background: var(--bg-alt); }
.nav-avatar {
  display: inline-grid; place-items: center;
  width: 26px; height: 26px; border-radius: 999px;
  background: var(--primary); color: #fff;
  font: 700 12px/1 var(--sans);
}
.nav-account-panel {
  position: absolute; top: calc(100% + 10px); right: 0;
  width: 250px; padding: 10px;
  background: var(--surface); color: var(--ink);
  border: 1px solid var(--line); border-radius: 8px;
  box-shadow: var(--shadow-md);
}
.nav-settings-panel { width: 190px; }
.nav-account-panel::before {
  content: ""; position: absolute; top: -6px; right: 16px;
  width: 10px; height: 10px; transform: rotate(45deg);
  background: var(--surface); border-left: 1px solid var(--line); border-top: 1px solid var(--line);
}
.nav-account-head {
  display: grid; grid-template-columns: auto 1fr; grid-gap: 10px; gap: 10px; align-items: center;
  padding: 6px 6px 10px; border-bottom: 1px solid var(--line); margin-bottom: 8px;
}
.nav-account-head b,
.nav-account-head span { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nav-account-head b { font-size: 13px; }
.nav-account-head span { font-size: 12px; color: var(--ink-soft); }
.nav-menu-row {
  padding: 6px;
  display: flex; justify-content: stretch;
}
.nav-menu-row label,
.nav-menu-row select { width: 100%; }
.nav-menu-action {
  width: 100%; -webkit-appearance: none; -moz-appearance: none; appearance: none; border: 0; background: transparent;
  display: flex; align-items: center; padding: 9px 10px;
  color: var(--ink); border-radius: 5px;
  font: 600 13px/1.2 var(--sans); text-align: left;
}
.nav-menu-action:hover { background: var(--bg-alt); }

.hero-inner {
  position: relative; z-index: 4;
  max-width: 1080px; margin: 0 auto; padding: 80px 56px 0;
  color: #fff;
  text-align: center;
}
.hero-eyebrow {
  display: inline-flex; align-items: center; gap: 8px;
  background: rgba(255,255,255,.15); -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
  border: 1px solid rgba(255,255,255,.25);
  border-radius: 999px; padding: 6px 14px;
  font-size: 13px; font-weight: 500; letter-spacing: 0.02em;
  margin-bottom: 24px;
}
.hero-eyebrow .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--accent-2); box-shadow: 0 0 10px var(--accent-2); }
.hero-title { color: #fff; max-width: 880px; margin: 0 auto; }
.hero-title em { color: var(--accent-2); }
.hero-sub {
  max-width: 520px; margin: 22px auto 36px;
  font-size: 17px; color: rgba(255,255,255,.88); line-height: 1.55;
}

.search {
  display: flex; align-items: center;
  background: var(--surface); border-radius: 999px;
  padding: 8px 8px 8px 24px;
  max-width: 560px; margin: 0 auto;
  box-shadow: 0 8px 30px rgba(0,0,0,.18), 0 0 0 1px rgba(0,0,0,.04);
}
.search-icon { color: var(--ink-soft); display: grid; place-items: center; margin-right: 10px; }
.search input {
  flex: 1 1; border: 0; outline: 0; background: transparent;
  font: 500 16px/1 var(--sans); color: var(--ink);
  padding: 16px 8px;
}
.search input::placeholder { color: #a8a89a; }
.search-go {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 0; background: var(--accent); color: #fff;
  font-weight: 600; font-size: 14px; padding: 12px 20px; border-radius: 999px;
  display: inline-flex; align-items: center; gap: 6px;
}
.search-go:hover { background: #d05a2c; }

.suggest {
  display: flex; align-items: center; flex-wrap: wrap; justify-content: center;
  gap: 8px; margin-top: 20px;
}
.suggest-lbl { font-size: 13px; color: rgba(255,255,255,.85); font-weight: 500; }
.chip {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 1px solid rgba(255,255,255,.55); background: rgba(0,0,0,.3);
  color: #fff; font-size: 13px; font-weight: 600; padding: 7px 14px; border-radius: 999px;
  -webkit-backdrop-filter: blur(8px);
          backdrop-filter: blur(8px);
  text-shadow: 0 1px 2px rgba(0,0,0,.3);
}
.chip:hover { background: rgba(255,255,255,.95); color: var(--ink); border-color: #fff; text-shadow: none; }

.hero-stamps { position: absolute; inset: 0; pointer-events: none; z-index: 2; }
.stamp {
  position: absolute; color: rgba(255,255,255,.35);
  width: 180px; height: 54px;
}

/* ───────── SECTIONS ───────── */
.section {
  max-width: 1280px; margin: 0 auto; padding: 88px 56px;
}
.section-alt { background: var(--bg-alt); max-width: none; padding-left: 0; padding-right: 0; }
.section-alt > * { max-width: 1280px; margin-left: auto; margin-right: auto; padding-left: 56px; padding-right: 56px; }

.section-head {
  display: flex; align-items: end; justify-content: space-between; gap: 24px;
  margin-bottom: 36px;
}

/* Featured spots grid */
.featured-grid {
  display: grid; grid-template-columns: repeat(3, 1fr); grid-gap: 24px; gap: 24px;
}

.spot-card {
  background: var(--surface); border-radius: var(--radius-lg);
  overflow: hidden; box-shadow: var(--shadow-sm);
  transition: transform .25s, box-shadow .25s;
  cursor: pointer; display: flex; flex-direction: column;
}
.spot-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.spot-img { position: relative; aspect-ratio: 4/3; overflow: hidden; }
.spot-img img { width: 100%; height: 100%; object-fit: cover; transition: transform .4s; }
.spot-card:hover .spot-img img { transform: scale(1.04); }
.spot-heart {
  position: absolute; top: 12px; right: 12px;
  width: 34px; height: 34px; border-radius: 50%;
  background: rgba(255,255,255,.92); border: 0;
  display: grid; place-items: center; color: var(--ink);
  -webkit-backdrop-filter: blur(6px);
          backdrop-filter: blur(6px);
}
.spot-heart:hover { color: var(--accent); }
.spot-type-badge {
  position: absolute; top: 12px; left: 12px;
  display: inline-flex; align-items: center; gap: 6px;
  color: #fff; font-size: 12px; font-weight: 600;
  padding: 6px 10px; border-radius: 999px;
  letter-spacing: 0.01em;
}
.spot-meta { padding: 18px 20px 20px; flex: 1 1; display: flex; flex-direction: column; gap: 4px; }
.spot-row { display: flex; justify-content: space-between; align-items: start; gap: 10px; }
.spot-row h3 { font-size: 18px; }
.spot-rating { display: inline-flex; align-items: center; gap: 4px; font-size: 14px; font-weight: 600; }
.spot-region { font-size: 13px; color: var(--ink-soft); }
.spot-foot { display: flex; align-items: center; gap: 8px; margin-top: 10px; font-size: 13px; color: var(--ink-soft); font-weight: 500; }
.spot-foot span:first-child { color: var(--ink); font-weight: 600; }
.spot-dot { color: var(--line); }

/* Collections */
.coll-grid { display: grid; grid-template-columns: 2fr 1fr 1fr 2fr; grid-auto-rows: 280px; grid-gap: 18px; gap: 18px; }
.coll-grid > :nth-child(1) { grid-column: span 2; }
.coll-grid > :nth-child(4) { grid-column: span 2; }
.coll-card {
  position: relative; border-radius: var(--radius-lg); overflow: hidden;
  cursor: pointer; transition: transform .25s;
}
.coll-card:hover { transform: translateY(-3px); }
.coll-img { position: relative; height: 100%; }
.coll-img img { width: 100%; height: 100%; object-fit: cover; }
.coll-tint { position: absolute; inset: 0; background: linear-gradient(180deg, rgba(0,0,0,0) 30%, rgba(0,0,0,.7) 100%); }
.coll-tag {
  position: absolute; top: 14px; left: 14px;
  background: var(--surface); color: var(--ink); font-size: 11px; font-weight: 700;
  padding: 5px 10px; border-radius: 999px; text-transform: uppercase; letter-spacing: 0.06em;
}
.coll-text { position: absolute; bottom: 18px; left: 18px; right: 18px; color: #fff; }
.coll-text h3 { color: #fff; font-size: 22px; }
.coll-text p { font-size: 13px; color: rgba(255,255,255,.85); margin: 4px 0 0; }

/* Recent */
.recent-wrap { display: grid; grid-template-columns: 320px 1fr; grid-gap: 56px; gap: 56px; align-items: start; }
.recent-side { position: -webkit-sticky; position: sticky; top: 30px; }
.recent-side p { color: var(--ink-soft); margin: 14px 0 22px; font-size: 15px; }
.recent-list { display: flex; flex-direction: column; gap: 14px; }
.recent-row {
  display: grid; grid-template-columns: 88px 1fr auto; grid-gap: 18px; gap: 18px; align-items: center;
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 14px; transition: border-color .15s, box-shadow .15s;
}
.recent-row:hover { border-color: var(--ink); box-shadow: var(--shadow-sm); }
.recent-thumb { width: 88px; height: 88px; object-fit: cover; border-radius: 10px; }
.recent-mid h4 { margin-top: 4px; font-size: 17px; }
.recent-mid p { margin: 4px 0 0; font-size: 13px; color: var(--ink-soft); line-height: 1.5;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.recent-top { display: flex; align-items: center; gap: 10px; font-size: 12px; color: var(--ink-soft); }
.recent-pill {
  display: inline-flex; align-items: center; gap: 4px;
  font-weight: 600; font-size: 11px; padding: 3px 8px; border-radius: 999px;
}
.recent-by b { color: var(--ink); }
.recent-arrow {
  width: 36px; height: 36px; border-radius: 50%;
  background: var(--bg-alt); border: 0; display: grid; place-items: center;
  color: var(--ink); transition: background .15s, transform .15s;
}
.recent-arrow:hover { background: var(--primary); color: #fff; transform: translateX(3px); }

/* Map preview */
.map-preview {
  max-width: 1280px; margin: 0 auto; padding: 88px 56px;
  display: grid; grid-template-columns: 5fr 6fr; grid-gap: 56px; gap: 56px; align-items: center;
}
.map-preview-text p { color: var(--ink-soft); font-size: 16px; margin: 16px 0 28px; max-width: 420px; }
.map-stats { display: flex; gap: 32px; margin-top: 36px; padding-top: 28px; border-top: 1px solid var(--line); }
.map-stats > div { display: flex; flex-direction: column; }
.map-stats b { font-family: var(--display); font-size: 32px; font-weight: 600; letter-spacing: -0.02em; }
.map-stats span { font-size: 13px; color: var(--ink-soft); }
.map-preview-img {
  position: relative; aspect-ratio: 5/4; border-radius: var(--radius-lg); overflow: hidden;
  cursor: pointer; box-shadow: var(--shadow-md);
  border: 1px solid var(--line);
}
.minimap { position: relative; width: 100%; height: 100%; }
.minimap-svg { width: 100%; height: 100%; display: block; }
.minimap-pin { position: absolute; transform: translate(-50%, -100%); }
.minimap-route { position: absolute; inset: 0; pointer-events: none; }
.minimap-route svg { width: 100%; height: 100%; }
.map-open-cta {
  position: absolute; bottom: 18px; right: 18px;
  background: var(--surface-inverse); color: var(--on-inverse);
  padding: 10px 16px; border-radius: 999px; font-size: 13px; font-weight: 600;
  display: inline-flex; align-items: center; gap: 6px;
}

/* Footer */
.foot { background: var(--surface-inverse); color: rgba(255,255,255,.75); padding: 64px 56px 32px; }
.foot-top { display: flex; justify-content: space-between; align-items: end; max-width: 1280px; margin: 0 auto 40px; }
.foot-brand { display: flex; align-items: center; gap: 10px; color: #fff; }
.foot-top p { color: rgba(255,255,255,.65); max-width: 320px; text-align: right; }
.foot-cols { display: grid; grid-template-columns: repeat(4, 1fr); grid-gap: 40px; gap: 40px; max-width: 1280px; margin: 0 auto; padding-bottom: 40px; border-bottom: 1px solid rgba(255,255,255,.1); }
.foot-cols > div { display: flex; flex-direction: column; gap: 8px; }
.foot-cols b { color: #fff; margin-bottom: 8px; font-size: 14px; }
.foot-cols a { color: rgba(255,255,255,.65); font-size: 14px; cursor: pointer; }
.foot-cols a:hover { color: #fff; }
.foot-bot { max-width: 1280px; margin: 24px auto 0; font-size: 13px; color: rgba(255,255,255,.5); }
.foot-slim {
  padding: 14px 32px;
  flex-shrink: 0;
}
.foot-slim-inner {
  max-width: 1280px; margin: 0 auto;
  display: grid; grid-template-columns: auto auto 1fr;
  align-items: center; grid-gap: 24px; gap: 24px;
}
.foot-slim-brand {
  display: inline-flex; align-items: center; gap: 8px;
  color: #fff; font: 700 14px/1 var(--display);
}
.foot-slim-links {
  display: flex; gap: 16px;
}
.foot-slim-links a {
  color: rgba(255,255,255,.68);
  font: 600 12px/1 var(--sans);
  text-decoration: none;
}
.foot-slim-links a:hover { color: #fff; }
.foot-slim-copy {
  justify-self: end;
  color: rgba(255,255,255,.5);
  font-size: 12px;
}

/* ───────── MAP PAGE ───────── */
.mapview { height: 100vh; min-height: 100vh; overflow: hidden; position: relative; }
.mapview > .foot { display: none; }
.map-global-nav {
  background: var(--surface); border-bottom: 1px solid var(--line);
  color: var(--ink); padding: 14px 32px; flex-shrink: 0;
}
.map-global-nav .nav-links a { color: var(--ink-soft); }
.map-global-nav .nav-links a:hover { color: var(--ink); }
.map-global-nav .nav-links a.active { color: var(--ink); font-weight: 600; }
.map-global-nav .nav-actions .btn-ghost { color: var(--ink); }
.map-global-nav .nav-actions .btn-ghost:hover { background: var(--bg-alt); }
.map-nav {
  position: relative;
  display: grid;
  grid-template-columns: minmax(180px, 1fr) minmax(280px, 420px) minmax(280px, 1fr);
  align-items: center; grid-gap: 12px; gap: 12px;
  min-height: 56px;
  padding: 8px 20px;
  background: var(--surface-overlay);
  border-bottom: 1px solid var(--line);
  z-index: 20;
  pointer-events: auto;
  flex-shrink: 0;
}
.map-app-brand {
  display: inline-flex; align-items: center; gap: 9px;
  color: var(--ink);
  justify-self: start;
}
.map-app-exit-icon {
  width: 28px; height: 28px; border-radius: 999px;
  display: inline-grid; place-items: center;
  color: var(--ink-soft);
  transform: rotate(180deg);
  transition: background .15s, color .15s;
}
.map-app-brand:hover .map-app-exit-icon {
  background: var(--bg-alt);
  color: var(--ink);
}
.map-app-brand .brand-mark { width: 32px; height: 32px; border-radius: 9px; }
.map-app-brand .brand-name { font-size: 20px; }
.map-app-signin {
  color: var(--ink);
  font: 700 13px/1 var(--sans);
  white-space: nowrap;
  justify-self: end;
}
.map-app-add {
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--primary); color: #fff;
  min-height: 38px; padding: 0 16px; border-radius: 5px;
  font: 700 13px/1 var(--sans);
  white-space: nowrap;
}
.nav-back {
  display: inline-flex; align-items: center; gap: 8px;
  background: transparent; border: 0; color: var(--ink); font-weight: 600;
  padding: 6px 10px; border-radius: 8px;
}
.nav-back:hover { background: var(--bg-alt); }
.nav-back-arrow { display: inline-grid; place-items: center; transform: rotate(180deg); }
/* Map nav search bar — matches the site's form-input language (white
 * surface, subtle --line border, slight ink darkening on focus) so it
 * reads as an active input field rather than a beige inset. The icon
 * is the submit affordance, so it gets the ink-soft tint by default
 * and the deeper ink on focus to match the input border. */
.map-search {
  width: 100%;
  display: flex; align-items: center; gap: 10px;
  background: var(--bg-alt); border: 1px solid transparent; border-radius: 10px;
  padding: 0 12px;
  transition: border-color .15s, box-shadow .15s, background .15s;
}
.map-search-slot {
  grid-column: 2;
  grid-row: 1;
  justify-self: center;
  width: min(420px, 100%);
}
.map-nav-actions {
  grid-column: 3;
  grid-row: 1;
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  min-width: 0;
}
.map-tool-actions,
.map-user-actions {
  display: inline-flex; align-items: center; gap: 10px;
  min-width: 0;
}
.map-user-actions { margin-left: auto; }
.map-filter-toggle {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 0; background: var(--bg-alt);
  min-height: 38px; padding: 0 12px; border-radius: 8px;
  display: inline-flex; align-items: center; gap: 7px;
  color: var(--ink); font: 600 13px/1 var(--sans);
  white-space: nowrap; cursor: pointer;
  transition: background .15s, color .15s, box-shadow .15s;
}
.map-filter-toggle:hover { background: var(--surface); }
.map-filter-toggle[data-open="true"] {
  background: var(--bg-alt);
}
.map-filter-toggle:focus { outline: 0; }
.map-filter-toggle:focus-visible {
  box-shadow: 0 0 0 3px rgba(47, 90, 58, 0.14);
}
.map-filter-toggle[data-active="true"] {
  color: var(--ink);
}
.map-filter-count {
  display: inline-grid; place-items: center;
  min-width: 16px; height: 16px; padding: 0 5px; border-radius: 999px;
  background: var(--primary); color: #fff;
  font: 700 10px/1 var(--sans);
}
.map-filter-toggle[data-active="true"] .map-filter-count {
  background: var(--primary);
  color: #fff;
}
.map-search:focus-within {
  border-color: var(--ink-soft);
  background: var(--surface);
  box-shadow: 0 0 0 3px rgba(47, 90, 58, 0.08);
}
.map-search-icon {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 0; background: transparent; padding: 0;
  display: grid; place-items: center; color: var(--ink-soft); cursor: pointer;
  transition: color .15s;
}
.map-search:focus-within .map-search-icon { color: var(--ink); }
.map-search-icon:disabled { cursor: progress; opacity: 0.7; }
.map-search input {
  flex: 1 1; border: 0; outline: 0; background: transparent;
  font: 500 14px/1 var(--sans); color: var(--ink);
  padding: 10px 0;
}
.map-search input::placeholder { color: #a8a89a; }
.map-view-toggle { display: flex; background: var(--bg-alt); border-radius: 10px; padding: 4px; }
.map-view-toggle button {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 0; background: transparent;
  font: 600 13px/1 var(--sans); color: var(--ink-soft);
  padding: 8px 14px; border-radius: 7px;
  display: inline-flex; align-items: center; gap: 6px;
}
.map-view-toggle button[data-on="true"] { background: var(--surface); color: var(--ink); box-shadow: 0 1px 3px rgba(0,0,0,.08); }

.fb-filters-btn {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 1px solid var(--line); background: var(--surface);
  font: 600 13px/1 var(--sans); padding: 8px 14px; border-radius: 999px;
  display: inline-flex; align-items: center; gap: 6px; color: var(--ink);
  white-space: nowrap; flex-shrink: 0;
}
.fb-filters-btn:hover { background: var(--bg-alt); }
.fb-filters-btn[data-on="true"] { background: var(--toggle-on-bg); color: var(--toggle-on-text); border-color: var(--toggle-on-bg); }
.fb-filters-btn .cnt {
  background: var(--accent); color: #fff; font-size: 11px; font-weight: 700;
  padding: 1px 6px; border-radius: 999px; min-width: 18px; text-align: center;
}

.map-results-pill {
  font-size: 13px; color: var(--ink-soft); font-weight: 500;
  white-space: nowrap; padding: 0 8px; flex-shrink: 0;
}

/* "Search this area" floating button — sits centered near the top of the
   map canvas, only visible when the user has panned/zoomed off the last
   fetched bbox. Pattern is borrowed from Google Maps / Yelp / Airbnb. */
.map-search-here {
  /* Match .btn-primary so the floating action reads as a primary affordance
     consistent with "Add a spot" in the nav. The drop-shadow stays — this
     button floats over the map and needs lift to separate from terrain. */
  position: absolute; top: 16px; left: 50%; transform: translateX(-50%);
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 0; border-radius: 999px;
  background: rgba(47, 90, 58, .94); color: #fff;
  font-weight: 600; font-size: 13px; font-family: var(--sans);
  padding: 9px 15px;
  display: inline-flex; align-items: center; gap: 6px;
  box-shadow: 0 8px 24px rgba(0,0,0,.16);
  cursor: pointer; z-index: 10;
  transition: transform .15s, background .15s;
  animation: mshFadeIn .18s ease-out;
}
.map-search-here:hover { background: var(--primary-deep); }
.map-search-here:disabled { opacity: 0.7; cursor: progress; }
@keyframes mshFadeIn {
  from { opacity: 0; transform: translate(-50%, -6px); }
  to   { opacity: 1; transform: translate(-50%, 0); }
}
.map-spinner {
  width: 12px; height: 12px;
  border: 2px solid rgba(255,255,255,.35);
  border-top-color: #fff;
  border-radius: 50%;
  animation: mshSpin .7s linear infinite;
}
@keyframes mshSpin { to { transform: rotate(360deg); } }

/* Modal backdrop fade — shared by Modal.tsx (AddPhoto / EditSpot /
   ReportProblem placeholders). Short duration so the modal feels
   responsive rather than animated. */
@keyframes modalFadeIn {
  from { opacity: 0; }
  to   { opacity: 1; }
}

/* "Showing N — zoom in for more" tag when the server capped the result. */
.map-cap-note {
  position: absolute; top: 16px; left: 50%; transform: translateX(-50%);
  background: var(--surface-overlay-strong); color: var(--ink-soft);
  font: 500 12px/1 var(--sans);
  padding: 7px 12px; border-radius: 4px;
  box-shadow: 0 2px 8px rgba(0,0,0,.08), 0 0 0 1px var(--line);
  z-index: 9;
  pointer-events: none;
}

.fb-route {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; background: var(--bg-alt); border: 0;
  font: 600 13px/1 var(--sans); padding: 10px; border-radius: 999px;
  display: inline-flex; align-items: center; gap: 6px; color: var(--ink);
  white-space: nowrap; flex-shrink: 0; cursor: pointer;
}
.fb-route span { display: none; }
.fb-route:hover { background: var(--surface); }
.fb-route[data-on="true"] { background: var(--accent); color: #fff; padding: 10px 12px; }
.fb-route[data-on="true"] span { display: inline; }

@media (max-width: 1180px) {
  .map-nav {
    grid-template-columns: auto minmax(220px, 1fr) auto;
  }
  .map-search-slot {
    grid-column: 2;
    width: min(420px, 100%);
  }
  .map-nav-actions { grid-column: 3; justify-content: flex-end; }
  .map-user-actions { display: none; }
}

@media (max-width: 760px) {
  .map-nav {
    grid-template-columns: auto 1fr auto;
    gap: 8px; padding: 8px 12px;
  }
  .map-app-brand .brand-name { display: none; }
  .map-search-slot { grid-column: 2; min-width: 0; width: 100%; }
  .fb-route { display: none; }
  .map-filter-toggle { min-height: 38px; padding: 0 10px; }
  .map-filter-toggle > span:not(.map-filter-count) { display: none; }

  /* Detail sheet — at 380px wide it overflows a 375px viewport. Convert
   * to a peek-style bottom sheet that shows just enough to identify the
   * spot (cover thumb, name, rating) and expands on tap to reveal
   * actions + the "View full" CTA. Amenities + "added by" never appear
   * here — they live on the full /spots/[slug] page two taps away. */
  .detail {
    top: auto;
    /* Peek default: floating card with 8 px gutters so it reads as the
     * same family as .route-panel (also floating with 8 px gutters).
     * Full 16 px radius on all four corners. The expanded state below
     * snaps it to the viewport bottom for a true bottom-sheet feel. */
    left: 8px; right: 8px; bottom: 8px;
    width: auto;
    height: auto;
    max-height: 70vh;
    border-radius: var(--sheet-radius);
    animation: detailSlideUp .24s cubic-bezier(.3,.7,.4,1);
    transition: max-height .22s cubic-bezier(.3,.7,.4,1),
                bottom .22s cubic-bezier(.3,.7,.4,1),
                left .22s cubic-bezier(.3,.7,.4,1),
                right .22s cubic-bezier(.3,.7,.4,1),
                border-radius .22s cubic-bezier(.3,.7,.4,1);
  }
  .detail[data-expanded] {
    left: 0; right: 0; bottom: 0;
    border-radius: var(--sheet-radius) var(--sheet-radius) 0 0;
  }
  /* Peek mode: list-card layout — full-height thumb on the left,
   * grab handle and info stacked on the right. The cover, type pill,
   * route button, amenities, "added by", and "View full" CTA are all
   * hidden; tapping the thumbnail or the grab handle expands the
   * sheet to reveal them. */
  .detail:not([data-expanded]) {
    display: grid;
    /* Image spans the full left column for both rows; the grab handle
     * and body share the right column. Image height ends up equal to
     * grab + body content height — i.e. the full card. */
    grid-template-areas:
      "img grab"
      "img body";
    grid-template-columns: 96px 1fr;
    grid-template-rows: 14px auto;
    max-height: none;
  }
  .detail:not([data-expanded]) .detail-grab {
    grid-area: grab;
    position: relative;
    top: auto; left: auto; right: auto;
    height: 14px;
    background: transparent;
  }
  .detail:not([data-expanded]) .detail-grab-bar {
    background: var(--ink-soft);
    opacity: 0.45;
    box-shadow: none;
  }
  .detail:not([data-expanded]) .detail-img {
    grid-area: img;
    width: 96px;
    height: 100%;
    aspect-ratio: auto;
    cursor: pointer;
  }
  /* Type pill on a 96 px thumb is too dense — drop it in peek. */
  .detail:not([data-expanded]) .detail-type { display: none; }
  .detail:not([data-expanded]) .detail-body {
    grid-area: body;
    padding: 6px 14px 8px 14px;
    display: flex; flex-direction: column;
    justify-content: center;
    gap: 4px;
  }
  .detail:not([data-expanded]) .detail-by,
  .detail:not([data-expanded]) .detail-region,
  .detail:not([data-expanded]) .detail-close,
  .detail:not([data-expanded]) .detail-body > a { display: none; }

  /* Amenities in peek: a flex row of icon glyphs (no labels, no
   * heading). Slots between the title row and the actions row via
   * CSS order so the JSX source order doesn't have to flip for the
   * expanded layout below. */
  .detail:not([data-expanded]) .detail-amen {
    display: block;
    order: 1;
    margin: 4px 0 0;
  }
  .detail:not([data-expanded]) .detail-price-row { order: 2; }
  .detail:not([data-expanded]) .detail-amen h4 { display: none; }
  .detail:not([data-expanded]) .detail-amen-grid {
    display: flex;
    flex-direction: row;
    gap: 8px;
    align-items: center;
    flex-wrap: nowrap;
    overflow: hidden;
  }
  .detail:not([data-expanded]) .detail-amen-item {
    background: transparent;
    padding: 0;
    color: var(--ink-soft);
    flex: 0 0 auto;
  }
  .detail:not([data-expanded]) .detail-amen-label { display: none; }
  .detail:not([data-expanded]) .detail-head h2 {
    font-size: 16px;
    line-height: 1.2;
    /* Truncate long names rather than wrapping them across the whole
     * peek body — keeps the card height predictable. */
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .detail:not([data-expanded]) .detail-head {
    /* The desktop @media (max-width: 760px) block down-page sets
     * align-items: stretch on .detail-head. In peek that stretches the
     * rating into a full-width slab. Pin children to their natural
     * width instead. */
    align-items: flex-start;
    gap: 2px;
  }
  .detail:not([data-expanded]) .detail-rating {
    font-size: 12.5px;
    padding-top: 0;
  }
  /* Surface Save + Route in peek, both pushed to the right edge of the
   * row. Price is hidden (the spot detail page is a tap away on the
   * card itself). */
  .detail:not([data-expanded]) .detail-price-row {
    display: flex;
    flex-direction: row;
    align-items: center;
    justify-content: flex-end;
    gap: 8px;
    margin: 2px 0 0;
    padding: 0;
    border: 0;
  }
  .detail:not([data-expanded]) .detail-price { display: none; }
  .detail:not([data-expanded]) .detail-actions {
    width: auto;
    flex-shrink: 0;
    gap: 6px;
  }
  .detail:not([data-expanded]) .detail-actions .btn-primary.sm,
  .detail:not([data-expanded]) .detail-actions .btn-ghost.sm {
    flex: 0 0 auto;
    min-height: 36px;
    /* Ditch the "saved/started route" labels on a 251 px-wide body —
     * the icons carry the meaning; "Save" / "Route" labels keep two
     * buttons readable side-by-side in peek without overflowing. */
    padding: 7px 10px;
    font-size: 12px;
  }
  .detail:not([data-expanded]) .detail-actions .btn-primary.sm { min-width: 0; }

  /* Expanded mode: actions + price + CTA appear, cover stays
   * banner-shaped so the content sits in the viewer's thumb zone. */
  .detail[data-expanded] .detail-img { aspect-ratio: 21/9; }
  .detail[data-expanded] .detail-body { padding: 14px 16px 16px; overflow: visible; }
  .detail[data-expanded] .detail-head h2 { font-size: 20px; }
  .detail[data-expanded] .detail-region { font-size: 12.5px; }
  .detail[data-expanded] .detail-amen,
  .detail[data-expanded] .detail-by { display: none; }
  .detail[data-expanded] .detail-price-row { margin: 12px 0; padding: 10px 0; }
  .detail[data-expanded] .detail-price { font-size: 18px; }
  .detail[data-expanded] .detail-actions .btn-primary.sm { min-width: 0; }

  .detail-close {
    width: var(--tap-min); height: var(--tap-min);
    /* Sit a bit lower in peek so it's vertically centered in the
     * 96 px-tall row rather than crashing into the grab handle. */
    top: 18px;
    right: 8px;
  }
  .detail[data-expanded] .detail-close {
    top: 12px; right: 12px;
  }

  /* Grab handle — wide invisible tap zone with a centred bar. Big
   * enough to drive the peek↔expand toggle reliably with a thumb. */
  .detail-grab {
    -webkit-appearance: none;
       -moz-appearance: none;
            appearance: none; border: 0; background: transparent;
    position: absolute; top: 0; left: 0; right: 0;
    height: 24px;
    z-index: 3;
    display: flex; align-items: center; justify-content: center;
    cursor: pointer;
    /* Sit on top of the cover; semi-transparent so the photo shows
     * through but the bar is still visible. */
    background: linear-gradient(180deg, rgba(0,0,0,.18), transparent);
  }
  .detail-grab-bar {
    width: 38px; height: 4px; border-radius: 999px;
    background: rgba(255,255,255,.85);
    box-shadow: 0 1px 3px rgba(0,0,0,.25);
  }

  /* Results list — at 360px wide it overlaps the map and clips content
   * below 375px. Make it a bottom-anchored sheet that takes the bottom
   * half of the viewport when toggled open. */
  .map-body.view-split .spotlist {
    position: absolute;
    top: auto; left: 0; right: 0; bottom: 0;
    width: 100%;
    max-width: none;
    max-height: 60vh;
    border-radius: var(--sheet-radius) var(--sheet-radius) 0 0;
  }
  .spotlist-close { width: var(--tap-min); height: var(--tap-min); }

  /* Map "search this area" / cap-note pills shouldn't push past the
   * filter toggle on a 375px viewport. */
  .map-search-here { font-size: 13px; padding: 9px 14px; }

  /* Floating filter panel: clamp width so it can't overflow. The panel
   * itself has its own internal layout, this just bounds it. */
  .floating-filter,
  .filterdrawer {
    max-width: 100vw;
  }
}

@keyframes detailSlideUp {
  from { transform: translateY(20px); opacity: 0; }
  to   { transform: translateY(0); opacity: 1; }
}

/* Filters drawer */
.filterdrawer {
  background: var(--surface); border-bottom: 1px solid var(--line);
  padding: 18px 32px 22px; flex-shrink: 0;
  animation: fdSlideIn .2s cubic-bezier(.3,.7,.4,1);
  max-height: 50vh; overflow-y: auto;
}
@keyframes fdSlideIn { from { opacity: 0; transform: translateY(-8px); } to { opacity: 1; transform: none; } }
.fd-head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; }
.fd-head h3 { font-size: 16px; font-family: var(--sans); font-weight: 600; }
.fd-head-actions { display: flex; align-items: center; gap: 8px; }
.fd-clear {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 0; background: transparent;
  font: 600 13px/1 var(--sans); color: var(--ink-soft); padding: 6px 10px; border-radius: 6px;
}
.fd-clear:hover { color: var(--accent); background: var(--bg-alt); }
.fd-x {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 0; background: var(--bg-alt); color: var(--ink);
  width: 30px; height: 30px; border-radius: 50%;
  display: grid; place-items: center;
}
.fd-x:hover { background: var(--line); }

.fd-body {
  display: grid; grid-template-columns: repeat(2, 1fr); grid-gap: 22px 40px; gap: 22px 40px;
  max-width: 980px;
}
.fd-group { display: flex; flex-direction: column; gap: 10px; }
.fd-group:first-child { grid-column: 1 / -1; }
.fd-group:last-child { grid-column: 1 / -1; }
.fd-lbl {
  display: flex; justify-content: space-between; align-items: baseline;
  font-size: 12px; text-transform: uppercase; letter-spacing: 0.06em;
  color: var(--ink-soft); font-weight: 600;
}
.fd-lbl b { color: var(--ink); font-weight: 600; font-size: 13px; letter-spacing: 0; text-transform: none; }
.fd-range-input { width: 100%; max-width: 320px; accent-color: var(--accent); }

.fb-types { display: flex; flex-wrap: wrap; gap: 6px; }
.fb-type {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; background: var(--surface); border: 1.5px solid;
  font: 600 12.5px/1 var(--sans);
  padding: 7px 12px; border-radius: 999px;
  display: inline-flex; align-items: center; gap: 5px; white-space: nowrap;
  transition: all .15s;
}
.fb-rating { display: flex; align-items: center; gap: 6px; }
.fb-rating button {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 1px solid var(--line); background: var(--surface);
  font: 600 12px/1 var(--sans); padding: 8px 14px; border-radius: 8px;
  color: var(--ink-soft);
}
.fb-rating button[data-on="true"] { background: var(--toggle-on-bg); color: var(--toggle-on-text); border-color: var(--toggle-on-bg); }

.fd-amen-grid { display: grid; grid-template-columns: repeat(5, 1fr); grid-gap: 6px; gap: 6px; }
.fd-amen {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 1px solid var(--line); background: var(--surface);
  font: 500 13px/1 var(--sans);
  padding: 10px 12px; border-radius: 8px;
  display: inline-flex; align-items: center; gap: 8px; color: var(--ink);
}
.fd-amen:hover { background: var(--bg-alt); }
.fd-amen[data-on="true"] { background: var(--primary); color: #fff; border-color: var(--primary); }

.map-body { display: flex; flex: 1 1; min-height: 0; }
.map-body.view-split .spotlist { width: 360px; }
.map-body.view-list .spotlist { width: 100%; }
.map-body.view-map .map-canvas-wrap { width: 100%; }

.spotlist {
  position: absolute; top: 16px; left: 16px; bottom: 16px; z-index: 28;
  background: var(--surface-overlay);
  border: 1px solid rgba(31,36,24,.1); border-radius: 10px;
  box-shadow: 0 18px 50px rgba(0,0,0,.18), 0 3px 10px rgba(0,0,0,.08);
  display: flex; flex-direction: column; overflow: hidden;
  max-width: calc(100% - 32px);
}
.spotlist-head {
  padding: 12px 14px; border-bottom: 1px solid var(--line);
  display: flex; justify-content: space-between; align-items: center;
}
.spotlist-head h3 { font-size: 15px; font-family: var(--sans); font-weight: 600; }
.spotlist-head span { font-size: 12px; color: var(--ink-soft); }
.spotlist-head-actions { display: inline-flex; align-items: center; gap: 8px; }
.spotlist-close {
  width: 30px; height: 30px; border: 0; border-radius: 50%;
  display: grid; place-items: center;
  background: var(--bg-alt); color: var(--ink-soft);
}
.spotlist-close:hover { background: var(--line); color: var(--ink); }
.spotlist-scroll {
  flex: 1 1; overflow-y: auto; padding: 8px;
}
.map-body.view-list .spotlist-scroll { display: grid; grid-template-columns: repeat(auto-fill, minmax(380px, 1fr)); grid-gap: 10px; gap: 10px; padding: 16px 24px; }

.map-results-toggle {
  position: absolute; top: 16px; left: 16px; z-index: 28;
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 1px solid var(--line);
  background: var(--surface); color: var(--ink);
  font: 600 13px/1 var(--sans);
  padding: 8px 14px; border-radius: 4px;
  display: inline-flex; align-items: center; gap: 6px;
  box-shadow: none;
}
.map-results-toggle:hover { background: var(--bg-alt); box-shadow: none; }

.sl-item {
  display: grid; grid-template-columns: 84px 1fr auto; grid-gap: 10px; gap: 10px;
  padding: 8px; border-radius: 8px; cursor: pointer;
  border: 2px solid transparent;
}
.sl-item:hover { background: var(--bg-alt); }
.sl-item.sel { border-color: var(--accent); background: #fff8f0; }
.sl-img { position: relative; width: 84px; height: 84px; border-radius: 7px; overflow: hidden; }
.sl-img img { width: 100%; height: 100%; object-fit: cover; }
.sl-type {
  position: absolute; top: 6px; left: 6px;
  width: 22px; height: 22px; border-radius: 6px;
  display: grid; place-items: center;
}
.sl-mid { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.sl-top { display: flex; justify-content: space-between; gap: 8px; }
.sl-top h4 { font-size: 14px; font-family: var(--sans); font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sl-rating { font-size: 12px; font-weight: 600; display: inline-flex; align-items: center; gap: 3px; flex-shrink: 0; }
.sl-region { font-size: 12px; color: var(--ink-soft); }
.sl-amen { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }
.sl-amen-pill { font-size: 10.5px; color: var(--ink-soft); background: var(--bg-alt); padding: 2px 6px; border-radius: 4px; }
.sl-foot { display: flex; gap: 6px; margin-top: 4px; font-size: 12px; color: var(--ink-soft); }
.sl-price { font-weight: 700; color: var(--ink); }
.sl-actions { display: flex; flex-direction: column; gap: 6px; align-items: end; }
.sl-icon {
  width: 28px; height: 28px; border-radius: 50%; border: 0;
  background: var(--bg-alt); color: var(--ink-soft);
  display: grid; place-items: center;
}
.sl-icon[data-on="true"] { background: var(--accent); color: #fff; }
.sl-route {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 1.5px solid var(--accent); background: var(--surface);
  color: var(--accent); font: 700 12px/1 var(--sans);
  width: 28px; height: 28px; border-radius: 50%;
}
.sl-route[data-on="true"] { background: var(--accent); color: #fff; }

/* Map canvas */
.map-canvas-wrap { flex: 1 1; position: relative; min-width: 0; min-height: 0; overflow: hidden; }
.mapcanvas {
  position: relative; width: 100%; height: 100%;
  cursor: -webkit-grab;
  cursor: grab; overflow: hidden; -webkit-user-select: none; -moz-user-select: none; user-select: none;
}
.mapcanvas:active { cursor: -webkit-grabbing; cursor: grabbing; }
.map-bg { position: absolute; inset: 0; }
.map-bg-svg { width: 100%; height: 100%; transform-origin: center; }
.map-pin-layer { position: absolute; inset: 0; transform-origin: center; }
.map-pin-btn {
  position: absolute; transform: translate(-50%, -100%);
  background: transparent; border: 0; padding: 0;
  opacity: .88;
  transition: transform .15s, opacity .15s;
}
.map-pin-btn:hover { transform: translate(-50%, -110%); opacity: 1; }
.map-pin-btn[data-selected="true"] { opacity: 1; }
.map-pin-tag {
  position: absolute; top: 100%; left: 50%; transform: translate(-50%, 4px);
  background: var(--surface); color: var(--ink);
  font-size: 12px; font-weight: 600; white-space: nowrap;
  padding: 5px 10px; border-radius: 8px;
  box-shadow: var(--shadow-md);
}
.map-pin-routenum {
  position: absolute; top: -6px; right: -6px;
  background: var(--accent); color: #fff;
  width: 22px; height: 22px; border-radius: 50%;
  display: grid; place-items: center;
  font: 700 12px/1 var(--sans);
  border: 2px solid #fff;
}
.map-cluster {
  position: absolute; transform: translate(-50%, -50%);
  background: var(--primary); color: #fff;
  border: 3px solid #fff;
  width: 48px; height: 48px; border-radius: 50%;
  font: 700 14px/1 var(--sans);
  display: grid; place-items: center;
  box-shadow: 0 4px 12px rgba(0,0,0,.25), 0 0 0 6px rgba(47,90,58,.18);
}
.map-route-svg { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }

.map-controls {
  position: absolute; top: 16px; right: 16px; z-index: 30;
  display: flex; flex-direction: column;
  background: var(--surface); border-radius: 10px; box-shadow: var(--shadow-md);
  overflow: hidden;
}
.map-controls button {
  width: 40px; height: 40px; border: 0; background: var(--surface);
  display: grid; place-items: center;
  border-bottom: 1px solid var(--line);
}
.map-controls button:hover { background: var(--bg-alt); }
.map-controls button:last-of-type { border-bottom: 0; }
.map-zoom-ind {
  font: 600 11px/1 var(--mono); padding: 6px; text-align: center;
  color: var(--ink-soft); border-top: 1px solid var(--line); background: var(--bg-alt);
}
.map-attrib {
  position: absolute; bottom: 8px; left: 12px; z-index: 5;
  font: 500 11px/1 var(--sans); color: var(--ink-soft);
  background: var(--surface-overlay-soft); padding: 4px 8px; border-radius: 6px;
}

/* Detail sheet */
.detail {
  position: absolute; top: 16px; left: 16px; bottom: 16px;
  width: 380px; z-index: 40;
  background: var(--surface); border-radius: var(--radius-lg);
  box-shadow: var(--shadow-md); overflow: hidden;
  display: flex; flex-direction: column;
  animation: slideIn .25s ease;
  /* Clicking the card body navigates to the spot detail page; the
   * grab handle, close X, save, and route buttons all stopPropagation
   * so they keep their own behaviour. */
  cursor: pointer;
}
@keyframes slideIn { from { transform: translateX(-12px); opacity: 0; } to { transform: none; opacity: 1; } }
.detail-close {
  position: absolute; top: 12px; right: 12px; z-index: 2;
  width: 32px; height: 32px; border-radius: 50%;
  border: 0; background: rgba(255,255,255,.95); color: var(--ink);
  display: grid; place-items: center;
}
/* Grab handle is a mobile-only affordance (the bottom-sheet variant of
 * the detail card). Hidden by default; the @media (max-width: 760px)
 * block above flips it on. */
.detail-grab { display: none; }
.detail-img { position: relative; aspect-ratio: 16/10; }
.detail-img img { width: 100%; height: 100%; object-fit: cover; }
.detail-type {
  position: absolute; top: 12px; left: 12px;
  display: inline-flex; align-items: center; gap: 6px;
  color: #fff; font: 600 12px/1 var(--sans);
  padding: 6px 10px; border-radius: 999px;
}
.detail-body { padding: 20px 22px; overflow-y: auto; flex: 1 1; }
.detail-head { display: flex; justify-content: space-between; align-items: start; gap: 12px; }
.detail-head h2 { font-size: 24px; }
.detail-region { font-size: 13px; color: var(--ink-soft); margin-top: 2px; }
.detail-rating { display: inline-flex; align-items: center; gap: 4px; font-size: 14px; color: var(--ink-soft); flex-shrink: 0; padding-top: 6px; }
.detail-rating b { color: var(--ink); }
.detail-price-row {
  display: flex; justify-content: space-between; align-items: center;
  margin: 16px 0; padding: 14px 0; border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
}
.detail-price { font-family: var(--display); font-size: 22px; font-weight: 600; }
.detail-actions { display: flex; gap: 8px; align-items: center; flex-shrink: 0; }
.detail-actions .btn-primary.sm,
.detail-actions .btn-ghost.sm {
  min-width: 78px;
  min-height: 38px;
  justify-content: center;
  white-space: nowrap;
}
.detail-actions .btn-primary.sm { min-width: 104px; }
.detail-desc { font-size: 14px; color: var(--ink-soft); line-height: 1.6; margin: 0 0 20px; }
.detail-amen h4 { font-size: 13px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-soft); margin-bottom: 10px; font-family: var(--sans); }
.detail-amen-grid { display: grid; grid-template-columns: 1fr 1fr; grid-gap: 8px; gap: 8px; }
.detail-amen-item {
  display: flex; align-items: center; gap: 8px;
  font-size: 13px; padding: 8px 10px; background: var(--bg-alt); border-radius: 8px;
  color: var(--ink);
}
.detail-by { font-size: 13px; color: var(--ink-soft); margin-top: 18px; padding-top: 16px; border-top: 1px solid var(--line); }
.detail-by b { color: var(--ink); }
/* When the amenities block is hidden (no amenities for this spot) the
   price-row's bottom border sits right next to the detail-by top border,
   making a doubled-up divider with empty space in between. Collapse to
   a single rule by dropping detail-by's top border in that case. */
.detail-price-row + .detail-by { border-top: 0; padding-top: 0; margin-top: 14px; }

.route-panel {
  position: absolute; bottom: 16px; right: 16px; z-index: 35;
  width: 340px;
  background: var(--surface);
  /* Match the spot detail card's larger corner + roomier padding so
   * the two floating cards read as the same family of surface. */
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-md);
  padding: 20px 22px;
  overflow: hidden;
}
.route-head { display: flex; justify-content: space-between; align-items: start; margin-bottom: 14px; gap: 12px; }
.route-head h4 {
  font-family: var(--display);
  font-size: 18px;
  font-weight: 600;
  letter-spacing: -0.01em;
  margin: 0;
}
.route-head span { font-size: 12px; color: var(--ink-soft); }
.route-mobile-toggle {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 0; background: transparent; padding: 0;
  min-width: 0; color: inherit; font: inherit; text-align: left;
  display: none; gap: 2px; cursor: default;
}
.route-head-copy { min-width: 0; }
.route-mobile-toggle svg { display: none; }
.route-title {
  font-family: var(--display);
  font-size: 18px; line-height: 1.25;
  font-weight: 600; letter-spacing: -0.01em;
  color: var(--ink);
}
.route-summary {
  font-size: 12px; color: var(--ink-soft);
}
.route-list { display: flex; flex-direction: column; gap: 6px; margin-bottom: 12px; max-height: 200px; overflow-y: auto; }
.route-empty {
  display: flex; align-items: flex-start; gap: 10px;
  padding: 12px; border: 1px dashed var(--line); border-radius: 8px;
  background: var(--bg-alt); color: var(--ink-soft);
  font: 500 12px/1.35 var(--sans);
}
.route-empty svg { flex-shrink: 0; color: var(--primary); }
.route-row {
  display: grid; grid-template-columns: 26px 1fr auto; grid-gap: 10px; gap: 10px; align-items: center;
  padding: 8px 10px; border-radius: 8px; background: var(--bg-alt);
  cursor: -webkit-grab;
  cursor: grab;
  -webkit-user-select: none;
     -moz-user-select: none;
          user-select: none;
  transition: opacity 0.12s ease;
}
.route-row:active { cursor: -webkit-grabbing; cursor: grabbing; }
/* Browsers paint the drag image themselves; we dim the in-place row so
   the user sees clearly what they picked up. */
.route-row[data-dragging] { opacity: 0.35; }
/* Drop-position indicator: drawn as an inset box-shadow so it doesn't
   add height to the row. Inserting a real DOM node here would shift
   sibling rows and make the cursor jitter between targets. */
.route-row[data-drop-pos="before"] { box-shadow: inset 0 3px 0 0 var(--accent); }
.route-row[data-drop-pos="after"]  { box-shadow: inset 0 -3px 0 0 var(--accent); }
.route-num {
  background: var(--accent); color: #fff; font: 700 12px/1 var(--sans);
  width: 22px; height: 22px; border-radius: 50%;
  display: grid; place-items: center;
}
.route-info { display: flex; flex-direction: column; min-width: 0; }
.route-info b { font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.route-info span { font-size: 11px; color: var(--ink-soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.route-x {
  width: 22px; height: 22px; border-radius: 50%; border: 0;
  background: transparent; color: var(--ink-soft);
  display: grid; place-items: center;
}
.route-x:hover { background: rgba(0,0,0,.08); color: var(--ink); }
/* Per-leg distance row — sits between two route-rows. The vertical line
   visually connects the two stop bullets to communicate "this is the
   travel between them". */
.route-leg {
  display: flex; align-items: center; gap: 10px;
  padding: 2px 8px 2px 0;
  margin-left: 18px; /* aligns with the left edge of the route-num bullet */
  pointer-events: none; /* never absorb dragover events meant for rows */
  transition: opacity 0.12s ease;
}
.route-leg[data-stale] { opacity: 0.35; }
.route-leg-dot {
  width: 1.5px; height: 18px; background: var(--line); margin-left: 6px;
  flex-shrink: 0;
}
.route-leg-label {
  font: 500 11px/1 var(--sans); color: var(--ink-soft);
  letter-spacing: 0.01em;
}
.route-error {
  margin: -2px 0 10px;
  color: #9b2f20;
  font: 600 12px/1.35 var(--sans);
}
.route-go { width: 100%; justify-content: center; }
.route-go:disabled {
  opacity: .55;
  cursor: not-allowed;
  background: var(--primary);
}

/* Route settings cog — sits in the panel header next to "Clear". */
.route-head-actions {
  position: relative;
  display: flex; align-items: center; gap: 6px;
}
.route-cog {
  position: relative;
  width: 28px; height: 28px;
  display: grid; place-items: center;
  border: 1px solid var(--line);
  background: var(--surface); color: var(--ink-soft);
  border-radius: 4px;
  cursor: pointer;
  transition: color 0.15s, border-color 0.15s, background 0.15s;
}
.route-cog:hover { color: var(--ink); border-color: var(--ink-soft); }
.route-cog[data-on="true"] {
  color: var(--accent); border-color: var(--accent);
  background: rgba(232, 105, 58, 0.08);
}
.route-cog-badge {
  position: absolute;
  top: -5px; right: -5px;
  min-width: 14px; height: 14px;
  padding: 0 3px;
  border-radius: 7px;
  background: var(--accent); color: #fff;
  font: 700 9px/14px var(--sans);
  text-align: center;
  border: 1.5px solid #fff;
}
/* Popover: anchored under the cog button, opens to the left so it
   doesn't clip the right edge of the panel. */
.route-settings {
  position: absolute;
  top: calc(100% + 6px);
  right: 0;
  z-index: 5;
  min-width: 220px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 8px;
  box-shadow: var(--shadow-md);
  padding: 10px 12px 12px;
  display: flex; flex-direction: column; gap: 8px;
}
.route-settings-head {
  font: 600 12px/1 var(--sans);
  color: var(--ink);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  padding-bottom: 4px;
  border-bottom: 1px solid var(--line);
  margin-bottom: 2px;
}
.route-settings-row {
  display: flex; align-items: center; gap: 10px;
  font: 500 13px/1.2 var(--sans);
  color: var(--ink);
  cursor: pointer;
  padding: 4px 2px;
  border-radius: 4px;
}
.route-settings-row:hover { background: var(--bg-alt); }
.route-settings-row input[type="checkbox"] {
  width: 14px; height: 14px;
  accent-color: var(--accent);
  cursor: pointer;
  margin: 0;
}
.route-settings-hint {
  font: 400 11px/1.4 var(--sans);
  color: var(--ink-soft);
  padding-top: 4px;
  border-top: 1px solid var(--line);
  margin-top: 2px;
}

/* Responsive */
@media (max-width: 1100px) {
  .featured-grid { grid-template-columns: repeat(2, 1fr); }
  .coll-grid { grid-template-columns: 1fr 1fr; }
  .coll-grid > :nth-child(1), .coll-grid > :nth-child(4) { grid-column: span 1; }
  .recent-wrap { grid-template-columns: 1fr; gap: 32px; }
  .map-preview { grid-template-columns: 1fr; }
}
@media (max-width: 720px) {
  .nav { padding: 16px 24px; }
  .nav-links { display: none; }
  .hero-inner { padding: 60px 24px 0; }
  .section { padding: 60px 24px; }
  .section-alt > * { padding-left: 24px; padding-right: 24px; }
  .featured-grid { grid-template-columns: 1fr; }
  .coll-grid { grid-template-columns: 1fr; grid-auto-rows: 220px; }
  .map-preview { padding: 60px 24px; }
  .foot-cols { grid-template-columns: 1fr 1fr; }
  .foot { padding: 40px 24px 24px; }
}

@media (max-width: 480px) {
  /* Landing hero is 760px tall by default — half a phone screen of dead
   * space before content. Drop to a more reasonable height + tighten
   * the headline lower bound so the title fits on one or two lines. */
  .hero { min-height: 540px; padding-bottom: 48px; }
  .hero-inner { padding: 40px var(--mobile-pad) 0; }
  h1 { font-size: clamp(34px, 9vw, 64px); }
  .hero-sub { font-size: 15px; margin: 16px auto 24px; }
  .search { padding: 6px 6px 6px 16px; }
  .search input { font-size: 15px; padding: 12px 6px; }
  .search-go { padding: 10px 14px; }
  /* Section padding tightens further than 720 to let content breathe on
   * iPhone SE. */
  .section { padding: 48px var(--mobile-pad); }
  .section-alt > * { padding-left: var(--mobile-pad); padding-right: var(--mobile-pad); }
  .nav { padding: 12px var(--mobile-pad); }
  .foot-cols { grid-template-columns: 1fr; }
  .foot { padding: 32px var(--mobile-pad) 20px; }

  /* Detail-page side gallery — at 480 the 2-col strip still squeezes
   * 90px thumbs. Make a single horizontally-scrollable row so admins
   * can swipe through extras without the layout fighting them. */
  .dp-gallery-side {
    grid-template-columns: repeat(4, 32%);
    grid-template-rows: 90px;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    scroll-snap-type: x mandatory;
  }
  .dp-gallery-side > * { scroll-snap-align: start; }
}

/* ───────── DETAIL PAGE ───────── */
.dp { background: var(--bg); min-height: 100vh; }
.dp-nav { background: var(--surface); border-bottom: 1px solid var(--line); color: var(--ink); padding: 16px 56px; }
.dp-nav .nav-actions .btn-ghost { color: var(--ink); }
.dp-nav .nav-actions .btn-ghost:hover { background: var(--bg-alt); }
.dp-links a { color: var(--ink-soft); }
.dp-links a:hover { color: var(--ink); }
.dp-share { border: 1.5px solid var(--line); }

.dp-crumbs {
  width: 100%; max-width: 1280px; margin: 0 auto; padding: 18px 56px 0;
  font-size: 13px; color: var(--ink-soft);
  display: flex; gap: 8px; align-items: center;
}
.dp-crumbs a { color: var(--ink-soft); cursor: pointer; }
.dp-crumbs a:hover { color: var(--accent); }
.dp-crumbs-cur { color: var(--ink); font-weight: 600; }

.dp-gallery {
  width: 100%; max-width: 1280px; margin: 18px auto 0; padding: 0 56px;
  display: grid; grid-template-columns: 2fr 1fr; grid-gap: 8px; gap: 8px;
  height: 460px;
}
.dp-gallery-main {
  position: relative; overflow: hidden; border-radius: var(--radius-lg);
  cursor: pointer;
}
.dp-gallery-main img { width: 100%; height: 100%; object-fit: cover; }
.dp-gallery-tint { position: absolute; inset: 0; background: linear-gradient(180deg, rgba(0,0,0,.25) 0%, transparent 30%, transparent 70%, rgba(0,0,0,.35) 100%); pointer-events: none; }
.dp-gallery-overlay {
  position: absolute; inset: 0; padding: 18px;
  display: flex; justify-content: space-between; align-items: start;
  pointer-events: none;
}
.dp-gallery-overlay > * { pointer-events: auto; }
.dp-type-pill {
  display: inline-flex; align-items: center; gap: 6px;
  color: #fff; font: 600 13px/1 var(--sans); padding: 8px 12px; border-radius: 999px;
  align-self: start;
}
.dp-saveall {
  align-self: end; margin-top: auto;
  background: rgba(255,255,255,.95); color: var(--ink);
  border: 0; padding: 9px 14px; border-radius: 999px;
  font: 600 13px/1 var(--sans);
  position: absolute; bottom: 18px; right: 18px;
  text-decoration: none;
}
.dp-saveall:hover { background: var(--surface); }
.dp-gallery-side {
  display: grid; grid-template-rows: 1fr 1fr; grid-template-columns: 1fr 1fr; grid-gap: 8px; gap: 8px;
}
.dp-thumb {
  position: relative; overflow: hidden; border-radius: var(--radius-lg);
  border: 0; padding: 0; cursor: pointer;
  transition: opacity .15s, outline-color .15s;
  outline: 3px solid transparent;
}
.dp-thumb img { width: 100%; height: 100%; object-fit: cover; }
.dp-thumb:hover img { opacity: 0.92; }
.dp-thumb.sel { outline-color: var(--accent); }

.dp-titlerow {
  width: 100%; max-width: 1280px; margin: 28px auto 0; padding: 0 56px;
  display: flex; justify-content: space-between; align-items: end; gap: 24px;
  flex-wrap: wrap;
}
.dp-title-left h1 { font-size: 48px; line-height: 1; }
.dp-meta {
  display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin-top: 12px;
  font-size: 14px; color: var(--ink-soft);
}
.dp-meta b { color: var(--ink); }
.dp-meta > span { display: inline-flex; align-items: center; gap: 5px; }
.dp-rating { font-weight: 500; }
.dp-dot { color: var(--line); }
.dp-title-right { display: flex; gap: 8px; }
.dp-edit-mode-toggle {
  border-color: var(--line);
  white-space: nowrap;
}
.dp-edit-mode-toggle[data-on="true"] {
  background: var(--primary);
  border-color: var(--primary);
  color: #fff;
}
.dp-edit-mode-toggle[data-on="true"]:hover {
  background: var(--primary-deep);
}
.admin-inline-value {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
  border: 1.5px dashed transparent;
  border-radius: 8px;
  background: transparent;
  color: inherit;
  font: inherit;
  letter-spacing: inherit;
  line-height: inherit;
  margin: -2px -4px;
  max-width: 100%;
  padding: 2px 4px;
  text-align: left;
  display: inline-flex;
  align-items: baseline;
  gap: 8px;
}
.admin-inline-value:hover,
.admin-inline-value:focus-visible {
  background: var(--surface);
  border-color: var(--accent);
  outline: 0;
}
.admin-inline-value[data-empty="true"] {
  color: var(--ink-soft);
  font-weight: 500;
}
.admin-inline-value svg,
.admin-inline-card-button svg,
.admin-inline-row-button svg:last-child,
.admin-inline-contact-row svg:last-child {
  color: var(--accent);
  flex-shrink: 0;
  opacity: .55;
}
.admin-description-stack {
  display: grid; grid-gap: 18px; gap: 18px;
}
.admin-description-locale-tag {
  font: 600 11px/1 var(--sans);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-soft);
  margin-bottom: 6px;
}
.admin-description-locale-row {
  display: flex; align-items: center; justify-content: space-between;
  gap: 8px; margin-bottom: 6px;
}
.admin-description-locale-row .admin-description-locale-tag {
  margin-bottom: 0;
}
.admin-description-translate {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; background: transparent;
  border: 1px solid var(--line); border-radius: 999px;
  font: 500 11.5px/1 var(--sans); color: var(--ink-soft);
  padding: 5px 10px;
  display: inline-flex; align-items: center; gap: 5px;
  cursor: pointer; transition: all .15s;
}
.admin-description-translate:hover:not(:disabled) {
  background: var(--bg-alt); color: var(--ink); border-color: var(--ink-soft);
}
.admin-description-translate:disabled { opacity: .5; cursor: default; }
.admin-inline-form,
.admin-inline-card-form,
.admin-inline-row-form,
.admin-inline-contact-form {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow-sm);
  display: grid;
  grid-gap: 10px;
  gap: 10px;
  padding: 12px;
}
.admin-inline-form-heading {
  max-width: 760px;
}
.admin-inline-form-heading input {
  font-family: var(--display);
  font-size: 34px;
  font-weight: 600;
  line-height: 1.05;
}
.admin-inline-form input,
.admin-inline-form textarea,
.admin-inline-card-form input,
.admin-inline-row-form input,
.admin-inline-contact-form input {
  width: 100%;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: var(--bg);
  color: var(--ink);
  padding: 10px 12px;
  font: 500 14px/1.45 var(--sans);
}
.admin-inline-form textarea {
  min-height: 120px;
  resize: vertical;
}
.admin-inline-form input:focus,
.admin-inline-form textarea:focus,
.admin-inline-card-form input:focus,
.admin-inline-row-form input:focus,
.admin-inline-contact-form input:focus {
  outline: 2px solid rgba(232, 105, 58, .2);
  border-color: var(--accent);
}
.admin-inline-actions {
  display: flex;
  justify-content: flex-end;
  gap: 8px;
}
.admin-inline-actions[data-compact="true"] {
  justify-content: flex-start;
}
.admin-inline-error {
  color: #8d2e18;
  background: #fff4ed;
  border: 1px solid #f3c7b3;
  border-radius: 8px;
  padding: 8px 10px;
  font: 600 12px/1.35 var(--sans);
}
.admin-inline-card-button {
  width: 100%;
  border: 1.5px dashed transparent;
  border-radius: 10px;
  background: transparent;
  color: inherit;
  padding: 4px 28px 4px 4px;
  position: relative;
  text-align: left;
}
.admin-inline-card-button:hover,
.admin-inline-card-button:focus-visible {
  border-color: var(--accent);
  outline: 0;
}
.admin-inline-card-button svg {
  position: absolute;
  right: 6px;
  top: 8px;
}
.admin-inline-card-form label {
  display: grid;
  grid-gap: 6px;
  gap: 6px;
}
.admin-inline-card-form label span {
  color: var(--ink-soft);
  font: 700 12px/1 var(--sans);
}
.admin-inline-row[data-empty="true"] > span {
  color: var(--ink-soft);
}
.admin-inline-row[data-editing="true"] {
  align-items: stretch;
  flex-direction: column;
}
.admin-inline-row-button {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
  border: 1.5px dashed transparent;
  border-radius: 8px;
  background: transparent;
  color: var(--ink);
  padding: 4px 6px;
  font: 700 13px/1 var(--sans);
  display: inline-flex;
  align-items: center;
  gap: 5px;
  min-width: 0;
}
.admin-inline-row-button:hover,
.admin-inline-row-button:focus-visible {
  background: var(--surface);
  border-color: var(--accent);
  outline: 0;
}
.admin-inline-row-button[data-empty="true"] {
  color: var(--ink-soft);
  font-weight: 600;
}
.admin-inline-row-form,
.admin-inline-choice {
  width: 100%;
}
.admin-inline-choice {
  display: flex;
  flex-wrap: wrap;
  gap: 7px;
}
.admin-inline-choice button,
.admin-inline-amenity-grid button {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
  border: 1.5px solid var(--line);
  border-radius: 999px;
  background: var(--surface);
  color: var(--ink);
  min-height: 34px;
  padding: 7px 11px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font: 700 12px/1 var(--sans);
}
.admin-inline-choice button[data-on="true"],
.admin-inline-amenity-grid button[data-on="true"] {
  background: var(--primary);
  border-color: var(--primary);
  color: #fff;
}
.admin-inline-choice .admin-inline-cancel {
  color: var(--ink-soft);
  border-style: dashed;
}
.admin-inline-amenities {
  display: grid;
  grid-gap: 12px;
  gap: 12px;
}
.admin-inline-amenity-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.admin-inline-amenity-actions {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}
.admin-inline-contact {
  gap: 6px;
}
.admin-inline-contact-row {
  width: 100%;
  border: 1.5px dashed transparent;
  background: transparent;
  padding: 6px 4px;
  text-align: left;
}
.admin-inline-contact-row:hover,
.admin-inline-contact-row:focus-visible {
  background: var(--bg-alt);
  border-color: var(--accent);
  outline: 0;
}
.admin-inline-contact-row[data-empty="true"] span {
  color: var(--ink-soft);
}
.admin-inline-contact-form {
  grid-template-columns: auto minmax(0, 1fr);
  align-items: center;
  gap: 8px;
  padding: 8px;
}
.admin-inline-contact-form .admin-inline-actions,
.admin-inline-contact-form .admin-inline-error {
  grid-column: 2;
}
.admin-inline-contact-form svg {
  color: var(--ink-soft);
}
.admin-location-preview {
  position: relative;
  display: grid;
  grid-gap: 8px;
  gap: 8px;
}
.admin-location-preview .dp-mini-map {
  display: block;
  color: inherit;
  text-decoration: none;
}
.admin-location-button {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
  position: absolute;
  top: 12px;
  right: 12px;
  z-index: 2;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: rgba(255,255,255,.94);
  color: var(--ink);
  padding: 8px 12px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font: 700 12px/1 var(--sans);
  box-shadow: 0 6px 18px rgba(0,0,0,.12);
}
.admin-location-button:hover,
.admin-location-button:focus-visible {
  border-color: var(--accent);
  outline: 0;
}
.admin-location-coords {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.admin-location-coords span {
  border: 1px solid var(--line);
  border-radius: 999px;
  background: var(--bg-alt);
  color: var(--ink-soft);
  padding: 5px 9px;
  font: 700 11px/1 var(--sans);
}
.admin-location-editor {
  display: grid;
  grid-gap: 12px;
  gap: 12px;
  padding: 12px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
}
.admin-location-search {
  position: relative;
}
.admin-location-search input {
  width: 100%;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: var(--bg);
  color: var(--ink);
  padding: 11px 82px 11px 12px;
  font: 500 14px/1.35 var(--sans);
}
.admin-location-search input:focus {
  outline: 2px solid rgba(232, 105, 58, .2);
  border-color: var(--accent);
}
.admin-location-search > span {
  position: absolute;
  top: 50%;
  right: 12px;
  transform: translateY(-50%);
  color: var(--ink-soft);
  font: 700 12px/1 var(--sans);
  pointer-events: none;
}
.admin-location-search ul {
  position: absolute;
  z-index: 20;
  top: calc(100% + 4px);
  left: 0;
  right: 0;
  margin: 0;
  padding: 0;
  list-style: none;
  max-height: 280px;
  overflow: auto;
  background: var(--bg);
  border: 1px solid var(--line);
  border-radius: 8px;
  box-shadow: 0 4px 16px rgba(0,0,0,.08);
}
.admin-location-search button {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
  width: 100%;
  border: 0;
  background: transparent;
  color: var(--ink);
  padding: 10px 12px;
  text-align: left;
}
.admin-location-search button:hover,
.admin-location-search button:focus-visible {
  background: var(--bg-alt);
  outline: 0;
}
.admin-location-search b,
.admin-location-search small {
  display: block;
}
.admin-location-search b {
  font: 700 13px/1.25 var(--sans);
}
.admin-location-search small {
  margin-top: 2px;
  color: var(--ink-soft);
  font: 500 12px/1.3 var(--sans);
}
.admin-location-fields {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  grid-gap: 10px;
  gap: 10px;
}
.admin-location-fields label {
  display: grid;
  grid-gap: 6px;
  gap: 6px;
}
.admin-location-fields span {
  color: var(--ink-soft);
  font: 700 12px/1 var(--sans);
}
.admin-location-fields input {
  width: 100%;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: var(--bg);
  color: var(--ink);
  padding: 10px 11px;
  font: 600 14px/1.2 var(--sans);
}
.admin-location-fields input:focus {
  outline: 2px solid rgba(232, 105, 58, .2);
  border-color: var(--accent);
}
.admin-inline-actions button:disabled,
.admin-inline-choice button:disabled,
.admin-inline-amenity-actions button:disabled {
  opacity: .55;
  cursor: not-allowed;
}
.admin-derived-address {
  min-height: 36px;
}
.admin-derived-address[data-empty="true"] span {
  color: var(--ink-soft);
}

.dp-tabs {
  width: 100%; max-width: 1280px; margin: 32px auto 0; padding: 0 56px;
  display: flex; gap: 4px; border-bottom: 1px solid var(--line);
}
/* Tabs render as <a> on the server (linkable, deep-link-friendly) but
   could just as well be <button>. Style both so either works. */
.dp-tabs a,
.dp-tabs button {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 0; background: transparent;
  font: 600 14px/1 var(--sans); color: var(--ink-soft);
  padding: 14px 18px; text-transform: capitalize;
  border-bottom: 2px solid transparent; margin-bottom: -1px;
  text-decoration: none; cursor: pointer;
}
.dp-tabs a:hover,
.dp-tabs button:hover { color: var(--ink); }
.dp-tabs a[data-on="true"],
.dp-tabs button[data-on="true"] { color: var(--ink); border-bottom-color: var(--accent); }

.dp-body {
  width: 100%; max-width: 1280px; margin: 0 auto; padding: 36px 56px;
  display: grid; grid-template-columns: 1fr 360px; grid-gap: 48px; gap: 48px; align-items: start;
}
.dp-section { margin-bottom: 40px; }
.dp-section h2 { font-size: 26px; margin-bottom: 14px; }
.dp-lead { font-size: 17px; line-height: 1.55; color: var(--ink); margin: 0 0 14px; }
.dp-body-text { font-size: 15px; line-height: 1.65; color: var(--ink-soft); margin: 0; }

.dp-amen-grid {
  display: grid; grid-template-columns: repeat(3, 1fr); grid-gap: 10px; gap: 10px;
}
.dp-amen-tile {
  display: flex; align-items: center; gap: 10px;
  padding: 14px 16px; background: var(--surface);
  border: 1px solid var(--line); border-radius: 10px;
  font-size: 14px; font-weight: 500;
}
.dp-amen-tile svg { color: var(--primary); }

.dp-amen-list { display: grid; grid-template-columns: repeat(2, 1fr); grid-gap: 4px; gap: 4px; }
.dp-amen-line {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 4px; font-size: 14px; border-bottom: 1px solid var(--line);
}
.dp-amen-line.has { color: var(--ink); }
.dp-amen-line.has svg { color: var(--primary); }
.dp-amen-line.no { color: var(--ink-soft); text-decoration: line-through; }
.dp-amen-line.no svg { color: var(--ink-soft); }

.dp-photo-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  grid-gap: 10px;
  gap: 10px;
}
.dp-photo-tile {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
  border: 0;
  border-radius: var(--radius);
  background: var(--surface);
  padding: 0;
  aspect-ratio: 4 / 3;
  cursor: zoom-in;
  overflow: hidden;
  position: relative;
}
.dp-photo-tile img {
  width: 100%;
  height: 100%;
  display: block;
  object-fit: cover;
  transition: transform .16s ease, opacity .16s ease;
}
.dp-photo-tile:hover img,
.dp-photo-tile:focus-visible img {
  opacity: .92;
  transform: scale(1.02);
}
.dp-photo-tile:focus-visible {
  outline: 3px solid var(--accent);
  outline-offset: 2px;
}
.admin-photo-editor {
  display: grid;
  grid-gap: 14px;
  gap: 14px;
}
.admin-photo-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}
.admin-photo-toolbar > div {
  display: grid;
  grid-gap: 3px;
  gap: 3px;
}
.admin-photo-toolbar b {
  color: var(--ink);
  font: 800 15px/1.2 var(--sans);
}
.admin-photo-toolbar span,
.admin-photo-note,
.admin-photo-empty span {
  color: var(--ink-soft);
  font: 600 12px/1.35 var(--sans);
}
.admin-photo-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  grid-gap: 10px;
  gap: 10px;
}
.admin-photo-item {
  position: relative;
  aspect-ratio: 4 / 3;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--surface);
  box-shadow: var(--shadow-sm);
  cursor: -webkit-grab;
  cursor: grab;
  overflow: hidden;
}
.admin-photo-item[data-dragging="true"] {
  opacity: .5;
}
.admin-photo-item img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.admin-photo-index {
  position: absolute;
  top: 8px;
  left: 8px;
  width: 28px;
  height: 28px;
  display: grid;
  place-items: center;
  border-radius: 999px;
  background: rgba(31,36,24,.76);
  color: #fff;
  font: 800 12px/1 var(--sans);
  -webkit-backdrop-filter: blur(4px);
          backdrop-filter: blur(4px);
}
.admin-photo-flag {
  position: absolute;
  top: 8px;
  right: 8px;
  background: #c4302b;
  color: #fff;
  font: 700 10px/1 var(--sans);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  padding: 5px 8px;
  border-radius: 999px;
}
.admin-photo-controls {
  position: absolute;
  right: 8px;
  bottom: 8px;
  display: flex;
  gap: 5px;
}
.admin-photo-icon {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
  width: 32px;
  height: 32px;
  border: 1px solid rgba(255,255,255,.28);
  border-radius: 999px;
  background: rgba(31,36,24,.78);
  color: #fff;
  display: grid;
  place-items: center;
  -webkit-backdrop-filter: blur(4px);
          backdrop-filter: blur(4px);
}
.admin-photo-icon:hover,
.admin-photo-icon:focus-visible {
  background: var(--primary);
  outline: 0;
}
.admin-photo-icon:disabled {
  cursor: not-allowed;
  opacity: .45;
}
.admin-photo-prev svg {
  transform: rotate(180deg);
}
.admin-photo-remove:hover,
.admin-photo-remove:focus-visible {
  background: var(--accent);
}
.admin-photo-empty {
  border: 1px dashed var(--line);
  border-radius: var(--radius);
  background: var(--surface);
  min-height: 150px;
  display: grid;
  place-items: center;
  grid-gap: 4px;
  gap: 4px;
  padding: 24px;
  text-align: center;
}
.admin-photo-empty b {
  color: var(--ink);
  font: 800 15px/1.2 var(--sans);
}

.admin-photo-library {
  display: grid;
  grid-gap: 22px;
  gap: 22px;
}
.admin-photo-library-header {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
}
.admin-photo-library-header > div {
  display: grid;
  grid-gap: 5px;
  gap: 5px;
}
.admin-photo-library-header h1 {
  font-family: var(--display);
  font-size: 28px;
  font-weight: 600;
  letter-spacing: 0;
  margin: 0;
}
.admin-photo-library-header span,
.admin-photo-library-empty {
  color: var(--ink-soft);
  font: 600 13px/1.35 var(--sans);
}
.admin-photo-library-search {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}
.admin-photo-library-search label {
  min-width: min(340px, 100%);
  height: 42px;
  display: flex;
  align-items: center;
  gap: 9px;
  padding: 0 12px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: var(--surface);
  color: var(--ink-soft);
}
.admin-photo-library-search label:focus-within {
  border-color: var(--primary);
  box-shadow: 0 0 0 3px rgba(47,90,58,.12);
}
.admin-photo-library-search input {
  width: 100%;
  min-width: 0;
  border: 0;
  outline: 0;
  background: transparent;
  color: var(--ink);
  font: 600 14px/1 var(--sans);
}
.admin-photo-library-search button,
.admin-photo-library-search a {
  height: 42px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 8px;
  font: 800 13px/1 var(--sans);
}
.admin-photo-library-search button {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
  border: 0;
  padding: 0 15px;
  background: var(--primary);
  color: #fff;
}
.admin-photo-library-search button:hover,
.admin-photo-library-search button:focus-visible {
  background: var(--primary-deep);
  outline: 0;
}
.admin-photo-library-search a {
  padding: 0 10px;
  color: var(--ink-soft);
}
.admin-photo-library-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  grid-gap: 14px;
  gap: 14px;
}
.admin-photo-library-card {
  min-width: 0;
  overflow: hidden;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: var(--surface);
  box-shadow: var(--shadow-sm);
}
.admin-photo-library-image {
  position: relative;
  display: block;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  background: var(--bg-alt);
}
.admin-photo-library-image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: opacity .16s ease, transform .16s ease;
}
.admin-photo-library-image:hover img,
.admin-photo-library-image:focus-visible img {
  opacity: .92;
  transform: scale(1.02);
}
.admin-photo-library-image > span {
  position: absolute;
  top: 8px;
  left: 8px;
  border-radius: 999px;
  padding: 5px 8px;
  background: rgba(31,36,24,.76);
  color: #fff;
  font: 800 10px/1 var(--sans);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  -webkit-backdrop-filter: blur(4px);
          backdrop-filter: blur(4px);
}
.admin-photo-library-image > span[data-status="clean"] {
  background: rgba(47,90,58,.82);
}
.admin-photo-library-image > span[data-status="flagged"] {
  background: rgba(196,48,43,.86);
}
.admin-photo-library-body {
  display: grid;
  grid-gap: 10px;
  gap: 10px;
  padding: 12px;
}
.admin-photo-library-meta {
  display: grid;
  grid-gap: 2px;
  gap: 2px;
}
.admin-photo-library-meta a {
  min-width: 0;
  overflow: hidden;
  color: var(--ink);
  font: 800 14px/1.25 var(--sans);
  text-overflow: ellipsis;
  white-space: nowrap;
}
.admin-photo-library-meta small {
  color: var(--ink-soft);
  font: 600 12px/1.25 var(--sans);
}
.admin-photo-library-body p {
  min-height: 94px;
  margin: 0;
  color: var(--ink);
  font: 500 13px/1.45 var(--sans);
  display: -webkit-box;
  -webkit-line-clamp: 5;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.admin-photo-library-body p[data-empty="true"] {
  color: var(--ink-soft);
}
.admin-photo-library-footer {
  display: flex;
  justify-content: space-between;
  gap: 10px;
  color: var(--ink-soft);
  font: 700 11px/1.25 var(--sans);
}
.admin-photo-library-footer span {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.admin-photo-library-models {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  grid-gap: 6px;
  gap: 6px;
}
.admin-photo-library-models span {
  min-width: 0;
  overflow: hidden;
  border-radius: 6px;
  background: var(--bg-alt);
  color: var(--ink-soft);
  padding: 5px 7px;
  font: 700 10px/1.2 var(--mono);
  display: inline-flex;
  align-items: center;
  gap: 5px;
}
.admin-photo-library-models span[data-kind="safety"] {
  background: #eef4ec;
  color: #355f3b;
}
.admin-photo-library-models span[data-kind="description"] {
  background: #f5eedf;
  color: #6b5730;
}
.admin-photo-library-models span[data-kind="description-skipped"] {
  background: #f1f1ea;
  color: var(--ink-soft);
}
.admin-photo-library-models svg {
  flex: 0 0 auto;
}
.admin-photo-library-models b {
  min-width: 0;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
.admin-photo-library-flag {
  border-radius: 6px;
  background: #fde2e2;
  color: #7a1f1f;
  padding: 8px;
  font: 700 12px/1.35 var(--sans);
}
.admin-photo-library-pagination {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  padding-top: 2px;
}
.admin-photo-library-pagination a,
.admin-photo-library-pagination span {
  height: 38px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 8px;
  font: 800 12px/1 var(--sans);
}
.admin-photo-library-pagination a {
  min-width: 86px;
  padding: 0 12px;
  border: 1px solid var(--line);
  background: var(--surface);
  color: var(--ink);
}
.admin-photo-library-pagination a[data-disabled="true"] {
  pointer-events: none;
  color: var(--ink-soft);
  opacity: .45;
}
.admin-photo-library-pagination span {
  color: var(--ink-soft);
  padding: 0 4px;
}

.dp-mini-map {
  display: block;
  position: relative; aspect-ratio: 16/8;
  border-radius: var(--radius-lg); overflow: hidden;
  border: 1px solid var(--line); cursor: pointer;
}
.dp-mini-cta {
  position: absolute; bottom: 12px; right: 12px;
  background: var(--surface-inverse); color: var(--on-inverse);
  padding: 8px 14px; border-radius: 999px;
  font: 600 13px/1 var(--sans);
  display: inline-flex; align-items: center; gap: 6px;
}
.dp-loc-card {
  position: absolute; top: 12px; left: 12px;
  max-width: calc(100% - 24px);
  background: var(--surface); color: var(--ink);
  padding: 12px 16px; border-radius: var(--radius);
  border: 1px solid var(--line);
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
  font: 500 14px/1.4 var(--sans);
  display: inline-flex; align-items: flex-start; gap: 10px;
}
.dp-loc-card > svg { margin-top: 2px; flex: 0 0 auto; }
.dp-loc-text {
  display: flex; flex-direction: column; gap: 1px;
  min-width: 0;
}
.dp-loc-text b {
  font: 700 15px/1.3 var(--sans); color: var(--ink);
}
.dp-loc-text span {
  color: var(--ink-soft);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* Reviews */
.dp-rev-head { display: flex; justify-content: space-between; align-items: end; margin-bottom: 20px; }
.dp-rating-big { display: inline-flex; align-items: center; gap: 8px; margin-top: 8px; }
.dp-rating-big b { font-family: var(--display); font-size: 28px; }
.dp-rating-big span { color: var(--ink-soft); font-size: 13px; }
.dp-reviews { display: flex; flex-direction: column; gap: 20px; }
.dp-review {
  display: grid; grid-template-columns: 48px 1fr; grid-gap: 14px; gap: 14px;
  padding: 18px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
}
.dp-rev-avatar {
  width: 48px; height: 48px; border-radius: 50%;
  color: #fff; font: 700 18px/1 var(--display);
  display: grid; place-items: center;
}
.dp-rev-top { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; }
.dp-rev-top b { font-size: 14px; }
.dp-rev-flag { margin-left: 4px; font-size: 13px; }
.dp-rev-when { font-size: 12px; color: var(--ink-soft); }
.dp-rev-stars { display: inline-flex; gap: 1px; margin: 4px 0 8px; }
.dp-review p { font-size: 14px; color: var(--ink); line-height: 1.55; margin: 0; }
.admin-review-display {
  display: grid;
}
.admin-review-actions {
  display: flex;
  align-items: center;
  gap: 8px;
  justify-content: flex-end;
  margin-top: 12px;
}
.admin-review-delete {
  color: #8d2e18;
  border-color: #efc5b5;
}
.admin-review-delete:hover {
  background: #fff4ed;
}
.admin-review-edit {
  display: grid;
  grid-gap: 10px;
  gap: 10px;
}
.admin-review-edit textarea {
  width: 100%;
  min-height: 110px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: var(--bg);
  color: var(--ink);
  padding: 10px 12px;
  font: 500 14px/1.5 var(--sans);
  resize: vertical;
}
.admin-review-edit textarea:focus {
  outline: 2px solid rgba(232, 105, 58, .2);
  border-color: var(--accent);
}
.admin-review-stars {
  display: inline-flex;
  gap: 2px;
}
.admin-review-stars button {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
  border: 0;
  background: transparent;
  color: #d8d4c4;
  padding: 2px;
}
.admin-review-stars button[data-on="true"] {
  color: #e8a838;
}
.admin-review-stars button:disabled,
.admin-review-actions button:disabled {
  opacity: .55;
  cursor: not-allowed;
}
.admin-review-error {
  color: #8d2e18;
  background: #fff4ed;
  border: 1px solid #f3c7b3;
  border-radius: 8px;
  padding: 8px 10px;
  font: 600 12px/1.35 var(--sans);
}

/* Rules */
.dp-rules { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 4px; }
.dp-rules li {
  padding: 14px 18px; background: var(--surface); border: 1px solid var(--line); border-radius: 10px;
  font-size: 14px; color: var(--ink-soft);
}
.dp-rules b { color: var(--ink); margin-right: 6px; }

/* Right rail */
.dp-rail { position: -webkit-sticky; position: sticky; top: 24px; display: flex; flex-direction: column; gap: 16px; }
.dp-card {
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg);
  padding: 22px;
  box-shadow: var(--shadow-sm);
}
.dp-card-price b { font-family: var(--display); font-size: 36px; font-weight: 600; letter-spacing: -0.02em; line-height: 1; }
.dp-card-price span { display: block; font-size: 13px; color: var(--ink-soft); margin-top: 4px; }
.dp-card-sep { height: 1px; background: var(--line); margin: 18px 0; }
.dp-card-row {
  display: flex; justify-content: space-between; align-items: center;
  padding: 8px 0; font-size: 13px;
}
.dp-card-row span { color: var(--ink-soft); }
.dp-card-row b { font-weight: 600; display: inline-flex; align-items: center; gap: 5px; }
.dp-card-go { width: 100%; justify-content: center; margin-top: 14px; }
.dp-card-report { width: 100%; justify-content: center; margin-top: 8px; border: 0; }

.dp-weather {
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 16px 18px;
}

/* Contact card — sits in the right rail next to the price card. Same
   surface treatment as .dp-weather so the rail reads as a stack of
   peer cards. Hidden entirely (in the JSX) when all four contact
   fields are null, so a missing field never produces an empty card. */
.dp-contact {
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 16px 18px;
  display: flex; flex-direction: column; gap: 8px;
}
.dp-contact h4 {
  font-family: var(--sans); font-size: 13px;
  text-transform: uppercase; letter-spacing: 0.06em;
  color: var(--ink-soft); margin-bottom: 4px;
}
.dp-contact-row {
  display: flex; align-items: center; gap: 10px;
  font-size: 13px; color: var(--ink); min-width: 0;
}
.dp-contact-row svg { color: var(--ink-soft); flex-shrink: 0; }
.dp-contact-row span {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  min-width: 0;
}
.dp-contact-link {
  text-decoration: none; color: var(--ink);
  transition: color 0.12s;
}
.dp-contact-link:hover {
  color: var(--accent);
}
.dp-contact-link:hover svg {
  color: var(--accent);
}
.dp-weather h4 { font-family: var(--sans); font-size: 13px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-soft); margin-bottom: 12px; }
.dp-weather-row { display: grid; grid-template-columns: repeat(5, 1fr); grid-gap: 4px; gap: 4px; }
.dp-weather-day {
  display: flex; flex-direction: column; align-items: center; gap: 4px;
  padding: 8px 4px; border-radius: 8px;
}
.dp-weather-day:hover { background: var(--bg-alt); }
.dp-weather-day span { font-size: 11px; color: var(--ink-soft); font-weight: 600; text-transform: uppercase; }
.dp-weather-icon { font-size: 22px; }
.dp-weather-day b { font-size: 13px; }
/* Open-Meteo CC BY 4.0 attribution — small, muted, hover for emphasis. */
.dp-weather-attrib {
  display: block; margin-top: 10px;
  font-size: 10px; color: var(--ink-soft);
  text-decoration: none; letter-spacing: 0.02em;
}
.dp-weather-attrib:hover { color: var(--ink); }

.dp-host {
  display: flex; align-items: center; gap: 12px;
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 14px 16px;
}
.dp-host-avatar {
  width: 40px; height: 40px; border-radius: 50%;
  background: var(--primary); color: #fff;
  font: 700 16px/1 var(--display);
  display: grid; place-items: center;
}
.dp-host b { display: block; font-size: 14px; }
.dp-host span { font-size: 12px; color: var(--ink-soft); }

.dp-nearby {
  width: 100%; max-width: 1280px; margin: 0 auto; padding: 24px 56px 80px;
  border-top: 1px solid var(--line);
  padding-top: 60px;
}
.dp-nearby-grid { display: grid; grid-template-columns: repeat(4, 1fr); grid-gap: 18px; gap: 18px; }

@media (max-width: 1100px) {
  .dp-body { grid-template-columns: 1fr; }
  .dp-rail { position: static; }
  .dp-nearby-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 720px) {
  .dp-nav { padding: 14px 24px; }
  .dp-crumbs, .dp-gallery, .dp-titlerow, .dp-tabs, .dp-body, .dp-nearby { padding-left: 24px; padding-right: 24px; }
  .dp-gallery { grid-template-columns: 1fr; height: auto; }
  /* 4-col strip squashed thumbnails below readability — drop to 2-col
   * with taller cells. */
  .dp-gallery-side { grid-template-columns: repeat(2, 1fr); grid-template-rows: 90px; }
  .dp-amen-grid { grid-template-columns: 1fr 1fr; }
  .dp-nearby-grid { grid-template-columns: 1fr; }
  .dp-title-left h1 { font-size: 32px; }
}

/* ───────── TRIP PAGE ───────── */
.tp { background: var(--bg); min-height: 100vh; }
.tp-nav { background: var(--surface); border-bottom: 1px solid var(--line); color: var(--ink); padding: 16px 56px; }
.tp-nav .nav-actions .btn-ghost { color: var(--ink); }
.tp-nav .nav-actions .btn-ghost:hover { background: var(--bg-alt); }

.tp-hero { position: relative; min-height: 560px; overflow: hidden; display: flex; flex-direction: column; }
.tp-hero-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; z-index: 0; }
.tp-hero-tint {
  position: absolute; inset: 0; z-index: 1;
  background: linear-gradient(180deg, rgba(0,0,0,.35) 0%, rgba(0,0,0,.5) 70%, rgba(0,0,0,.75) 100%);
}
.tp-hero-inner {
  position: relative; z-index: 2;
  width: 100%; max-width: 1280px; margin: 0 auto; padding: 60px 56px 56px;
  display: flex; flex-direction: column; justify-content: end; flex: 1 1;
  color: #fff;
}
.tp-nav-overlay {
  position: relative; z-index: 5; color: #fff;
  background: transparent;
  border-bottom: 0;
}
.tp-nav-overlay .brand-name { color: #fff; }
.tp-nav-overlay .nav-actions .btn-ghost { color: #fff; }
.tp-nav-overlay .nav-actions .btn-ghost:hover { background: rgba(255,255,255,.15); }
.tp-nav-overlay .nav-links a { color: rgba(255,255,255,.85); }
.tp-nav-overlay .nav-links a:hover { color: #fff; }
.tp-nav-overlay .nav-links a.active { color: #fff; }
.tp-nav-overlay .nav-account summary {
  color: #fff;
  background: rgba(255,255,255,.1);
  border-color: rgba(255,255,255,.28);
  -webkit-backdrop-filter: blur(10px);
          backdrop-filter: blur(10px);
}
.tp-nav-overlay .nav-account summary:hover { background: rgba(255,255,255,.18); }
.tp-nav-overlay .nav-avatar { background: rgba(255,255,255,.18); }
.tp-nav-overlay .nav-account-panel .nav-avatar { background: var(--primary); }

.tp-back-link {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 0; background: rgba(255,255,255,.12);
  -webkit-backdrop-filter: blur(8px);
          backdrop-filter: blur(8px);
  color: #fff; font: 600 13px/1 var(--sans);
  padding: 8px 14px; border-radius: 999px;
  display: inline-flex; align-items: center; gap: 8px;
  align-self: start; margin-bottom: 18px;
  border: 1px solid rgba(255,255,255,.2);
}
.tp-back-link:hover { background: rgba(255,255,255,.22); }

.tp-tag {
  display: inline-flex; align-self: start;
  background: rgba(255,255,255,.18); border: 1px solid rgba(255,255,255,.3);
  -webkit-backdrop-filter: blur(10px);
          backdrop-filter: blur(10px);
  padding: 6px 14px; border-radius: 999px;
  font-size: 12px; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase;
  margin-bottom: 16px;
  white-space: nowrap;
}
.tp-hero-inner h1 { color: #fff; font-size: clamp(44px, 6vw, 72px); max-width: 760px; }
.tp-hero-inner p { color: rgba(255,255,255,.88); font-size: 16px; max-width: 560px; margin: 16px 0 28px; line-height: 1.55; }
.tp-hero-actions { display: flex; gap: 12px; }
.btn-ghost.lg { padding: 14px 24px; font-size: 15px; }

.tp-stats {
  max-width: 1280px; margin: -28px auto 0; padding: 0 56px; position: relative; z-index: 2;
  display: grid; grid-template-columns: repeat(6, 1fr); grid-gap: 1px; gap: 1px;
  background: var(--line); border-radius: var(--radius-lg); overflow: hidden;
  border: 1px solid var(--line);
  box-shadow: var(--shadow-md);
}
.tp-stat { background: var(--surface); padding: 22px 20px; display: flex; flex-direction: column; gap: 4px; }
.tp-stat span { font-size: 12px; color: var(--ink-soft); text-transform: uppercase; letter-spacing: 0.06em; font-weight: 600; }
.tp-stat b { font-family: var(--display); font-size: 22px; font-weight: 600; letter-spacing: -0.02em; }

.tp-body {
  max-width: 1280px; margin: 0 auto; padding: 56px 56px 80px;
  display: grid; grid-template-columns: 1fr 360px; grid-gap: 48px; gap: 48px; align-items: start;
}
.tp-itin h2 { font-size: 36px; }
.tp-itin-lead { color: var(--ink-soft); font-size: 15px; margin: 10px 0 28px; }

.tp-days { display: flex; gap: 8px; overflow-x: auto; padding-bottom: 4px; margin-bottom: 24px; }
.tp-day-tab {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 1.5px solid var(--line); background: var(--surface);
  padding: 14px 18px; border-radius: 12px;
  display: flex; flex-direction: column; gap: 4px; align-items: start;
  flex: 0 0 auto; min-width: 220px;
  cursor: pointer; transition: border-color .15s, background .15s;
}
.tp-day-tab:hover { border-color: var(--ink); }
.tp-day-tab.sel { background: var(--toggle-on-bg); border-color: var(--toggle-on-bg); color: var(--toggle-on-text); }
.tp-day-num { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: var(--accent); white-space: nowrap; }
.tp-day-tab.sel .tp-day-num { color: var(--accent-2); }
.tp-day-title { font-family: var(--display); font-size: 16px; font-weight: 600; white-space: nowrap; }
.tp-day-km { font-size: 12px; color: var(--ink-soft); white-space: nowrap; }
.tp-day-tab.sel .tp-day-km { color: rgba(255,255,255,.7); }

.tp-day-detail {
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg);
  padding: 28px;
}
.tp-day-head { display: flex; justify-content: space-between; align-items: start; gap: 16px; margin-bottom: 14px; }
.tp-day-eyebrow { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: var(--accent); }
.tp-day-head h3 { font-size: 24px; margin-top: 4px; }
.tp-day-meta { display: flex; gap: 14px; font-size: 13px; color: var(--ink-soft); }
.tp-day-meta span { display: inline-flex; align-items: center; gap: 5px; }
.tp-day-note { font-size: 14px; color: var(--ink-soft); font-style: italic; padding: 12px 16px; background: var(--bg-alt); border-radius: 8px; margin: 0 0 24px; }

.tp-stops { display: flex; flex-direction: column; gap: 4px; }
.tp-stop {
  display: grid; grid-template-columns: 32px 100px 1fr auto; grid-gap: 16px; gap: 16px; align-items: center;
  padding: 14px; border-radius: 12px; cursor: pointer;
  transition: background .15s;
}
.tp-stop:hover { background: var(--bg-alt); }
.tp-stop-line { display: flex; flex-direction: column; align-items: center; height: 100%; }
.tp-stop-num {
  width: 26px; height: 26px; border-radius: 50%; color: #fff;
  display: grid; place-items: center; font: 700 12px/1 var(--sans); flex-shrink: 0;
  border: 2px solid #fff; box-shadow: 0 0 0 1.5px currentColor;
}
.tp-stop-bar { flex: 1 1; width: 2px; background: var(--line); margin-top: 4px; min-height: 30px; }
.tp-stop-img { width: 100px; height: 90px; object-fit: cover; border-radius: 10px; }
.tp-stop-mid { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.tp-stop-pill {
  display: inline-flex; align-items: center; gap: 4px; align-self: start;
  font-weight: 600; font-size: 11px; padding: 3px 8px; border-radius: 999px;
}
.tp-stop-mid h4 { font-size: 16px; }
.tp-stop-mid p {
  font-size: 13px; color: var(--ink-soft); margin: 0; line-height: 1.5;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.tp-stop-foot { display: flex; gap: 6px; font-size: 12px; color: var(--ink-soft); align-items: center; }
.tp-stop-foot span:first-child { color: var(--ink); font-weight: 600; }
.tp-stop-arrow {
  width: 36px; height: 36px; border-radius: 50%;
  background: var(--bg-alt); border: 0; color: var(--ink);
  display: grid; place-items: center;
}
.tp-stop:hover .tp-stop-arrow { background: var(--primary); color: #fff; }

.tp-notes { margin-top: 40px; }
.tp-notes h3 { font-size: 22px; margin-bottom: 16px; }
.tp-notes-grid { display: grid; grid-template-columns: repeat(2, 1fr); grid-gap: 14px; gap: 14px; }
.tp-notes-grid > div {
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 18px;
}
.tp-note-icon {
  display: inline-grid; place-items: center; width: 36px; height: 36px;
  background: var(--bg-alt); color: var(--primary); border-radius: 9px; margin-bottom: 10px;
}
.tp-notes-grid b { display: block; font-size: 15px; margin-bottom: 4px; }
.tp-notes-grid p { font-size: 13px; color: var(--ink-soft); margin: 0; line-height: 1.55; }

/* Right rail */
.tp-map { position: -webkit-sticky; position: sticky; top: 24px; display: flex; flex-direction: column; gap: 16px; }
.tp-map-preview {
  position: relative; aspect-ratio: 4/5; border-radius: var(--radius-lg); overflow: hidden;
  border: 1px solid var(--line); box-shadow: var(--shadow-sm);
}
.tp-map-overlay {
  position: absolute; left: 12px; right: 12px; bottom: 12px;
  background: var(--surface-overlay-strong); -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
  border-radius: 12px; padding: 12px 14px;
  display: flex; justify-content: space-between; align-items: center;
}
.tp-map-overlay b { font-family: var(--display); font-size: 16px; }
.tp-map-overlay span { display: block; font-size: 12px; color: var(--ink-soft); }

.tp-elevation {
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 16px 18px;
}
.tp-elevation h4 { font-family: var(--sans); font-size: 13px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-soft); margin-bottom: 10px; }
.tp-elev-svg { width: 100%; height: 60px; display: block; }
.tp-elev-foot { display: flex; justify-content: space-between; font-size: 11px; color: var(--ink-soft); margin-top: 6px; font-family: var(--mono); }

.tp-author {
  display: flex; align-items: center; gap: 12px;
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 14px 16px;
}
.tp-author-avatar {
  width: 40px; height: 40px; border-radius: 50%;
  background: var(--accent); color: #fff;
  font: 700 16px/1 var(--display); display: grid; place-items: center;
}
.tp-author b { display: block; font-size: 14px; }
.tp-author span { font-size: 12px; color: var(--ink-soft); }

.tp-similar {
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 16px;
}
.tp-similar h4 { font-family: var(--sans); font-size: 13px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-soft); margin-bottom: 12px; }
.tp-similar-row { display: grid; grid-template-columns: 56px 1fr; grid-gap: 10px; gap: 10px; align-items: center; padding: 8px 0; border-top: 1px solid var(--line); cursor: pointer; }
.tp-similar-row:first-of-type { border-top: 0; }
.tp-similar-row img { width: 56px; height: 56px; object-fit: cover; border-radius: 8px; }
.tp-similar-row b { display: block; font-size: 13px; }
.tp-similar-row span { font-size: 11px; color: var(--ink-soft); }

@media (max-width: 1100px) {
  .tp-body { grid-template-columns: 1fr; }
  .tp-map { position: static; }
  .tp-stats { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 720px) {
  .tp-nav { padding: 14px 24px; }
  .tp-hero-inner, .tp-stats, .tp-body { padding-left: 24px; padding-right: 24px; }
  .tp-stats { grid-template-columns: repeat(2, 1fr); margin-top: -20px; }
  .tp-notes-grid { grid-template-columns: 1fr; }
  .tp-stop { grid-template-columns: 24px 80px 1fr; gap: 10px; }
  .tp-stop-arrow { display: none; }
  .tp-stop-img { width: 80px; height: 80px; }
}

/* ===========================================================
   Active Chips Bar (filter style: 'chips')
   =========================================================== */
.acb {
  display: flex; align-items: center; gap: 6px; flex-wrap: wrap; flex: 1 1; min-width: 0;
}
.acb-chip-wrap { position: relative; }
.acb-chip {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 1px solid var(--line); background: var(--surface);
  font: 600 12.5px/1 var(--sans); color: var(--ink);
  padding: 7px 10px 7px 10px; border-radius: 999px;
  display: inline-flex; align-items: center; gap: 6px; white-space: nowrap;
  cursor: pointer; transition: all .15s;
}
.acb-chip:hover { border-color: var(--ink-soft); background: var(--bg-alt); }
.acb-chip[data-on="true"], .acb-chip.on {
  background: var(--toggle-on-bg); color: var(--toggle-on-text); border-color: var(--toggle-on-bg);
}
.acb-chip.on { padding-right: 4px; }
.acb-dots { display: inline-flex; gap: 2px; }
.acb-dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; }
.acb-x {
  width: 18px; height: 18px; border-radius: 50%;
  background: rgba(255,255,255,.18); display: inline-grid; place-items: center;
  margin-left: 2px;
}
.acb-x:hover { background: rgba(255,255,255,.32); }
.acb-add {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 1px dashed var(--line); background: transparent;
  font: 600 12.5px/1 var(--sans); color: var(--ink-soft);
  padding: 7px 12px; border-radius: 999px;
  display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; cursor: pointer;
}
.acb-add:hover { border-color: var(--ink); border-style: solid; color: var(--ink); background: var(--bg-alt); }

.acb-pop {
  position: absolute; top: calc(100% + 8px); left: 0; z-index: 100;
  background: var(--surface); border: 1px solid var(--line); border-radius: 14px;
  box-shadow: 0 14px 40px rgba(0,0,0,.14), 0 2px 6px rgba(0,0,0,.05);
  padding: 12px; min-width: 280px;
  animation: acbPop .14s cubic-bezier(.3,.7,.4,1);
}
.acb-pop.sm { min-width: 240px; }
.acb-pop.add { min-width: 180px; padding: 6px; }
@keyframes acbPop { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
.acb-pop-head {
  display: flex; justify-content: space-between; align-items: baseline;
  font-size: 11px; text-transform: uppercase; letter-spacing: .06em; color: var(--ink-soft);
  font-weight: 600; padding: 0 4px 8px; border-bottom: 1px solid var(--bg-alt); margin-bottom: 8px;
}
.acb-pop-head b { font-size: 13px; color: var(--ink); letter-spacing: 0; text-transform: none; }
.acb-pop-all {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; background: transparent; border: 0;
  font: 600 11px/1 var(--sans); color: var(--accent); cursor: pointer; text-transform: none; letter-spacing: 0;
}
.acb-pop-grid { display: flex; flex-direction: column; gap: 2px; }
.acb-pop-grid.two { display: grid; grid-template-columns: 1fr 1fr; grid-gap: 2px; gap: 2px; }
.acb-pop-row {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; background: transparent; border: 0;
  font: 500 13px/1 var(--sans); color: var(--ink);
  padding: 8px 8px; border-radius: 8px;
  display: grid; grid-template-columns: 22px 1fr auto; align-items: center; grid-gap: 10px; gap: 10px;
  cursor: pointer; text-align: left;
}
.acb-pop-row:hover { background: var(--bg-alt); }
.acb-pop-row[data-on="true"] { color: var(--ink); font-weight: 600; }
.acb-pop-icn {
  width: 22px; height: 22px; border-radius: 6px;
  display: grid; place-items: center; color: #fff;
}
.acb-pop-icn.neutral { background: var(--bg-alt); color: var(--ink-soft); }
.acb-range { width: 100%; accent-color: var(--accent); margin: 4px 0 2px; }
.acb-range-tick { display: flex; justify-content: space-between; font-size: 11px; color: var(--ink-soft); padding: 0 2px; }
.acb-rating-row { display: grid; grid-template-columns: repeat(4, 1fr); grid-gap: 4px; gap: 4px; }
.acb-rating-btn {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 1px solid var(--line); background: var(--surface);
  font: 600 13px/1 var(--sans); color: var(--ink);
  padding: 10px 0; border-radius: 8px; cursor: pointer;
}
.acb-rating-btn[data-on="true"] { background: var(--toggle-on-bg); color: var(--toggle-on-text); border-color: var(--toggle-on-bg); }
.acb-add-row {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 0; background: transparent;
  font: 500 13px/1 var(--sans); color: var(--ink);
  padding: 8px 10px; border-radius: 6px; width: 100%; text-align: left;
  display: inline-flex; align-items: center; gap: 8px; cursor: pointer;
}
.acb-add-row:hover { background: var(--bg-alt); }
.acb-add-empty { font-size: 12px; color: var(--ink-soft); padding: 10px 8px; }

/* ===========================================================
   Floating filter panel (filter style: 'floating')
   =========================================================== */
.fpanel {
  position: absolute; top: 16px; right: 58px; z-index: 30;
  width: 320px; max-width: calc(100% - 32px);
  background: var(--surface); border: 1px solid var(--line); border-radius: 16px;
  box-shadow: 0 16px 48px rgba(0,0,0,.18), 0 2px 8px rgba(0,0,0,.06);
  overflow: hidden;
  font-family: var(--sans);
}
.fpanel.collapsed,
/* When minimised the panel collapses to just its header, so let it shrink
   to that content's natural width instead of holding the full 320px. */
.fpanel[data-minimised="true"] { width: auto; }
.fpanel[data-minimised="true"] .fpanel-head { padding: 8px 12px; }
.fpanel[data-minimised="true"] .fpanel-collapse { font-size: 12px; padding: 2px; }
/* Header is now the entire toggle button — clicking anywhere along it
   minimises/expands the panel. The chevron rotates as the visual cue. */
.fpanel-head {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
  width: 100%;
  display: flex; align-items: center; justify-content: space-between;
  padding: 10px 12px;
  background: transparent; border: 0; border-bottom: 1px solid var(--bg-alt);
  font-family: var(--sans);
  cursor: pointer; text-align: left;
}
.fpanel-head:hover { background: var(--bg-alt); }
.fpanel[data-minimised="true"] .fpanel-head { border-bottom: 0; }
.fpanel.collapsed .fpanel-head { border-bottom: 0; }
.fpanel-collapse {
  font: 600 13px/1 var(--sans); color: var(--ink);
  display: inline-flex; align-items: center; gap: 8px;
  padding: 4px 4px;
}
.fpanel-collapse span { flex: 1 1; text-align: left; }
.fpanel-clear {
  /* `margin-left: auto` parks Reset next to the chevron on the right.
     Without it, justify-content: space-between on .fpanel-head treats
     Reset as the middle of three children and floats it mid-row. */
  display: inline-flex; align-items: center; margin-left: auto;
  font: 600 12px/1 var(--sans); color: var(--accent); cursor: pointer;
  padding: 4px 8px; border-radius: 4px;
  -webkit-user-select: none;
     -moz-user-select: none;
          user-select: none;
}
.fpanel-clear:hover { background: var(--bg-alt); }
.fpanel-chevron {
  display: inline-flex; align-items: center; color: var(--ink-soft);
  margin-left: 6px;
  transition: transform .18s ease-out;
}
.fpanel[data-minimised="true"] .fpanel-chevron {
  transform: rotate(-90deg);
}

.fpanel-types {
  display: flex; flex-wrap: wrap; gap: 5px;
}
.fpanel-type {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; background: var(--surface); border: 1.5px solid var(--line);
  color: var(--ink-soft);
  font: 600 11.5px/1 var(--sans);
  padding: 6px 10px; border-radius: 999px;
  display: inline-flex; align-items: center; gap: 4px; white-space: nowrap;
  cursor: pointer; transition: all .15s;
}
/* Default active state for the .fpanel-type pill (used by the
   open-seasons selector in /submit). The spot-type chooser overrides
   colors per-type via inline style, so this rule only kicks in when no
   inline override is present. */
.fpanel-type[data-on="true"] {
  background: var(--primary); border-color: var(--primary); color: #fff;
}

.fpanel-tabs {
  display: flex; gap: 2px; padding: 8px 8px 0;
}
.fpanel-tabs button {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 0; background: transparent;
  font: 600 12px/1 var(--sans); color: var(--ink-soft);
  padding: 8px 12px; border-radius: 8px 8px 0 0; cursor: pointer; position: relative;
}
.fpanel-tabs button:hover { color: var(--ink); }
.fpanel-tabs button[data-on="true"] {
  color: var(--ink); background: var(--bg-alt);
}
.fpanel-tab-dot {
  position: absolute; top: 4px; right: 6px;
  width: 5px; height: 5px; border-radius: 50%; background: var(--accent);
}

.fpanel-section {
  background: var(--bg-alt);
  padding: 14px 14px 16px;
  min-height: 80px;
}
.fpanel-row-head {
  display: flex; justify-content: space-between; align-items: baseline;
  font-size: 12px; color: var(--ink-soft); margin-bottom: 8px;
}
.fpanel-row-head b { color: var(--ink); font-size: 14px; }
.fpanel-range { width: 100%; accent-color: var(--accent); }
.fpanel-range-tick { display: flex; justify-content: space-between; font-size: 11px; color: var(--ink-soft); margin-top: 4px; }

.fpanel-rating { display: grid; grid-template-columns: repeat(4, 1fr); grid-gap: 4px; gap: 4px; }
.fpanel-rating button {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 1px solid var(--line); background: var(--surface);
  font: 600 13px/1 var(--sans); color: var(--ink);
  padding: 10px 0; border-radius: 8px; cursor: pointer;
}
.fpanel-rating button[data-on="true"] { background: var(--toggle-on-bg); color: var(--toggle-on-text); border-color: var(--toggle-on-bg); }

.fpanel-amen { display: grid; grid-template-columns: 1fr 1fr; grid-gap: 4px; gap: 4px; }
.fpanel-amen button {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 1px solid var(--line); background: var(--surface);
  font: 500 12px/1 var(--sans); color: var(--ink);
  padding: 8px 10px; border-radius: 8px; text-align: left;
  display: inline-flex; align-items: center; gap: 6px; cursor: pointer;
}
.fpanel-amen button[data-on="true"] { background: var(--primary); color: #fff; border-color: var(--primary); }

/* Hide the now-unused old filter drawer styles if FilterBar is referenced anywhere */
.filterdrawer { display: none; }

/* ===========================================================
   Floating panel — accordion (multi-category)
   =========================================================== */
.acc-list {
  display: flex; flex-direction: column;
  max-height: calc(100vh - 220px);
  overflow-y: auto;
}
.acc-section {
  border-bottom: 1px solid var(--bg-alt);
}
.acc-section:last-child { border-bottom: 0; }

.acc-head {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 0; background: transparent;
  width: 100%; display: flex; align-items: center; gap: 8px;
  padding: 12px 14px;
  /* Reserve enough vertical room for the .acc-badge (18px tall) so the
     row doesn't visibly grow when the count bubble appears. 42 = 18 + 24
     (top + bottom padding). */
  min-height: 42px; box-sizing: border-box;
  font: 600 13px/1 var(--sans); color: var(--ink);
  cursor: pointer; text-align: left;
  transition: background .12s;
}
.acc-head:hover { background: var(--bg-alt); }
.acc-section[data-open="true"] .acc-head { background: var(--bg-alt); }
.acc-section[data-open="true"] .acc-head svg:last-child { transform: rotate(180deg); }
.acc-head svg:last-child { margin-left: auto; transition: transform .15s; color: var(--ink-soft); flex-shrink: 0; }
.acc-label { flex: 1 1; }
.acc-badge {
  background: var(--accent); color: #fff;
  font: 700 10px/1 var(--sans);
  min-width: 18px; height: 18px; padding: 0 6px;
  border-radius: 999px;
  display: inline-grid; place-items: center;
}

.acc-body {
  padding: 4px 14px 16px;
  background: var(--bg-alt);
  animation: accBody .15s cubic-bezier(.3,.7,.4,1);
}
@keyframes accBody { from { opacity: 0; max-height: 0; } to { opacity: 1; max-height: 600px; } }

.acc-types {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-gap: 4px;
  gap: 4px;
  padding-top: 4px;
}
.acc-types .fpanel-type {
  width: 100%;
  justify-content: flex-start;
  padding: 9px 10px;
  border-radius: 8px;
  font-size: 12.5px;
}

.acc-pills {
  display: grid; grid-gap: 4px; gap: 4px;
}
.acc-pill {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 1px solid var(--line); background: var(--surface);
  font: 500 12.5px/1 var(--sans); color: var(--ink);
  padding: 9px 10px; border-radius: 8px;
  cursor: pointer; text-align: left;
  transition: all .12s;
}
.acc-pill:hover { border-color: var(--ink-soft); }
.acc-pill[data-on="true"] {
  background: var(--toggle-on-bg); color: var(--toggle-on-text); border-color: var(--toggle-on-bg);
}

/* Reuse fpanel-* layout but inside accordion bodies */
.acc-section .fpanel-row-head { margin-bottom: 8px; padding-top: 4px; }
.acc-section .fpanel-range { margin-top: 4px; }
.acc-section .fpanel-rating,
.acc-section .fpanel-amen {
  margin-top: 4px;
}

/* ── Image lightbox ──────────────────────────────────────────────────── */
/* Full-viewport dim overlay. Click the backdrop to close; the figure
   inside stops propagation so clicks on the image don't bubble up. */
.lightbox {
  /* High z-index to clear MapLibre HTML markers (mini-map highlighted
     pin sits in its own stacking context via inline z-index + CSS
     transforms, which can paint above modest values). Matches the
     Modal component's 9000 so the two share a tier. */
  position: fixed; inset: 0; z-index: 9000;
  background: rgba(12, 12, 14, 0.92);
  display: grid; place-items: center;
  padding: 32px;
  cursor: zoom-out;
  animation: lightbox-fade 0.15s ease-out;
}
@keyframes lightbox-fade {
  from { opacity: 0; }
  to   { opacity: 1; }
}
.lightbox-figure {
  position: relative; margin: 0;
  max-width: min(1400px, 100%);
  max-height: 100%;
  cursor: default;
  display: flex; flex-direction: column; align-items: center; gap: 12px;
}
.lightbox-figure img {
  display: block;
  max-width: 100%;
  /* Reserve room for the counter caption underneath without forcing a scrollbar. */
  max-height: calc(100vh - 100px);
  object-fit: contain;
  border-radius: 8px;
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6);
}
.lightbox-counter {
  font: 500 13px/1 var(--sans);
  color: rgba(255, 255, 255, 0.75);
  letter-spacing: 0.02em;
}
/* Floating controls — same circular treatment for close + nav so they
   read as a set. Positioned over the backdrop, not inside the figure,
   so they stay put as the image's aspect ratio changes between shots. */
.lightbox-close,
.lightbox-nav {
  position: absolute; z-index: 1;
  width: 44px; height: 44px; border-radius: 50%;
  border: 0; padding: 0;
  background: rgba(255, 255, 255, 0.12);
  color: #fff;
  display: grid; place-items: center;
  cursor: pointer;
  transition: background 0.12s;
}
.lightbox-close:hover,
.lightbox-nav:hover {
  background: rgba(255, 255, 255, 0.22);
}
.lightbox-close { top: 20px; right: 20px; }
.lightbox-prev  { left: 20px; top: 50%; transform: translateY(-50%); }
.lightbox-next  { right: 20px; top: 50%; transform: translateY(-50%); }
/* The `arrow` icon points right; flip it for the prev button. */
.lightbox-prev svg { transform: scaleX(-1); }

/* ───────── Mobile polish ─────────
   These overrides are intentionally narrow-width only so desktop keeps the
   existing layout, spacing, and visual rhythm. */
@media (max-width: 760px) {
  html,
  body {
    overflow-x: hidden;
  }

  body {
    font-size: 14px;
  }

  h1 {
    font-size: clamp(34px, 12vw, 44px);
    line-height: 1.02;
    letter-spacing: 0;
  }

  h2 {
    font-size: clamp(26px, 9vw, 34px);
    line-height: 1.08;
    letter-spacing: 0;
  }

  h3,
  h4 {
    letter-spacing: 0;
  }

  .btn-primary,
  .btn-ghost {
    min-height: 42px;
    justify-content: center;
  }

  .btn-primary.lg,
  .btn-ghost.lg {
    padding: 12px 18px;
    font-size: 14px;
  }

  .nav {
    grid-template-columns: 1fr auto;
    gap: 12px;
    padding: 12px 16px;
  }

  .nav-brand {
    min-width: 0;
  }

  .brand-name {
    font-size: 20px;
    min-width: 0;
  }

  .nav-actions {
    gap: 8px;
  }

  .nav-actions .btn-primary,
  .nav-actions .btn-ghost {
    padding: 9px 12px;
    white-space: nowrap;
  }

  .nav-account-panel {
    position: fixed;
    top: 58px;
    right: 16px;
    left: 16px;
    width: auto;
    max-width: none;
  }

  .nav-account-panel::before {
    display: none;
  }

  .hero {
    min-height: 650px;
    padding-bottom: 48px;
  }

  .hero-inner {
    padding-top: 56px;
  }

  .hero-sub {
    margin: 18px auto 26px;
    font-size: 15px;
  }

  .search {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    grid-gap: 0 8px;
    gap: 0 8px;
    width: 100%;
    max-width: none;
    padding: 10px;
    border-radius: 22px;
  }

  .search-icon {
    margin: 0 0 0 4px;
  }

  .search input {
    min-width: 0;
    padding: 12px 4px;
    font-size: 15px;
  }

  .search-go {
    grid-column: 1 / -1;
    width: 100%;
    justify-content: center;
    margin-top: 6px;
    padding: 12px 16px;
  }

  .suggest {
    justify-content: flex-start;
  }

  .section {
    padding: 52px 18px;
  }

  .section-alt > * {
    padding-left: 18px;
    padding-right: 18px;
  }

  .section-head {
    align-items: flex-start;
    flex-direction: column;
    gap: 14px;
    margin-bottom: 24px;
  }

  .spot-card {
    border-radius: 14px;
  }

  .spot-meta {
    padding: 16px;
  }

  .spot-row h3 {
    font-size: 17px;
  }

  .spot-foot {
    flex-wrap: wrap;
    row-gap: 4px;
  }

  .recent-row {
    grid-template-columns: 72px minmax(0, 1fr);
    gap: 12px;
  }

  .recent-thumb {
    width: 72px;
    height: 72px;
  }

  .recent-arrow {
    display: none;
  }

  .map-stats {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    grid-gap: 16px;
    gap: 16px;
  }

  .map-stats b {
    font-size: 28px;
    letter-spacing: 0;
  }

  .map-open-cta {
    left: 14px;
    right: 14px;
    justify-content: center;
  }

  .foot {
    padding: 40px 18px 24px;
  }

  .foot-top {
    align-items: flex-start;
    flex-direction: column;
    gap: 16px;
  }

  .foot-top p {
    text-align: left;
    margin: 0;
  }

  .foot-cols {
    grid-template-columns: 1fr 1fr;
    gap: 28px 20px;
  }

  .foot-slim {
    padding: 18px;
  }

  .foot-slim-inner {
    grid-template-columns: 1fr;
    gap: 12px;
  }

  .foot-slim-copy {
    justify-self: start;
  }

  .mapview {
    height: 100svh;
    min-height: 100svh;
  }

  .map-nav {
    grid-template-columns: auto minmax(0, 1fr) auto;
    gap: 8px;
    padding: 8px 10px;
  }

  .map-app-exit-icon {
    width: 24px;
    height: 24px;
  }

  .map-app-brand .brand-mark {
    width: 30px;
    height: 30px;
  }

  .map-search {
    border-radius: 999px;
    padding: 0 10px;
  }

  .map-search input {
    min-width: 0;
    padding: 9px 0;
    font-size: 13px;
  }

  .map-filter-toggle {
    position: relative;
    width: 38px;
    padding: 0;
    justify-content: center;
  }

  .map-filter-count {
    position: absolute;
    top: -5px;
    right: -5px;
  }

  .map-search-here,
  .map-cap-note {
    top: 12px;
    max-width: calc(100% - 104px);
    text-align: center;
  }

  .map-controls {
    top: 12px;
    right: 10px;
  }

  .spotlist {
    top: auto;
    left: 8px;
    right: 8px;
    bottom: 8px;
    width: auto !important;
    max-width: none;
    max-height: min(58vh, 460px);
    border-radius: 14px;
  }

  .map-body.view-list .spotlist {
    top: 8px;
    max-height: calc(100% - 16px);
  }

  .map-body.view-list .spotlist-scroll {
    grid-template-columns: 1fr;
    padding: 8px;
  }

  .sl-item {
    grid-template-columns: 72px minmax(0, 1fr) auto;
    gap: 8px;
    padding: 8px;
  }

  .sl-img {
    width: 72px;
    height: 72px;
  }

  .sl-amen {
    display: none;
  }

  .detail {
    top: auto;
    left: 8px;
    right: 8px;
    bottom: 8px;
    width: auto;
    max-height: min(76vh, 640px);
    border-radius: 16px;
  }

  .detail-img {
    aspect-ratio: 16 / 9;
    max-height: 200px;
    overflow: hidden;
  }

  .detail-body {
    padding: 16px;
  }

  .detail-head,
  .detail-price-row {
    align-items: stretch;
    flex-direction: column;
  }

  .detail-actions {
    width: 100%;
  }

  .detail-actions .btn-primary.sm,
  .detail-actions .btn-ghost.sm {
    flex: 1 1;
  }

  .route-panel {
    left: 8px;
    right: 8px;
    bottom: 8px;
    width: auto;
    max-height: min(46svh, 360px);
    padding: 12px 14px;
    overflow: hidden;
    /* Match the mobile spot-detail sheet's corner family so the two
     * floating cards read as part of the same surface system. */
    border-radius: var(--sheet-radius);
    transition: bottom .22s cubic-bezier(.3,.7,.4,1);
  }
  /* When the spot peek card is open, push the route panel above it so
   * the route summary + actions stay visible. --detail-h is set live
   * by DetailSheet via ResizeObserver, so the gap is exact regardless
   * of how the peek body grows (e.g. from extra amenity icons). Falls
   * back to 130 px before the observer fires so the first paint isn't
   * clipped. When the card is expanded, this rule doesn't match —
   * existing z-index hides the panel behind the larger card. */
  .detail:not([data-expanded]) ~ .route-panel {
    bottom: calc(16px + var(--detail-h, 130px));
  }

  .route-head {
    align-items: center;
    gap: 8px;
    margin-bottom: 0;
  }

  .route-head-copy {
    display: none;
  }

  .route-mobile-toggle {
    cursor: pointer;
    flex: 1 1;
    min-height: 38px;
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    grid-template-areas:
      "title icon"
      "summary icon";
    align-items: center;
    grid-gap: 1px 8px;
    gap: 1px 8px;
  }

  .route-mobile-toggle svg {
    display: block;
    grid-area: icon;
    color: var(--ink-soft);
    transform: rotate(-90deg);
    transition: transform .16s ease;
  }

  .route-panel[data-mobile-expanded="true"] .route-mobile-toggle svg {
    transform: rotate(90deg);
  }

  .route-title {
    grid-area: title;
    font-size: 15px;
    line-height: 1.1;
  }

  .route-summary {
    grid-area: summary;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: 11px;
  }

  .route-head-actions {
    gap: 4px;
    flex-shrink: 0;
  }

  .route-cog {
    width: 32px;
    height: 32px;
  }

  .route-head-actions .btn-ghost.sm {
    min-height: 32px;
    padding: 6px 9px;
    font-size: 12px;
  }

  .route-panel:not([data-mobile-expanded="true"]) .route-list,
  .route-panel:not([data-mobile-expanded="true"]) .route-error,
  .route-panel:not([data-mobile-expanded="true"]) .route-go {
    display: none;
  }

  .route-panel[data-mobile-expanded="true"] .route-list {
    margin-top: 8px;
    margin-bottom: 8px;
    max-height: min(28svh, 210px);
  }

  .route-row {
    grid-template-columns: 24px minmax(0, 1fr) auto;
    gap: 8px;
    padding: 6px 7px;
  }

  .route-num {
    width: 20px;
    height: 20px;
    font-size: 11px;
  }

  .route-info b {
    font-size: 12.5px;
  }

  .route-info span,
  .route-leg-label {
    font-size: 10.5px;
  }

  .route-leg {
    padding: 0;
    margin-left: 15px;
    gap: 8px;
  }

  .route-leg-dot {
    height: 12px;
  }

  .route-empty {
    padding: 9px 10px;
  }

  .route-go {
    min-height: 38px;
    padding: 9px 12px;
  }

  .route-settings {
    top: auto;
    bottom: calc(100% + 6px);
    left: auto;
    right: 0;
    width: min(280px, calc(100vw - 20px));
    min-width: 0;
  }

  .fpanel {
    left: 8px;
    right: 8px;
    top: 8px;
    width: auto;
    max-width: none;
    max-height: calc(100svh - 88px);
    border-radius: 12px;
    overflow: auto;
  }

  .fpanel.collapsed,
  .fpanel[data-minimised="true"] {
    width: auto;
  }

  .acc-list {
    max-height: calc(100svh - 180px);
  }

  .acb-pop {
    position: fixed;
    top: 72px;
    left: 12px;
    right: 12px;
    min-width: 0;
    max-height: calc(100svh - 96px);
    overflow: auto;
  }

  .dp-crumbs {
    overflow-x: auto;
    white-space: nowrap;
  }

  .dp-gallery {
    gap: 6px;
    grid-template-columns: 1fr;
    height: auto;
  }

  .dp-gallery-side {
    grid-template-columns: repeat(2, 1fr);
    grid-template-rows: 90px;
  }

  .dp-titlerow {
    align-items: stretch;
    gap: 16px;
  }

  .dp-title-right {
    width: 100%;
    flex-wrap: wrap;
  }

  .dp-title-right .btn-primary,
  .dp-title-right .btn-ghost {
    flex: 1 1 140px;
  }

  .admin-inline-actions,
  .admin-inline-amenity-actions {
    align-items: stretch;
    flex-direction: column;
  }

  .admin-inline-actions button,
  .admin-inline-amenity-actions button {
    justify-content: center;
  }

  .admin-inline-contact-form {
    grid-template-columns: 1fr;
  }

  .admin-inline-contact-form .admin-inline-actions,
  .admin-inline-contact-form .admin-inline-error {
    grid-column: 1;
  }

  .admin-location-editor {
    padding: 10px;
  }

  .dp-tabs {
    overflow-x: auto;
    scrollbar-width: none;
  }

  .dp-tabs::-webkit-scrollbar {
    display: none;
  }

  .dp-tabs a,
  .dp-tabs button {
    flex: 0 0 auto;
    padding: 14px 12px;
    white-space: nowrap;
  }

  .dp-body {
    gap: 28px;
    padding-top: 28px;
  }

  .dp-section {
    margin-bottom: 32px;
  }

  .dp-amen-grid,
  .dp-amen-list {
    grid-template-columns: 1fr;
  }

  .dp-photo-grid,
  .admin-photo-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .dp-rev-head,
  .dp-rev-top {
    align-items: flex-start;
    flex-direction: column;
  }

  .dp-review {
    grid-template-columns: 40px minmax(0, 1fr);
    padding: 14px;
  }

  .dp-rev-avatar {
    width: 40px;
    height: 40px;
  }

  .dp-weather {
    overflow: hidden;
  }

  .dp-weather-row {
    overflow-x: auto;
    padding-bottom: 4px;
  }

  .dp-weather-day {
    min-width: 54px;
  }

  .tp-hero {
    min-height: 520px;
  }

  .tp-hero-inner {
    padding-top: 42px;
    padding-bottom: 36px;
  }

  .tp-hero-inner h1 {
    font-size: clamp(34px, 11vw, 44px);
    line-height: 1.02;
    letter-spacing: 0;
  }

  .tp-hero-inner p {
    font-size: 15px;
  }

  .tp-hero-actions {
    align-items: stretch;
    flex-direction: column;
  }

  .tp-stats {
    margin: -18px 18px 0;
    padding: 0 !important;
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .tp-stat {
    padding: 16px 14px;
  }

  .tp-stat b {
    letter-spacing: 0;
  }

  .tp-body {
    gap: 32px;
    padding-top: 42px;
  }

  .tp-itin h2 {
    font-size: 30px;
    letter-spacing: 0;
  }

  .tp-day-tab {
    min-width: 180px;
    padding: 12px 14px;
  }

  .tp-day-detail {
    padding: 18px;
  }

  .tp-day-head {
    flex-direction: column;
  }

  .tp-day-meta {
    flex-wrap: wrap;
  }

  .tp-stop {
    padding: 10px 0;
  }

  .form-page-main,
  .dashboard-main,
  .trip-builder-page,
  .edit-spot-main {
    width: 100%;
    margin: 24px auto 56px !important;
    padding: 0 18px !important;
  }

  .form-page-main h1,
  .dashboard-main h1,
  .trip-builder-page h1,
  .edit-spot-main h1 {
    font-size: 32px !important;
    line-height: 1.05;
    letter-spacing: 0 !important;
  }

  .auth-card {
    max-width: none !important;
    margin: 24px 16px 56px !important;
    padding: 28px 20px !important;
    border-radius: 12px !important;
  }

  .auth-card h1 {
    font-size: 30px !important;
    line-height: 1.05;
    letter-spacing: 0 !important;
  }

  .spot-form-steps {
    grid-template-columns: 1fr !important;
    gap: 6px !important;
  }

  .spot-form-steps button {
    min-height: 54px;
  }

  .spot-form .fpanel-amen {
    grid-template-columns: 1fr !important;
  }

  .spot-form input[type="number"] {
    max-width: 100% !important;
  }

  .spot-form-actions {
    align-items: stretch !important;
    flex-wrap: wrap;
  }

  .spot-form-actions > button {
    flex: 1 1 120px;
  }

  .spot-form-final {
    align-items: stretch !important;
    flex-direction: column;
    width: 100%;
  }

  .spot-form-final .btn-primary {
    width: 100%;
  }

  .trip-builder input[type="range"] {
    width: min(100%, 240px) !important;
  }

  .trip-search-result,
  .trip-picked-row {
    align-items: flex-start !important;
    flex-wrap: wrap;
  }

  .trip-search-actions {
    width: 100%;
  }

  .trip-picked-row select {
    flex: 1 1 140px;
  }

  .admin-shell {
    display: block !important;
    width: 100%;
    margin: 24px auto 56px !important;
    padding: 0 18px !important;
  }

  .admin-sidebar {
    border-right: 0 !important;
    border-bottom: 1px solid var(--line);
    margin-bottom: 20px;
    padding: 0 0 16px !important;
  }

  .admin-sidebar nav {
    flex-direction: row !important;
    flex-wrap: wrap;
  }

  .admin-main {
    min-width: 0;
    overflow: hidden;
  }

  .admin-main h1 {
    font-size: 26px !important;
    letter-spacing: 0 !important;
  }

  .admin-main table {
    display: block;
    overflow-x: auto;
    padding-bottom: 8px;
    white-space: nowrap;
    -webkit-overflow-scrolling: touch;
  }

  .admin-main > div[style*="border-bottom"] {
    overflow-x: auto;
    padding-bottom: 2px;
    white-space: nowrap;
    -webkit-overflow-scrolling: touch;
  }

  .lightbox {
    padding: 14px;
  }

  .lightbox-close {
    top: 12px;
    right: 12px;
  }

  .lightbox-prev {
    left: 12px;
  }

  .lightbox-next {
    right: 12px;
  }
}

@media (max-width: 420px) {
  .nav {
    grid-template-columns: auto 1fr;
  }

  .nav .brand-name {
    display: none;
  }

  .nav-actions {
    gap: 6px;
  }

  .nav-actions .btn-primary,
  .nav-actions .btn-ghost {
    padding-left: 10px;
    padding-right: 10px;
  }

  .hero {
    min-height: 620px;
  }

  .section,
  .map-preview,
  .dp-crumbs,
  .dp-gallery,
  .dp-titlerow,
  .dp-tabs,
  .dp-body,
  .dp-nearby,
  .tp-hero-inner,
  .tp-body {
    padding-left: 16px;
    padding-right: 16px;
  }

  .foot-cols {
    grid-template-columns: 1fr;
  }

  .map-stats {
    grid-template-columns: 1fr;
  }

  .dp-gallery-side {
    grid-template-columns: repeat(2, 1fr);
    grid-template-rows: 64px 64px;
  }

  .dp-review {
    grid-template-columns: 1fr;
  }

  .admin-location-fields {
    grid-template-columns: 1fr;
  }

  .admin-location-button {
    left: 12px;
    right: auto;
  }

  .dp-rev-avatar {
    width: 36px;
    height: 36px;
  }

  .tp-stats {
    grid-template-columns: 1fr;
  }

  .tp-stop {
    grid-template-columns: 24px minmax(0, 1fr);
  }

  .tp-stop-img {
    display: none;
  }
}

/* Theme toggle button — sits in Nav alongside sign-in / Add Spot. */
.theme-toggle {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 1px solid var(--line); background: transparent;
  width: 38px; height: 38px; border-radius: 999px;
  display: inline-grid; place-items: center; color: var(--ink-soft);
  cursor: pointer; transition: background .15s, color .15s, border-color .15s;
}
.theme-toggle:hover { background: var(--bg-alt); color: var(--ink); }
.theme-toggle:focus-visible {
  outline: 0;
  box-shadow: 0 0 0 3px rgba(47, 90, 58, 0.18);
}
.tp-nav-overlay .theme-toggle {
  border-color: rgba(255, 255, 255, 0.28);
  color: rgba(255, 255, 255, 0.88);
}
.tp-nav-overlay .theme-toggle:hover {
  background: rgba(255, 255, 255, 0.18);
  color: #fff;
}

/* ===========================================================
   Dark theme — driven by [data-theme="dark"] on <html>.
   The ThemeProvider sets this from system preference + the
   user's persisted choice. Overrides token values from :root;
   most components inherit the new palette automatically because
   they use --surface, --bg, --ink, --line tokens.
   =========================================================== */
[data-theme="dark"] {
  color-scheme: dark;
  --bg: #11140f;
  --bg-alt: #1a1f1a;
  --ink: #e6ebe1;
  --ink-soft: #9ba59a;
  --line: #2d332c;
  --primary: #4d9962;
  --primary-deep: #5fb377;
  --accent: #ee7a4d;
  --accent-2: #f0bd5d;

  --surface: #1a1f1a;
  --surface-2: #232a23;
  --surface-overlay: rgba(26, 31, 26, 0.96);
  --surface-overlay-strong: rgba(26, 31, 26, 0.92);
  --surface-overlay-soft: rgba(26, 31, 26, 0.7);
  --surface-inverse: #07090a;
  --on-inverse: #f1f3ee;
  --toggle-on-bg: var(--primary);
  --toggle-on-text: #ffffff;
  --scrim: rgba(0, 0, 0, 0.65);

  --map-bg: #14181a;
  --map-land: #1f2520;
  --map-stroke: #3a4138;
  --map-water: #1a2c44;

  --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4), 0 4px 14px rgba(0, 0, 0, 0.35);
  --shadow-md: 0 4px 10px rgba(0, 0, 0, 0.5), 0 14px 30px rgba(0, 0, 0, 0.5);
}

/* Warm-tinted error/hover surfaces — recolored as dark warm tints. */
[data-theme="dark"] .sl-item.sel {
  background: rgba(238, 122, 77, 0.12);
}
[data-theme="dark"] .admin-inline-error,
[data-theme="dark"] .admin-review-error {
  color: #ffb39a;
  background: rgba(238, 122, 77, 0.12);
  border-color: rgba(238, 122, 77, 0.3);
}
[data-theme="dark"] .admin-review-delete {
  color: #ffb39a;
  border-color: rgba(238, 122, 77, 0.3);
}
[data-theme="dark"] .admin-review-delete:hover {
  background: rgba(238, 122, 77, 0.12);
}

/* Native input fields inherit color-scheme:dark via the body, but explicit
   form controls that draw their own surface need to flip too. */
[data-theme="dark"] input,
[data-theme="dark"] textarea,
[data-theme="dark"] select {
  color-scheme: dark;
}

/* Subtle: dark hero gradient is a touch deeper so spot photos still pop. */
[data-theme="dark"] .hero-bg-tint {
  background:
    linear-gradient(180deg, rgba(0, 0, 0, 0.6) 0%, rgba(0, 0, 0, 0.4) 30%, var(--bg) 95%),
    linear-gradient(90deg, rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0.15));
}

/* Footer text already uses literal whites; in dark mode the footer slab
   is even darker (--surface-inverse), so keep the existing whites. */

/* ===========================================================
   PROFILE PAGE  (/u/[slug])
   =========================================================== */
.prof { background: var(--bg); min-height: 100vh; }
.prof-empty {
  font-size: 14px; color: var(--ink-soft);
  padding: 18px 0;
}

/* Hero */
.prof-hero {
  position: relative;
  height: 56vh; min-height: 480px; max-height: 640px;
  overflow: hidden;
}
.prof-hero-img {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: cover; display: block;
}
.prof-hero-img-fallback {
  background: linear-gradient(135deg, var(--primary) 0%, var(--accent) 100%);
}
.prof-hero-shade {
  position: absolute; inset: 0;
  background: linear-gradient(180deg,
    rgba(20, 30, 15, 0.20) 0%,
    rgba(20, 30, 15, 0.40) 50%,
    rgba(20, 30, 15, 0.88) 100%);
}
.prof-hero-text {
  position: absolute; left: 0; right: 0; bottom: 0;
  padding: 56px 56px 64px;
  max-width: 1280px; margin: 0 auto;
  color: #fff;
}
.prof-hero-eyebrow {
  display: inline-flex; align-items: center; gap: 8px;
  font: 600 12px/1 var(--mono);
  text-transform: uppercase; letter-spacing: 0.12em;
  padding: 8px 14px; border-radius: 999px;
  background: rgba(255, 255, 255, 0.15);
  -webkit-backdrop-filter: blur(8px);
          backdrop-filter: blur(8px);
  border: 1px solid rgba(255, 255, 255, 0.2);
  margin-bottom: 20px;
  color: #fff;
}
.prof-hero-text h1 {
  font-family: var(--display);
  font-size: clamp(48px, 6vw, 84px);
  font-weight: 600; line-height: 0.98;
  letter-spacing: -0.03em;
  text-wrap: balance;
  color: #fff;
  margin: 0 0 14px;
}
.prof-hero-sub {
  font-family: var(--display);
  font-style: italic;
  font-size: 20px; line-height: 1.45;
  color: rgba(255, 255, 255, 0.88);
  max-width: 640px;
  margin: 0 0 18px;
  text-wrap: pretty;
}
.prof-hero-meta {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  font: 500 13.5px var(--sans);
  color: rgba(255, 255, 255, 0.85);
  margin-bottom: 22px;
}
.prof-hero-meta span { display: inline-flex; align-items: center; gap: 6px; }
.prof-hero-bullet { opacity: 0.5; }
.prof-hero-handle { font-family: var(--mono); font-size: 12.5px; }
.prof-hero-avatar {
  position: absolute; top: 56px; right: 56px;
  z-index: 2;
}
.prof-avatar {
  width: 88px; height: 88px;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--accent) 0%, var(--accent-2) 100%);
  color: #fff;
  display: inline-flex; align-items: center; justify-content: center;
  font: 700 36px var(--display);
  box-shadow: 0 6px 24px rgba(0, 0, 0, 0.25), 0 0 0 4px rgba(255, 255, 255, 0.2);
}
.prof-avatar-img {
  width: 88px; height: 88px;
  border-radius: 50%;
  object-fit: cover;
  box-shadow: 0 6px 24px rgba(0, 0, 0, 0.25), 0 0 0 4px rgba(255, 255, 255, 0.2);
}

/* Cover-edit floating buttons (top-right of hero, owner only) */
.prof-hero-edit {
  position: absolute; top: 16px; left: 16px;
  z-index: 3;
  display: flex; flex-direction: column; gap: 6px;
  align-items: flex-start;
}
.prof-hero-edit-btn {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 0; cursor: pointer;
  display: inline-flex; align-items: center; gap: 6px;
  padding: 7px 12px;
  border-radius: 999px;
  background: var(--surface-overlay-strong);
  color: var(--ink);
  font: 600 12px var(--sans);
  -webkit-backdrop-filter: blur(8px);
          backdrop-filter: blur(8px);
  border: 1px solid rgba(255, 255, 255, 0.18);
}
.prof-hero-edit-btn:hover { background: var(--surface); }
.prof-hero-edit-btn:disabled { opacity: 0.6; cursor: progress; }
.prof-hero-edit-btn-ghost {
  background: rgba(0, 0, 0, 0.4);
  color: #fff;
  border-color: rgba(255, 255, 255, 0.22);
}
.prof-hero-edit-btn-ghost:hover { background: rgba(0, 0, 0, 0.6); }
.prof-hero-edit-err {
  margin: 0;
  font: 500 11.5px var(--sans);
  color: #ffb39a;
  padding: 4px 8px;
  background: rgba(0, 0, 0, 0.45);
  border-radius: 6px;
  -webkit-backdrop-filter: blur(8px);
          backdrop-filter: blur(8px);
}

/* Inline-edit fields (click to edit on hero) */
.inline-edit-read {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 0; background: transparent;
  font: inherit; color: inherit; padding: 0; margin: 0;
  text-align: left; cursor: pointer;
  display: inline-flex; align-items: center; gap: 6px;
  border-radius: 8px;
  position: relative;
  transition: background 0.12s;
  padding: 2px 8px;
  margin-left: -8px;
}
.inline-edit-read:hover {
  background: rgba(255, 255, 255, 0.12);
}
.inline-edit-read .inline-edit-pencil {
  opacity: 0;
  display: inline-flex; align-items: center;
  color: rgba(255, 255, 255, 0.6);
  transition: opacity 0.12s;
}
.inline-edit-read:hover .inline-edit-pencil { opacity: 1; }
.inline-edit-read.is-empty .inline-edit-value {
  font-style: italic;
  opacity: 0.55;
}
.inline-edit-prefix {
  font-family: var(--mono);
  font-size: 0.85em;
  opacity: 0.7;
}
/* Read-state sizing tweaks per slot — h1, p, span are picked up via .as */
.prof-hero-h1.inline-edit-read,
.prof-hero-bio.inline-edit-read {
  display: flex;
  width: -moz-fit-content;
  width: fit-content;
  max-width: 100%;
  margin-bottom: 14px;
}
.prof-hero-h1 .inline-edit-value {
  font-family: var(--display);
  font-size: clamp(48px, 6vw, 84px);
  font-weight: 600; line-height: 0.98;
  letter-spacing: -0.03em;
  text-wrap: balance;
  margin: 0;
}
.prof-hero-bio { max-width: 640px; }
.prof-hero-bio .inline-edit-value {
  font-family: var(--display);
  font-style: italic;
  font-size: 20px; line-height: 1.45;
}
.prof-hero-meta-field {
  font: 500 13.5px var(--sans);
}

/* Edit-state — input/textarea + actions */
.inline-edit-edit {
  display: inline-flex; flex-direction: column; gap: 8px;
  margin-bottom: 10px;
  width: 100%;
  max-width: 640px;
}
.inline-edit-edit.is-multiline { display: flex; }
.inline-edit-input,
.inline-edit-textarea {
  font: 500 14px/1.5 var(--sans);
  color: #fff;
  background: rgba(0, 0, 0, 0.4);
  border: 1px solid rgba(255, 255, 255, 0.32);
  border-radius: 10px;
  padding: 8px 12px;
  outline: none;
  width: 100%;
  -webkit-backdrop-filter: blur(8px);
          backdrop-filter: blur(8px);
}
.inline-edit-input::placeholder,
.inline-edit-textarea::placeholder {
  color: rgba(255, 255, 255, 0.4);
}
.inline-edit-input:focus,
.inline-edit-textarea:focus {
  border-color: rgba(255, 255, 255, 0.6);
  background: rgba(0, 0, 0, 0.55);
}
.inline-edit-textarea { resize: vertical; min-height: 64px; }
.inline-edit-actions {
  display: inline-flex; gap: 6px; align-items: center;
}
.inline-edit-cancel,
.inline-edit-save {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; border: 0; cursor: pointer;
  font: 600 12px var(--sans);
  padding: 6px 12px;
  border-radius: 999px;
}
.inline-edit-cancel {
  background: rgba(255, 255, 255, 0.14);
  color: #fff;
}
.inline-edit-cancel:hover { background: rgba(255, 255, 255, 0.24); }
.inline-edit-save {
  background: var(--accent);
  color: #fff;
}
.inline-edit-save:hover { background: var(--accent-2); color: var(--ink); }
.inline-edit-save:disabled,
.inline-edit-cancel:disabled { opacity: 0.6; cursor: progress; }
.inline-edit-error {
  margin: 0;
  font: 500 12px var(--sans);
  color: #ffb39a;
}

/* Sticky meta strip */
.prof-meta {
  background: var(--surface);
  border-bottom: 1px solid var(--line);
  position: -webkit-sticky;
  position: sticky; top: 0; z-index: 20;
}
.prof-meta-inner {
  max-width: 1280px; margin: 0 auto;
  padding: 22px 56px;
  display: flex; gap: 36px;
  align-items: center; flex-wrap: wrap;
}
.prof-meta-stat {
  display: flex; flex-direction: column; gap: 5px;
  background: transparent; border: 0; padding: 0;
  text-align: left; font: inherit; color: inherit;
}
.prof-meta-stat b {
  font-family: var(--display); font-size: 30px; font-weight: 600;
  letter-spacing: -0.02em; line-height: 1; color: var(--ink);
}
.prof-meta-stat span {
  font: 600 11px/1 var(--mono); color: var(--ink-soft);
  text-transform: uppercase; letter-spacing: 0.08em;
}
.prof-meta-stat-btn { cursor: pointer; transition: transform 0.15s; }
.prof-meta-stat-btn:disabled { cursor: default; opacity: 0.6; }
.prof-meta-stat-btn:not(:disabled):hover { transform: translateY(-2px); }
.prof-meta-stat-btn:not(:disabled):hover b { color: var(--accent); }
.prof-meta-divider { width: 1px; height: 36px; background: var(--line); }

/* Sections */
.prof-section { padding: 64px 0 80px; }
.prof-section + .prof-section { border-top: 1px solid var(--line); }
.prof-section-inner { max-width: 1280px; margin: 0 auto; padding: 0 56px; }
.prof-timeline-inner { max-width: 920px; }
.prof-timeline-head { text-align: center; margin-bottom: 48px; }
.prof-timeline-head h2 {
  font-family: var(--display);
  font-size: 44px; font-weight: 600;
  letter-spacing: -0.02em; line-height: 1.05;
  margin: 12px 0 14px;
  color: var(--ink); text-wrap: balance;
}
.prof-timeline-head p {
  color: var(--ink-soft);
  font-family: var(--display); font-style: italic;
  font-size: 17px; max-width: 540px;
  margin: 0 auto; line-height: 1.55;
}

/* Trips timeline */
.prof-tl { position: relative; margin-top: 32px; }
.prof-tl-spine {
  position: absolute; left: 110px; top: 8px; bottom: 32px;
  width: 2px;
  background-image: linear-gradient(180deg, var(--line) 0%, var(--line) 50%, transparent 50%);
  background-size: 2px 8px;
  background-repeat: repeat-y;
  z-index: 0;
}
.prof-tl-year + .prof-tl-year { margin-top: 8px; }
.prof-tl-year-head {
  display: flex; align-items: baseline; gap: 14px;
  padding: 28px 0 16px 130px;
  position: relative; z-index: 1;
}
.prof-tl-year-num {
  font-family: var(--display);
  font-size: 30px; font-weight: 600;
  letter-spacing: -0.02em; line-height: 1; color: var(--ink);
}
.prof-tl-year-meta {
  font: 500 12px var(--mono);
  color: var(--ink-soft);
  text-transform: uppercase; letter-spacing: 0.06em;
}
.prof-tl-now {
  display: flex; align-items: center;
  margin: 24px 0;
  position: relative; z-index: 2;
}
.prof-tl-now-marker {
  width: 110px;
  display: flex; justify-content: center;
  position: relative;
}
.prof-tl-now-marker::before,
.prof-tl-now-marker::after {
  content: ''; position: absolute; top: 50%; height: 1px;
  background: var(--accent);
}
.prof-tl-now-marker::before { left: 0; right: 50%; }
.prof-tl-now-marker::after  { left: 50%; right: 0; }
.prof-tl-now-dot {
  width: 14px; height: 14px; border-radius: 50%;
  background: var(--accent);
  box-shadow: 0 0 0 4px var(--bg), 0 0 0 5px var(--accent);
  position: relative; z-index: 2;
}
.prof-tl-now-label {
  display: flex; align-items: baseline; gap: 12px;
  padding-left: 20px;
}
.prof-tl-now-label span {
  font: 700 13px var(--mono);
  text-transform: uppercase; letter-spacing: 0.1em;
  color: var(--accent);
}
.prof-tl-now-label em {
  font-style: normal;
  font: 500 13px var(--sans);
  color: var(--ink-soft);
}
.prof-tl-row {
  display: grid;
  grid-template-columns: 110px 24px 1fr;
  align-items: stretch;
  position: relative; z-index: 1;
  margin-bottom: 18px;
}
.prof-tl-date {
  padding-top: 18px;
  display: flex; flex-direction: column; align-items: flex-end;
  gap: 1px; padding-right: 18px; text-align: right;
}
.prof-tl-day {
  font-family: var(--display); font-size: 30px; font-weight: 600;
  line-height: 1; letter-spacing: -0.01em; color: var(--ink);
}
.prof-tl-mon {
  font: 700 11px var(--mono);
  text-transform: uppercase; letter-spacing: 0.1em;
  color: var(--ink-soft); margin-top: 2px;
}
.prof-tl-thru {
  font: 500 11px var(--mono);
  color: var(--ink-soft); margin-top: 4px; opacity: 0.8;
}
.prof-tl-node { display: flex; justify-content: center; padding-top: 26px; }
.prof-tl-node-dot {
  width: 14px; height: 14px; border-radius: 50%;
  background: var(--ink);
  box-shadow: 0 0 0 4px var(--bg), 0 4px 10px rgba(0, 0, 0, 0.08);
  position: relative; z-index: 2;
}
.prof-tl-card {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 18px;
  overflow: hidden;
  transition: transform 0.2s, box-shadow 0.2s, border-color 0.2s;
  display: grid;
  grid-template-columns: 240px 1fr;
  margin-left: 18px;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.03);
}
.prof-tl-card:hover {
  transform: translateY(-2px);
  box-shadow: var(--shadow-md);
}
.prof-tl-cover { position: relative; overflow: hidden; min-height: 140px; }
.prof-tl-cover img { width: 100%; height: 100%; object-fit: cover; display: block; }
.prof-tl-cover-fallback {
  width: 100%; height: 100%;
  background: linear-gradient(135deg, var(--bg-alt), var(--surface-2));
}
.prof-tl-status {
  position: absolute; top: 10px; left: 10px;
  display: inline-flex; align-items: center; gap: 5px;
  font: 600 9.5px/1 var(--mono);
  color: #fff;
  text-transform: uppercase; letter-spacing: 0.06em;
  padding: 5px 8px; border-radius: 5px;
}
.prof-trip-dot {
  width: 6px; height: 6px; border-radius: 50%;
  background: #fff;
  animation: profPulse 1.6s ease-in-out infinite;
}
@keyframes profPulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } }
.prof-tl-body {
  padding: 16px 22px 18px;
  display: flex; flex-direction: column; justify-content: center;
}
.prof-tl-body-head { display: flex; align-items: baseline; gap: 12px; margin-bottom: 4px; }
.prof-tl-body-head h3 {
  font-family: var(--display);
  font-size: 21px; font-weight: 600;
  letter-spacing: -0.01em; line-height: 1.2;
  margin: 0; color: var(--ink); flex: 1 1;
}
.prof-tl-body p {
  font-size: 13.5px;
  color: var(--ink-soft);
  margin: 0 0 12px;
}
.prof-tl-meta {
  display: flex; gap: 14px; flex-wrap: wrap; align-items: center;
  font: 500 12px var(--sans);
  color: var(--ink-soft);
  padding-top: 10px;
  border-top: 1px solid var(--line);
}
.prof-tl-meta > span { display: inline-flex; align-items: center; gap: 4px; }
.prof-tl-flags { margin-left: auto; display: inline-flex; gap: 4px; }
.prof-tl-flags em {
  font-style: normal;
  font: 700 9.5px/1 var(--mono);
  letter-spacing: 0.08em;
  color: var(--ink-soft);
  background: var(--bg-alt);
  padding: 4px 6px; border-radius: 4px;
}
.prof-tl-row-past .prof-tl-day { color: var(--ink-soft); font-weight: 500; }
.prof-tl-row-past .prof-tl-node-dot { background: var(--ink-soft); }
.prof-tl-row-upcoming .prof-tl-day { color: var(--accent); }

/* Spots grid */
.prof-spots-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-gap: 16px;
  gap: 16px;
  margin-top: 24px;
}

/* Spots flyout */
.prof-flyout-scrim {
  position: fixed; inset: 0;
  background: var(--scrim);
  -webkit-backdrop-filter: blur(2px);
          backdrop-filter: blur(2px);
  z-index: 100;
  display: flex; justify-content: flex-end;
  animation: profScrimIn 0.18s ease-out;
}
@keyframes profScrimIn { from { opacity: 0; } to { opacity: 1; } }
.prof-flyout {
  width: min(560px, 100%);
  height: 100%;
  background: var(--bg);
  display: flex; flex-direction: column;
  box-shadow: -20px 0 60px rgba(0, 0, 0, 0.18);
  animation: profFlyIn 0.26s cubic-bezier(0.2, 0.8, 0.2, 1);
}
@keyframes profFlyIn {
  from { transform: translateX(40px); opacity: 0; }
  to   { transform: translateX(0); opacity: 1; }
}
.prof-flyout-head {
  padding: 24px 28px 18px;
  border-bottom: 1px solid var(--line);
  display: flex; justify-content: space-between; align-items: flex-start;
  gap: 16px;
}
.prof-flyout-head h2 {
  font-family: var(--display);
  font-size: 26px; font-weight: 600;
  letter-spacing: -0.015em; line-height: 1.1;
  margin: 6px 0 4px;
  color: var(--ink);
}
.prof-flyout-head p { font-size: 13px; color: var(--ink-soft); margin: 0; }
.prof-flyout-close {
  width: 36px; height: 36px;
  border-radius: 8px;
  border: 1px solid var(--line);
  background: var(--surface);
  display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer; color: var(--ink);
  flex-shrink: 0;
}
.prof-flyout-close:hover { background: var(--bg-alt); }
.prof-flyout-toolbar {
  display: flex; justify-content: space-between; align-items: center;
  gap: 14px;
  padding: 14px 28px;
  border-bottom: 1px solid var(--line);
  background: var(--bg);
}
.prof-flyout-tabs { display: flex; gap: 6px; flex-wrap: wrap; }
.prof-flyout-tabs button {
  font: 600 12px var(--sans);
  color: var(--ink-soft);
  background: transparent;
  border: 1px solid transparent;
  border-radius: 999px;
  padding: 6px 11px;
  display: inline-flex; align-items: center; gap: 6px;
  cursor: pointer;
}
.prof-flyout-tabs button:hover { background: var(--surface); color: var(--ink); }
.prof-flyout-tabs button.on {
  background: var(--toggle-on-bg);
  color: var(--toggle-on-text);
  border-color: var(--toggle-on-bg);
}
.prof-flyout-tabs .ct {
  font: 500 10.5px var(--mono);
  opacity: 0.7;
}
.prof-flyout-sort {
  display: inline-flex; align-items: center; gap: 8px;
  font: 600 11px var(--mono);
  color: var(--ink-soft);
  text-transform: uppercase; letter-spacing: 0.06em;
}
.prof-flyout-sort select {
  font: 500 12.5px var(--sans);
  color: var(--ink);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 8px;
  padding: 6px 10px;
  cursor: pointer;
}
.prof-flyout-body {
  flex: 1 1; overflow-y: auto;
  padding: 8px 16px 16px;
}
.prof-flyout-list {
  list-style: none; padding: 0; margin: 0;
  display: flex; flex-direction: column; gap: 4px;
}
.prof-flyout-row {
  display: grid;
  grid-template-columns: 88px 1fr auto;
  grid-gap: 14px;
  gap: 14px; align-items: center;
  padding: 12px;
  border-radius: 12px;
  transition: background 0.12s;
}
.prof-flyout-row:hover { background: var(--surface); }
.prof-flyout-thumb {
  width: 88px; height: 64px;
  border-radius: 8px; overflow: hidden;
  background: var(--bg-alt);
}
.prof-flyout-thumb img { width: 100%; height: 100%; object-fit: cover; }
.prof-flyout-row-head {
  display: flex; align-items: center; gap: 10px;
  margin-bottom: 2px;
}
.prof-flyout-row-head h4 {
  font-family: var(--display);
  font-size: 16px; font-weight: 600;
  letter-spacing: -0.005em; line-height: 1.2;
  margin: 0; color: var(--ink);
  flex: 1 1; min-width: 0;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.prof-flyout-region { font-size: 12.5px; color: var(--ink-soft); margin: 0 0 4px; }
.prof-flyout-row-meta {
  display: flex; gap: 6px;
  font: 500 11.5px var(--mono);
  color: var(--ink-soft);
}
.prof-spot-bullet { opacity: 0.5; }
.prof-flyout-row-action {
  width: 32px; height: 32px;
  border-radius: 50%;
  background: transparent;
  border: 1px solid transparent;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--ink-soft);
  flex-shrink: 0;
  text-decoration: none;
}
.prof-flyout-row:hover .prof-flyout-row-action {
  background: var(--toggle-on-bg);
  color: var(--toggle-on-text);
}
.prof-flyout-empty {
  padding: 48px 16px;
  text-align: center;
  font-size: 14px; color: var(--ink-soft);
}
.prof-flyout-foot {
  padding: 16px 28px;
  border-top: 1px solid var(--line);
  display: flex; justify-content: flex-end; gap: 10px;
  background: var(--surface);
}


@media (max-width: 980px) {
  .prof-hero-text { padding: 32px 24px 40px; }
  .prof-hero-avatar { top: 32px; right: 24px; }
  .prof-avatar, .prof-avatar-img { width: 64px; height: 64px; font-size: 26px; }
  .prof-meta-inner { padding: 16px 24px; gap: 22px; }
  .prof-meta-stat b { font-size: 22px; }
  .prof-section-inner { padding: 0 24px; }
  .prof-spots-grid { grid-template-columns: repeat(2, 1fr); }
  .prof-tl-spine { left: 60px; }
  .prof-tl-year-head { padding-left: 80px; }
  .prof-tl-row { grid-template-columns: 60px 24px 1fr; }
  .prof-tl-card { grid-template-columns: 120px 1fr; margin-left: 12px; }
  .prof-tl-now-marker { width: 60px; }
}

/* ───────── Profile flyout — mobile bottom sheet ─────────
 * Right-edge drawer reads as "panel" on desktop but feels like a
 * takeover on phones. Convert to a bottom-anchored sheet with sticky
 * header so the close target is always reachable. */
@media (max-width: 760px) {
  .prof-flyout-scrim {
    align-items: flex-end;
    justify-content: stretch;
  }
  .prof-flyout {
    width: 100%;
    height: auto;
    max-height: 92vh;
    border-radius: var(--sheet-radius) var(--sheet-radius) 0 0;
    box-shadow: 0 -16px 40px rgba(0, 0, 0, 0.18);
    animation: profSheetUp 0.26s cubic-bezier(0.2, 0.8, 0.2, 1);
  }
  .prof-flyout-head {
    position: -webkit-sticky;
    position: sticky;
    top: 0;
    z-index: 2;
    background: var(--bg);
    padding: 18px 20px 14px;
  }
  /* Grab handle pseudo-element above the title for the bottom-sheet
   * affordance. */
  .prof-flyout-head::before {
    content: "";
    position: absolute;
    top: 6px; left: 50%;
    transform: translateX(-50%);
    width: 36px; height: 4px;
    border-radius: 999px;
    background: var(--line);
  }
  .prof-flyout-close {
    min-width: var(--tap-min);
    min-height: var(--tap-min);
  }
  .prof-flyout-toolbar {
    padding: 12px 20px;
  }
}
@keyframes profSheetUp {
  from { transform: translateY(100%); }
  to   { transform: translateY(0); }
}

/* ===========================================================
   ADMIN SHELL + DASHBOARD
   =========================================================== */
.admin-shell {
  display: grid;
  /* minmax(0,1fr) — without the 0 floor, wide cell content (long URLs in
     contributions, big tables) refuses to shrink and pushes the grid past
     max-width. */
  grid-template-columns: 220px minmax(0, 1fr);
  grid-gap: 32px;
  gap: 32px;
  /* Explicit width + max-width is load-bearing: as a flex item inside
     `.home` (column flex), auto cross-axis margins normally override
     stretch and shrink the item to its content's natural width — so each
     admin page rendered at a different width, and the sidebar drifted
     horizontally between pages. Setting width: 100% pins the cross-axis
     size to the container, then max-width clamps and the auto margins
     center the result. */
  width: 100%;
  max-width: 1280px;
  margin: 32px auto;
  padding: 0 32px;
  min-height: calc(100vh - 200px);
}
.admin-sidebar {
  display: flex; flex-direction: column;
  gap: 4px;
  padding-right: 16px;
  border-right: 1px solid var(--line);
}
.admin-side-brand {
  display: inline-flex; align-items: center; gap: 8px;
  margin-bottom: 22px;
  font: 700 14px/1 var(--display);
  letter-spacing: -0.01em;
  color: var(--ink);
  text-decoration: none;
}
.admin-side-brand-mark {
  width: 26px; height: 26px;
  border-radius: 7px;
  background: var(--ink); color: var(--on-inverse);
  display: inline-grid; place-items: center;
}
.admin-side-section-label {
  font: 600 11px/1 var(--mono);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-soft);
  margin: 8px 0 8px;
}
.admin-side-nav { display: flex; flex-direction: column; gap: 2px; }
.admin-side-link {
  display: inline-flex; align-items: center; gap: 10px;
  padding: 8px 12px;
  border-radius: 8px;
  font: 500 14px var(--sans);
  color: var(--ink);
  text-decoration: none;
  transition: background 0.12s, color 0.12s;
}
.admin-side-link:hover { background: var(--bg-alt); }
.admin-side-link[data-active] {
  background: var(--bg-alt);
  color: var(--ink);
  font-weight: 600;
}
.admin-side-link[data-active]::before {
  content: '';
  width: 3px; height: 16px;
  border-radius: 2px;
  background: var(--accent);
  margin-left: -4px;
  margin-right: 4px;
}
.admin-side-foot {
  /* Anchor the foot a fixed distance below the moderation nav. Using
     `margin-top: auto` here would push it to the bottom of the sidebar
     column, which grows as the main column streams in — the Settings link
     would slide down during initial load. A static gap keeps it put. */
  margin-top: 20px;
  padding-top: 16px;
  border-top: 1px solid var(--line);
}
.admin-side-back {
  display: inline-flex; align-items: center; gap: 8px;
  margin-bottom: 22px;
  font: 600 13px var(--sans);
  color: var(--ink-soft);
  text-decoration: none;
  transition: color 0.12s;
}
.admin-side-back:hover { color: var(--ink); }

/* Dashboard */
.admin-dash { display: flex; flex-direction: column; gap: 32px; }
.admin-dash-head {
  display: flex; justify-content: space-between; align-items: flex-end;
  gap: 24px;
}
.admin-dash-head h1 {
  font-family: var(--display);
  font-size: 36px; font-weight: 600;
  letter-spacing: -0.02em; line-height: 1;
  margin: 0 0 8px;
  color: var(--ink);
}
.admin-dash-head p {
  margin: 0; color: var(--ink-soft); font-size: 14px;
}
.admin-dash-settings-link { white-space: nowrap; }

/* Stat cards */
.admin-dash-cards {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-gap: 14px;
  gap: 14px;
}
.admin-card {
  display: flex; flex-direction: column;
  padding: 18px 18px 14px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 14px;
  text-decoration: none;
  color: var(--ink);
  transition: border-color 0.15s, transform 0.15s, box-shadow 0.15s;
}
.admin-card:hover {
  transform: translateY(-2px);
  box-shadow: var(--shadow-sm);
  border-color: var(--ink-soft);
}
.admin-card[data-tone="warn"] {
  border-color: rgba(232, 105, 58, 0.4);
}
.admin-card[data-tone="warn"] .admin-card-icon {
  background: rgba(232, 105, 58, 0.14);
  color: var(--accent);
}
.admin-card-head {
  display: flex; align-items: center; gap: 10px;
  margin-bottom: 10px;
}
.admin-card-icon {
  width: 28px; height: 28px;
  border-radius: 8px;
  background: var(--bg-alt);
  color: var(--ink-soft);
  display: inline-grid; place-items: center;
}
.admin-card-label {
  font: 600 12.5px var(--sans);
  color: var(--ink-soft);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  font-size: 11.5px;
}
.admin-card-value {
  font-family: var(--display);
  font-size: 36px; font-weight: 600;
  letter-spacing: -0.02em; line-height: 1;
  color: var(--ink);
  margin-bottom: 12px;
}
.admin-card-breakdown {
  list-style: none; padding: 0; margin: 0;
  display: flex; gap: 14px; flex-wrap: wrap;
  border-top: 1px solid var(--line);
  padding-top: 10px;
}
.admin-card-breakdown li {
  display: inline-flex; align-items: baseline; gap: 5px;
  font-size: 12px; color: var(--ink-soft);
}
.admin-card-breakdown li em {
  font-style: normal;
  font-weight: 600;
  color: var(--ink);
}
.admin-card-breakdown li[data-danger] em {
  color: var(--accent);
}

/* Two-column dashboard grid */
.admin-dash-grid {
  display: grid;
  grid-template-columns: 1.2fr 1fr;
  grid-gap: 16px;
  gap: 16px;
}
.admin-dash-attention { grid-row: span 2; }
.admin-dash-block {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 14px;
  padding: 18px 20px 14px;
  display: flex; flex-direction: column;
  min-width: 0;
}
.admin-dash-block > header {
  display: flex; justify-content: space-between; align-items: baseline;
  margin-bottom: 14px;
  gap: 12px;
}
.admin-dash-block h2 {
  font-family: var(--display);
  font-size: 18px; font-weight: 600;
  letter-spacing: -0.01em; line-height: 1.2;
  margin: 0;
  color: var(--ink);
}
.admin-dash-block h2 a {
  color: inherit;
  transition: color 0.12s;
}
.admin-dash-block h2 a:hover { color: var(--accent); }
.admin-dash-block > header > span {
  font: 500 11.5px var(--mono);
  color: var(--ink-soft);
}
.admin-dash-block > header > a {
  font: 600 12px var(--sans);
  color: var(--ink-soft);
  text-decoration: none;
}
.admin-dash-block > header > a:hover { color: var(--ink); }
.admin-dash-empty {
  font-size: 13.5px; color: var(--ink-soft);
  margin: 8px 0 4px;
}

/* Attention list */
.admin-dash-attention-list {
  list-style: none; padding: 0; margin: 0;
  display: flex; flex-direction: column;
  gap: 4px;
}
.admin-dash-attention-list a {
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  grid-gap: 12px;
  gap: 12px;
  padding: 10px 12px;
  border-radius: 10px;
  text-decoration: none;
  color: var(--ink);
}
.admin-dash-attention-list a:hover { background: var(--bg-alt); }
.admin-dash-attention-pill {
  font: 600 10.5px/1 var(--mono);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  padding: 4px 8px;
  border-radius: 999px;
  background: var(--bg-alt);
  color: var(--ink-soft);
}
.admin-dash-attention-pill[data-kind="photo"] {
  background: rgba(232, 105, 58, 0.16);
  color: var(--accent);
}
.admin-dash-attention-list b {
  font-size: 13.5px; color: var(--ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  min-width: 0;
}
.admin-dash-attention-list em {
  font-style: normal;
  font: 500 11.5px var(--mono);
  color: var(--ink-soft);
}

/* Generic admin-dash list */
.admin-dash-list {
  list-style: none; padding: 0; margin: 0;
  display: flex; flex-direction: column;
  gap: 2px;
}
.admin-dash-list a {
  display: grid;
  grid-template-columns: 44px 1fr auto;
  align-items: center;
  grid-gap: 12px;
  gap: 12px;
  padding: 8px 10px;
  border-radius: 10px;
  text-decoration: none;
  color: var(--ink);
}
.admin-dash-list a:hover { background: var(--bg-alt); }
.admin-dash-list a > img {
  width: 44px; height: 44px;
  object-fit: cover;
  border-radius: 8px;
  flex-shrink: 0;
}
.admin-dash-list a > div { min-width: 0; }
.admin-dash-list a b {
  font-size: 13.5px;
  display: block;
  color: var(--ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.admin-dash-list a span {
  font: 500 12px var(--sans);
  color: var(--ink-soft);
  display: block;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.admin-dash-list a em {
  font-style: normal;
  font: 600 11.5px var(--mono);
  color: var(--ink-soft);
  display: inline-flex; align-items: center; gap: 4px;
  padding: 3px 8px;
  border-radius: 999px;
  background: var(--bg-alt);
  white-space: nowrap;
}
.admin-dash-list em[data-status="live"] {
  background: rgba(47, 90, 58, 0.15);
  color: var(--primary);
}
.admin-dash-list em[data-status="complete"] { color: var(--ink); }
.admin-dash-list em[data-status="idea"] { background: transparent; }

.admin-dash-users a {
  grid-template-columns: 36px 1fr auto;
}
.admin-dash-users a > img,
.admin-dash-avatar {
  width: 36px; height: 36px;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--primary), var(--accent));
  color: #fff;
  display: inline-grid; place-items: center;
  font: 700 13px var(--mono);
  flex-shrink: 0;
  overflow: hidden;
}
.admin-dash-avatar img {
  width: 100%; height: 100%; object-fit: cover;
}

/* Settings body — section nav lives in the sidebar (see AdminSidebar's
   settings mode); each sub-page renders its own h1 into this card. */
.admin-settings-body {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 14px;
  padding: 24px 28px;
}

/* ───────── Admin tables ─────────
 * Shared shell for the contributions/spots/users tables. The wrap allows
 * horizontal scroll on phones (admins still need every column on
 * occasion); columns marked data-priority="low" disappear at 760px to
 * keep the common case scannable on a phone.
 *
 * Mask-image fades the right edge so admins know there's more to the
 * right when the table overflows. */
.admin-page-header {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
  margin: 0 0 16px;
}
.admin-page-header h1 {
  font-family: var(--display);
  font-size: 28px;
  font-weight: 600;
  letter-spacing: -0.02em;
  margin: 0;
}
.admin-tabs {
  display: flex;
  gap: 4px;
  margin-bottom: 20px;
  border-bottom: 1px solid var(--line);
  flex-wrap: wrap;
}
.admin-tabs--pills {
  gap: 6px;
  margin-bottom: 20px;
  border-bottom: 0;
}
.admin-tab {
  padding: 10px 16px;
  font-size: 14px;
  font-weight: 500;
  color: var(--ink-soft);
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  text-decoration: none;
  white-space: nowrap;
}
.admin-tab[data-on="true"] {
  color: var(--ink);
  border-bottom-color: var(--primary);
}
.admin-tab--pill {
  padding: 4px 10px;
  font-size: 12px;
  font-weight: 500;
  border-radius: 4px;
  background: transparent;
  color: var(--ink-soft);
  text-decoration: none;
  border: 1px solid var(--line);
  white-space: nowrap;
}
.admin-tab--pill[data-on="true"] {
  background: var(--bg-alt);
  color: var(--ink);
}
.admin-table-wrap {
  width: 100%;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  /* Right-edge fade as a "more →" affordance when the table overflows. */
  mask-image: linear-gradient(to right, #000 calc(100% - 18px), transparent 100%);
  -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 18px), transparent 100%);
}
.admin-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 14px;
}
.admin-table thead tr {
  text-align: left;
  color: var(--ink-soft);
  font-size: 12px;
}
.admin-table th {
  text-transform: uppercase;
  letter-spacing: 0.05em;
  font-weight: 600;
  padding: 8px 6px;
  white-space: nowrap;
}
.admin-table td {
  padding: 12px 6px;
  vertical-align: top;
}
.admin-table tbody tr {
  border-top: 1px solid var(--line);
}
.admin-table .num-cell { text-align: right; }

@media (max-width: 1100px) {
  .admin-shell { grid-template-columns: 1fr; }
  .admin-sidebar { border-right: 0; padding-right: 0; }
  .admin-dash-cards { grid-template-columns: repeat(2, 1fr); }
  .admin-dash-grid { grid-template-columns: 1fr; }
  .admin-dash-attention { grid-row: auto; }
}

@media (max-width: 760px) {
  /* Admin shell padding shrinks so tables get more room on phones. */
  .admin-shell { padding: 0 var(--mobile-pad); margin-top: 16px; gap: 16px; }
  /* Hide low-priority columns on phones; horizontal scroll still works
     for admins who need everything. */
  .admin-table [data-priority="low"] { display: none; }
}

@media (max-width: 480px) {
  .admin-table { font-size: 13px; }
  .admin-table th,
  .admin-table td { padding: 8px 6px; }
  .admin-page-header h1 { font-size: 22px; }
  .admin-tab { padding: 8px 12px; font-size: 13px; }
}

/* ===========================================================
   TRIP DIARY  (/trips/[slug])
   =========================================================== */
.td { min-height: 100vh; background: var(--bg); color: var(--ink); }

/* Top bar */
/* Hero */
.td-hero {
  position: relative;
  height: 56vh; min-height: 460px; max-height: 620px;
  overflow: hidden;
}
.td-hero-img {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: cover; display: block;
}
.td-hero-img-fallback {
  background: linear-gradient(135deg, var(--primary) 0%, var(--accent) 100%);
}
.td-hero-shade {
  position: absolute; inset: 0;
  background: linear-gradient(180deg,
    rgba(20, 30, 15, 0.15) 0%,
    rgba(20, 30, 15, 0.35) 50%,
    rgba(20, 30, 15, 0.85) 100%);
}
.td-hero-text {
  position: absolute; left: 0; right: 0; bottom: 0;
  padding: 56px 56px 64px;
  max-width: 1280px; margin: 0 auto;
  color: #fff;
}
.td-hero-eyebrow {
  display: inline-flex; align-items: center; gap: 8px;
  font: 600 12px/1 var(--mono);
  text-transform: uppercase; letter-spacing: 0.12em;
  padding: 8px 14px; border-radius: 999px;
  background: rgba(255, 255, 255, 0.15);
  -webkit-backdrop-filter: blur(8px);
          backdrop-filter: blur(8px);
  border: 1px solid rgba(255, 255, 255, 0.2);
  margin-bottom: 20px;
}
.td-hero-text h1 {
  font-family: var(--display);
  font-size: clamp(48px, 6vw, 84px);
  font-weight: 600; line-height: 0.98;
  letter-spacing: -0.03em;
  text-wrap: balance;
  color: #fff;
  margin-bottom: 12px;
}
.td-hero-sub {
  font-family: var(--display); font-style: italic;
  font-size: 22px;
  color: rgba(255, 255, 255, 0.85);
  margin-bottom: 16px;
  max-width: 720px;
}

/* Meta strip */
.td-meta {
  background: var(--surface);
  border-bottom: 1px solid var(--line);
  position: -webkit-sticky;
  position: sticky; top: 0; z-index: 20;
}
.td-meta-inner {
  max-width: 1280px; margin: 0 auto;
  padding: 20px 56px;
  display: flex; gap: 48px;
  align-items: center; flex-wrap: wrap;
}
.td-meta-stat { display: flex; flex-direction: column; gap: 4px; }
.td-meta-stat b {
  font-family: var(--display); font-size: 30px; font-weight: 600;
  letter-spacing: -0.02em; line-height: 1; color: var(--ink);
}
.td-meta-stat span {
  font: 600 11px/1 var(--mono); color: var(--ink-soft);
  text-transform: uppercase; letter-spacing: 0.08em;
}
.td-meta-flag .td-flag {
  font-size: 28px; line-height: 1;
  letter-spacing: 4px;
  /* The display font's emoji rendering is inconsistent — fall through
   *  to system emoji fonts so flags actually appear as flags. */
  font-family: "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji",
    var(--display);
}

/* Timeline shell */
.td-timeline { background: var(--bg); padding: 64px 0 96px; }
.td-timeline-inner { max-width: 880px; margin: 0 auto; padding: 0 32px; }
.td-timeline-head { text-align: center; margin-bottom: 48px; }
.td-timeline-head .section-eyebrow { justify-content: center; }
.td-timeline-head h2 {
  font-family: var(--display);
  font-size: 48px; font-weight: 600;
  letter-spacing: -0.02em; line-height: 1;
  margin: 12px 0 12px;
  color: var(--ink);
}
.td-timeline-head p {
  color: var(--ink-soft); font-size: 15px;
  max-width: 460px; margin: 0 auto;
  line-height: 1.55;
}

/* Rail */
.td-rail { position: relative; padding-left: 56px; }
.td-rail::before {
  content: ''; position: absolute;
  left: 19px; top: 8px; bottom: 8px;
  width: 2px;
  background-image: linear-gradient(180deg, var(--line) 0%, var(--line) 50%, transparent 50%);
  background-size: 2px 8px;
  background-repeat: repeat-y;
}

/* Markers (start / end) */
.td-marker {
  position: relative;
  display: flex; align-items: center; gap: 16px;
  padding: 14px 0;
  margin-left: -56px;
}
.td-marker-dot {
  width: 40px; height: 40px; border-radius: 50%;
  background: var(--primary); color: #fff;
  display: grid; place-items: center;
  flex-shrink: 0;
  box-shadow: 0 0 0 4px var(--bg);
  z-index: 2; position: relative;
}
.td-marker-end .td-marker-dot { background: var(--accent); }
.td-marker-text { line-height: 1.3; }
.td-marker-text span {
  font: 700 10px/1 var(--mono);
  color: var(--ink-soft); text-transform: uppercase; letter-spacing: 0.14em;
}
.td-marker-text b {
  display: block; margin-top: 4px;
  font-family: var(--display); font-size: 20px; font-weight: 600;
  letter-spacing: -0.01em; color: var(--ink);
}
.td-marker-text em {
  font-style: normal; font-size: 13px; color: var(--ink-soft);
}

/* Entries — common */
.td-entry { position: relative; margin-bottom: 28px; }
/* Stretch the rail to the full card height and flex-center the dot
 *  block (and the "DAY N" label, for stop entries) against it so the
 *  marker always sits halfway down the card body. */
.td-entry-rail {
  position: absolute;
  left: -56px; top: 0; bottom: 0;
  width: 40px;
  display: flex; flex-direction: column; align-items: center;
  justify-content: center; gap: 6px;
}

/* Stop entry (camp card) */
.td-stop-dot {
  width: 40px; height: 40px; border-radius: 50%;
  display: grid; place-items: center;
  color: #fff;
  box-shadow: 0 0 0 4px var(--bg), 0 4px 12px rgba(0, 0, 0, 0.08);
  z-index: 2; position: relative;
}
/* Floats below the centered dot without contributing to the rail's
 *  flex layout — keeps the dot itself dead-centered against the card,
 *  not the dot+label block. */
.td-stop-day {
  position: absolute;
  top: calc(50% + 28px);
  left: 0; right: 0;
  font: 700 10px/1 var(--mono);
  color: var(--ink-soft); text-transform: uppercase; letter-spacing: 0.1em;
  text-align: center;
}

.td-camp-card {
  display: grid;
  grid-template-columns: 200px 1fr;
  grid-gap: 0;
  gap: 0;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 14px;
  overflow: hidden;
  cursor: pointer;
  text-align: left;
  width: 100%; padding: 0;
  font-family: inherit;
  color: inherit;
  transition: transform 0.15s, box-shadow 0.15s;
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
}
.td-camp-card:hover {
  transform: translateY(-1px);
  box-shadow: var(--shadow-md);
}
.td-camp-card-thumb {
  position: relative;
  height: 100%; min-height: 180px;
  overflow: hidden;
}
.td-camp-card-thumb img {
  width: 100%; height: 100%; object-fit: cover; display: block;
}
.td-camp-card-fallback {
  width: 100%; height: 100%;
  background: linear-gradient(135deg, var(--bg-alt), var(--surface-2));
}
.td-camp-card-body {
  padding: 18px 22px 16px;
  display: flex; flex-direction: column; gap: 6px;
}
.td-camp-card-head { display: flex; gap: 10px; align-items: center; }
.td-stop-when {
  font: 600 11px/1 var(--mono);
  color: var(--ink-soft);
  text-transform: uppercase; letter-spacing: 0.06em;
}
.td-camp-card-body h3 {
  font-family: var(--display);
  font-size: 22px; font-weight: 600;
  letter-spacing: -0.01em; line-height: 1.15;
  margin: 2px 0 4px;
  color: var(--ink);
}
.td-stop-loc {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 13px; color: var(--ink-soft);
}
/* First-day-note preview pulled into the rail card. Quoted-style edge so
 *  it reads as their words, not a generic blurb. */
.td-camp-snippet {
  font-family: var(--display);
  font-style: italic;
  font-size: 14.5px; line-height: 1.5;
  color: var(--ink);
  border-left: 2px solid var(--accent-2);
  padding-left: 12px;
  margin: 8px 0 0;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  overflow: hidden;
}
.td-camp-counts {
  display: flex; gap: 18px; align-items: center;
  /* Auto-margin pushes the counts row to the bottom of the card body
   *  in the flex column, so it sits at the bottom edge of the photo
   *  whether or not a snippet is present above it. */
  margin-top: auto;
  padding-top: 12px;
  border-top: 1px solid var(--line);
  font: 500 12.5px var(--sans);
  color: var(--ink-soft);
  flex-wrap: wrap;
}
.td-camp-counts span { display: inline-flex; align-items: center; gap: 6px; }
.td-camp-open {
  margin-left: auto;
  color: var(--ink); font-weight: 600;
}

/* Moment entry */
.td-moment { margin-bottom: 20px; }
.td-moment-dot {
  width: 14px; height: 14px; border-radius: 50%;
  background: var(--surface);
  border: 2px solid var(--accent-2);
  z-index: 2; position: relative;
  box-shadow: 0 0 0 4px var(--bg);
}
.td-moment-card {
  background: var(--surface-overlay-strong);
  border: 1px dashed var(--line);
  border-radius: 14px;
  padding: 16px 22px 18px;
}
.td-moment-when {
  display: flex; align-items: center; gap: 6px;
  font: 600 11px/1 var(--mono);
  color: var(--ink-soft); text-transform: uppercase; letter-spacing: 0.08em;
  margin-bottom: 10px;
}
.td-moment-actions {
  display: inline-flex; gap: 4px;
  margin-left: auto;
}
.td-moment-actions button {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; cursor: pointer;
  width: 22px; height: 22px; border-radius: 6px;
  border: 1px solid transparent; background: transparent;
  color: var(--ink-soft);
  display: inline-flex; align-items: center; justify-content: center;
  padding: 0;
}
.td-moment-actions button:hover:not(:disabled),
.td-moment-actions button:focus-visible:not(:disabled) {
  color: var(--ink);
  background: var(--bg-alt);
  border-color: var(--line);
  outline: none;
}
.td-moment-actions-danger:hover:not(:disabled),
.td-moment-actions-danger:focus-visible:not(:disabled) {
  color: #b94a2c !important;
  border-color: rgba(185, 74, 44, 0.4) !important;
  background: rgba(185, 74, 44, 0.08) !important;
}
.td-moment-textarea {
  width: 100%; resize: vertical;
  font: 500 14.5px/1.55 var(--sans); color: var(--ink);
  background: var(--bg); border: 1px solid var(--line); border-radius: 10px;
  padding: 10px 12px; outline: none;
  margin-bottom: 8px;
}
.td-moment-edit-foot {
  display: flex; justify-content: flex-end; gap: 8px;
  margin-top: 6px; margin-bottom: 12px;
}
.td-moment-err {
  margin: 0 0 8px;
  font-size: 12.5px; color: #c4622d;
}
.td-moment-text {
  font-family: var(--display);
  font-style: italic;
  font-size: 17px; line-height: 1.55;
  color: var(--ink);
  border-left: 3px solid var(--accent-2);
  padding-left: 14px;
  margin-bottom: 14px;
}
.td-moment-photos {
  display: grid; grid-gap: 6px; gap: 6px;
  border-radius: 10px; overflow: hidden;
  margin-bottom: 12px;
}
.td-mphotos-1 { grid-template-columns: 1fr; aspect-ratio: 16/10; }
.td-mphotos-2 { grid-template-columns: 1fr 1fr; aspect-ratio: 16/8; }
.td-mphotos-3 { grid-template-columns: 1fr 1fr 1fr; aspect-ratio: 16/6; }
.td-moment-photos img {
  width: 100%; height: 100%; object-fit: cover; display: block;
}

/* Add-entry button */
.td-add-entry {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; background: transparent;
  width: 100%;
  display: flex; align-items: center; gap: 16px;
  padding: 18px 22px;
  border: 1.5px dashed var(--line);
  border-radius: 14px;
  cursor: pointer; text-align: left;
  font-family: var(--sans);
  margin-bottom: 28px;
  position: relative;
  color: var(--ink);
}
.td-add-entry::before {
  content: ''; position: absolute;
  left: -42px; top: 50%; transform: translateY(-50%);
  width: 24px; height: 1.5px;
  background: var(--line);
}
.td-add-entry:hover {
  border-color: var(--primary);
  background: rgba(47, 90, 58, 0.04);
}
.td-add-entry-dot {
  width: 36px; height: 36px; border-radius: 50%;
  background: var(--primary); color: #fff;
  display: grid; place-items: center;
  flex-shrink: 0;
  box-shadow: 0 0 0 4px var(--bg);
}
.td-add-entry-text b {
  display: block;
  font-family: var(--display); font-size: 17px; font-weight: 600;
  letter-spacing: -0.01em; color: var(--ink);
}
.td-add-entry-text em {
  font-style: normal; font-size: 13px; color: var(--ink-soft);
  margin-top: 2px; display: block;
}

/* Stop drawer */
.td-detail-shade {
  position: fixed; inset: 0;
  background: var(--scrim);
  -webkit-backdrop-filter: blur(2px);
          backdrop-filter: blur(2px);
  z-index: 200;
  display: flex; justify-content: flex-end;
  animation: tdFade 0.18s ease-out;
}
@keyframes tdFade { from { opacity: 0; } to { opacity: 1; } }
@keyframes tdSlide {
  from { transform: translateX(40px); opacity: 0; }
  to   { transform: translateX(0); opacity: 1; }
}
.td-detail {
  width: min(620px, 100vw);
  height: 100vh;
  background: var(--bg);
  display: flex; flex-direction: column;
  box-shadow: -20px 0 60px rgba(0, 0, 0, 0.18);
  animation: tdSlide 0.24s ease-out;
}
.td-detail-bar {
  display: flex; align-items: center; gap: 14px;
  padding: 14px 20px;
  border-bottom: 1px solid var(--line);
  background: var(--surface);
  flex-shrink: 0;
}
.td-detail-close {
  width: 32px; height: 32px; border-radius: 8px;
  border: 1px solid var(--line); background: var(--surface);
  display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer;
  color: var(--ink);
}
.td-detail-close:hover { background: var(--bg-alt); }

/* ───────── Trip stop drawer — mobile bottom sheet ───────── */
@media (max-width: 760px) {
  .td-detail-shade {
    align-items: flex-end;
    justify-content: stretch;
  }
  .td-detail {
    width: 100%;
    height: auto;
    max-height: 92vh;
    border-radius: var(--sheet-radius) var(--sheet-radius) 0 0;
    box-shadow: 0 -16px 40px rgba(0, 0, 0, 0.18);
    animation: tdSheetUp 0.26s cubic-bezier(0.2, 0.8, 0.2, 1);
  }
  .td-detail-bar {
    position: -webkit-sticky;
    position: sticky; top: 0; z-index: 2;
    padding: 14px 16px;
  }
  .td-detail-bar::before {
    content: "";
    position: absolute;
    top: 6px; left: 50%;
    transform: translateX(-50%);
    width: 36px; height: 4px;
    border-radius: 999px;
    background: var(--line);
  }
  .td-detail-close {
    width: var(--tap-min);
    height: var(--tap-min);
  }
  .td-detail-cover { height: 200px; }
  .td-detail-body { padding: 22px 18px 32px; }
}
@keyframes tdSheetUp {
  from { transform: translateY(100%); }
  to   { transform: translateY(0); }
}

.td-detail-crumb {
  font: 600 11px/1 var(--mono);
  color: var(--ink-soft); text-transform: uppercase; letter-spacing: 0.08em;
  flex: 1 1;
}
.td-detail-scroll { flex: 1 1; overflow-y: auto; }
.td-detail-cover { position: relative; height: 280px; overflow: hidden; }
.td-detail-cover img { width: 100%; height: 100%; object-fit: cover; display: block; }
.td-detail-cover-shade {
  position: absolute; inset: 0;
  /* Three-stop gradient + a soft drop-shadow on the title so the text
   *  stays readable on bright covers (overcast skies, snow, sand) where
   *  a single bottom-up fade isn't dark enough where the title sits. */
  background: linear-gradient(
    180deg,
    rgba(0, 0, 0, 0) 0%,
    rgba(0, 0, 0, 0.25) 45%,
    rgba(0, 0, 0, 0.85) 100%
  );
}
.td-detail-cover-text {
  position: absolute; left: 28px; right: 28px; bottom: 22px;
  color: #fff;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.45), 0 0 18px rgba(0, 0, 0, 0.4);
}
.td-detail-cover-text h1 {
  font-family: var(--display); font-size: 34px; font-weight: 600;
  letter-spacing: -0.02em; line-height: 1.05;
  margin: 8px 0 6px;
  /* Override the global h1 ink colour — this h1 sits on a darkened
   *  cover photo and needs to be white to read. */
  color: #fff;
}
.td-detail-loc {
  display: inline-flex; align-items: center; gap: 8px;
  font-size: 13px; color: rgba(255, 255, 255, 0.92);
  flex-wrap: wrap;
}
/* Owner-only icon buttons in the drawer header (edit dates, remove
 *  stop). Subdued by default; the destructive variant only flushes red
 *  on hover/focus. */
.td-detail-bar-actions {
  display: inline-flex; gap: 4px;
  margin-left: auto;
}
.td-detail-bar-btn {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none; cursor: pointer;
  width: 32px; height: 32px; border-radius: 8px;
  border: 1px solid transparent; background: transparent;
  color: var(--ink-soft);
  display: inline-flex; align-items: center; justify-content: center;
  padding: 0;
}
.td-detail-bar-btn:hover:not(:disabled),
.td-detail-bar-btn:focus-visible:not(:disabled),
.td-detail-bar-btn[aria-pressed="true"] {
  color: var(--ink);
  background: var(--bg-alt);
  border-color: var(--line);
  outline: none;
}
.td-detail-bar-btn-danger:hover:not(:disabled),
.td-detail-bar-btn-danger:focus-visible:not(:disabled) {
  color: #b94a2c;
  background: rgba(185, 74, 44, 0.08);
  border-color: rgba(185, 74, 44, 0.4);
}
.td-detail-bar-btn:disabled { opacity: 0.5; cursor: progress; }
.td-detail-dates-edit {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-gap: 10px 14px;
  gap: 10px 14px;
  padding: 14px 28px 18px;
  border-bottom: 1px solid var(--line);
  background: var(--bg-alt);
}
.td-detail-dates-edit label {
  display: flex; flex-direction: column; gap: 4px;
  font: 600 10.5px/1 var(--mono);
  color: var(--ink-soft);
  text-transform: uppercase; letter-spacing: 0.08em;
}
.td-detail-dates-edit input[type="date"] {
  font: 500 13.5px var(--sans);
  color: var(--ink);
  background: var(--bg);
  border: 1px solid var(--line);
  border-radius: 8px;
  padding: 7px 10px;
}
.td-detail-dates-foot {
  grid-column: 1 / -1;
  display: flex; justify-content: flex-end; gap: 8px;
}
.td-detail-dates-err {
  grid-column: 1 / -1;
  margin: 0;
  color: #c4622d; font-size: 12.5px;
}
.td-detail-body { padding: 26px 28px 40px; }
.td-detail-section { margin-bottom: 26px; }
.td-detail-section:last-child { margin-bottom: 0; }
.td-detail-h {
  font: 600 11px/1 var(--mono);
  color: var(--ink-soft);
  text-transform: uppercase; letter-spacing: 0.08em;
  margin-bottom: 12px;
}
.td-section-head {
  display: flex; align-items: baseline; justify-content: space-between;
  margin-bottom: 14px;
}
.td-section-head .td-detail-h { margin-bottom: 0; }
.td-detail-meta {
  font: 500 11.5px var(--mono);
  color: var(--ink-soft);
}

/* Quick compose (drawer) */
.td-quick-compose {
  display: flex; align-items: center; gap: 12px;
  width: 100%;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 12px;
  padding: 12px 14px;
  margin-top: 12px;
  cursor: pointer;
  font-family: inherit;
  text-align: left;
  color: var(--ink);
}
.td-quick-compose:hover { border-color: var(--ink-soft); }
.td-quick-compose-input {
  flex: 1 1; font-size: 14px; color: var(--ink-soft);
}

/* Day list */
.td-day-list { display: flex; flex-direction: column; position: relative; }
.td-day {
  display: grid;
  grid-template-columns: 36px 1fr;
  position: relative;
  padding-bottom: 18px;
}
.td-day:not(:last-child)::before {
  content: ''; position: absolute;
  left: 13px; top: 32px; bottom: 0;
  width: 2px; background: var(--line);
}
.td-day-rail { position: relative; padding-top: 10px; }
.td-day-num {
  width: 28px; height: 28px;
  border-radius: 50%;
  background: var(--surface-inverse); color: var(--on-inverse);
  display: inline-flex; align-items: center; justify-content: center;
  font: 700 11px var(--mono);
  position: relative; z-index: 1;
}
.td-day-avatar {
  width: 28px; height: 28px;
  border-radius: 50%;
  object-fit: cover;
  display: block;
  position: relative; z-index: 1;
  box-shadow: 0 0 0 2px var(--surface);
}
.td-day-card {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 12px;
  padding: 14px 16px;
}
.td-day-head {
  display: flex; align-items: center; gap: 10px;
  margin-bottom: 8px;
}
.td-day-head b { font-size: 14.5px; font-weight: 600; color: var(--ink); }
.td-day-date {
  font: 500 11px var(--mono);
  color: var(--ink-soft);
  text-transform: uppercase; letter-spacing: 0.06em;
}
.td-day-actions {
  margin-left: auto;
  display: flex; gap: 4px;
  opacity: 0; transition: opacity 0.15s;
}
.td-day-card:hover .td-day-actions { opacity: 1; }
.td-day-actions button {
  width: 24px; height: 24px;
  border: 0; background: transparent;
  border-radius: 6px;
  display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer; color: var(--ink-soft);
}
.td-day-actions button:hover { background: var(--bg-alt); color: var(--ink); }
.td-day-text {
  font-size: 14px; line-height: 1.6;
  color: var(--ink); margin: 0 0 12px;
  white-space: pre-wrap;
}
.td-day-label-input,
.td-day-textarea {
  width: 100%;
  border: 1px solid var(--line);
  border-radius: 8px;
  padding: 10px 12px;
  font: 400 14px/1.55 var(--sans);
  color: var(--ink);
  background: var(--bg);
  outline: none;
  margin-bottom: 12px;
}
.td-day-label-input { font: 600 14px var(--sans); }
.td-day-label-input:focus,
.td-day-textarea:focus { border-color: var(--ink-soft); }
.td-day-textarea { resize: vertical; }
.td-day-photos {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-gap: 8px;
  gap: 8px;
}
.td-day-photo {
  position: relative;
  aspect-ratio: 4/3;
  border-radius: 10px; overflow: hidden;
  background: var(--bg-alt);
}
.td-day-photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
.td-day-photo-x {
  position: absolute; top: 6px; right: 6px;
  width: 22px; height: 22px;
  border-radius: 50%;
  background: rgba(0, 0, 0, 0.55);
  border: none; color: #fff;
  display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer;
}
.td-day-drop {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
  aspect-ratio: 4/3;
  border: 1.5px dashed var(--line);
  border-radius: 10px;
  background: var(--bg-alt);
  display: flex; flex-direction: column;
  align-items: center; justify-content: center;
  gap: 6px;
  cursor: pointer;
  font: 500 11.5px var(--sans);
  color: var(--ink-soft);
}
.td-day-drop:hover {
  border-color: var(--primary);
  background: var(--surface);
  color: var(--ink);
}
.td-day-drop-err { color: #c4622d; font-style: normal; font-size: 11px; }
.td-day-edit-foot {
  display: flex; gap: 8px; justify-content: flex-end;
  margin-top: 12px;
  padding-top: 10px;
  border-top: 1px solid var(--line);
}
.td-compose-card {
  background: var(--surface);
  border: 1px solid var(--ink-soft);
  border-radius: 12px;
  padding: 14px 16px;
  margin-top: 16px;
  display: flex; flex-direction: column; gap: 10px;
}

/* Activities */
.td-detail-acts {
  list-style: none; padding: 0; margin: 0;
  display: flex; flex-direction: column; gap: 10px;
}
.td-detail-acts li { display: flex; align-items: center; gap: 12px; font-size: 14.5px; color: var(--ink); }
.td-act-tick {
  width: 20px; height: 20px; border-radius: 50%;
  background: var(--primary); color: #fff;
  display: inline-flex; align-items: center; justify-content: center;
  border: 0; cursor: pointer; flex-shrink: 0;
}
.td-act-tick:disabled { cursor: default; }
.td-act-tick.open {
  background: transparent;
  border: 1.5px solid var(--line);
}
.td-detail-acts li.todo .td-act-text { color: var(--ink-soft); }

/* Comments */
.td-comments-list { display: flex; flex-direction: column; gap: 18px; }
.td-comments-empty { font-size: 14px; color: var(--ink-soft); font-style: italic; }
.td-comment { display: flex; gap: 12px; }
.td-comment-avatar {
  width: 34px; height: 34px; border-radius: 50%;
  background: var(--bg-alt); color: var(--ink);
  display: inline-flex; align-items: center; justify-content: center;
  font: 700 11px var(--mono); flex-shrink: 0;
}
.td-comment-avatar.me { background: var(--primary); color: #fff; }
.td-comment-avatar.guest { background: var(--bg-alt); color: var(--ink-soft); }
.td-comment-body { flex: 1 1; }
.td-comment-head { display: flex; align-items: baseline; gap: 8px; margin-bottom: 4px; }
.td-comment-head b { font-size: 13.5px; font-weight: 600; color: var(--ink); }
.td-comment-head em { font-style: normal; font: 500 11px var(--mono); color: var(--ink-soft); }
.td-comment-body p { font-size: 14px; line-height: 1.55; margin: 0; color: var(--ink); }

/* Comment compose footer */
.td-detail-compose {
  display: flex; align-items: center; gap: 10px;
  padding: 14px 20px;
  border-top: 1px solid var(--line);
  background: var(--surface);
  flex-shrink: 0;
}
.td-detail-compose input {
  flex: 1 1; border: 1px solid var(--line); background: var(--bg);
  border-radius: 24px; padding: 10px 16px;
  font: 400 14px var(--sans); color: var(--ink);
  outline: none;
}
.td-detail-compose input:focus { border-color: var(--ink-soft); }
.td-detail-compose-signed-out {
  justify-content: center;
  color: var(--ink-soft);
  font: 500 13px var(--sans);
}

@media (max-width: 720px) {
  .td-hero-text { padding: 32px 24px 40px; }
  .td-hero-text h1 { font-size: 38px; }
  .td-meta-inner { padding: 16px 20px; gap: 24px; }
  .td-meta-stat b { font-size: 22px; }
  .td-timeline-inner { padding: 0 16px; }
  .td-timeline-head h2 { font-size: 32px; }
  .td-rail { padding-left: 44px; }
  .td-rail::before { left: 14px; }
  .td-entry-rail { left: -44px; }
  .td-camp-card { grid-template-columns: 1fr; }
  .td-camp-card-thumb { min-height: 140px; }
  .td-detail { width: 100vw; }
  .td-detail-cover { height: 220px; }
  .td-detail-body { padding: 20px 18px 30px; }
}

/* ─── Onboarding ────────────────────────────────────────────────── */
.onboard-shell {
  max-width: 480px;
  margin: 60px auto 80px;
  padding: 40px 32px;
  background: var(--bg-alt);
  border: 1px solid var(--line);
  border-radius: 16px;
}
.onboard-title {
  font-family: var(--display);
  font-size: 32px;
  font-weight: 600;
  letter-spacing: -0.02em;
  margin: 8px 0 12px;
}
.onboard-sub {
  color: var(--ink-soft);
  font-size: 14px;
  line-height: 1.5;
  margin-bottom: 28px;
}
.onboard-form { display: flex; flex-direction: column; gap: 20px; }
.onboard-field { display: flex; flex-direction: column; gap: 6px; }
.onboard-field label {
  font-size: 13px;
  font-weight: 600;
  color: var(--ink-soft);
}
.onboard-field input {
  width: 100%;
  padding: 12px 14px;
  font-size: 15px;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: var(--bg);
  color: var(--ink);
  font-family: var(--sans);
  outline: none;
  transition: border-color 0.15s;
}
.onboard-field input:focus { border-color: var(--ink-soft); }
.onboard-field input[aria-invalid="true"] { border-color: var(--danger, #c44); }

.onboard-slug-row {
  display: flex;
  align-items: stretch;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: var(--bg);
  overflow: hidden;
}
.onboard-slug-row:focus-within { border-color: var(--ink-soft); }
.onboard-slug-row .onboard-slug-prefix {
  display: inline-flex;
  align-items: center;
  padding: 0 12px;
  background: var(--bg-alt);
  color: var(--ink-soft);
  font: 500 13px var(--mono, var(--sans));
  border-right: 1px solid var(--line);
  white-space: nowrap;
}
.onboard-slug-row input {
  flex: 1 1;
  border: none;
  border-radius: 0;
  background: transparent;
  padding: 12px 14px;
}
.onboard-slug-row input:focus { border: none; }

.onboard-hint {
  color: var(--ink-soft);
  font-size: 12px;
  margin: 2px 0 0;
}
.onboard-error {
  color: var(--danger, #c44);
  font-size: 13px;
  margin: 0;
}
.onboard-submit {
  align-self: flex-start;
  justify-content: center;
  margin-top: 4px;
}


/*!****************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[14].oneOf[10].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[14].oneOf[10].use[3]!./styles/minimal.css ***!
  \****************************************************************************************************************************************************************************************************************************************************************/
/* Minimal aesthetic — applied when body[data-aesthetic="minimal"]
   Strips the editorial flourishes: serif display, italics, deep shadows,
   gradient overlays, sticker pins. Replaces them with Inter, hairlines,
   flat fills, and tighter rhythm. */

body[data-aesthetic="minimal"] {
  --shadow-sm: 0 0 0 1px var(--line);
  --shadow-md: 0 0 0 1px var(--line);
  --radius: 4px;
  --radius-lg: 6px;
}

/* Type — Inter everywhere, no italic accent color */
body[data-aesthetic="minimal"] h1,
body[data-aesthetic="minimal"] h2,
body[data-aesthetic="minimal"] h3,
body[data-aesthetic="minimal"] h4 {
  font-family: var(--sans);
  font-weight: 600;
  letter-spacing: -0.02em;
}
body[data-aesthetic="minimal"] em {
  font-style: normal;
  font-family: var(--sans);
  color: inherit;
  font-weight: 600;
}

/* Hero — strip topo + tint, calm gradient */
body[data-aesthetic="minimal"] .topo-overlay { display: none; }
body[data-aesthetic="minimal"] .hero-bg-tint {
  background: linear-gradient(180deg, rgba(0,0,0,.45) 0%, rgba(0,0,0,.35) 100%);
}
body[data-aesthetic="minimal"] .hero-eyebrow .dot { box-shadow: none; }
body[data-aesthetic="minimal"] .search-pill {
  border-radius: 6px;
  box-shadow: 0 0 0 1px rgba(0,0,0,.08);
}

/* Brand mark — flat square */
body[data-aesthetic="minimal"] .brand-mark {
  border-radius: 4px;
  box-shadow: none;
}
body[data-aesthetic="minimal"] .brand-mark.sm { border-radius: 4px; }

/* Cards — hairline borders, no lift on hover */
body[data-aesthetic="minimal"] .spot-card,
body[data-aesthetic="minimal"] .recent-row,
body[data-aesthetic="minimal"] .map-preview-img,
body[data-aesthetic="minimal"] .dp-card,
body[data-aesthetic="minimal"] .tp-stats,
body[data-aesthetic="minimal"] .tp-map-preview,
body[data-aesthetic="minimal"] .fpanel {
  border: 1px solid var(--line);
  box-shadow: none;
  border-radius: 4px;
}
body[data-aesthetic="minimal"] .spot-card:hover {
  transform: none;
  box-shadow: none;
  border-color: var(--line);
}
body[data-aesthetic="minimal"] .recent-row:hover {
  border-color: var(--ink);
  box-shadow: none;
}
body[data-aesthetic="minimal"] .spot-img,
body[data-aesthetic="minimal"] .coll-img,
body[data-aesthetic="minimal"] .recent-thumb,
body[data-aesthetic="minimal"] .dp-gallery-main,
body[data-aesthetic="minimal"] .dp-thumb {
  /* Minimal aesthetic was fully square (0); softened to a small radius
     so images read as photos rather than tiles, while still distinct
     from the editorial 22px pill-radius. */
  border-radius: 6px;
}
body[data-aesthetic="minimal"] .spot-card,
body[data-aesthetic="minimal"] .map-preview-img,
body[data-aesthetic="minimal"] .tp-map-preview {
  overflow: hidden;
}

/* Collection tints — drop the heavy bottom shade */
body[data-aesthetic="minimal"] .coll-tint {
  background: linear-gradient(180deg, rgba(0,0,0,0) 50%, rgba(0,0,0,.55) 100%);
}
body[data-aesthetic="minimal"] .dp-gallery-tint { background: none; }
body[data-aesthetic="minimal"] .tp-hero-tint {
  background: linear-gradient(180deg, rgba(0,0,0,.25) 0%, rgba(0,0,0,.45) 70%, rgba(0,0,0,.6) 100%);
}

/* Map pins — kill the drop-shadow flourish on the SVG-stickers and the
   default box-shadow ring on flat dots. MapPin renders inline styles,
   so we override with !important. */
body[data-aesthetic="minimal"] .map-pin-btn > div,
body[data-aesthetic="minimal"] .minimap-pin > div {
  filter: none !important;
  box-shadow: none !important;
}
/* Slim down the white stroke on sticker + classic variants */
body[data-aesthetic="minimal"] .map-pin-btn svg path,
body[data-aesthetic="minimal"] .minimap-pin svg path {
  stroke-width: 1.5 !important;
}
body[data-aesthetic="minimal"] .map-pin-routenum {
  box-shadow: none;
  border: 1.5px solid #fff;
  outline: 1px solid rgba(0,0,0,.25);
  border-radius: 4px;
}

/* Floating panels — tighter, square-ish */
body[data-aesthetic="minimal"] .map-detail-panel,
body[data-aesthetic="minimal"] .route-panel,
body[data-aesthetic="minimal"] .map-spotlist,
body[data-aesthetic="minimal"] .filter-drawer,
body[data-aesthetic="minimal"] .acb-popover {
  border-radius: 4px;
  box-shadow: 0 0 0 1px var(--line), 0 8px 20px rgba(0,0,0,.06);
}
body[data-aesthetic="minimal"] .map-view-toggle {
  border-radius: 4px;
}
body[data-aesthetic="minimal"] .map-view-toggle button[data-on="true"] {
  box-shadow: none;
  background: var(--bg-alt);
}

/* Buttons — square corners. Apply the same 4px rounding to every
   button-like element so the UI reads as one consistent shape language
   instead of a mix of pills and rectangles. */
body[data-aesthetic="minimal"] .btn-primary,
body[data-aesthetic="minimal"] .btn-ghost,
body[data-aesthetic="minimal"] .btn-primary.lg,
body[data-aesthetic="minimal"] .btn-primary.sm,
body[data-aesthetic="minimal"] .btn-ghost.sm,
body[data-aesthetic="minimal"] .chip,
body[data-aesthetic="minimal"] .map-open-cta,
body[data-aesthetic="minimal"] .fb-filters-btn,
body[data-aesthetic="minimal"] .fb-route,
body[data-aesthetic="minimal"] .tp-back-link,
body[data-aesthetic="minimal"] .dp-saveall,
body[data-aesthetic="minimal"] .dp-type-pill {
  border-radius: 4px;
}
/* Hero search keeps the pill shape from the original design — the
   minimal aesthetic squares everything else off, but the homepage's
   centrepiece search bar reads as a single rounded affordance. */
/* Small inline counters/badges that sit inside larger buttons stay slightly
   rounder so they read as a token, not a button. */
body[data-aesthetic="minimal"] .fb-filters-btn .cnt {
  border-radius: 3px;
}

/* Big numbers — Inter, lighter weight */
body[data-aesthetic="minimal"] .map-stats b,
body[data-aesthetic="minimal"] .tp-stat b,
body[data-aesthetic="minimal"] .dp-card-price b,
body[data-aesthetic="minimal"] .dp-rating-big b,
body[data-aesthetic="minimal"] .detail-price,
body[data-aesthetic="minimal"] .tp-map-overlay b,
body[data-aesthetic="minimal"] .tp-day-title {
  font-family: var(--sans);
  font-weight: 600;
}

/* Coords stay mono — that's a functional choice, not editorial */

