.resort-search-wrapper {
  justify-content: center;
  width: 100%;
  margin-top: 20px;
  position: relative;
  z-index: 3;
  display: flex;
}

.resort-search-bar {
  color: var(--fg-primary);
  background-color: var(--bg-subtle);
  border: 1px solid var(--border-subtle);
  border-radius: 999px;
  justify-content: flex-start;
  align-items: center;
  width: 100%;
  max-width: 760px;
  padding: 8px;
  display: flex;
  gap: 8px;
  box-shadow: var(--shadow-card);
}

.resort-search-segment {
  align-items: center;
  display: flex;
  gap: 8px;
}

.resort-search-segment--input {
  flex: 1;
  min-width: 200px;
  padding: 6px 10px 6px 14px;
}

.resort-search-icon {
  color: var(--fg-secondary);
  justify-content: center;
  align-items: center;
  width: 20px;
  height: 20px;
  display: flex;
}

.resort-search-input {
  color: var(--fg-primary);
  background-color: #0000;
  border: 1px #0000;
  width: 100%;
  min-height: 36px;
  margin-bottom: 0;
  padding: 0;
  font-size: 16px;
  line-height: 24px;
}

.resort-search-input::placeholder {
  color: var(--fg-secondary);
}

.resort-search-input:focus {
  outline: none;
}

.resort-search-input[readonly] {
  cursor: default;
}

.resort-search-divider {
  background-color: var(--border-subtle);
  width: 1px;
  height: 28px;
}

.resort-search-pill {
  color: var(--fg-secondary);
  background-color: var(--bg-elevated);
  border: 1px solid var(--bg-elevated);
  border-radius: 999px;
  padding: 8px 18px;
  font-size: 16px;
  font-weight: 500;
  line-height: 24px;
  cursor: pointer;
  transition: background-color .2s, color .2s, border-color .2s;
}

.resort-search-pill:hover,
.resort-search-pill:focus-visible {
  color: var(--fg-inverse);
  background-color: var(--bg-inverse);
  border-color: var(--bg-inverse);
}

.resort-search-pill.is-active {
  color: var(--fg-inverse);
  background-color: var(--bg-inverse);
  border-color: var(--bg-inverse);
}

.resort-search-submit {
  color: var(--fg-inverse);
  background-color: var(--bg-inverse);
  border: 1px solid var(--bg-inverse);
  border-radius: 999px;
  padding: 8px 22px;
  font-size: 16px;
  font-weight: 600;
  line-height: 24px;
  cursor: pointer;
  transition: transform .2s, box-shadow .2s;
}

.resort-search-submit:hover,
.resort-search-submit:focus-visible {
  transform: translateY(-1px);
  box-shadow: var(--shadow-card);
}

.resort-search-popover {
  position: absolute;
  top: calc(100% + 12px);
  left: 50%;
  transform: translateX(-50%);
  background-color: var(--bg-subtle);
  border: 1px solid var(--border-subtle);
  border-radius: 24px;
  width: 100%;
  max-width: 520px;
  padding: 24px;
  box-shadow: var(--shadow-card);
}

.resort-search-popover--wide {
  max-width: 920px;
}

/* On mobile, the When/Who picker becomes its own full-screen scrollable sheet
   (portalled to <body>) so the calendar isn't clipped or unscrollable. */
.resort-search-popover--sheet {
  position: fixed !important;
  inset: 0 !important;
  z-index: 100000 !important;
  width: 100% !important;
  max-width: none !important;
  transform: none !important;
  margin: 0 !important;
  border: 0 !important;
  border-radius: 0 !important;
  padding: 0 1.25rem calc(2rem + env(safe-area-inset-bottom, 0px)) !important;
  background-color: var(--bg-subtle) !important;
  box-shadow: none !important;
  overflow-y: auto !important;
  -webkit-overflow-scrolling: touch;
}
.resort-search-popover--sheet .resort-search-sheet-head {
  display: flex;
  position: sticky;
  top: 0;
  z-index: 1;
  margin: 0 -1.25rem 0.75rem;
  padding: 1rem 1.25rem;
  background-color: var(--bg-subtle);
  border-bottom: 1px solid var(--border-subtle);
}
/* Resort picker sheet: search field at the top, list below. */
.resort-resort-sheet__search {
  margin-bottom: 0.5rem;
}
.resort-resort-sheet__input {
  width: 100%;
  padding: 0.85rem 1rem;
  border-radius: 12px;
  background: var(--bg-elevated);
  border: 1px solid var(--border-subtle);
  color: var(--fg-primary);
  font-size: 16px; /* 16px avoids iOS focus-zoom */
  outline: none;
}
.resort-resort-sheet__input::placeholder {
  color: var(--fg-secondary);
}

.resort-search-popover-top {
  justify-content: space-between;
  align-items: center;
  display: flex;
  margin-bottom: 20px;
}

.resort-search-toggle {
  background-color: var(--bg-elevated);
  border-radius: 999px;
  padding: 4px;
  display: inline-flex;
  gap: 4px;
}

.resort-search-toggle-button {
  color: var(--fg-secondary);
  background-color: #0000;
  border: 1px solid #0000;
  border-radius: 999px;
  padding: 6px 14px;
  font-size: 14px;
  font-weight: 500;
  cursor: pointer;
}

.resort-search-toggle-button.is-active {
  color: var(--fg-inverse);
  background-color: var(--bg-inverse);
}

.resort-search-link {
  color: var(--fg-secondary);
  background-color: #0000;
  border: 0;
  font-size: 14px;
  cursor: pointer;
}

.resort-search-link:hover {
  color: var(--fg-primary);
}

.resort-calendar-grid {
  grid-column-gap: 28px;
  grid-row-gap: 24px;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
}

.resort-calendar {
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.resort-calendar-header {
  color: var(--fg-primary);
  font-size: 18px;
  font-weight: 600;
}

/* Per-month title — only used in the stacked mobile date sheet (see media). */
.resort-calendar-month-label {
  display: none;
}

.resort-calendar-weekdays {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 6px;
  color: var(--fg-secondary);
  font-size: 12px;
}

.resort-calendar-weekday {
  text-align: center;
}

.resort-calendar-days {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 6px;
}

.resort-calendar-day,
.resort-calendar-empty {
  width: 36px;
  height: 36px;
}

.resort-calendar-day {
  color: var(--ch-text);
  background-color: #0000;
  border: 1px solid #0000;
  border-radius: 999px;
  font-size: 14px;
  cursor: pointer;
}

.resort-calendar-day:hover {
  background-color: var(--ch-control-hover);
}

.resort-calendar-day.is-range {
  background-color: var(--ch-control);
}

.resort-calendar-day.is-start,
.resort-calendar-day.is-end {
  color: var(--ch-control-on-fg);
  background-color: var(--ch-control-on);
}

.resort-search-flex {
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 20px;
  display: flex;
}

.resort-search-chip {
  color: var(--ch-text-muted);
  background-color: var(--ch-control);
  border: 1px solid var(--ch-control-border);
  border-radius: 999px;
  padding: 6px 14px;
  font-size: 13px;
  cursor: pointer;
}

.resort-search-chip.is-active {
  color: var(--ch-text);
  background-color: var(--ch-control-active);
}


.resort-guest-row {
  justify-content: space-between;
  align-items: center;
  display: flex;
  gap: 16px;
}

.resort-guest-label {
  display: flex;
  gap: 12px;
  align-items: center;
}

.resort-guest-icon {
  width: 36px;
  height: 36px;
  border-radius: 12px;
  background-color: var(--ch-control);
  display: flex;
  align-items: center;
  justify-content: center;
}

.resort-guest-icon img {
  width: 20px;
  height: 20px;
}

.resort-guest-title {
  color: var(--ch-text);
  font-size: 16px;
  font-weight: 600;
}

.resort-guest-subtitle {
  color: var(--ch-text-muted);
  font-size: 13px;
}

.resort-guest-controls {
  display: flex;
  align-items: center;
  gap: 12px;
}

.resort-guest-button {
  width: 36px;
  height: 36px;
  border-radius: 999px;
  border: 1px solid var(--ch-control-border-strong);
  background-color: var(--ch-control);
  color: var(--ch-text);
  font-size: 18px;
  cursor: pointer;
}

.resort-guest-count {
  color: var(--ch-text);
  min-width: 24px;
  text-align: center;
  font-weight: 600;
}

/* Mobile-only search chrome — hidden on desktop. */
.resort-search-trigger,
.resort-search-sheet-head,
.resort-search-done {
  display: none;
}

@media screen and (max-width: 767px) {
  .resort-search-bar {
    border-radius: 24px;
    flex-wrap: wrap;
    padding: 12px;
  }

  .resort-search-segment--input {
    width: 100%;
  }

  .resort-search-divider {
    display: none;
  }

  .resort-search-pill,
  .resort-search-submit {
    justify-content: center;
    width: 100%;
  }

  .resort-search-popover,
  .resort-search-popover--wide {
    left: 0;
    transform: none;
    max-width: 100%;
  }

  .resort-calendar-grid {
    grid-template-columns: 1fr;
  }

  /* Stacked months: each month gets its own title above its grid (the shared
     header row showing both titles at the top is wrong once stacked). */
  .resort-search-popover--sheet .resort-calendar-headers {
    display: none;
  }
  .resort-search-popover--sheet .resort-calendar-month-label {
    display: block;
    text-align: center;
    margin: 0.75rem 0 1rem;
    font-size: 1.15rem;
    font-weight: 700;
    color: var(--ch-text);
  }
  .resort-search-popover--sheet .resort-calendar + .resort-calendar {
    margin-top: 0.5rem;
  }
  /* With the middle title column hidden, switch the nav row to flex so the
     prev/next arrows sit at the left/right edges instead of bunching up. */
  .resort-search-popover--sheet .resort-calendar-header-row {
    display: flex;
    justify-content: space-between;
    align-items: center;
  }

  /* Map / Search-filter buttons become labelled pills in the sheet.
     Labels wrap rather than clip so longer translations (FR/DE) stay legible. */
  .resort-search-bar .filter-icon-btn {
    width: auto;
    height: auto;
    flex: 1 1 auto;
    min-width: 0;
    gap: 8px;
    padding: 0.85rem 1rem;
    border-radius: 999px;
    font-size: 0.95rem;
    font-weight: 500;
    line-height: 1.2;
    color: #e7e7ea;
    text-align: center;
    white-space: normal;
  }
  .resort-search-bar .filter-icon-btn .filter-icon-label {
    display: inline;
  }
  .resort-search-bar .filter-icon-btn .filter-icon-badge {
    position: static;
    min-width: 18px;
    margin-left: 2px;
  }

  /* ── Collapse the search bar to a compact, non-sticky pill ────────────
     The full bar was a tall sticky block; on mobile it becomes a single
     trigger that opens the bar as a full-screen sheet. */
  #search-rail {
    position: static !important;
    z-index: auto !important;
    padding-top: 16px !important;
    padding-bottom: 0 !important;
    margin-bottom: 1rem !important;
  }
  /* Kill the sticky "compact" restyle on mobile (no longer sticky). */
  #search-rail.is-stuck {
    background: transparent !important;
    box-shadow: none !important;
    -webkit-backdrop-filter: none !important;
    backdrop-filter: none !important;
  }
  #search-rail.is-stuck .resort-search-bar {
    transform: none !important;
  }

  /* Collapsed: show the trigger, hide the full bar. */
  .resort-search-trigger {
    display: flex;
    align-items: center;
    gap: 10px;
    width: 100%;
    padding: 14px 16px;
    border-radius: 999px;
    background: #1e1e20;
    border: 1px solid #2c2c30;
    color: #f5f5f7;
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
    cursor: pointer;
    text-align: left;
  }
  .resort-search-trigger__icon {
    display: inline-flex;
    color: #c9c9cf;
    flex-shrink: 0;
  }
  .resort-search-trigger__text {
    flex: 1;
    min-width: 0;
    font-size: 15px;
    font-weight: 500;
    color: #e7e7ea;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  .resort-search-trigger__badge {
    flex-shrink: 0;
    min-width: 20px;
    height: 20px;
    padding: 0 6px;
    border-radius: 10px;
    background: #fff;
    color: #121214;
    font-size: 11px;
    font-weight: 700;
    display: inline-flex;
    align-items: center;
    justify-content: center;
  }
  .resort-search-bar {
    display: none;
  }

  /* ── Opened sheet ─────────────────────────────────────────────────── */
  /* The rail lives inside .container-medium-2 (position:relative; z-index:1),
     which traps the sheet's stacking below the navbar (z-index:1000). Lift the
     trapping ancestor above the navbar while the sheet is open. */
  .container-medium-2:has(.resort-search-wrapper.is-msearch-open) {
    z-index: 3000 !important;
  }
  #search-rail.is-msearch-open {
    position: fixed !important;
    inset: 0 !important;
    z-index: 3000 !important;
    margin: 0 !important;
    padding: 0 0 calc(1.25rem + env(safe-area-inset-bottom, 0px)) !important;
    background: #121317 !important;
    display: flex !important;
    flex-direction: column !important;
    align-items: stretch !important;
    overflow-y: auto;
  }
  #search-rail.is-msearch-open .resort-search-trigger {
    display: none;
  }
  #search-rail.is-msearch-open .resort-search-sheet-head {
    display: flex;
  }
  #search-rail.is-msearch-open .resort-search-done {
    display: block;
  }
  #search-rail.is-msearch-open .resort-search-bar {
    display: flex;
    background: transparent;
    border: 0;
    box-shadow: none;
    margin: 1.25rem 0 0;
    padding: 0 1.5rem !important;
    row-gap: 12px;
  }
  /* Smaller pill text + a touch more height in the sheet. */
  #search-rail.is-msearch-open .resort-search-pill {
    font-size: 14px;
    padding: 13px 16px;
  }
  #search-rail.is-msearch-open .filter-icon-btn {
    font-size: 0.875rem;
  }
  /* Active filter tags: align with the pills and shrink the text. */
  #search-rail.is-msearch-open .search-active-bar {
    padding: 0 1.5rem;
    margin-top: 1.5rem;
  }
  #search-rail.is-msearch-open .search-active-tag {
    font-size: 12px;
    padding: 9px 12px;
  }
  /* Stretch tags to fill the row — but only when there are 2+ of them, so a
     single tag keeps its natural width instead of spanning the whole row. */
  #search-rail.is-msearch-open
    .search-active-bar:has(.search-active-tag ~ .search-active-tag)
    .search-active-tag {
    flex: 1 1 auto;
    justify-content: center;
  }
  #search-rail.is-msearch-open .resort-search-done {
    margin-left: 1.5rem;
    margin-right: 1.5rem;
  }
  /* On mobile, Clear all drops to its own line below the tags. (Desktop keeps
     it inline with the filter tags.) */
  #search-rail.is-msearch-open .search-clear-all {
    flex-basis: 100%;
    text-align: left;
    order: 1;
  }

  .resort-search-sheet-head {
    align-items: center;
    justify-content: space-between;
    padding: 1rem 1.5rem;
    border-bottom: 1px solid var(--ch-line, rgba(255, 255, 255, 0.08));
  }
  .resort-search-sheet-title {
    font-size: 1rem;
    font-weight: 600;
    color: var(--ch-text, #f4f4f6);
  }
  .resort-search-sheet-close {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    border-radius: 10px;
    background: rgba(255, 255, 255, 0.04);
    border: 1px solid var(--ch-line, rgba(255, 255, 255, 0.1));
    color: var(--ch-text, #f4f4f6);
    font-size: 16px;
    cursor: pointer;
  }
  .resort-search-done {
    margin: auto 1.25rem 0;
    padding: 1rem;
    border-radius: 999px;
    border: 0;
    background: var(--ch-text, #f4f4f6);
    color: var(--ch-bg, #0c0c11);
    font-size: 1rem;
    font-weight: 600;
    cursor: pointer;
  }
}
.resort-search-bar {
  padding-right: 12px !important;
}

.resort-search-popover {
  max-width: 600px;
}

.resort-search-popover--wide {
  max-width: 600px;
}

.resort-calendar-shell {
  display: flex;
  flex-direction: column;
  gap: 16px;
}

.resort-calendar-header-row {
  display: grid;
  grid-template-columns: 36px minmax(0, 1fr) 36px;
  align-items: center;
  gap: 18px;
}

.resort-calendar-headers {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  align-items: center;
  gap: 28px;
}

.resort-calendar-header {
  text-align: center;
}

.resort-calendar-weekdays {
  gap: 4px;
  justify-items: center;
}

.resort-calendar-days {
  gap: 4px;
  justify-items: center;
}

.resort-calendar-day,
.resort-calendar-empty {
  width: 32px;
  height: 32px;
}

.resort-flexible {
  display: flex;
  flex-direction: column;
  gap: 20px;
}

.resort-flexible-title {
  color: var(--ch-text);
  font-size: 20px;
  font-weight: 600;
  text-align: center;
}

.resort-flexible-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 14px;
}

.resort-flexible-option {
  color: var(--ch-text);
  background-color: var(--ch-control);
  border: 1px solid var(--ch-control-border);
  border-radius: 16px;
  padding: 18px 12px;
  display: flex;
  flex-direction: column;
  gap: 6px;
  align-items: center;
  justify-content: center;
  cursor: pointer;
}

.resort-flexible-option:hover {
  background-color: var(--ch-control-hover);
}

.resort-flexible-option.is-active {
  color: var(--ch-control-on-fg);
  background-color: var(--ch-control-on);
}

.resort-flexible-month {
  font-size: 16px;
  font-weight: 600;
}

.resort-flexible-year {
  font-size: 14px;
  color: var(--ch-text-muted);
}

.resort-flexible-option.is-active .resort-flexible-year {
  color: color-mix(in srgb, var(--ch-control-on-fg) 70%, var(--ch-control-on));
}

@media screen and (max-width: 767px) {
  .resort-calendar-headers {
    grid-template-columns: 1fr;
  }

  .resort-flexible-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

/* Flag emoji alignment */
.div-block-31 {
  align-items: center;
}

.flag-sm {
  width: auto !important;
  display: inline !important;
  font-size: 13px;
  vertical-align: middle;
}

/* Search page */

/* Card image carousel */
.carousel-arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 28px;
  height: 28px;
  border-radius: 50%;
  border: none;
  background: rgba(0, 0, 0, 0.55);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  opacity: 0;
  transition: opacity 0.2s;
  z-index: 2;
}

.headerimagecard:hover .carousel-arrow {
  opacity: 1;
}

.carousel-arrow:hover {
  background: rgba(0, 0, 0, 0.8);
}

.carousel-arrow--left {
  left: 8px;
}

.carousel-arrow--right {
  right: 8px;
}

.carousel-dots {
  position: absolute;
  bottom: 8px;
  left: 50%;
  transform: translateX(-50%);
  display: flex;
  align-items: center;
  gap: 5px;
  z-index: 2;
}

.carousel-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.4);
  transition: background 0.2s;
}

.carousel-dot.is-active {
  background: #fff;
}

.carousel-counter {
  font-size: 11px;
  color: #fff;
  background: rgba(0, 0, 0, 0.5);
  padding: 2px 8px;
  border-radius: 10px;
}

/* Sort select dropdown */
.search-sort-select {
  background: #1a1a1e;
  border: 1px solid #2a2a2f;
  border-radius: 8px;
  color: #c0c0c5;
  font-size: 13px;
  padding: 6px 28px 6px 10px;
  cursor: pointer;
  appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg width='10' height='6' viewBox='0 0 10 6' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1L5 5L9 1' stroke='%239b9ba1' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 10px center;
}

.search-sort-select:hover {
  border-color: #3a3a3f;
}

.search-sort-select:focus {
  outline: none;
  border-color: #6366f1;
}

/* Share button */
.search-share-btn {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  background: #1a1a1e;
  border: 1px solid #2a2a2f;
  border-radius: 8px;
  color: #9b9ba1;
  font-size: 13px;
  padding: 6px 12px;
  cursor: pointer;
  transition: all 0.15s;
  white-space: nowrap;
}

.search-share-btn:hover {
  border-color: #3a3a3f;
  color: #e7e7ea;
}

.search-share-btn.is-copied {
  border-color: #22c55e;
  color: #22c55e;
}


/* Active filter tags bar */
.search-active-bar {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 14px;
  align-items: center;
}

.search-active-tag {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 8px 14px;
  border-radius: 20px;
  background: #2a2a2f;
  border: 1px solid #3a3a3f;
  color: #e7e7ea;
  font-size: 13px;
  cursor: pointer;
  text-transform: capitalize;
  transition: background 0.15s;
}

.search-active-tag:hover {
  background: #3a3a3f;
}

.search-clear-all {
  background: none;
  border: none;
  color: #9b9ba1;
  font-size: 13px;
  cursor: pointer;
  text-decoration: underline;
  padding: 8px 8px;
}

/* Map / filter icon buttons carry a text label on mobile only. */
.filter-icon-label {
  display: none;
}

.search-results-header {
  padding-bottom: 16px;
  border-bottom: 1px solid #1a1a1e;
  margin-bottom: 24px;
}

.search-results-count {
  color: var(--ch-text-muted);
  font-size: 14px;
  text-transform: capitalize;
}

.search-empty {
  text-align: center;
  padding: 4rem 0;
  color: #9b9ba1;
}

.search-empty h3 {
  color: #e7e7ea;
  margin-bottom: 8px;
}

.search-pagination {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 16px;
  padding: 32px 0;
}

.search-page-btn {
  background: #1a1a1e;
  border: 1px solid #2a2a2f;
  border-radius: 8px;
  padding: 10px 20px;
  color: #e7e7ea;
  font-size: 14px;
  cursor: pointer;
}

.search-page-btn:hover:not(:disabled) {
  background: #232327;
}

.search-page-btn:disabled {
  opacity: 0.4;
  cursor: not-allowed;
}

.search-page-info {
  color: #9b9ba1;
  font-size: 14px;
}

/* Loading skeletons */
.search-skeleton-card {
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.search-skeleton-image {
  width: 100%;
  aspect-ratio: 4/3;
  background: #1a1a1e;
  border-radius: 12px;
  animation: skeleton-pulse 1.5s infinite ease-in-out;
}

.search-skeleton-text {
  height: 16px;
  background: #1a1a1e;
  border-radius: 4px;
  width: 80%;
  animation: skeleton-pulse 1.5s infinite ease-in-out;
}

.search-skeleton-text--short {
  width: 50%;
}

@keyframes skeleton-pulse {
  0%, 100% { opacity: 0.4; }
  50% { opacity: 0.8; }
}

/* Filter icon button (next to search) */
.filter-icon-btn {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: 12px;
  border: 1px solid #2a2a2f;
  background: #18181b;
  color: #e7e7ea;
  cursor: pointer;
  flex-shrink: 0;
}

.filter-icon-btn:hover {
  background: #232327;
}

.filter-icon-badge {
  position: absolute;
  top: -4px;
  right: -4px;
  min-width: 18px;
  height: 18px;
  border-radius: 9px;
  background: #fff;
  color: #121214;
  font-size: 11px;
  font-weight: 700;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0 4px;
}

/* Filter modal overlay */
.filter-modal-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.7);
  z-index: 100000;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
}

.filter-modal {
  background: #18181b;
  border: 1px solid #2a2a2f;
  border-radius: 20px;
  width: 100%;
  /* 720px, not 540: the feature list is long chips ("Electric Vehicle Charging
     Point (EVCP)", "Egyptian Cotton Linen & Towels") that wrapped to one or two
     per row at the old width, making the list far taller than it needed to be. */
  max-width: 720px;
  max-height: 85vh;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

.filter-modal-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 20px 24px;
  border-bottom: 1px solid #2a2a2f;
}

.filter-modal-title {
  font-size: 18px;
  font-weight: 600;
  color: #e7e7ea;
  margin: 0;
}

.filter-modal-close {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  border: none;
  background: #232327;
  color: #e7e7ea;
  cursor: pointer;
}

.filter-modal-close:hover {
  background: #2a2a2f;
}

.filter-modal-body {
  flex: 1;
  overflow-y: auto;
  /* Stop the scroll chaining to the page once this list hits its top or bottom. */
  overscroll-behavior: contain;
  -webkit-overflow-scrolling: touch;
  padding: 24px;
  display: flex;
  flex-direction: column;
  gap: 28px;
}

.filter-modal-empty {
  padding: 8px 0 16px;
  font-size: 14px;
  color: var(--fg-secondary, #9a9aa2);
}

.filter-modal-section {
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.filter-modal-section-title {
  font-size: 14px;
  font-weight: 600;
  color: #9b9ba1;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

.filter-modal-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.filter-modal-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 10px 16px;
  border-radius: 20px;
  border: 1px solid #2a2a2f;
  background: #232327;
  color: #c0c0c5;
  font-size: 14px;
  cursor: pointer;
  text-transform: capitalize;
  transition: background 0.15s, color 0.15s, border-color 0.15s;
}

.filter-modal-chip:hover {
  background: #2a2a2f;
}

.filter-modal-chip.is-active {
  background: #fff;
  color: #121214;
  border-color: #fff;
}

.filter-modal-chip-count {
  font-size: 12px;
  opacity: 0.6;
}

.filter-modal-chip.is-active .filter-modal-chip-count {
  opacity: 0.5;
}

.filter-modal-footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 16px 24px;
  border-top: 1px solid #2a2a2f;
}

.filter-modal-clear {
  background: none;
  border: none;
  color: #9b9ba1;
  font-size: 14px;
  cursor: pointer;
  text-decoration: underline;
  padding: 8px 12px;
}

.filter-modal-clear:hover {
  color: #e7e7ea;
}

.filter-modal-apply {
  background: #fff;
  color: #121214;
  border: none;
  border-radius: 12px;
  padding: 12px 28px;
  font-size: 15px;
  font-weight: 600;
  cursor: pointer;
}

.filter-modal-apply:hover {
  background: #e7e7ea;
}

/* Resort autocomplete dropdown */
.resort-autocomplete-dropdown {
  background: #18181b;
  border: 1px solid #2a2a2f;
  border-radius: 12px;
  padding: 6px;
  max-height: 280px;
  overflow-y: auto;
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
}

.resort-autocomplete-option {
  display: block;
  width: 100%;
  padding: 10px 14px;
  border: none;
  border-radius: 8px;
  background: transparent;
  color: var(--fg-secondary);
  font-size: 14px;
  text-align: left;
  cursor: pointer;
}

.resort-autocomplete-option:hover {
  background: var(--bg-elevated);
  color: var(--fg-primary);
}

.resort-autocomplete-option.is-active {
  background: var(--bg-inverse);
  color: var(--fg-inverse);
}

/* Force dark background on pages with .bodydark wrapper */
body.bodydark,
body:has(.bodydark) {
  background-color: var(--bg-base) !important;
  color: var(--fg-primary) !important;
}

.bodydark {
  background-color: var(--bg-base);
  color: var(--fg-primary);
  min-height: 100vh;
}

.bodydark .section-regular {
  background-color: var(--bg-base);
}

/* ------------------------------------------------------------------ */
/*  Chalet Map                                                         */
/* ------------------------------------------------------------------ */

.chalet-map-overlay {
  position: fixed;
  inset: 0;
  z-index: 9999;
  background: color-mix(in srgb, var(--bg-inverse) 72%, transparent);
  backdrop-filter: blur(4px);
  display: flex;
  align-items: center;
  justify-content: center;
  animation: mapFadeIn 0.2s ease-out;
}

@keyframes mapFadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}

.chalet-map-container {
  position: relative;
  width: 92vw;
  height: 85vh;
  max-width: 1200px;
  background: var(--bg-subtle);
  border-radius: 16px;
  box-shadow: var(--shadow-card);
  animation: mapSlideUp 0.25s ease-out;
  display: flex;
  flex-direction: column;
}

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

.chalet-map-close {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  min-width: 36px;
  flex-shrink: 0;
  border-radius: 10px;
  border: 1px solid var(--border-subtle);
  background: transparent;
  color: var(--fg-primary);
  cursor: pointer;
  transition: background 0.15s;
  position: relative;
  margin-left: 0;
}

.chalet-map-close:hover {
  background: var(--bg-elevated);
}

.chalet-map-header {
  padding: 12px 16px !important;
  border-bottom: 1px solid var(--border-subtle);
  flex-shrink: 0;
  display: flex !important;
  align-items: center !important;
  gap: 12px !important;
  overflow: visible !important;
  z-index: 2;
}

.chalet-map-header > * {
  overflow: visible !important;
}

.chalet-map-header-count {
  color: var(--fg-secondary);
  font-size: 14px;
  flex: 1 1 0 !important;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.chalet-map-style-toggle {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  border-radius: 8px;
  border: 1px solid var(--border-subtle);
  background: transparent;
  color: var(--fg-secondary);
  font-size: 13px;
  cursor: pointer;
  transition: all 0.15s;
  flex-shrink: 0;
  white-space: nowrap;
  overflow: visible;
  position: relative;
}

.chalet-map-style-toggle:hover {
  background: var(--bg-elevated);
  color: var(--fg-primary);
}

.chalet-map-style-toggle.active {
  background: var(--accent);
  border-color: var(--accent);
  color: var(--accent-fg);
}

.chalet-map-canvas {
  flex: 1 1 0;
  min-height: 0;
  position: relative;
  overflow: hidden;
  border-radius: 0 0 16px 16px;
}

.chalet-map-canvas .mapboxgl-map {
  position: absolute !important;
  inset: 0;
  width: 100% !important;
  height: 100% !important;
}

.chalet-map-empty {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--fg-secondary);
  font-size: 15px;
}

/* Mapbox popup overrides */
.chalet-map-popup-wrapper .mapboxgl-popup-content {
  background: var(--bg-subtle);
  border-radius: 12px;
  padding: 0;
  box-shadow: var(--shadow-card);
  overflow: hidden;
  border: 1px solid var(--border-subtle);
}

.chalet-map-popup-wrapper .mapboxgl-popup-tip {
  border-top-color: var(--bg-subtle);
}

.chalet-map-popup-wrapper .mapboxgl-popup-close-button {
  color: var(--fg-primary);
  font-size: 18px;
  padding: 4px 8px;
  right: 2px;
  top: 2px;
  z-index: 2;
  background: color-mix(in srgb, var(--bg-inverse) 40%, transparent);
  border-radius: 6px;
}

.chalet-map-popup-wrapper .mapboxgl-popup-close-button:hover {
  background: color-mix(in srgb, var(--bg-inverse) 60%, transparent);
}

.chalet-map-popup {
  width: 260px;
}

/* Shown when a cluster cannot be split by zooming — chalets sharing an address.
   Each child is a normal .chalet-map-popup card, stacked and separated. */
.chalet-map-popup-list {
  width: 300px;
  max-height: 60vh;
  overflow-y: auto;
  overscroll-behavior: contain;
  -webkit-overflow-scrolling: touch;
}

.chalet-map-popup-list .chalet-map-popup {
  width: 100%;
}

.chalet-map-popup-list .chalet-map-popup + .chalet-map-popup {
  border-top: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.12));
}

.chalet-map-popup-list .chalet-map-popup-img {
  height: 116px;
}

.chalet-map-popup-more {
  padding: 10px 14px;
  font-size: 12px;
  color: var(--fg-secondary, #9a9aa2);
  border-top: 1px solid var(--border-subtle, rgba(255, 255, 255, 0.12));
}

.chalet-map-popup-img {
  width: 100%;
  height: 140px;
  object-fit: cover;
  display: block;
}

.chalet-map-popup-body {
  padding: 12px 14px 14px;
}

.chalet-map-resort {
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--accent);
  margin-bottom: 4px;
}

.chalet-map-name {
  font-size: 15px;
  font-weight: 600;
  color: var(--fg-primary);
  margin-bottom: 4px;
  line-height: 1.3;
}

.chalet-map-detail {
  font-size: 13px;
  color: var(--fg-secondary);
  margin-bottom: 4px;
}

.chalet-map-price {
  font-size: 14px;
  font-weight: 600;
  color: var(--accent);
}

/* Map icon button - inherits filter-icon-btn styles */
.map-icon-btn {
  /* uses same base styles as filter-icon-btn */
}

@media (max-width: 767px) {
  .chalet-map-container {
    width: 100vw;
    height: 100vh;
    border-radius: 0;
  }
}

/* ========== Auth Gate & Enquiry Modal ========== */
.auth-gate-overlay {
  position: fixed;
  inset: 0;
  z-index: 9999;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, 0.5);
  backdrop-filter: blur(4px);
  animation: authFadeIn 0.2s ease;
}

.auth-gate-modal {
  position: relative;
  background: #fff;
  border-radius: 16px;
  padding: 32px;
  max-width: 400px;
  width: calc(100% - 32px);
  text-align: center;
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
  animation: authSlideUp 0.25s ease;
}

.auth-gate-close {
  position: absolute;
  top: 12px;
  right: 12px;
  background: none;
  border: none;
  cursor: pointer;
  color: #94a3b8;
  padding: 4px;
  border-radius: 6px;
  transition: color 0.15s;
}

.auth-gate-close:hover {
  color: #1e293b;
}

.auth-gate-icon {
  margin-bottom: 16px;
}

.auth-gate-title {
  font-size: 18px;
  font-weight: 600;
  color: #1e293b;
  margin: 0 0 8px;
}

.auth-gate-text {
  font-size: 14px;
  color: #64748b;
  margin: 0 0 24px;
  line-height: 1.5;
}

.auth-gate-actions {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.auth-gate-btn {
  display: block;
  width: 100%;
  padding: 12px 24px;
  border-radius: 10px;
  font-size: 14px;
  font-weight: 600;
  text-align: center;
  text-decoration: none;
  cursor: pointer;
  border: none;
  transition: background 0.15s, opacity 0.15s;
}

.auth-gate-btn--primary {
  background: #0ea5e9;
  color: #fff;
}

.auth-gate-btn--primary:hover {
  background: #0284c7;
}

.auth-gate-btn--primary:disabled {
  opacity: 0.6;
  cursor: not-allowed;
}

.auth-gate-btn--secondary {
  background: #f1f5f9;
  color: #334155;
}

.auth-gate-btn--secondary:hover {
  background: #e2e8f0;
}

.enquiry-textarea {
  width: 100%;
  padding: 12px;
  border: 1px solid #e2e8f0;
  border-radius: 10px;
  font-size: 14px;
  color: #1e293b;
  resize: vertical;
  font-family: inherit;
  line-height: 1.5;
  transition: border-color 0.15s;
}

.enquiry-textarea:focus {
  outline: none;
  border-color: #0ea5e9;
  box-shadow: 0 0 0 3px rgba(14, 165, 233, 0.15);
}

.enquiry-textarea::placeholder {
  color: #94a3b8;
}

.enquiry-error {
  font-size: 13px;
  color: #ef4444;
  margin: 8px 0 0;
  text-align: left;
}

/* Card wrapper — replaces Webflow's product-link to avoid JS interference */
.chalet-card {
  grid-column-gap: 16px;
  grid-row-gap: 16px;
  color: var(--ch-text);
  border-radius: 10px;
  flex-flow: column;
  justify-content: center;
  align-items: flex-start;
  text-decoration: none;
  display: flex;
}

.chalet-card-actions {
  display: flex !important;
  gap: 8px;
  padding: 12px 16px 16px;
  position: relative;
  z-index: 10;
  isolation: isolate;
}

.chalet-card-btn {
  flex: 1;
  display: inline-flex !important;
  align-items: center;
  justify-content: center;
  gap: 6px;
  padding: 10px 16px;
  border-radius: 10px;
  font-size: 13px;
  font-weight: 600;
  cursor: pointer !important;
  border: none;
  transition: background 0.15s, color 0.15s;
  pointer-events: auto !important;
  position: relative;
  z-index: 11;
  text-decoration: none;
  line-height: 1.4;
  letter-spacing: 0;
}

.chalet-card-btn--website {
  background: #fff;
  color: #121214;
}

.chalet-card-btn--website:hover {
  background: #e7e7ea;
  color: #121214;
}

.chalet-card-btn--enquiry {
  background: #2a2a2f;
  color: #e7e7ea;
}

.chalet-card-btn--enquiry:hover {
  background: #353539;
  color: #fff;
}

/* ── Enquiry modal (dark, matches filter modal) ── */

.enquiry-modal-backdrop {
  position: fixed;
  inset: 0;
  background: color-mix(in srgb, var(--bg-inverse) 72%, transparent);
  z-index: 100000;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
}

.enquiry-modal {
  background: var(--bg-subtle);
  border: 1px solid var(--border-subtle);
  border-radius: 20px;
  width: 100%;
  max-width: 480px;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

.enquiry-modal-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 20px 24px;
  border-bottom: 1px solid var(--border-subtle);
}

.enquiry-modal-title {
  font-size: 18px;
  font-weight: 600;
  color: var(--fg-primary);
  margin: 0;
}

.enquiry-modal-close {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  border: none;
  background: var(--bg-elevated);
  color: var(--fg-primary);
  cursor: pointer;
}

.enquiry-modal-close:hover {
  background: var(--bg-inverse);
  color: var(--fg-inverse);
}

.enquiry-modal-body {
  padding: 24px;
}

.enquiry-modal-desc {
  font-size: 14px;
  color: var(--fg-secondary);
  line-height: 1.5;
  margin: 0 0 16px;
}

.enquiry-modal-desc strong {
  color: var(--fg-primary);
}

.enquiry-modal-success {
  text-align: center;
  padding: 12px 0;
}

.enquiry-modal-success svg {
  margin: 0 auto 16px;
  display: block;
}

.enquiry-modal-success .enquiry-modal-desc {
  margin: 0;
}

.enquiry-modal-textarea {
  width: 100%;
  padding: 12px 16px;
  border: 1px solid var(--border-subtle);
  border-radius: 12px;
  font-size: 14px;
  color: var(--fg-primary);
  background: var(--bg-elevated);
  resize: vertical;
  font-family: inherit;
  line-height: 1.5;
  box-sizing: border-box;
}

.enquiry-modal-textarea::placeholder {
  color: var(--fg-secondary);
}

.enquiry-modal-textarea:focus {
  outline: none;
  border-color: var(--border-strong);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 16%, transparent);
}

.enquiry-modal-error {
  font-size: 13px;
  color: #ef4444;
  margin: 8px 0 0;
}

.enquiry-modal-actions {
  display: flex;
  gap: 10px;
  margin-top: 16px;
}

.enquiry-modal-submit {
  flex: 1;
  background: var(--bg-inverse);
  color: var(--fg-inverse);
  border: none;
  border-radius: 12px;
  padding: 12px 28px;
  font-size: 15px;
  font-weight: 600;
  cursor: pointer;
}

.enquiry-modal-submit:hover {
  background: color-mix(in srgb, var(--bg-inverse) 92%, var(--bg-base));
}

.enquiry-modal-cancel {
  flex: 1;
  background: var(--bg-elevated);
  color: var(--fg-secondary);
  border: 1px solid var(--border-subtle);
  border-radius: 12px;
  padding: 12px 28px;
  font-size: 15px;
  font-weight: 600;
  cursor: pointer;
}

.enquiry-modal-cancel:hover {
  background: var(--bg-subtle);
  color: var(--fg-primary);
}

.enquiry-modal-footer {
  padding: 16px 24px;
  border-top: 1px solid var(--border-subtle);
}

/* ── Auth gate modal (dark, matches filter modal) ── */

.auth-gate-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.7);
  z-index: 100000;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
}

.auth-gate-modal {
  background: #18181b;
  border: 1px solid #2a2a2f;
  border-radius: 20px;
  width: 100%;
  max-width: 400px;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

.auth-gate-header {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  padding: 16px 20px 0;
}

.auth-gate-close {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  border: none;
  background: #232327;
  color: #e7e7ea;
  cursor: pointer;
}

.auth-gate-close:hover {
  background: #2a2a2f;
}

.auth-gate-body {
  padding: 8px 24px 24px;
  text-align: center;
}

.auth-gate-body svg {
  margin: 0 auto 16px;
  display: block;
}

.auth-gate-title {
  font-size: 18px;
  font-weight: 600;
  color: #e7e7ea;
  margin: 0 0 8px;
}

.auth-gate-text {
  font-size: 14px;
  color: #9b9ba1;
  line-height: 1.5;
  margin: 0 0 24px;
}

.auth-gate-actions {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.auth-gate-btn-primary {
  display: block;
  width: 100%;
  padding: 12px 24px;
  border-radius: 12px;
  font-size: 15px;
  font-weight: 600;
  background: #fff;
  color: #121214;
  text-align: center;
  text-decoration: none;
  border: none;
  cursor: pointer;
  box-sizing: border-box;
}

.auth-gate-btn-primary:hover {
  background: #e7e7ea;
}

.auth-gate-btn-secondary {
  display: block;
  width: 100%;
  padding: 12px 24px;
  border-radius: 12px;
  font-size: 15px;
  font-weight: 600;
  background: #232327;
  color: #c0c0c5;
  text-align: center;
  text-decoration: none;
  border: 1px solid #2a2a2f;
  cursor: pointer;
  box-sizing: border-box;
}

.auth-gate-btn-secondary:hover {
  background: #2a2a2f;
  color: #e7e7ea;
}

@keyframes authFadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}

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

/* ===== Chalet Detail Page ===== */

.chalet-detail-breadcrumb {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 16px 24px;
  font-size: 0.875rem;
  color: #94a3b8;
  max-width: 1280px;
  margin: 0 auto;
}

.chalet-detail-breadcrumb a {
  color: #94a3b8;
  text-decoration: none;
  transition: color 0.15s;
}

.chalet-detail-breadcrumb a:hover {
  color: var(--ch-text);
}

.chalet-detail-breadcrumb span:last-child {
  color: var(--ch-text);
}

.chalet-detail-breadcrumb-sep {
  color: #475569;
}

.chalet-detail-hero {
  position: relative;
  width: 100%;
  max-width: 1280px;
  margin: 0 auto;
  aspect-ratio: 21 / 9;
  border-radius: 12px;
  overflow: hidden;
}

.chalet-detail-hero-img {
  object-fit: cover;
}

.chalet-detail-gallery {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 8px;
  max-width: 1280px;
  margin: 8px auto 0;
}

.chalet-detail-gallery-item {
  position: relative;
  aspect-ratio: 4 / 3;
  border-radius: 8px;
  overflow: hidden;
}

.chalet-detail-gallery-img {
  object-fit: cover;
}

.chalet-detail-content {
  display: grid;
  grid-template-columns: 1fr 360px;
  gap: 32px;
  max-width: 1280px;
  margin: 32px auto 64px;
  padding: 0 24px;
}

.chalet-detail-main {
  min-width: 0;
}

.chalet-detail-title {
  font-size: 2rem;
  font-weight: 700;
  color: var(--ch-text);
  margin: 0;
  line-height: 1.2;
}

.chalet-detail-location {
  color: #94a3b8;
  font-size: 1rem;
  margin-top: 8px;
}

.chalet-detail-stats {
  display: flex;
  gap: 20px;
  margin-top: 16px;
}

.chalet-detail-stat {
  display: flex;
  align-items: center;
  gap: 6px;
  color: #cbd5e1;
  font-size: 0.9375rem;
}

.chalet-detail-description {
  margin-top: 24px;
  color: #cbd5e1;
  font-size: 1rem;
  line-height: 1.65;
}

.chalet-detail-section-title {
  font-size: 1.25rem;
  font-weight: 600;
  color: var(--ch-text);
  margin: 0 0 16px;
}

.chalet-detail-features {
  margin-top: 32px;
}

.chalet-detail-feature-group {
  margin-bottom: 20px;
}

.chalet-detail-feature-type {
  font-size: 0.75rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: #64748b;
  margin: 0 0 8px;
}

.chalet-detail-feature-list {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.chalet-detail-feature-tag {
  display: inline-block;
  padding: 6px 14px;
  border-radius: 20px;
  font-size: 0.8125rem;
  color: #cbd5e1;
  background: rgba(255, 255, 255, 0.06);
  border: 1px solid rgba(255, 255, 255, 0.08);
}

.chalet-detail-availability {
  margin-top: 32px;
}

.chalet-detail-availability .chalet-detail-section-title {
  margin-bottom: 16px;
}

.chalet-detail-availability-grid {
  display: flex !important;
  flex-direction: column !important;
  gap: 0 !important;
  grid-template-columns: none !important;
}

.chalet-detail-availability-card {
  display: flex !important;
  flex-direction: row !important;
  justify-content: space-between;
  align-items: center;
  padding: 16px 20px;
  gap: 16px;
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);
  background: transparent;
  border-radius: 0;
  border-left: none;
  border-right: none;
  border-top: none;
}

.chalet-detail-availability-card:first-child {
  border-top: 1px solid rgba(255, 255, 255, 0.06);
}

.chalet-detail-availability-card:hover {
  background: rgba(255, 255, 255, 0.03);
}

.chalet-detail-availability-info {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 20px;
  min-width: 0;
  flex: 1;
}

.chalet-detail-availability-dates {
  font-size: 0.875rem;
  font-weight: 500;
  color: #e2e8f0;
  white-space: nowrap;
  min-width: 180px;
}

.chalet-detail-availability-price {
  font-size: 0.875rem;
  font-weight: 600;
  color: var(--ch-text);
  display: flex;
  align-items: center;
  gap: 8px;
  white-space: nowrap;
}

.chalet-detail-price-original {
  text-decoration: line-through;
  color: #64748b;
  font-weight: 400;
  font-size: 0.8125rem;
}

.chalet-detail-price-sale {
  color: #22c55e;
}

.chalet-detail-price-discount {
  font-size: 0.6875rem;
  font-weight: 600;
  background: rgba(34, 197, 94, 0.15);
  color: #22c55e;
  padding: 2px 6px;
  border-radius: 4px;
  line-height: 1.4;
}

/* Sidebar */
.chalet-detail-sidebar {
  position: sticky;
  top: 24px;
  align-self: start;
}

.chalet-detail-host-card {
  padding: 24px;
  border-radius: 12px;
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid rgba(255, 255, 255, 0.08);
}

.chalet-detail-host-label {
  font-size: 0.75rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: #64748b;
  margin: 0 0 12px;
}

.chalet-detail-host-link {
  display: flex;
  align-items: center;
  gap: 12px;
  text-decoration: none;
  color: var(--ch-text);
  transition: opacity 0.15s;
}

.chalet-detail-host-link:hover {
  opacity: 0.85;
}

.chalet-detail-host-logo {
  border-radius: 50%;
  object-fit: cover;
}

.chalet-detail-host-name {
  font-size: 1.125rem;
  font-weight: 600;
}

.chalet-detail-host-bio {
  margin-top: 12px;
  font-size: 0.875rem;
  color: #94a3b8;
  line-height: 1.5;
}

.chalet-detail-cta {
  margin-top: 16px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.chalet-detail-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 12px 20px;
  border-radius: 10px;
  font-size: 0.9375rem;
  font-weight: 600;
  text-decoration: none;
  text-align: center;
  cursor: pointer;
  transition: opacity 0.15s;
}

.chalet-detail-btn:hover {
  opacity: 0.9;
}

.chalet-detail-btn--enquire {
  background: #0ea5e9;
  color: #fff;
  border: none;
  gap: 8px;
  white-space: nowrap;
  flex-shrink: 0;
}

/* Compact enquire button inside availability rows */
.chalet-detail-availability-card .chalet-detail-btn--enquire {
  padding: 8px 16px;
  font-size: 0.8125rem;
  border-radius: 8px;
}

.chalet-detail-btn--website {
  background: #fff;
  color: #1e293b;
}

/* Responsive */
@media (max-width: 768px) {
  .chalet-detail-content {
    grid-template-columns: 1fr;
  }

  .chalet-detail-gallery {
    grid-template-columns: repeat(2, 1fr);
  }

  .chalet-detail-hero {
    aspect-ratio: 16 / 9;
    border-radius: 0;
  }

  .chalet-detail-title {
    font-size: 1.5rem;
  }

  .chalet-detail-availability-card {
    flex-direction: column !important;
    align-items: flex-start !important;
    padding: 14px 16px;
    gap: 10px;
  }

  .chalet-detail-availability-info {
    flex-direction: column;
    gap: 4px;
  }

  .chalet-detail-availability-dates {
    min-width: 0;
  }

  .chalet-detail-availability-card .chalet-detail-btn--enquire {
    width: 100%;
  }
}

/* ===== Host Profile Page ===== */

.host-profile-header {
  display: flex;
  align-items: flex-start;
  gap: 24px;
  max-width: 1280px;
  margin: 40px auto 0;
  padding: 0 24px;
}

.host-profile-logo {
  border-radius: 50%;
  object-fit: cover;
  flex-shrink: 0;
}

.host-profile-name {
  font-size: 2rem;
  font-weight: 700;
  color: var(--ch-text);
  margin: 0;
  line-height: 1.2;
}

.host-profile-bio {
  color: #94a3b8;
  font-size: 1rem;
  margin-top: 8px;
  line-height: 1.6;
}

.host-profile-links {
  display: flex;
  gap: 16px;
  margin-top: 12px;
}

.host-profile-link {
  color: #0ea5e9;
  font-size: 0.875rem;
  text-decoration: none;
  font-weight: 500;
}

.host-profile-link:hover {
  text-decoration: underline;
}

.host-profile-section {
  max-width: 1280px;
  margin: 40px auto 64px;
  padding: 0 24px;
}

.host-profile-section-title {
  font-size: 1.25rem;
  font-weight: 600;
  color: var(--ch-text);
  margin: 0 0 24px;
}

.host-profile-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: 24px;
}

.host-chalet-card {
  border-radius: 12px;
  overflow: hidden;
  background: var(--ch-surface);
  border: 1px solid var(--ch-line);
  text-decoration: none;
  color: var(--ch-text);
  transition: border-color 0.2s, transform 0.2s;
}

.host-chalet-card:hover {
  border-color: var(--ch-line-strong);
  transform: translateY(-2px);
}

.host-chalet-card-image {
  position: relative;
  aspect-ratio: 16 / 10;
}

.host-chalet-card-img {
  object-fit: cover;
}

.host-chalet-card-body {
  padding: 16px;
}

.host-chalet-card-name {
  font-size: 1.0625rem;
  font-weight: 600;
  color: var(--ch-text);
  margin: 0;
}

.host-chalet-card-resort {
  font-size: 0.875rem;
  color: #94a3b8;
  margin: 4px 0 0;
}

.host-chalet-card-meta {
  display: flex;
  gap: 12px;
  margin-top: 10px;
  font-size: 0.8125rem;
  color: #64748b;
}

.host-chalet-card-price {
  color: #22c55e;
  font-weight: 500;
}

@media (max-width: 768px) {
  .host-profile-header {
    flex-direction: column;
    align-items: center;
    text-align: center;
  }

  .host-profile-links {
    justify-content: center;
  }

  .host-profile-name {
    font-size: 1.5rem;
  }
}


/* Override: section-large-2 should not have left margin */
.section-large-2 {
  /* Consistent vertical rhythm across sections; slightly tighter on mobile. */
  margin: 0;
  padding-block: var(--section-pad-y);
}
/* Divider between the hero and the first section below it. */
.ch-hero + .section-large-2 {
  border-top: 1px solid var(--ch-line);
}

/* Trimming the hero alone could not lift the first chalet card over the fold:
   the card sat at hero_bottom + 273px, of which 225px was this section's top
   padding and header. On a phone the section lede is the most expendable of
   the three — the eyebrow and title already name the section — so it goes,
   and the top padding halves. Together that is ~105px, which is what turns a
   hero trim into an actually visible card. Only the FIRST section under the
   hero is affected; the rest of the page keeps its rhythm. */
@media (max-width: 720px) {
  .ch-hero + .section-large-2 {
    padding-block-start: clamp(1.75rem, 4.5vw, 2.5rem);
  }
  .ch-hero + .section-large-2 .ch-section-header .ch-lede {
    display: none;
  }
}


/* Hero header (homepage) — restore styles removed from latest ch-2026.css */
.resortbg-copy {
  background-image: linear-gradient(rgba(255,255,255,0.5), rgba(255,255,255,0.5));
  border-radius: 20px;
  height: 60vh;
  padding: 0;
  display: flex;
  position: relative;
}

.homeheader {
  background-image: linear-gradient(rgba(255,255,255,0.5), rgba(255,255,255,0.5));
  border-radius: 20px;
  flex-flow: column;
  justify-content: center;
  align-items: center;
  width: 100%;
  min-height: 50svh;
  display: flex;
  position: relative;
}

.div-block-33-copy {
  color: #000;
  max-width: 700px;
}


/* ===================================================================
   CHALET HUNTER DESIGN TOKENS — single source of truth
   -------------------------------------------------------------------
   Surfaces, borders, type and motion. Anything outside this block
   should consume these vars — no ad-hoc hex / rgba in components.
   ------------------------------------------------------------------- */
:root {
  --bg-base: #f4f6fb;
  --bg-subtle: #ffffff;
  --bg-elevated: #e9eef7;
  --bg-inverse: #081427;
  --fg-primary: #111827;
  --fg-secondary: #4b5563;
  --fg-inverse: #f8fafc;
  --accent: var(--accent-brand, #2a90c7);
  /* Foreground for text sitting ON the accent. The accent is the same hex in
     both themes, so this must be dark ink in both: near-white on #2a90c7 is
     only 3.41:1 and fails WCAG AA. Dark ink measures 5.56:1 — the value the
     Subscribe button (.alerts-submit) already uses. */
  --accent-fg: #0a0a0f;
  /* The accent used AS text on a light surface: #2a90c7 is only 3.29:1 on
     --bg-base and 3.55:1 on white, so it needs darkening to 4.5:1. Fills and
     borders keep --accent; only ink uses this. */
  --accent-ink: #1d6f9c;
  --border-subtle: rgba(15, 23, 42, 0.16);
  --border-strong: rgba(15, 23, 42, 0.26);
  --ring: rgba(42, 144, 199, 0.38);
  --shadow-card: 0 12px 34px rgba(10, 20, 35, 0.14);

  /* Bridge legacy `--ch-*` usage onto the semantic layer. */
  --ch-bg: var(--bg-base);
  --ch-surface: var(--bg-subtle);
  --ch-surface-2: var(--bg-elevated);
  --ch-surface-3: color-mix(in srgb, var(--bg-elevated) 70%, var(--bg-inverse));
  --ch-border: var(--border-subtle);
  --ch-border-strong: var(--border-strong);
  --ch-line: var(--border-subtle);
  --ch-line-strong: var(--border-strong);

  /* The single vertical section rhythm. Every content section resolves to
     this; only heroes, the footer and utility bands opt out. */
  --section-pad-y: clamp(5rem, 9vw, 8.5rem);

  /* Text */
  --ch-text: var(--fg-primary);
  --ch-text-soft: color-mix(in srgb, var(--fg-primary) 80%, white);
  --ch-text-muted: var(--fg-secondary);
  --ch-text-dim: color-mix(in srgb, var(--fg-secondary) 78%, transparent);
  --ch-ink: var(--fg-inverse);

  /* Controls — chips, steppers, calendar cells, inline inputs. These used to be
     hardcoded charcoal (#1f1f23 / #232327 / #2a2a2f), which rendered as dark
     blocks inside light-theme popovers. Consume these instead of raw hex. */
  --ch-control: #eef1f7;
  --ch-control-hover: #e2e7f1;
  --ch-control-active: #d6dded;
  --ch-control-border: rgba(15, 23, 42, 0.12);
  --ch-control-border-strong: rgba(15, 23, 42, 0.2);
  /* Inverted control (selected day, active option): swaps with the theme. */
  --ch-control-on: var(--fg-primary);
  --ch-control-on-fg: var(--fg-inverse);

  /* Accent — cold alpine blue */
  --ch-accent: var(--accent);
  --ch-accent-ink: var(--accent-ink);
  --ch-accent-soft: color-mix(in srgb, var(--accent) 16%, transparent);
  --ch-accent-strong: color-mix(in srgb, var(--accent) 30%, transparent);

  /* ── always-dark surfaces ─────────────────────────────────────────────────
   * Two surfaces paint themselves #020617 in BOTH themes: the full-bleed hero
   * plate, and the mobile navbar below 768px. Anything drawn on them needs
   * colours that do NOT flip with data-theme, or the light-theme foreground
   * (#111827) lands on near-black at ~1.1:1. That has now bitten three
   * separate controls — the hero CTA pills, the hamburger, and the eyebrow —
   * so these are tokens rather than a fourth one-off patch.
   *
   * --ch-accent is the wrong token here: it resolves to #2a90c7 in the light
   * theme, which is 3.3:1 on the plate and was rendering next to the italic's
   * hardcoded #5ec8f5 — two different blues in one hero. One value serves both. */
  --ch-ondark-fg: rgba(244, 244, 246, 0.95);
  --ch-ondark-accent: #5ec8f5;
  --ch-ondark-fill: rgba(244, 244, 246, 0.08);
  --ch-ondark-line: rgba(244, 244, 246, 0.28);
  /* Opaque variant of the search panel surface. The translucent original is
     correct while the panel floats over the hero art; once it escapes the
     plate onto the pale section below, 6% bleed of near-white through
     near-black is enough to read the headings behind it. */
  --ch-ondark-sheet: rgb(18, 18, 22);

  /* Radius scale */
  --ch-radius-pill: 9999px;
  --ch-radius-button: 12px;
  --ch-radius-card: 24px;
  --ch-radius-hero: 32px;

  /* Shadows */
  --ch-shadow-sm: 0 1px 2px rgba(19, 26, 28, 0.04), 0 8px 24px -12px rgba(19, 26, 28, 0.10);
  --ch-shadow-md: 0 1px 2px rgba(19, 26, 28, 0.04), 0 8px 24px -12px rgba(19, 26, 28, 0.10);
  --ch-shadow-lg: 0 2px 4px rgba(19, 26, 28, 0.05), 0 18px 40px -16px rgba(19, 26, 28, 0.18);

  /* Motion — calm, premium */
  --ch-ease: cubic-bezier(0.2, 0.8, 0.2, 1);
  --ch-duration-fast: 160ms;
  --ch-duration: 240ms;
  --ch-duration-slow: 420ms;

  /* Typography — humanist sans for eyebrows, meta, captions, labels.
     Was Geist Mono; replaced for a warmer luxury-hospitality register. */
  --ch-font-display: 'Cabinet Grotesk', var(--font-body), 'Inter Tight',
                     system-ui, -apple-system, sans-serif;
}

[data-theme='dark'] {
  --bg-base: #020617;
  --bg-subtle: #0a1124;
  --bg-elevated: #111a30;
  --bg-inverse: #f4f4f6;
  --fg-primary: #f4f4f6;
  --fg-secondary: #b8b9c2;
  --fg-inverse: #081427;
  --accent: var(--accent-brand, #6cc7f5);
  --accent-fg: #06141f;
  --border-subtle: rgba(255, 255, 255, 0.08);
  --border-strong: rgba(255, 255, 255, 0.16);
  --ring: rgba(108, 199, 245, 0.36);
  --shadow-card: 0 18px 48px rgba(0, 0, 0, 0.45);

  --ch-surface-3: #1a2540;
  --ch-text-soft: #d8dbe4;
  --ch-text-muted: #98a1b3;
  --ch-text-dim: rgba(255, 255, 255, 0.55);

  --ch-control: #1f1f23;
  --ch-control-hover: #2a2a2f;
  --ch-control-active: #2e2e33;
  --ch-control-border: #2a2a2f;
  --ch-control-border-strong: #3a3a41;
  /* Dark theme's accent (#6cc7f5) is already light enough to use as ink. */
  --accent-ink: var(--accent);
  /* Flat in dark theme too (no inset highlight), but the outer shadows stay
     heavy — the light-theme values above are invisible on dark surfaces. */
  --ch-shadow-sm: 0 4px 16px rgba(0, 0, 0, 0.40);
  --ch-shadow-md: var(--shadow-card);
  --ch-shadow-lg: 0 24px 80px rgba(0, 0, 0, 0.60);
}

/* Much tighter section spacing on mobile (~72px -> ~30px).
   Must come AFTER the base :root token above to win the cascade. */
@media (max-width: 720px) {
  :root {
    --section-pad-y: clamp(3rem, 6vw, 5rem);
  }
}

/* ===================== HOME SEARCH BAR ===================== */
.home-search-bar {
  display: flex;
  align-items: center;
  gap: 6px;
  background: rgba(20, 20, 24, 0.72);
  backdrop-filter: blur(16px) saturate(140%);
  -webkit-backdrop-filter: blur(16px) saturate(140%);
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: 999px;
  padding: 8px 8px 8px 22px;
  width: 100%;
  max-width: 600px;
  margin: 28px auto 0;
  box-shadow: var(--ch-shadow-lg);
  transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease;
}
.home-search-bar:focus-within {
  border-color: rgba(94, 200, 245, 0.4);
  transform: translateY(-2px);
  box-shadow: 0 28px 70px rgba(0, 0, 0, 0.55), 0 0 0 4px rgba(94, 200, 245, 0.08);
}
.home-search-icon { color: var(--ch-text-soft); display: flex; flex-shrink: 0; }
.home-search-input {
  flex: 1;
  min-width: 0;
  background: transparent;
  border: none;
  outline: none;
  color: var(--ch-text);
  font-size: 16px;
  padding: 12px 0;
  font-family: inherit;
}
.home-search-input::placeholder { color: var(--ch-text-muted); }
.home-search-submit {
  background: var(--ch-text);
  color: #0d0d10;
  border: none;
  border-radius: 999px;
  padding: 12px 26px;
  font-size: 15px;
  font-weight: 600;
  cursor: pointer;
  letter-spacing: 0.2px;
  transition: transform .15s ease, box-shadow .15s ease, background .15s ease;
}
.home-search-submit:hover {
  transform: translateY(-1px);
  background: #fff;
  box-shadow: 0 10px 24px rgba(0, 0, 0, 0.4);
}
@media (max-width: 479px) {
  .home-search-bar { padding: 6px 6px 6px 16px; }
  .home-search-submit { padding: 10px 18px; font-size: 14px; }
}

/* ===================== HOME SECTION TITLE ===================== */
.home-section-title {
  text-align: center;
  margin-bottom: 40px;
  max-width: 640px;
  margin-left: auto;
  margin-right: auto;
}
.home-section-title h2 {
  font-size: 40px;
  font-weight: 400;
  color: var(--ch-text);
  letter-spacing: -0.02em;
  line-height: 1.1;
}
.home-section-title p {
  color: var(--ch-text-muted);
  margin-top: 10px;
  font-size: 16px;
  line-height: 1.5;
}
@media (max-width: 767px) {
  .home-section-title h2 { font-size: 28px; }
  .home-section-title p { font-size: 15px; }
}

/* ===================== STATS BAND ===================== */
.home-stats {
  display: flex;
  gap: 0;
  justify-content: center;
  align-items: stretch;
  flex-wrap: wrap;
  padding: 32px 24px;
  border-radius: 20px;
  background: linear-gradient(135deg, rgba(94, 200, 245, 0.06) 0%, rgba(255, 255, 255, 0.03) 100%);
  border: 1px solid rgba(255, 255, 255, 0.08);
  box-shadow: var(--ch-shadow-md);
}
.home-stat {
  flex: 1;
  min-width: 140px;
  text-align: center;
  padding: 8px 24px;
  position: relative;
}
.home-stat + .home-stat::before {
  content: '';
  position: absolute;
  left: 0;
  top: 12%;
  bottom: 12%;
  width: 1px;
  background: linear-gradient(to bottom, transparent, rgba(255, 255, 255, 0.08), transparent);
}
.home-stat-number {
  font-size: 44px;
  font-weight: 700;
  color: var(--ch-text);
  line-height: 1;
  letter-spacing: -1px;
  background: linear-gradient(135deg, #fff 0%, #c9c9cf 100%);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}
.home-stat-label {
  font-size: 12px;
  color: var(--ch-text-muted);
  margin-top: 8px;
  text-transform: uppercase;
  letter-spacing: 1.2px;
  font-weight: 500;
}
@media (max-width: 767px) {
  .home-stats { padding: 24px 16px; }
  .home-stat-number { font-size: 32px; }
  .home-stat + .home-stat::before { display: none; }
}

/* ===================== POPULAR RESORTS GRID ===================== */
.popular-resorts-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 24px;
}
@media (max-width: 991px) { .popular-resorts-grid { grid-template-columns: repeat(2, 1fr); gap: 16px; } }
@media (max-width: 479px) { .popular-resorts-grid { grid-template-columns: 1fr; } }

.popular-resort-card {
  position: relative;
  display: block;
  aspect-ratio: 4 / 5;
  border-radius: 20px;
  overflow: hidden;
  text-decoration: none;
  color: var(--ch-text);
  background: var(--ch-surface);
  box-shadow: var(--ch-shadow-sm);
  transition: transform .35s cubic-bezier(.2,.8,.2,1), box-shadow .35s ease;
  isolation: isolate;
}
.popular-resort-card:hover {
  transform: translateY(-6px);
  box-shadow: var(--ch-shadow-lg);
}
.popular-resort-card img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform .6s cubic-bezier(.2,.8,.2,1), filter .35s ease;
}
.popular-resort-card:hover img {
  transform: scale(1.08);
  filter: brightness(1.05);
}
.popular-resort-card::after {
  content: '';
  position: absolute; inset: 0;
  background: linear-gradient(to top,
    rgba(0,0,0,0.85) 0%,
    rgba(0,0,0,0.4) 35%,
    rgba(0,0,0,0) 65%);
  z-index: 1;
}
.popular-resort-info {
  position: absolute;
  left: 20px; right: 20px; bottom: 18px;
  z-index: 2;
}
.popular-resort-name {
  font-size: 20px;
  font-weight: 600;
  letter-spacing: -0.2px;
  text-shadow: 0 2px 8px rgba(0, 0, 0, 0.5);
}
.popular-resort-meta {
  font-size: 13px;
  color: var(--ch-text-soft);
  margin-top: 4px;
  display: flex;
  align-items: center;
  gap: 6px;
  text-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
}

/* ===================== COUNTRY CHIPS ===================== */
.country-chip-row {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  justify-content: center;
  max-width: 960px;
  margin: 0 auto;
}
.country-chip {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 12px 22px;
  border-radius: 999px;
  background: var(--ch-surface);
  border: 1px solid var(--ch-border);
  color: var(--ch-text-soft);
  text-decoration: none;
  font-size: 14px;
  font-weight: 500;
  transition: all .2s ease;
}
.country-chip:hover {
  background: var(--ch-surface-2);
  border-color: var(--ch-border-strong);
  color: var(--ch-text);
  transform: translateY(-2px);
  box-shadow: var(--ch-shadow-sm);
}
.country-chip > span:first-child { font-size: 18px; line-height: 1; }
.country-chip-count {
  color: var(--ch-text-muted);
  font-size: 12px;
  font-weight: 400;
}

/* ===================== FAQ ===================== */
.home-faq {
  max-width: 820px;
  margin: 0 auto;
  background: var(--ch-surface);
  border: 1px solid var(--ch-border);
  border-radius: 20px;
  overflow: hidden;
  box-shadow: var(--ch-shadow-sm);
}
.home-faq-item {
  border-bottom: 1px solid var(--ch-border);
  padding: 0;
  transition: background .2s ease;
}
.home-faq-item:last-child { border-bottom: none; }
.home-faq-item:hover { background: rgba(255, 255, 255, 0.02); }
.home-faq-item[open] {
  background: rgba(94, 200, 245, 0.04);
}
.home-faq-item[open] .home-faq-q::after {
  transform: rotate(45deg);
  color: var(--ch-accent);
}

.home-faq-q {
  list-style: none;
  cursor: pointer;
  font-size: 17px;
  font-weight: 500;
  color: var(--ch-text);
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 16px;
  padding: 22px 28px;
  letter-spacing: -0.1px;
}
.home-faq-q::-webkit-details-marker { display: none; }
.home-faq-q::after {
  content: '+';
  font-size: 28px;
  color: var(--ch-text-muted);
  transition: transform .3s cubic-bezier(.2,.8,.2,1), color .2s ease;
  line-height: 1;
  flex-shrink: 0;
  font-weight: 300;
}
.home-faq-a {
  padding: 0 28px 24px;
  color: var(--ch-text-soft);
  line-height: 1.65;
  font-size: 15px;
}
@media (max-width: 479px) {
  .home-faq-q { padding: 18px 20px; font-size: 16px; }
  .home-faq-a { padding: 0 20px 20px; }
}


/* ===================== SEASONAL STRIP ===================== */
.seasonal-strip {
  background: linear-gradient(135deg, rgba(94, 200, 245, 0.12) 0%, rgba(94, 200, 245, 0.04) 100%);
  border-top: 1px solid rgba(94, 200, 245, 0.18);
  border-bottom: 1px solid rgba(94, 200, 245, 0.18);
  position: sticky;
  top: 0;
  z-index: 100;
  backdrop-filter: saturate(140%) blur(6px);
  -webkit-backdrop-filter: saturate(140%) blur(6px);
  transition: background-color 1.2s ease, background 1.2s ease, border-color 1.2s ease, box-shadow 1.2s ease, color 1.2s ease;
}
.seasonal-strip-text,
.seasonal-strip-cta {
  transition: color 1.2s ease;
}
.seasonal-strip-inner {
  max-width: 1200px;
  margin: 0 auto;
  padding: 14px 24px;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 16px;
  flex-wrap: wrap;
}
.seasonal-strip-badge {
  background: var(--ch-accent);
  color: #0d0d10;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 1px;
  padding: 4px 10px;
  border-radius: 999px;
}
.seasonal-strip-text {
  color: var(--ch-text-soft);
  font-size: 14px;
}
.seasonal-strip-cta {
  color: var(--ch-text);
  font-size: 14px;
  font-weight: 600;
  text-decoration: none;
  white-space: nowrap;
  padding: 4px 0;
  border-bottom: 1px solid transparent;
  transition: border-color .15s ease;
}
.seasonal-strip-cta:hover { border-color: var(--ch-text); }
.seasonal-strip.is-stuck {
  background: #0d0d10;
  border-top-color: rgba(255, 255, 255, 0.08);
  border-bottom-color: rgba(255, 255, 255, 0.08);
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
}
.seasonal-strip.is-stuck .seasonal-strip-text { color: #e5e5e5; }
.seasonal-strip.is-stuck .seasonal-strip-cta { color: #fff; }
.seasonal-strip.is-stuck .seasonal-strip-cta:hover { border-color: #fff; }
@media (max-width: 559px) {
  .seasonal-strip-inner { gap: 10px; padding: 12px 16px; }
  .seasonal-strip-text { font-size: 13px; text-align: center; flex-basis: 100%; }
}

/* ===================== CHALET CARD CLS FIX ===================== */
/* Reserve the image slot so layout doesn't jump when the photo loads. */
.chalet-card .headerimagecard {
  aspect-ratio: 4 / 3;
  height: auto;
  background: var(--ch-surface-2, #1e1e22);
}
.chalet-card .resortheaderimage {
  width: 100%;
  height: 100%;
  display: block;
}

/* ===================== RESORTS INDEX ===================== */
.resorts-country-stack {
  display: flex;
  flex-direction: column;
  gap: 0;
}
.resorts-country-section {
  padding: 96px 5% 80px;
  border-top: 1px solid var(--ch-line);
  position: relative;
}
.resorts-country-section:first-child {
  border-top: none;
}
.resorts-country-header {
  display: flex;
  flex-direction: column;
  gap: 14px;
  margin-bottom: 40px;
  max-width: 1600px;
}
.resorts-country-count {
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ch-text-dim);
}
.resorts-country-name {
  display: flex;
  align-items: center;
  gap: 20px;
  font-family: var(--font-serif), 'Times New Roman', serif;
  font-weight: 400;
  font-size: clamp(44px, 6vw, 84px);
  line-height: 1;
  letter-spacing: -0.03em;
  color: var(--ch-text);
  margin: 0;
}
/* Country flag shown inside an outlined circle beside the name. */
.resorts-country-flag-badge {
  display: inline-grid;
  place-items: center;
  flex: 0 0 auto;
  width: 56px;
  height: 56px;
  border-radius: 50%;
  border: 1px solid var(--ch-line);
  font-size: 26px;
  line-height: 1;
  letter-spacing: 0;
}
@media (max-width: 600px) {
  .resorts-country-flag-badge { width: 44px; height: 44px; font-size: 22px; }
  .resorts-country-name { gap: 14px; }
}
.resorts-country-name em {
  font-style: italic;
  color: var(--ch-accent);
}

.resorts-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: 18px;
}
@media (min-width: 1400px) {
  .resorts-grid { grid-template-columns: repeat(4, 1fr); }
}
@media (max-width: 600px) {
  .resorts-grid { grid-template-columns: 1fr; gap: 12px; }
  /* Was 56/40 → ~97px of dead space between country groups on mobile. Keep the
     5% side gutter (matches the hero) so cards aren't flush to the edge. */
  .resorts-country-section { padding: 32px 5%; }
  .resorts-country-header { margin-bottom: 24px; }
}

.resort-card {
  position: relative;
  display: block;
  background: color-mix(in srgb, var(--bg-base) 94%, var(--fg-primary) 2%);
  border: 1px solid var(--ch-line);
  border-radius: 12px;
  text-decoration: none;
  color: inherit;
  transition: transform .25s ease, border-color .25s ease, background-color .25s ease;
}
.resort-card:hover {
  transform: translateY(-2px);
  border-color: rgba(94, 200, 245, 0.35);
  background: rgba(94, 200, 245, 0.05);
}

.resort-card-body {
  padding: 18px 20px 20px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.resort-card-stats {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 10px;
  font-family: var(--ch-font-display);
  font-size: 10.5px;
  letter-spacing: 1.3px;
  text-transform: uppercase;
  color: var(--ch-text-muted);
}
.resort-card-stat + .resort-card-stat::before {
  content: '·';
  margin-right: 10px;
  color: color-mix(in srgb, var(--ch-text-muted) 55%, transparent);
}
.resort-card-price {
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.5px;
  color: var(--ch-accent);
  font-weight: 500;
}
.resort-card-name {
  margin: 0;
  font-family: var(--font-serif), 'Times New Roman', serif;
  font-size: 22px;
  font-weight: 400;
  line-height: 1.15;
  letter-spacing: -0.01em;
  color: var(--ch-text);
}
.resort-card-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}
.resort-card-meta {
  font-family: var(--ch-font-display);
  font-size: 10.5px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
}
.resort-card-arrow {
  color: var(--ch-text-dim);
  font-size: 18px;
  line-height: 1;
  margin-left: auto;
  transition: transform .3s ease, color .3s ease;
}
.resort-card:hover .resort-card-arrow {
  color: var(--ch-accent);
  transform: translateX(4px);
}

/* Light theme hardening: keep resort list text dark on pale surfaces even if
   legacy rules from older stylesheets set headings to white. */
html[data-theme='light'] .resorts-country-section .resorts-country-name,
html[data-theme='light'] .resorts-country-section .resort-card-name {
  color: var(--fg-primary) !important;
}
html[data-theme='light'] .resorts-country-section .resort-card-stats,
html[data-theme='light'] .resorts-country-section .resort-card-meta {
  color: var(--fg-secondary) !important;
}
html[data-theme='light'] .resorts-country-section .resort-card-arrow {
  color: color-mix(in srgb, var(--fg-secondary) 78%, transparent) !important;
}

/* ===================== COMMAND PALETTE (cmdk) ===================== */
.cmdk-overlay {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.55);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  z-index: 10000;
  display: flex;
  align-items: flex-start;
  justify-content: center;
  padding-top: 12vh;
  animation: cmdk-fade .15s ease;
}
@keyframes cmdk-fade { from { opacity: 0; } }
.cmdk-panel {
  width: min(640px, 92vw);
  background: #0f1116;
  border: 1px solid rgba(255, 255, 255, 0.08);
  border-radius: 16px;
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6);
  overflow: hidden;
  animation: cmdk-rise .18s ease;
}
@keyframes cmdk-rise { from { transform: translateY(8px); opacity: 0; } }
.cmdk-panel [cmdk-input] {
  width: 100%;
  background: transparent;
  border: 0;
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);
  color: #fff;
  font-size: 16px;
  padding: 18px 20px;
  outline: none;
}
.cmdk-panel [cmdk-input]::placeholder { color: rgba(255,255,255,0.35); }
.cmdk-panel [cmdk-list] {
  max-height: 50vh;
  overflow-y: auto;
  padding: 8px;
}
.cmdk-panel [cmdk-group-heading] {
  font-size: 11px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.6px;
  color: rgba(255,255,255,0.4);
  padding: 10px 12px 6px;
}
.cmdk-panel [cmdk-item] {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 10px 12px;
  border-radius: 10px;
  color: #fff;
  font-size: 14px;
  cursor: pointer;
  user-select: none;
}
.cmdk-panel [cmdk-item][data-selected="true"] {
  background: rgba(94, 200, 245, 0.10);
  color: #5ec8f5;
}
.cmdk-panel .cmdk-hint {
  font-size: 12px;
  color: rgba(255,255,255,0.4);
}
.cmdk-panel [cmdk-empty] {
  padding: 24px;
  text-align: center;
  color: rgba(255,255,255,0.4);
  font-size: 14px;
}
.cmdk-foot {
  display: flex;
  gap: 10px;
  align-items: center;
  padding: 10px 16px;
  border-top: 1px solid rgba(255, 255, 255, 0.06);
  font-size: 11px;
  color: rgba(255,255,255,0.4);
}
.cmdk-foot kbd {
  background: rgba(255,255,255,0.08);
  padding: 2px 6px;
  border-radius: 4px;
  font-family: inherit;
  font-size: 10px;
  margin-right: 2px;
}

/* ===================== STICKY SEARCH RAIL ===================== */
#search-rail.is-stuck {
  padding-top: 12px !important;
  padding-bottom: 12px !important;
  background: rgba(10, 10, 15, 0.85) !important;
  backdrop-filter: saturate(140%) blur(12px);
  -webkit-backdrop-filter: saturate(140%) blur(12px);
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.45);
}
#search-rail.is-stuck .resort-search-bar {
  transform: scale(0.96);
  transform-origin: center top;
  transition: transform .3s ease;
}

/* ===================== SKELETON / SHIMMER ===================== */
.skeleton {
  position: relative;
  overflow: hidden;
  background: rgba(255, 255, 255, 0.05);
  isolation: isolate;
}
.skeleton::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(
    90deg,
    transparent 0%,
    rgba(255, 255, 255, 0.06) 30%,
    rgba(94, 200, 245, 0.10) 50%,
    rgba(255, 255, 255, 0.06) 70%,
    transparent 100%
  );
  transform: translateX(-100%);
  animation: skeleton-shimmer 1.6s ease-in-out infinite;
}
@keyframes skeleton-shimmer {
  100% { transform: translateX(100%); }
}
@media (prefers-reduced-motion: reduce) {
  .skeleton::after { animation: none; }
}
.chalet-grid-skeleton {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  gap: 24px;
}
.chalet-card-skeleton {
  background: var(--ch-surface, #16161a);
  border: 1px solid var(--ch-border, rgba(255,255,255,0.08));
  border-radius: 20px;
  padding: 14px;
}

/* ===================== VIEW TRANSITIONS ===================== */
@view-transition { navigation: auto; }
::view-transition-old(root),
::view-transition-new(root) {
  animation-duration: .35s;
  animation-timing-function: cubic-bezier(.4, 0, .2, 1);
}
::view-transition-old(root) { animation-name: vt-fade-out; }
::view-transition-new(root) { animation-name: vt-fade-in; }
@keyframes vt-fade-out { to { opacity: 0; transform: translateY(-4px); } }
@keyframes vt-fade-in  { from { opacity: 0; transform: translateY(4px); } }
@media (prefers-reduced-motion: reduce) {
  ::view-transition-old(root),
  ::view-transition-new(root) { animation: none !important; }
}

/* ===================== SMOOTH SCROLL (Lenis) ===================== */
html.lenis, html.lenis body { height: auto; }
.lenis.lenis-smooth { scroll-behavior: auto !important; }
.lenis.lenis-smooth [data-lenis-prevent] { overscroll-behavior: contain; }
.lenis.lenis-stopped { overflow: clip; }
.lenis.lenis-smooth iframe { pointer-events: none; }
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
}

/* ===================== FAQ + NEWSLETTER GRID ===================== */
.faq-newsletter-grid {
  display: grid;
  grid-template-columns: 1.2fr 1fr;
  gap: 48px;
  align-items: start;
}
.faq-sidebar {
  display: flex;
  flex-direction: column;
  gap: 24px;
  position: sticky;
  top: 80px;
}
.faq-newsletter-grid .newsletter-signup { max-width: none; }
.register-card {
  padding: 32px;
  border-radius: 24px;
  background:
    radial-gradient(circle at bottom left, rgba(94, 200, 245, 0.12) 0%, transparent 60%),
    var(--ch-surface);
  border: 1px solid var(--ch-border);
  box-shadow: var(--ch-shadow-md);
  text-align: center;
}
.register-card-badge {
  display: inline-block;
  background: rgba(94, 200, 245, 0.15);
  color: #5ec8f5;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 1px;
  text-transform: uppercase;
  padding: 4px 10px;
  border-radius: 999px;
  margin-bottom: 12px;
}
.register-card-title {
  font-size: 22px;
  font-weight: 700;
  color: var(--ch-text);
  letter-spacing: -0.3px;
  margin: 0 0 10px;
}
.register-card-sub {
  color: var(--ch-text-muted);
  font-size: 14px;
  line-height: 1.55;
  margin: 0 0 16px;
}
.register-card-list {
  list-style: none;
  padding: 0;
  margin: 0 0 20px;
  text-align: left;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.register-card-list li {
  color: var(--ch-text);
  font-size: 14px;
  padding-left: 24px;
  position: relative;
}
.register-card-list li::before {
  content: "✓";
  position: absolute;
  left: 0;
  color: #5ec8f5;
  font-weight: 700;
}
.register-card-cta {
  display: inline-block;
  background: var(--ch-text);
  color: #0d0d10;
  font-weight: 600;
  font-size: 15px;
  padding: 12px 24px;
  border-radius: 999px;
  text-decoration: none;
  transition: transform .15s ease;
}
.register-card-cta:hover { transform: translateY(-1px); }
.register-card-foot {
  color: var(--ch-text-muted);
  font-size: 13px;
  margin: 14px 0 0;
}
.register-card-foot a { color: var(--ch-text); text-decoration: underline; }
.home-section-title-left { text-align: left; margin-left: 0; }
@media (max-width: 899px) {
  .faq-newsletter-grid { grid-template-columns: 1fr; gap: 32px; }
  .faq-sidebar { position: static; }
}

/* ===================== NEWSLETTER ===================== */
.newsletter-signup {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 24px;
  padding: 48px;
  max-width: 640px;
  margin: 0 auto;
  border-radius: 24px;
  background:
    radial-gradient(circle at top right, rgba(94, 200, 245, 0.08) 0%, transparent 60%),
    var(--ch-surface);
  border: 1px solid var(--ch-border);
  box-shadow: var(--ch-shadow-md);
}
@media (max-width: 767px) {
  .newsletter-signup { padding: 32px 24px; }
}
.newsletter-title {
  font-size: 30px;
  font-weight: 700;
  color: var(--ch-text);
  letter-spacing: -0.5px;
  margin-bottom: 8px;
}
.newsletter-sub {
  color: var(--ch-text-muted);
  font-size: 15px;
  line-height: 1.55;
}
.newsletter-form {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  width: 100%;
  max-width: 480px;
  justify-content: center;
}
.newsletter-input {
  flex: 1;
  min-width: 180px;
  background: rgba(0, 0, 0, 0.3);
  border: 1px solid var(--ch-border);
  border-radius: 999px;
  color: var(--ch-text);
  font-size: 15px;
  padding: 14px 22px;
  outline: none;
  transition: border-color .15s ease;
  font-family: inherit;
}
.newsletter-input::placeholder { color: var(--ch-text-muted); }
.newsletter-input:focus { border-color: var(--ch-accent); }
.newsletter-submit {
  background: var(--ch-text);
  color: #0d0d10;
  border: none;
  border-radius: 999px;
  padding: 14px 26px;
  font-size: 15px;
  font-weight: 600;
  cursor: pointer;
  transition: transform .15s ease, box-shadow .15s ease;
  font-family: inherit;
}
.newsletter-submit:hover:not(:disabled) {
  transform: translateY(-1px);
  box-shadow: 0 10px 24px rgba(0, 0, 0, 0.3);
}
.newsletter-submit:disabled { opacity: 0.6; cursor: not-allowed; }
.newsletter-success {
  color: #4ade80;
  font-size: 15px;
  font-weight: 500;
  padding: 14px 22px;
  background: rgba(74, 222, 128, 0.08);
  border: 1px solid rgba(74, 222, 128, 0.3);
  border-radius: 999px;
  display: inline-block;
}
.newsletter-error {
  color: #f87171;
  font-size: 13px;
  flex-basis: 100%;
}


/* ===================== RESORT TILES (text-based) ===================== */
.resort-tile-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 12px;
  max-width: 1100px;
  margin: 0 auto;
}
@media (max-width: 991px) { .resort-tile-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 479px) { .resort-tile-grid { grid-template-columns: 1fr; } }

.resort-tile {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 16px 18px;
  background: var(--ch-surface);
  border: 1px solid var(--ch-border);
  border-radius: 14px;
  text-decoration: none;
  color: var(--ch-text);
  transition: all .2s ease;
  position: relative;
}
.resort-tile:hover {
  background: var(--ch-surface-2);
  border-color: var(--ch-accent);
  transform: translateY(-2px);
  box-shadow: var(--ch-shadow-md);
}
.resort-tile-flag {
  font-size: 28px;
  line-height: 1;
  flex-shrink: 0;
  filter: saturate(1.1);
}
.resort-tile-body {
  flex: 1;
  min-width: 0;
}
.resort-tile-name {
  font-size: 16px;
  font-weight: 600;
  color: var(--ch-text);
  letter-spacing: -0.2px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.resort-tile-meta {
  font-size: 12px;
  color: var(--ch-text-muted);
  margin-top: 2px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.resort-tile-arrow {
  color: var(--ch-text-muted);
  flex-shrink: 0;
  transition: transform .2s ease, color .2s ease;
}
.resort-tile:hover .resort-tile-arrow {
  color: var(--ch-accent);
  transform: translateX(3px);
}

/* ──────────────────────────────────────────────────────────── */
/* Chalet card — editorial dark surface, blue hover accent      */
/* ──────────────────────────────────────────────────────────── */

.chalet-card {
  gap: 0;
  padding: 8px 8px 4px;
  background: rgba(255, 255, 255, 0.035);
  border: 1px solid rgba(255, 255, 255, 0.07);
  border-radius: 20px;
  overflow: hidden;
  height: 100%;
  transition: border-color 0.25s ease, transform 0.25s ease, background 0.25s ease,
    box-shadow 0.25s ease;
}
.chalet-card .column-regular {
  flex: 1;
  display: flex;
  flex-direction: column;
}
.chalet-card .column-xx-small {
  flex: 1;
  display: flex;
  flex-direction: column;
}
.chalet-card .chalet-card-prices {
  margin-top: auto;
}
.chalet-card:hover {
  border-color: rgba(94, 200, 245, 0.5);
  background: rgba(255, 255, 255, 0.05);
  transform: translateY(-3px);
  box-shadow: 0 12px 32px -12px rgba(94, 200, 245, 0.35);
}

/* Image nested with its own radius (Airbnb-style inset) */
.chalet-card .headerimagecard {
  aspect-ratio: 4 / 3;
  height: auto;
  border-radius: 14px;
}
.chalet-card .resortheaderimage {
  border-radius: 14px !important;
}

/* Heart button: circular dark glass */
.chalet-card .product-top-detail {
  inset: 12px 12px auto;
  padding: 0;
}
.chalet-card .product-like {
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background: rgba(0, 0, 0, 0.5);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  color: rgba(255, 255, 255, 0.95);
}
.chalet-card .product-like:hover {
  background: rgba(0, 0, 0, 0.65);
  color: #fff;
}

/* Carousel controls tuned to dark card */
.chalet-card .carousel-arrow {
  background: rgba(255, 255, 255, 0.95);
  color: #121214;
}
.chalet-card .carousel-arrow:hover {
  background: #fff;
}

/* Body padding & spacing */
.chalet-card .column-regular {
  padding: 14px 10px 12px;
  gap: 10px;
  width: 100%;
  min-width: 0;
}
.chalet-card .column-xx-small {
  gap: 10px;
  min-width: 0;
}
.chalet-card .div-block-12 {
  gap: 10px;
  min-width: 0;
  width: 100%;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: center;
}
.chalet-card .div-block-31 {
  flex: 1 1 auto;
  min-width: 0;
  justify-content: flex-start;
}

/* Breadcrumb: softer, no uppercase, truncates gracefully */
.chalet-card .breadcrumb-wrapper {
  text-transform: none;
  font-size: 13px;
  letter-spacing: 0;
  color: var(--ch-text-muted);
  gap: 4px;
  min-width: 0;
  overflow: hidden;
}
.chalet-card .breadcrumb-wrapper .breadcrumb-link {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  min-width: 0;
}
.chalet-card .breadcrumb-link {
  color: var(--ch-text-muted);
  font-weight: 400;
}
.chalet-card .breadcrumb-link:hover {
  color: var(--ch-text);
}

/* Stat chips (beds, guests) */
.chalet-card .course-item-statistics {
  width: auto;
}
.chalet-card .course-item-statistics-left {
  gap: 6px;
}
.chalet-card .course-item-statistic {
  gap: 6px;
  padding: 4px 10px;
  background: color-mix(in srgb, var(--ch-text) 7%, transparent);
  border-radius: 999px;
  color: var(--ch-text-soft);
}
.chalet-card .course-item-statistic .caption-small {
  font-size: 12px;
  font-weight: 500;
  color: inherit;
}

/* Chalet name — editorial weight */
.chalet-card .div-block-30 {
  margin-top: 4px;
}
.chalet-card .paragraph-large.text-weight-medium {
  font-size: 19px;
  line-height: 1.2;
  font-weight: 600;
  letter-spacing: -0.3px;
  color: var(--ch-text);
}

/* Price section — date left, per-night + weekly total right */
.chalet-card .chalet-card-prices {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-top: 6px;
  padding-top: 12px;
  border-top: 1px solid var(--ch-line);
}
.chalet-card .chalet-card-price {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}
.chalet-card .chalet-card-price-dates {
  font-size: 11px;
  letter-spacing: 0.8px;
  color: var(--ch-text-muted);
  text-transform: uppercase;
  font-weight: 500;
}
.chalet-card .chalet-card-price-values {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 1px;
}
.chalet-card .chalet-card-price-primary {
  font-size: 15px;
  font-weight: 600;
  color: var(--ch-text);
  letter-spacing: -0.1px;
}
.chalet-card .chalet-card-price-secondary {
  font-size: 11px;
  color: var(--ch-text-dim);
  letter-spacing: 0.1px;
}
.chalet-card .chalet-card-price-more {
  font-size: 11px;
  color: var(--ch-accent);
  font-weight: 500;
  letter-spacing: 0.2px;
  text-transform: uppercase;
}

/* Light-surface variant for chalet cards (homepage featured grid and similar
   blocks). Prevent inherited dark-card white text from washing out on pale
   section backgrounds. */
html[data-theme='light'] .section-large-2 .chalet-card {
  background: color-mix(in srgb, var(--bg-base) 94%, var(--fg-primary) 2%);
  border-color: color-mix(in srgb, var(--fg-primary) 12%, transparent);
  color: var(--fg-primary) !important;
}
html[data-theme='light'] .section-large-2 .chalet-card:hover {
  background: color-mix(in srgb, var(--bg-base) 90%, var(--ch-accent) 6%);
  border-color: color-mix(in srgb, var(--ch-accent) 40%, transparent);
}
html[data-theme='light'] .section-large-2 .chalet-card .column-regular,
html[data-theme='light'] .section-large-2 .chalet-card .column-xx-small,
html[data-theme='light'] .section-large-2 .chalet-card .div-block-30,
html[data-theme='light'] .section-large-2 .chalet-card .paragraph-large,
html[data-theme='light'] .section-large-2 .chalet-card .paragraph-large.text-weight-medium {
  color: var(--fg-primary) !important;
}
html[data-theme='light'] .section-large-2 .chalet-card .breadcrumb-wrapper,
html[data-theme='light'] .section-large-2 .chalet-card .breadcrumb-link,
html[data-theme='light'] .section-large-2 .chalet-card .course-item-statistic,
html[data-theme='light'] .section-large-2 .chalet-card .chalet-card-price-dates,
html[data-theme='light'] .section-large-2 .chalet-card .chalet-card-price-secondary {
  color: var(--fg-secondary) !important;
}
html[data-theme='light'] .section-large-2 .chalet-card .paragraph-large.text-weight-medium,
html[data-theme='light'] .section-large-2 .chalet-card .chalet-card-price-primary {
  color: var(--fg-primary) !important;
}
html[data-theme='light'] .section-large-2 .chalet-card .course-item-statistic {
  background: color-mix(in srgb, var(--fg-primary) 8%, transparent);
}
html[data-theme='light'] .section-large-2 .chalet-card .chalet-card-prices {
  border-top-color: color-mix(in srgb, var(--fg-primary) 14%, transparent);
}

/* ═══════════════════════════════════════════════════════════ */
/*  Editorial sections — "Where we are" + "Before you book"   */
/* ═══════════════════════════════════════════════════════════ */

/* Footer: inherit body background (no distinct color) */
.footer-section {
  background-color: transparent;
}

/* Editorial full-bleed sections — midnight navy */
.browse-section.section-large-2,
.popular-section.section-large-2 {
  position: relative;
  margin: 0;
  padding: var(--section-pad-y) 5%;
  width: 100%;
  max-width: 100%;
  background: var(--ch-bg);
  border: none;
  overflow: hidden;
  isolation: isolate;
}
/* The topographic contour layer that used to sit on ::before here has been
   retired, and ::before reassigned to the section divider (see "Section
   dividers" at the end of this file).
   It was a 1MB PNG of dark-teal lines on dark teal, inverted and desaturated
   to read as light contours on the old dark page. Theme switching is off and
   the page is pinned light, so the invert now produces light-grey lines on a
   light background at 0.07 opacity: measured, it moved pixels by at most 5
   levels out of 255 (mean 3.1 across the 6% of pixels it touched). A megabyte
   of render-blocking image for an invisible texture.

   The accent glow that sat on ::after is replaced by the cool wash on the
   section background below — same job, no extra layer. */
.browse-section.section-large-2 > *,
.popular-section.section-large-2 > * {
  position: relative;
}

/* ═══════════════════════════════════════════════════════════ */
/*  Resort page — topographical hero                           */
/* ═══════════════════════════════════════════════════════════ */

.resort-hero {
  position: relative;
  background: #020617;
  overflow: hidden;
  min-height: 620px;
  padding: 140px 5% 80px;
  isolation: isolate;
  border-bottom: 1px solid var(--ch-line);
}

.resort-hero-topo {
  position: absolute;
  inset: 0;
  z-index: 0;
}
.resort-hero-topo .topo-map {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}
/* Cinematic treatment on the Mapbox tiles only — markers exempt.
   Lowers saturation, lifts contrast, slight warm tint for dusk-alpine feel. */
.resort-hero-topo .topo-map .mapboxgl-canvas {
  filter: saturate(0.7) contrast(1.15) brightness(0.68) sepia(0.15) hue-rotate(-8deg);
}
/* Warm overlay adds a subtle golden-hour wash, but never hides the map */
.resort-hero-topo::after {
  content: '';
  position: absolute;
  inset: 0;
  pointer-events: none;
  background:
    radial-gradient(ellipse 90% 70% at 50% 100%, rgba(255, 140, 60, 0.08), transparent 60%),
    linear-gradient(to bottom, rgba(30, 40, 80, 0.15), transparent 40%);
  mix-blend-mode: screen;
  z-index: 1;
}
/* Snapshot mode: skip the golden-hour wash — applied at display time instead */
.resort-hero-topo--snapshot::after {
  display: none;
}
/* Static snapshot image served in place of the live map */
.resort-hero-topo .topo-map-static {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
}

/* ── World map hero ────────────────────────────────────────── */
.resort-hero-topo .world-map {
  position: absolute;
  inset: 0;
}
.world-map {
  width: 100%;
  height: 100%;
  display: block;
}

/* Filled country silhouettes with soft white borders */
.world-map-countries path {
  fill: #1b1d23;
  stroke: rgba(255, 255, 255, 0.15);
  stroke-width: 0.4;
  stroke-linejoin: round;
  vector-effect: non-scaling-stroke;
}

/* Pulsing resort markers */
.world-map-marker-dot {
  fill: var(--ch-accent);
  filter: drop-shadow(0 0 4px rgba(94, 200, 245, 0.95))
          drop-shadow(0 0 12px rgba(94, 200, 245, 0.55));
}
.world-map-marker-ring {
  fill: none;
  stroke: var(--ch-accent);
  opacity: 0;
  transform-box: fill-box;
  transform-origin: center;
}
.world-map-marker-crosshair line {
  stroke: var(--ch-accent);
  stroke-linecap: round;
  opacity: 0.9;
  filter: drop-shadow(0 0 3px rgba(94, 200, 245, 0.8));
}
.world-map-marker--pulse .world-map-marker-ring {
  animation: world-map-pulse 2.4s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
}
.world-map-marker--pulse .world-map-marker-ring--delay {
  animation-delay: 1.2s;
}
@keyframes world-map-pulse {
  0%   { transform: scale(1);  opacity: 1; }
  80%  { transform: scale(6);  opacity: 0; }
  100% { transform: scale(6);  opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .world-map-marker--pulse .world-map-marker-ring {
    animation: none;
    opacity: 0;
  }
}

/* Shared TopoMap container + marker */
.topo-map {
  position: relative;
  width: 100%;
  height: 100%;
  opacity: 0;
  transition: opacity 800ms ease-out;
}
.topo-map.is-ready {
  opacity: 1;
}
.topo-map-marker {
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: #fff;
  border: 3px solid var(--ch-accent);
  box-shadow: 0 0 0 4px rgba(94, 200, 245, 0.3), 0 0 28px rgba(94, 200, 245, 0.9);
  position: relative;
  z-index: 5;
}
.topo-map-marker::before,
.topo-map-marker::after {
  content: '';
  position: absolute;
  inset: -3px;
  border-radius: 50%;
  border: 3px solid var(--ch-accent);
  animation: topo-marker-pulse 2.4s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
  pointer-events: none;
}
.topo-map-marker::after {
  animation-delay: 1.2s;
}
@keyframes topo-marker-pulse {
  0%   { transform: scale(1);   opacity: 1;   }
  80%  { transform: scale(5);   opacity: 0;   }
  100% { transform: scale(5);   opacity: 0;   }
}
@media (prefers-reduced-motion: reduce) {
  .topo-map-marker::before,
  .topo-map-marker::after { animation: none; opacity: 0; }
}
.topo-map .mapboxgl-ctrl-logo,
.topo-map .mapboxgl-ctrl-attrib {
  opacity: 0.3;
  transform: scale(0.8);
  transform-origin: bottom left;
}

.resort-hero-vignette {
  position: absolute;
  inset: 0;
  z-index: 1;
  background:
    radial-gradient(ellipse 80% 70% at 50% 40%, transparent 0%, rgba(0, 0, 0, 0.35) 60%, rgba(0, 0, 0, 0.8) 100%),
    linear-gradient(
      to bottom,
      rgba(0, 0, 0, 0.2) 0%,
      transparent 22%,
      transparent 45%,
      rgba(0, 0, 0, 0.45) 70%,
      rgba(0, 0, 0, 0.85) 90%,
      #000 100%
    );
}

/* Scrim behind the copy column. The world map has bright regions that the
   hero's light text disappears into (the intro line especially), so anchor the
   left third in shadow. Sits above the map (z 0/1) and below the copy (z 2). */
.resort-hero::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background: linear-gradient(
    100deg,
    rgba(2, 6, 23, 0.92) 0%,
    rgba(2, 6, 23, 0.78) 28%,
    rgba(2, 6, 23, 0.32) 52%,
    transparent 72%
  );
}

.resort-hero-content {
  position: relative;
  z-index: 2;
  max-width: 1600px;
  margin: 0 auto;
}

.resort-hero-crumb {
  display: flex;
  align-items: center;
  gap: 10px;
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ch-text-dim);
  margin-bottom: 32px;
}
.resort-hero-crumb a {
  color: var(--ch-text-dim);
  text-decoration: none;
  transition: color 0.15s ease;
}
.resort-hero-crumb a:hover {
  color: var(--ch-accent);
}
.resort-hero-crumb-flag {
  font-size: 14px;
  line-height: 1;
}
.resort-hero-crumb-sep {
  color: rgba(255, 255, 255, 0.55);
}

.resort-hero-title {
  font-family: var(--font-serif), serif;
  font-weight: 400;
  font-size: clamp(48px, 7vw, 96px);
  line-height: 1;
  color: #fff;
  margin: 0;
  letter-spacing: -0.03em;
  max-width: 14ch;
}
.resort-hero-title em {
  font-style: italic;
  color: var(--ch-accent);
}

.resort-hero-intro {
  font-size: 17px;
  line-height: 1.55;
  color: var(--ch-text-muted);
  margin: 32px 0 40px;
  max-width: 60ch;
}

.resort-hero-meta {
  display: flex;
  gap: 48px;
  flex-wrap: wrap;
  margin: 0 0 40px;
  padding: 24px 0;
  border-top: 1px solid var(--ch-line);
  border-bottom: 1px solid var(--ch-line);
}
.resort-hero-meta div {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.resort-hero-meta dt {
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ch-text-dim);
  margin: 0;
}
.resort-hero-meta dd {
  font-family: var(--font-serif), serif;
  font-size: 20px;
  color: #fff;
  margin: 0;
  letter-spacing: -0.01em;
}

.resort-hero-search {
  margin-top: 16px;
  max-width: 760px;
}

/* Resort hero sits on a dark map/image in both themes, so light-mode text
   still needs bright foreground values here. */
html[data-theme='light'] .resort-hero .resort-hero-title,
html[data-theme='light'] .resort-hero .resort-hero-meta dd {
  color: #f4f4f6 !important;
}
html[data-theme='light'] .resort-hero .resort-hero-intro,
html[data-theme='light'] .resort-hero .resort-hero-crumb,
html[data-theme='light'] .resort-hero .resort-hero-crumb a,
html[data-theme='light'] .resort-hero .resort-hero-meta dt {
  color: #d8dbe4 !important;
}

/* Mobile: the desktop hero's 620px min-height + 140/80 padding leaves far too
   much dead space top and bottom. Let it size to its content with tight padding. */
@media (max-width: 767px) {
  .resort-hero {
    min-height: auto;
    padding: 40px 5% 36px;
  }
  .resort-hero-crumb {
    margin-bottom: 20px;
  }
  .resort-hero-intro {
    margin: 20px 0 28px;
  }
  .resort-hero-meta {
    margin-bottom: 28px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .resort-hero-topo,
  .resort-hero-contours path,
  .resort-hero-anchor-halo {
    animation: none;
  }
  .resort-hero-contours path {
    stroke-dashoffset: 0;
    opacity: 0.5;
  }
}

/* ── Resort: About section ─────────────────────────────────── */

#resort-about,
#resort-facet-copy {
  padding: 96px 5% 72px;
  margin: 0;
  border-top: 1px solid var(--ch-line);
  align-items: center;
}

#resort-about .container-medium-2-copy,
#resort-facet-copy .container-medium-2-copy {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  row-gap: 28px;
  padding: 0;
  width: 100%;
  min-width: 0;
  max-width: 920px;
  margin-left: auto;
  margin-right: auto;
}

#resort-about .resort-intro,
#resort-facet-copy .resort-intro {
  display: contents;
}

#resort-about .h3-heading-3,
#resort-facet-copy .h3-heading-3 {
  display: block;
  margin: 0;
  font-family: var(--font-serif), 'Times New Roman', serif;
  font-size: clamp(32px, 3.4vw, 44px);
  font-weight: 400;
  line-height: 1.1;
  letter-spacing: -0.02em;
  color: var(--ch-text);
}

#resort-about .paragraph-x-large-2,
#resort-facet-copy .paragraph-x-large-2 {
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 17px;
  line-height: 1.65;
  color: var(--ch-text-muted);
  max-width: 75ch;
}

#resort-about .paragraph-x-large-2 strong,
#resort-facet-copy .paragraph-x-large-2 strong {
  color: var(--ch-text);
  font-weight: 500;
}

/* Cross-links inside the facet copy. The band's body text is muted and
   centred, so an unstyled anchor inherits that and reads as plain prose —
   the link is invisible without this. Ink colour plus a soft underline that
   firms up on hover: legible as a link, but not so loud that two of them in
   a short paragraph pull the eye off the copy. */
#resort-facet-copy .paragraph-x-large-2 a {
  color: var(--ch-text);
  text-decoration: underline;
  text-decoration-color: color-mix(in srgb, var(--ch-text) 35%, transparent);
  text-underline-offset: 0.18em;
  text-decoration-thickness: 1px;
  transition: text-decoration-color 0.15s ease;
}

#resort-facet-copy .paragraph-x-large-2 a:hover,
#resort-facet-copy .paragraph-x-large-2 a:focus-visible {
  text-decoration-color: var(--ch-text);
}

#resort-about .div-block-27-copy,
#resort-facet-copy .div-block-27-copy,
#resort-about .div-block-27,
#resort-facet-copy .div-block-27 {
  margin-top: 0;
  justify-content: center;
  flex-wrap: wrap;
}

#resort-about .div-block-27-copy,
#resort-facet-copy .div-block-27-copy {
  margin-top: 12px;
}

@media (max-width: 767px) {
  #resort-about,
  #resort-facet-copy {
    padding: 56px 5% 40px;
  }
  #resort-about .container-medium-2-copy,
  #resort-facet-copy .container-medium-2-copy {
    row-gap: 20px;
  }
  #resort-about .h3-heading-3,
  #resort-facet-copy .h3-heading-3 {
    font-size: 28px;
  }
  #resort-about .paragraph-x-large-2,
  #resort-facet-copy .paragraph-x-large-2 {
    font-size: 16px;
  }
}

.browse-section .home-section-title {
  margin-bottom: 32px;
}
.browse-section .country-chip {
  background: rgba(255, 255, 255, 0.04);
  border-color: rgba(255, 255, 255, 0.12);
}
.browse-section .country-chip:hover {
  background: rgba(255, 255, 255, 0.08);
  border-color: rgba(220, 190, 120, 0.4);
}

/* ── Why book direct (editorial) ───────────────────────────── */

.why-section {
  padding: var(--section-pad-y) 5%;
  background: var(--ch-surface);
  border-top: 1px solid var(--ch-line);
  border-bottom: 1px solid var(--ch-line);
}

.why-header {
  margin-bottom: 72px;
}

.why-headline-row {
  display: flex;
  flex-direction: column;
  gap: 24px;
  margin-top: 24px;
  max-width: 64rem;
}

.why-subhead {
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 1.0625rem;
  line-height: 1.6;
  color: var(--ch-text-soft);
  max-width: 60ch;
  margin: 0;
}
@media (min-width: 768px) {
  .why-subhead { font-size: 1.1875rem; line-height: 1.55; }
}

.why-pillars {
  display: grid;
  grid-template-columns: 1fr;
  gap: 48px;
  padding-top: 48px;
  border-top: 1px solid var(--ch-line);
}
@media (min-width: 720px) {
  .why-pillars {
    grid-template-columns: repeat(2, 1fr);
    gap: 56px 48px;
  }
}
@media (min-width: 1100px) {
  .why-pillars {
    grid-template-columns: repeat(4, 1fr);
    gap: 48px 40px;
  }
}

.why-pillar {
  display: flex;
  flex-direction: column;
  gap: 12px;
  min-height: 100%;
}
.why-pillar-num {
  font-family: var(--font-serif), serif;
  font-style: italic;
  font-weight: 400;
  font-size: 28px;
  color: var(--ch-accent);
  letter-spacing: -0.02em;
  margin-bottom: 4px;
}
.why-pillar-title {
  font-family: var(--font-serif), serif;
  font-weight: 500;
  font-size: 24px;
  line-height: 1.2;
  color: var(--ch-text);
  margin: 0;
  letter-spacing: -0.01em;
}
.why-pillar-body {
  font-size: 15px;
  line-height: 1.6;
  color: var(--ch-text-muted);
  margin: 0;
  max-width: 34ch;
}

/* Stats inside the 4th pillar — compact row */
.why-pillar-stats-row {
  display: flex;
  gap: 24px;
  margin-top: 8px;
}
.why-pillar-stat {
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.why-pillar-stat-num {
  font-family: var(--font-serif), serif;
  font-weight: 400;
  font-size: 32px;
  line-height: 1;
  color: var(--ch-text);
  letter-spacing: -0.02em;
  font-variant-numeric: tabular-nums;
}
.why-pillar-stat-label {
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ch-text-dim);
}

/* Stats meta-row — sits under the lede, single inline credibility line.
   Replaces the old giant 3-column strip that sat between pillars and CTAs. */
.why-meta-stats {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.875rem;
  margin-top: 1.5rem;
}
.why-meta-stat {
  display: inline-flex;
  align-items: baseline;
  gap: 0.5rem;
}
.why-meta-stat-num {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: 1.25rem;
  line-height: 1;
  color: var(--ch-text);
  letter-spacing: -0.01em;
  font-variant-numeric: tabular-nums;
}
.why-meta-stat-label {
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ch-text-dim);
}
.why-meta-stats-sep {
  /* --ch-text-dim is already alpha-reduced; stacking opacity on top took the
     effective alpha to ~0.27 and the dot to 2.42:1 in dark theme. */
  color: var(--ch-text-dim);
  font-size: 11px;
}

.why-cta-row {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 56px;
}
.why-cta-chip {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 10px 18px;
  border: 1px solid var(--ch-line-strong);
  border-radius: 999px;
  font-size: 13px;
  font-weight: 500;
  color: var(--ch-text-muted);
  text-decoration: none;
  background: rgba(255, 255, 255, 0.02);
  transition: border-color 0.2s ease, color 0.2s ease, background 0.2s ease,
    transform 0.2s ease;
}
.why-cta-chip:hover {
  border-color: var(--ch-accent);
  color: var(--ch-text);
  background: rgba(94, 200, 245, 0.08);
  transform: translateY(-1px);
}
.why-cta-chip span {
  transition: transform 0.2s ease;
  color: var(--ch-accent-ink);
}
.why-cta-chip:hover span {
  transform: translateX(3px);
}
/* ── centred header and CTA row ─────────────────────────────────────────────
 * The eyebrow, headline, subhead and stats were all set against the left edge
 * of a full-width container, so on a wide screen the section read as a column
 * of copy with two thirds of the row empty beside it.
 *
 * Deliberately stops at the header: the four pillar columns keep their
 * left-aligned body copy, because centring four blocks of multi-line text
 * gives every line a different start position and makes them slower to scan.
 * Placed after the .why-* rules above so it wins on order, not specificity. */
.why-header {
  text-align: center;
}
.why-headline-row {
  align-items: center;
  margin-inline: auto;
}
.why-subhead {
  margin-inline: auto;
}
.why-meta-stats {
  justify-content: center;
}
.why-cta-row {
  justify-content: center;
}

.why-cta-chip--primary {
  background: var(--ch-accent-soft);
  border-color: var(--ch-accent-strong);
  color: var(--ch-text);
}
.why-cta-chip--primary:hover {
  background: color-mix(in srgb, var(--ch-accent) 24%, transparent);
  border-color: var(--ch-accent);
}

/* ── Members (editorial free account) ──────────────────────── */

.members-section {
  padding: var(--section-pad-y) 5%;
  background: rgba(255, 255, 255, 0.015);
  border-top: 1px solid var(--ch-line);
  border-bottom: 1px solid var(--ch-line);
  text-align: center;
}
.members-section .section-eyebrow {
  margin-bottom: 16px;
}

.members-layout {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 64px;
  margin-top: 0;
}

.members-copy {
  max-width: 720px;
  display: flex;
  flex-direction: column;
  align-items: center;
}

.members-copy .editorial-headline {
  font-size: clamp(36px, 4.5vw, 60px);
  text-align: center;
}

.members-subhead {
  font-size: 16px;
  line-height: 1.6;
  color: var(--ch-text-muted);
  margin: 24px auto 32px;
  max-width: 52ch;
  text-align: center;
}

.members-actions {
  display: flex;
  align-items: center;
  gap: 20px;
  flex-wrap: wrap;
  justify-content: center;
}
.members-cta {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 14px 26px;
  background: #fff;
  color: #0a0a0f;
  border-radius: 999px;
  font-size: 14px;
  font-weight: 600;
  text-decoration: none;
  transition: background 0.15s ease, transform 0.15s ease;
}
.members-cta:hover {
  background: #e7e7ea;
  transform: translateY(-1px);
}
.members-cta span {
  transition: transform 0.15s ease;
}
.members-cta:hover span {
  transform: translateX(3px);
}
.members-signin {
  font-size: 13px;
  color: var(--ch-text-dim);
}
.members-signin a {
  color: var(--ch-accent-ink);
  text-decoration: none;
  font-weight: 500;
}
.members-signin a:hover {
  text-decoration: underline;
}

.members-benefits {
  list-style: none;
  margin: 0;
  padding: 40px 0 0;
  border-top: 1px solid var(--ch-line);
  display: grid;
  grid-template-columns: 1fr;
  gap: 40px;
  width: 100%;
  max-width: 980px;
}
@media (min-width: 720px) {
  .members-benefits {
    grid-template-columns: repeat(3, 1fr);
    gap: 48px;
  }
}
.members-benefit {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
  text-align: center;
}
.members-benefit-num {
  font-family: var(--font-serif), serif;
  font-style: italic;
  font-weight: 400;
  font-size: 22px;
  color: var(--ch-accent-ink);
  line-height: 1.2;
  letter-spacing: -0.02em;
  margin-bottom: 4px;
}
.members-benefit-title {
  font-family: var(--font-serif), serif;
  font-weight: 500;
  font-size: 19px;
  line-height: 1.2;
  color: var(--ch-text);
  margin: 0 0 6px;
  letter-spacing: -0.01em;
}
.members-benefit-body {
  font-size: 14px;
  line-height: 1.55;
  color: var(--ch-text-dim);
  margin: 0;
  max-width: 32ch;
}

/* Typography: Inter Tight for body, Fraunces for headings — overrides ch-2026.css */
body {
  font-family: var(--font-body), 'Inter Tight', -apple-system, BlinkMacSystemFont, 'Segoe UI',
    sans-serif;
}
h1, h2, h3, h4, h5, h6,
.h1-heading, .h2-heading, .h3-heading-3, .h3-heading, .h4-heading,
.heading, .heading-2, .heading-3, .heading-4, .heading-5 {
  font-family: var(--font-serif), 'Times New Roman', serif;
  letter-spacing: -0.01em;
}

.section-eyebrow {
  font-family: var(--ch-font-display);
  font-size: 12px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ch-text-dim);
  margin-bottom: 24px;
}

.editorial-headline {
  font-family: var(--font-serif), 'Times New Roman', serif;
  font-weight: 400;
  font-size: clamp(38px, 5vw, 72px);
  line-height: 1.05;
  letter-spacing: -0.02em;
  color: var(--ch-text);
  margin: 0;
}
.editorial-headline em {
  font-style: italic;
  color: var(--ch-accent);
  font-family: inherit;
}
/* Multi-line editorial headlines need a touch more leading on narrow screens. */
@media (max-width: 720px) {
  .editorial-headline { line-height: 1.12; }
}

.editorial-subheadline {
  font-family: var(--font-serif), 'Times New Roman', serif;
  font-weight: 400;
  font-size: clamp(24px, 2.4vw, 32px);
  line-height: 1.15;
  letter-spacing: -0.01em;
  color: var(--ch-text);
  margin: 0;
}
.editorial-subheadline em {
  font-style: italic;
  color: var(--ch-accent);
  font-family: inherit;
}

/* On light surfaces these editorial blocks must never inherit white text. */
html[data-theme='light'] .ch-advisor-prompt .editorial-headline,
html[data-theme='light'] .where-section .editorial-headline,
html[data-theme='light'] .members-section .editorial-headline,
html[data-theme='light'] .members-section .members-benefit-title {
  color: var(--fg-primary) !important;
}

/* ── Where we are ─────────────────────────────────────────── */

.where-section {
  padding: var(--section-pad-y) 5%;
  background: rgba(255, 255, 255, 0.015);
  border-top: 1px solid var(--ch-line);
  border-bottom: 1px solid var(--ch-line);
}
/* Hide the map "where we are" section on mobile. */
@media (max-width: 720px) {
  .where-section { display: none; }
}

.where-section-header {
  margin-bottom: 24px;
}

.where-subhead {
  font-size: 15px;
  line-height: 1.55;
  color: var(--ch-text-dim);
  max-width: 420px;
  margin: 16px 0 0;
}

.where-layout {
  display: grid;
  grid-template-columns: 1fr;
  gap: 32px;
  align-items: start;
}
@media (min-width: 960px) {
  .where-layout {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr);
    gap: 48px;
  }
}

.where-sticky-side {
  display: flex;
  flex-direction: column;
  gap: 24px;
}
@media (min-width: 960px) {
  .where-sticky-side {
    position: sticky;
    top: 24px;
    align-self: start;
    max-height: calc(100vh - 48px);
    overflow: hidden;
  }
}
.where-sticky-side .editorial-headline {
  font-size: clamp(32px, 3vw, 44px);
}

.where-list {
  list-style: none;
  margin: 0;
  padding: 0;
  border-top: 1px solid var(--ch-line);
}

.where-row {
  display: grid;
  grid-template-columns: 32px 1fr auto;
  gap: 16px;
  align-items: center;
  padding: 18px 4px 18px 0;
  border-bottom: 1px solid var(--ch-line);
  text-decoration: none;
  color: inherit;
  transition: background 0.2s ease, padding 0.2s ease;
}
.where-row:hover,
.where-row.is-active {
  background: rgba(94, 200, 245, 0.05);
  padding-left: 12px;
  padding-right: 12px;
}
.where-row.is-active .where-row-name {
  color: var(--ch-accent);
}

.where-row-flag {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 20px;
  font-size: 16px;
  background: rgba(255, 255, 255, 0.06);
  border-radius: 3px;
}

.where-row-body {
  min-width: 0;
}
.where-row-name {
  font-family: var(--font-serif), serif;
  font-size: 22px;
  line-height: 1.2;
  color: var(--ch-text);
  transition: color 0.2s ease;
}
.where-row-meta {
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 1px;
  text-transform: uppercase;
  color: var(--ch-text-dim);
  margin-top: 4px;
}

.where-row-price {
  text-align: right;
  min-width: 90px;
}
.where-row-price-amount {
  display: block;
  font-family: var(--font-serif), serif;
  font-size: 20px;
  color: var(--ch-text);
  line-height: 1.1;
}
.where-row-price-label {
  display: block;
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 1px;
  text-transform: uppercase;
  color: var(--ch-text-dim);
  margin-top: 2px;
}

.where-map-wrapper {
  position: relative;
  border-radius: 16px;
  overflow: hidden;
  border: 1px solid var(--ch-line);
  height: 420px;
  background: var(--ch-surface);
  width: 100%;
  isolation: isolate;
  flex: 0 0 420px;
}
.where-map {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}
/* ── Map treatment ───────────────────────────────────────────────────
   None of the rules below carry a data-theme variant any more. The home band
   this section belongs to is pinned pale in both themes (the --cx-* tokens
   further down aren't theme-scoped), so there is only one correct treatment
   and the old dark-theme pair was simply the one nobody could see.

   The basemap is light-v11 — see the note in WhereWeAre.tsx. The tint that
   used to be here (sepia + hue-rotate to navy) existed to sit dark-v11 on a
   dark page; this one only pulls the basemap's greys a little cooler and
   flatter so the tiles read as part of the wash. Scoped to the canvas so the
   DOM markers (.where-marker) keep their true accent colour — the canvas
   holds the tiles and labels, markers are separate overlay elements. */
.where-map .mapboxgl-canvas {
  /* light-v11 is pale to begin with, so this leans on contrast rather than
     brightness — lifting it as well washed the borders and coastlines out
     until the frame read as an empty rectangle. */
  filter: saturate(0.95) contrast(1.06);
}
/* A breath of the band's lavender over the tiles, multiplied so the basemap's
   greys go cool rather than the whole frame going flat. The wrapper is
   `isolation: isolate`, so the blend can't reach the page behind it. */
.where-map-wrapper::before {
  content: '';
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: rgba(124, 116, 214, 0.07);
  mix-blend-mode: multiply;
  z-index: 1;
}
/* Editorial vignette — the band's own colour blooming in at the edges, so the
   frame dissolves into the page instead of ending on a hard rectangle. */
.where-map-wrapper::after {
  content: '';
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: radial-gradient(
    ellipse at center,
    rgba(244, 246, 251, 0) 58%,
    rgba(244, 246, 251, 0.26) 86%,
    rgba(244, 246, 251, 0.6) 100%
  );
  z-index: 1;
}
/* Keep markers above the vignette */
.where-map-wrapper .mapboxgl-marker {
  z-index: 2;
}
/* Shrink Mapbox logo/attribution to stay out of the editorial frame */
.where-map-wrapper .mapboxgl-ctrl-logo,
.where-map-wrapper .mapboxgl-ctrl-attrib {
  opacity: 0.35;
  transform: scale(0.85);
  transform-origin: bottom left;
}
/* The hovered-resort card, on the band's glass recipe rather than the near
   black panel it was — on light tiles that was the heaviest element in the
   section. Blurred here, unlike the band's other glass: the backdrop is a map,
   so there is something to blur. */
.where-map-overlay {
  position: absolute;
  left: 20px;
  bottom: 20px;
  padding: 12px 16px;
  background: rgba(255, 255, 255, 0.88);
  border: 1px solid rgba(255, 255, 255, 0.9);
  border-radius: 14px;
  box-shadow: 0 1px 2px rgba(16, 29, 51, 0.05), 0 18px 40px -24px rgba(16, 29, 51, 0.5);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  min-width: 180px;
}
.where-map-overlay-label {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--cx-muted, #666e87);
  margin-bottom: 4px;
}
.where-map-overlay-title {
  font-size: 16px;
  color: var(--cx-ink, #101d33);
  line-height: 1.2;
}

/* Mapbox markers for "where we are". The glow they used to carry was a neon
   cyan halo built to read on charcoal tiles; on pale ones it dissolved. A
   white ring plus a soft accent halo is the light-basemap equivalent. */
.where-marker {
  width: 12px;
  height: 12px;
  border-radius: 50%;
  background: var(--cx-accent, #2a90c7);
  box-shadow:
    0 0 0 3px rgba(255, 255, 255, 0.92),
    0 0 0 5px rgba(42, 144, 199, 0.22),
    0 6px 14px -4px rgba(16, 29, 51, 0.45);
  cursor: pointer;
  transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease;
}
.where-marker.is-active {
  transform: scale(1.35);
  box-shadow:
    0 0 0 4px #fff,
    0 0 0 8px rgba(42, 144, 199, 0.3),
    0 10px 22px -6px rgba(16, 29, 51, 0.5);
}

/* ── Before you book ──────────────────────────────────────── */

.answers-section {
  padding: var(--section-pad-y) 5%;
  background: rgba(255, 255, 255, 0.015);
  border-top: 1px solid var(--ch-line);
  border-bottom: 1px solid var(--ch-line);
}

.answers-header {
  margin-bottom: 56px;
}

.answers-headline-row {
  display: flex;
  flex-direction: column;
  gap: 20px;
  max-width: 64rem;
}

.answers-subhead {
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 1.0625rem;
  line-height: 1.6;
  color: var(--ch-text-soft);
  max-width: 60ch;
  margin: 0;
}
@media (min-width: 768px) {
  .answers-subhead { font-size: 1.1875rem; line-height: 1.55; }
}

.answers-layout {
  display: grid;
  grid-template-columns: 1fr;
  gap: 32px;
  align-items: start;
}
@media (min-width: 960px) {
  .answers-layout {
    grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
    gap: 64px;
  }
}

.faq-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
}
.faq-item {
  border: 1px solid var(--ch-border);
  border-radius: var(--ch-radius-button);
  background: var(--ch-surface);
  transition: border-color var(--ch-duration) var(--ch-ease),
              background var(--ch-duration) var(--ch-ease);
}
.faq-item:hover { border-color: var(--ch-border-strong); }
.faq-item.is-open {
  border-color: var(--ch-border-strong);
  background: var(--ch-surface-2);
}
.faq-toggle {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  padding: 1.25rem 1.5rem;
  background: none;
  border: none;
  text-align: left;
  cursor: pointer;
  color: var(--ch-text);
  font-family: var(--font-serif), 'Fraunces', serif;
  font-size: 1.125rem;
  font-weight: 400;
  letter-spacing: -0.005em;
  line-height: 1.3;
  transition: color var(--ch-duration) var(--ch-ease);
}
.faq-toggle:hover {
  color: var(--ch-accent);
}
.faq-question {
  flex: 1;
}
.faq-icon {
  flex: none;
  width: 24px;
  height: 24px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: var(--ch-accent);
}
.faq-item.is-open .faq-toggle {
  padding-bottom: 0.75rem;
}
.faq-answer {
  padding: 0 1.5rem 1.5rem;
  font-size: 0.9375rem;
  line-height: 1.7;
  color: var(--ch-text-soft);
  max-width: 60ch;
}
/* Compact FAQ cards on mobile. */
@media (max-width: 720px) {
  .faq-list { gap: 0.5rem; }
  .faq-toggle {
    gap: 14px;
    padding: 0.85rem 1rem;
    font-size: 1rem;
  }
  .faq-icon { width: 20px; height: 20px; }
  .faq-item.is-open .faq-toggle { padding-bottom: 0.5rem; }
  .faq-answer {
    padding: 0 1rem 1rem;
    font-size: 0.875rem;
    line-height: 1.6;
  }
}

/* Alerts / newsletter card */
.alerts-card {
  background: rgba(255, 255, 255, 0.03);
  border: 1px solid var(--ch-line);
  border-radius: 18px;
  padding: 32px;
}
@media (min-width: 960px) {
  .alerts-card {
    position: sticky;
    top: 24px;
    align-self: start;
  }
}
.alerts-eyebrow {
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ch-accent-ink);
  margin-bottom: 16px;
  display: flex;
  align-items: center;
  gap: 8px;
}
.alerts-copy {
  font-size: 14px;
  line-height: 1.55;
  color: var(--ch-text-dim);
  margin: 16px 0 20px;
}
.alerts-form {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
}
.alerts-input {
  flex: 1;
  min-width: 0;
  padding: 12px 16px;
  background: rgba(0, 0, 0, 0.3);
  border: 1px solid var(--ch-line-strong);
  border-radius: 999px;
  color: #fff;
  font-size: 14px;
  outline: none;
  transition: border-color 0.15s ease;
}
html[data-theme='light'] .alerts-input {
  background: #ffffff;
  border-color: var(--border-strong);
  color: var(--fg-primary);
}
.alerts-input:focus {
  border-color: var(--ch-accent);
}
.alerts-input::placeholder {
  color: var(--ch-text-dim);
}
html[data-theme='light'] .alerts-input::placeholder {
  color: var(--fg-secondary);
}
.alerts-submit {
  padding: 12px 22px;
  background: var(--ch-accent);
  color: #0a0a0f;
  border: none;
  border-radius: 999px;
  font-size: 14px;
  font-weight: 600;
  cursor: pointer;
  transition: background 0.15s ease, transform 0.15s ease;
}
.alerts-submit:hover {
  background: #a9c8de;
  transform: translateY(-1px);
}
.alerts-submit:disabled {
  opacity: 0.6;
  cursor: not-allowed;
  transform: none;
}
.alerts-success {
  padding: 14px 16px;
  background: rgba(94, 200, 245, 0.1);
  border: 1px solid rgba(94, 200, 245, 0.35);
  border-radius: 12px;
  color: var(--ch-accent);
  font-size: 14px;
}
.alerts-error {
  margin-top: 12px;
  font-size: 13px;
  color: #e74c3c;
}
.alerts-footnote {
  margin-top: 16px;
  font-size: 12px;
  color: var(--ch-text-dim);
}


/* ============================================================
   Marketing pages: Blog (luxury grid), Contact, FAQ, Legal, About
   Uses --ch-* dark theme tokens + Fraunces serif for editorial heads
   ============================================================ */

/* --- Blog: page header --- */
.blog-page-header {
  text-align: center;
  max-width: 760px;
  margin: 0 auto;
  padding: 2rem 0 1rem;
}
.blog-eyebrow {
  display: inline-block;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ch-accent);
  margin-bottom: 1rem;
}
.blog-page-title {
  font-family: var(--font-serif), 'Fraunces', Georgia, serif;
  font-size: clamp(2.5rem, 5.5vw, 4rem);
  font-weight: 400;
  line-height: 1.05;
  letter-spacing: -0.02em;
  margin: 0 0 1.25rem;
  color: var(--ch-text);
}
.blog-page-title em {
  font-style: italic;
  color: var(--ch-accent);
}
.blog-page-tagline {
  font-size: clamp(1rem, 1.25vw, 1.125rem);
  color: var(--ch-text-soft);
  line-height: 1.6;
  margin: 0;
}

/* --- Blog: featured (hero) card --- */
.blog-listing {
  padding-top: 1rem !important;
}
.blog-feature-card {
  display: grid;
  grid-template-columns: 1.15fr 1fr;
  gap: 0;
  background: var(--ch-surface);
  border: 1px solid var(--ch-border);
  border-radius: 24px;
  overflow: hidden;
  text-decoration: none;
  color: inherit;
  margin-bottom: 3rem;
  transition: transform 0.35s ease, border-color 0.25s ease, box-shadow 0.35s ease;
}
.blog-feature-card:hover {
  transform: translateY(-4px);
  border-color: var(--ch-border-strong);
  box-shadow: var(--ch-shadow-lg);
}
.blog-feature-media {
  position: relative;
  min-height: 420px;
  overflow: hidden;
}
.blog-feature-media img {
  object-fit: cover;
  transition: transform 0.6s ease;
}
.blog-feature-card:hover .blog-feature-media img {
  transform: scale(1.04);
}
.blog-feature-body {
  padding: 3rem 3rem;
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 1rem;
}
.blog-feature-title {
  font-family: var(--font-serif), 'Fraunces', Georgia, serif;
  font-size: clamp(1.75rem, 2.6vw, 2.5rem);
  font-weight: 400;
  line-height: 1.15;
  letter-spacing: -0.01em;
  margin: 0;
  color: var(--ch-text);
}
.blog-feature-excerpt {
  font-size: 1.0625rem;
  line-height: 1.6;
  color: var(--ch-text-soft);
  margin: 0;
}
.blog-feature-cta {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 14px;
  font-weight: 600;
  letter-spacing: 0.02em;
  color: var(--ch-accent);
  margin-top: 0.5rem;
}
@media (max-width: 900px) {
  .blog-feature-card {
    grid-template-columns: 1fr;
  }
  .blog-feature-media {
    min-height: 280px;
  }
  .blog-feature-body {
    padding: 2rem 1.75rem;
  }
}

/* --- Blog: grid of secondary cards --- */
.blog-grid {
  list-style: none;
  padding: 0;
  margin: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
  gap: 2rem;
}
.blog-card {
  list-style: none;
}
.blog-card-link {
  display: flex;
  flex-direction: column;
  height: 100%;
  background: var(--ch-surface);
  border: 1px solid var(--ch-border);
  border-radius: 20px;
  overflow: hidden;
  color: inherit;
  text-decoration: none;
  transition: transform 0.3s ease, border-color 0.25s ease, box-shadow 0.3s ease;
}
.blog-card-link:hover {
  transform: translateY(-4px);
  border-color: var(--ch-border-strong);
  box-shadow: var(--ch-shadow-md);
}
.blog-card-media {
  position: relative;
  aspect-ratio: 16 / 10;
  background: var(--ch-bg);
  overflow: hidden;
}
.blog-card-media img {
  object-fit: cover;
  transition: transform 0.5s ease;
}
.blog-card-link:hover .blog-card-media img {
  transform: scale(1.05);
}
.blog-card-body {
  padding: 1.75rem;
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  flex: 1;
}
.blog-card-category,
.blog-card-meta {
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}
.blog-card-category {
  display: inline-block;
  align-self: flex-start;
  color: var(--ch-accent);
}
.blog-card-meta {
  color: var(--ch-text-muted);
  letter-spacing: 0.05em;
  font-weight: 500;
  text-transform: none;
  font-size: 13px;
  margin-top: auto;
}
.blog-card-title {
  font-family: var(--font-serif), 'Fraunces', Georgia, serif;
  font-size: 1.5rem;
  font-weight: 400;
  line-height: 1.2;
  letter-spacing: -0.01em;
  margin: 0;
  color: var(--ch-text);
}
.blog-card-excerpt {
  font-size: 0.9375rem;
  line-height: 1.55;
  color: var(--ch-text-soft);
  margin: 0;
}

/* --- Blog post detail --- */
.blog-post {
  background: var(--ch-bg);
}
.blog-post-hero {
  position: relative;
  height: clamp(380px, 60vh, 620px);
  width: 100%;
  overflow: hidden;
  display: flex;
  align-items: flex-end;
}
.blog-post-hero-image {
  object-fit: cover;
  z-index: 0;
}
.blog-post-hero-overlay {
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(0, 0, 0, 0.1) 0%, rgba(0, 0, 0, 0.3) 50%, rgba(13, 13, 16, 0.95) 100%);
  z-index: 1;
}
.blog-post-hero-inner {
  position: relative;
  z-index: 2;
  width: 100%;
  max-width: 880px;
  margin: 0 auto;
  padding: 2.5rem 1.5rem 3.5rem;
  display: flex;
  flex-direction: column;
  gap: 1rem;
  color: var(--ch-text);
}
.blog-post-back-link {
  font-size: 13px;
  color: var(--ch-text-soft);
  text-decoration: none;
  letter-spacing: 0.04em;
  align-self: flex-start;
  margin-bottom: 0.5rem;
}
.blog-post-back-link:hover {
  color: var(--ch-text);
}
.blog-post-hero-title {
  font-family: var(--font-serif), 'Fraunces', Georgia, serif;
  font-size: clamp(2rem, 5vw, 3.5rem);
  font-weight: 400;
  line-height: 1.1;
  letter-spacing: -0.02em;
  margin: 0.5rem 0 0;
  max-width: 820px;
}
.blog-post-hero-meta {
  font-size: 13px;
  letter-spacing: 0.05em;
  color: var(--ch-text-soft);
  text-transform: uppercase;
  font-weight: 500;
}
.blog-post-lede {
  max-width: 720px;
  margin: 0 auto 2.5rem;
  font-family: var(--font-serif), 'Fraunces', Georgia, serif;
  font-size: clamp(1.25rem, 1.75vw, 1.5rem);
  line-height: 1.45;
  font-style: italic;
  color: var(--ch-text);
  font-weight: 400;
}
.blog-post-body {
  max-width: 720px;
  margin: 0 auto;
  font-size: 1.0625rem;
  line-height: 1.8;
  color: var(--ch-text-soft);
}
.blog-post-body > * + * { margin-top: 0; }
.blog-post-body h2 {
  font-family: var(--font-serif), 'Fraunces', Georgia, serif;
  font-size: clamp(1.5rem, 2vw, 1.875rem);
  font-weight: 400;
  letter-spacing: -0.01em;
  margin: 3rem 0 1rem;
  color: var(--ch-text);
  line-height: 1.2;
}
.blog-post-body h3 {
  font-size: 1.25rem;
  font-weight: 600;
  margin: 2.25rem 0 0.75rem;
  color: var(--ch-text);
}
.blog-post-body p {
  margin: 0 0 1.5rem;
}
.blog-post-body ul,
.blog-post-body ol {
  margin: 0 0 1.5rem;
  padding-left: 1.5rem;
}
.blog-post-body li {
  margin-bottom: 0.5rem;
}
.blog-post-body a {
  color: var(--ch-accent);
  text-decoration: underline;
  text-underline-offset: 3px;
  text-decoration-thickness: 1px;
}
.blog-post-body strong {
  color: var(--ch-text);
  font-weight: 600;
}
.blog-post-body table {
  width: 100%;
  border-collapse: collapse;
  margin: 2rem 0;
  font-size: 0.95rem;
}
.blog-post-body th,
.blog-post-body td {
  padding: 0.875rem 1rem;
  border-bottom: 1px solid var(--ch-border);
  text-align: left;
}
.blog-post-body th {
  background: var(--ch-surface);
  font-weight: 600;
  color: var(--ch-text);
  font-size: 0.875rem;
  letter-spacing: 0.02em;
  text-transform: uppercase;
}
.blog-post-body code {
  background: var(--ch-surface);
  padding: 2px 6px;
  border-radius: 4px;
  font-size: 0.9em;
}
.blog-post-body blockquote {
  border-left: 3px solid var(--ch-accent);
  margin: 2rem 0;
  padding: 0.5rem 0 0.5rem 1.5rem;
  font-style: italic;
  color: var(--ch-text);
  font-size: 1.125rem;
}

/* --- Contact page --- */
.contact-grid {
  display: grid;
  gap: 4rem;
  grid-template-columns: minmax(0, 1.7fr) minmax(0, 1fr);
  align-items: start;
}
@media (max-width: 768px) {
  .contact-grid { grid-template-columns: 1fr; gap: 2.5rem; }
}
.contact-aside {
  padding: 2.25rem;
  background: var(--ch-surface);
  border: 1px solid var(--ch-border);
  border-radius: var(--ch-radius-card);
  display: flex;
  flex-direction: column;
  gap: 1.5rem;
}
.contact-aside h2 {
  margin: 0 0 1.25rem;
  font-family: var(--font-serif), 'Fraunces', Georgia, serif;
  font-size: 1.25rem;
  font-weight: 400;
  color: var(--ch-text);
}
.contact-aside a {
  color: var(--ch-text);
  text-decoration: underline;
  text-decoration-color: var(--ch-border-strong);
  text-underline-offset: 0.25em;
  transition: text-decoration-color var(--ch-duration) var(--ch-ease);
}
.contact-aside a:hover { text-decoration-color: var(--ch-accent); }
.contact-aside-list {
  margin: 0;
  font-size: 14px;
  color: var(--ch-text-soft);
  line-height: 1.6;
}
.contact-aside-list dt {
  font-weight: 600;
  font-size: 12px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  margin-top: 1.25rem;
  color: var(--ch-text-muted);
}
.contact-aside-list dt:first-child { margin-top: 0; }
.contact-aside-list dd {
  margin: 0.35rem 0 0;
  color: var(--ch-text);
}
.contact-form {
  display: grid;
  gap: 1.5rem;
}
.contact-form > button[type='submit'] { justify-self: start; margin-top: 0.5rem; }
.contact-field label {
  display: block;
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  margin-bottom: 0.5rem;
  color: var(--ch-text-muted);
}
.contact-field input,
.contact-field textarea {
  width: 100%;
  padding: 0.875rem 1rem;
  border-radius: 10px;
  border: 1px solid var(--ch-border);
  background: var(--ch-surface);
  color: var(--ch-text);
  font-size: 15px;
  outline: none;
  font-family: inherit;
  transition: border-color 0.2s;
}
.contact-field input:focus,
.contact-field textarea:focus { border-color: var(--ch-accent); }
.contact-textarea { resize: vertical; min-height: 160px; }
.contact-submit {
  padding: 0.95rem 1.75rem;
  border-radius: 10px;
  font-size: 15px;
  font-weight: 600;
  border: none;
  cursor: pointer;
  justify-self: start;
}
.contact-submit:disabled { opacity: 0.6; cursor: not-allowed; }
.contact-error {
  background: rgba(231, 76, 60, 0.1);
  border: 1px solid rgba(231, 76, 60, 0.35);
  color: #e74c3c;
  padding: 0.875rem 1rem;
  border-radius: 10px;
  font-size: 14px;
}
.contact-success {
  padding: 2rem;
  background: var(--ch-accent-soft);
  border: 1px solid var(--ch-accent);
  border-radius: 20px;
  color: var(--ch-text);
}
.contact-success strong {
  display: block;
  margin-bottom: 0.5rem;
  font-size: 1.25rem;
  font-family: var(--font-serif), 'Fraunces', Georgia, serif;
  font-weight: 400;
}
.contact-success p { margin: 0; color: var(--ch-text-soft); }

/* --- Legal / About prose --- */
.legal-body, .about-body {
  max-width: 720px;
  margin: 0 auto;
  font-size: 1.0625rem;
  line-height: 1.8;
  color: var(--ch-text-soft);
}
.legal-body h2, .about-body h2 {
  font-family: var(--font-serif), 'Fraunces', Georgia, serif;
  font-size: clamp(1.5rem, 2vw, 1.875rem);
  font-weight: 400;
  letter-spacing: -0.01em;
  margin: 3rem 0 1rem;
  color: var(--ch-text);
}
.legal-body h2:first-child, .about-body h2:first-child { margin-top: 0; }
.legal-body p, .about-body p { margin: 0 0 1.5rem; }
.legal-body ul, .about-body ul { margin: 0 0 1.5rem; padding-left: 1.5rem; }
.legal-body li, .about-body li { margin-bottom: 0.5rem; }
.legal-body strong, .about-body strong { color: var(--ch-text); }
.legal-body a, .about-body a {
  color: var(--ch-accent);
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* --- About page hero --- */
.about-hero {
  position: relative;
  height: clamp(380px, 55vh, 560px);
  overflow: hidden;
  display: flex;
  align-items: flex-end;
}
.about-hero-image { object-fit: cover; z-index: 0; }
.about-hero-overlay {
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(0,0,0,0.2) 0%, rgba(13,13,16,0.85) 100%);
  z-index: 1;
}
.about-hero-inner {
  position: relative;
  z-index: 2;
  max-width: 880px;
  width: 100%;
  margin: 0 auto;
  padding: 3rem 1.5rem 3.5rem;
}
.about-hero-eyebrow {
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ch-accent);
  display: block;
  margin-bottom: 1rem;
}
.about-hero-title {
  font-family: var(--font-serif), 'Fraunces', Georgia, serif;
  font-size: clamp(2.25rem, 5vw, 3.75rem);
  font-weight: 400;
  line-height: 1.05;
  letter-spacing: -0.02em;
  margin: 0;
  color: var(--ch-text);
  max-width: 720px;
}
.about-hero-title em { font-style: italic; color: var(--ch-accent); }
.about-stats {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 2rem;
  margin: 3rem auto;
  max-width: 720px;
  padding: 2.5rem 0;
  border-top: 1px solid var(--ch-border);
  border-bottom: 1px solid var(--ch-border);
}
.about-stat-value {
  font-family: var(--font-serif), 'Fraunces', Georgia, serif;
  font-size: clamp(2rem, 3.5vw, 2.75rem);
  font-weight: 400;
  letter-spacing: -0.02em;
  color: var(--ch-text);
  display: block;
  line-height: 1;
}
.about-stat-label {
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
  margin-top: 0.5rem;
  display: block;
}

/* --- FAQ page --- */
.faq-section { margin-bottom: 3rem; max-width: 800px; margin-left: auto; margin-right: auto; }
.faq-section-title {
  font-size: 12px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  color: var(--ch-accent);
  margin: 0 0 1.25rem;
}
.faq-items { display: grid; gap: 0.75rem; }
.faq-item {
  border: 1px solid var(--ch-border);
  border-radius: 14px;
  padding: 1.25rem 1.5rem;
  background: var(--ch-surface);
  transition: border-color 0.2s;
}
.faq-item[open] { border-color: var(--ch-border-strong); }
.faq-question {
  font-weight: 500;
  font-size: 1.0625rem;
  cursor: pointer;
  list-style: none;
  color: var(--ch-text);
  position: relative;
  padding-right: 2rem;
  font-family: var(--font-serif), 'Fraunces', Georgia, serif;
}
/* Older <details>-based accordion is no longer used; the React BeforeYouBook
   component renders its own +/× icon in JSX. Pseudo-element icons removed. */
.faq-answer {
  margin: 1rem 0 0;
  color: var(--ch-text-soft);
  line-height: 1.65;
  font-size: 0.9375rem;
}


/* ===================================================================
   DESIGN SYSTEM v2 — luxury primitives
   -------------------------------------------------------------------
   Consumed by <Section>, <Container>, <PageHero>, <SectionHeader>,
   <Prose>, <LuxuryButton>, <LuxuryField>. Token-driven, dark-first.
   ------------------------------------------------------------------- */

/* ---- Layout primitives ---- */
.ch-section {
  position: relative;
  padding-block: var(--section-pad-y);
}

/* Utility bands (toolbars, breadcrumb rows) keep the one tighter step. */
.ch-section--tight { padding-block: clamp(3rem, 6vw, 5rem); }

.ch-section--glow::before {
  content: '';
  position: absolute;
  inset: 0 0 auto 0;
  height: 60%;
  background: radial-gradient(60% 80% at 50% 0%, var(--ch-accent-soft), transparent 70%);
  pointer-events: none;
  z-index: 0;
}
.ch-section > * { position: relative; z-index: 1; }

.ch-section + .ch-section { border-top: 1px solid var(--ch-line); }

.ch-container {
  width: 100%;
  margin-inline: auto;
  padding-inline: max(1.25rem, 5%);
  /* Rail pattern: cap CONTENT at 100rem by adding the gutter to the element's
     max-width. Result: content edges align with the navbar/footer/hero rail. */
  max-width: calc(100rem + 2 * max(1.25rem, 5%));
}

/* For narrow text variants the gutter still applies, but max-width is what
   ultimately constrains the line length on desktop. */
.ch-container--prose { max-width: 44rem; }   /* 704px — long-form reading */
.ch-container--narrow { max-width: 56rem; }  /* 896px — blog post body */
.ch-container--wide { max-width: calc(100rem + 2 * max(1.25rem, 5%)); }

/* ---- Eyebrow — matches existing .section-eyebrow ---- */
.ch-eyebrow {
  display: inline-block;
  font-family: var(--ch-font-display);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ch-text-dim);
  margin: 0;
}

/* ---- Section header ---- */
.ch-section-header {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 1.5rem;
  margin-bottom: 3rem;
  max-width: 56rem;
  text-align: left;  /* prevent inheritance from .section-large-2 { text-align: center } */
}
.ch-section-header--center {
  align-items: center;
  text-align: center;
  margin-inline: auto;
}
.ch-section-header .ch-lede,
.ch-section-header .ch-heading { text-align: inherit; }

/* ---- Editorial headings (single global scale, matches .editorial-headline / .blog-page-title) ---- */
.ch-heading {
  font-family: var(--font-serif), 'Fraunces', 'Times New Roman', serif;
  font-weight: 400;
  letter-spacing: -0.02em;
  line-height: 1.05;
  color: var(--ch-text);
  margin: 0;
}
.ch-heading em {
  font-style: italic;
  color: var(--ch-accent);
  font-family: inherit;
}
.ch-heading--h1 { font-size: clamp(40px, 5.5vw, 72px); }
.ch-heading--h2 { font-size: clamp(38px, 5vw, 72px); }
.ch-heading--h3 { font-size: clamp(24px, 2.4vw, 32px); letter-spacing: -0.01em; line-height: 1.15; }

/* ---- Lede ---- */
.ch-lede {
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 1.0625rem;
  line-height: 1.6;
  color: var(--ch-text-soft);
  max-width: 60ch;
  margin: 0;
}
@media (min-width: 768px) { .ch-lede { font-size: 1.1875rem; line-height: 1.55; } }

/* ---- Page hero ---- */
.ch-page-hero {
  position: relative;
  isolation: isolate;
  min-height: 60vh;
  display: flex;
  align-items: flex-end;
  padding: 6rem max(1.25rem, 5%) 4rem;
  overflow: hidden;
  background: var(--ch-bg);
}
@media (min-width: 768px) {
  .ch-page-hero { min-height: 70vh; padding-block: 8rem 5rem; }
}
@media (min-width: 1024px) {
  .ch-page-hero { padding-block: 10rem 6rem; min-height: 75vh; }
}
.ch-page-hero--minimal {
  min-height: auto;
  padding-block: 6rem 3rem;
  align-items: flex-start;
}
@media (min-width: 768px) {
  .ch-page-hero--minimal { padding-block: 9rem 5rem; }
}
.ch-page-hero__image {
  position: absolute;
  inset: 0;
  object-fit: cover;
  z-index: -2;
}
.ch-page-hero__veil {
  position: absolute;
  inset: 0;
  background:
    linear-gradient(180deg, rgba(10, 11, 14, 0.55) 0%, rgba(10, 11, 14, 0.85) 60%, var(--ch-bg) 100%),
    radial-gradient(60% 80% at 50% 0%, var(--ch-accent-soft), transparent 70%);
  z-index: -1;
}
.ch-page-hero__inner {
  width: 100%;
  max-width: 100rem;
  margin-inline: auto;
  display: flex;
  flex-direction: column;
  gap: 1.25rem;
}

/* ---- Buttons ---- */
.ch-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  height: 3rem;
  padding-inline: 1.5rem;
  border-radius: var(--ch-radius-button);
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 0.9375rem;
  font-weight: 500;
  letter-spacing: -0.005em;
  text-decoration: none;
  cursor: pointer;
  border: 1px solid transparent;
  transition: background-color var(--ch-duration) var(--ch-ease),
              border-color var(--ch-duration) var(--ch-ease),
              color var(--ch-duration) var(--ch-ease),
              transform var(--ch-duration) var(--ch-ease);
  white-space: nowrap;
}
.ch-btn:disabled {
  opacity: 0.55;
  cursor: not-allowed;
}
.ch-btn--lg { height: 3.5rem; padding-inline: 2rem; font-size: 1rem; }
.ch-btn--sm { height: 2.5rem; padding-inline: 1.125rem; font-size: 0.875rem; }

.ch-btn--primary {
  background: var(--ch-text);
  color: var(--ch-bg);
  box-shadow: var(--ch-shadow-sm);
}
.ch-btn--primary:hover { background: #fff; color: var(--ch-text); transform: translateY(-1px); }
.ch-btn--primary:active { transform: translateY(0); }

.ch-btn--secondary {
  background: var(--ch-surface);
  color: var(--ch-text);
  border-color: var(--ch-border-strong);
}
.ch-btn--secondary:hover {
  background: var(--ch-surface-2);
  border-color: var(--ch-line-strong);
}

.ch-btn--ghost {
  background: transparent;
  color: var(--ch-text-soft);
  border-color: var(--ch-border);
}
.ch-btn--ghost:hover {
  color: var(--ch-text);
  border-color: var(--ch-border-strong);
  background: var(--ch-accent-soft);
}

.ch-btn__arrow {
  display: inline-block;
  transition: transform var(--ch-duration) var(--ch-ease);
}
.ch-btn:hover .ch-btn__arrow { transform: translateX(2px); }

/* ---- Form fields ---- */
.ch-field {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}
.ch-field__label {
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: 0.02em;
  color: var(--ch-text-soft);
}
.ch-field__hint { font-size: 0.75rem; color: var(--ch-text-muted); }
.ch-input,
.ch-textarea {
  width: 100%;
  background: var(--ch-surface);
  border: 1px solid var(--ch-border);
  border-radius: var(--ch-radius-button);
  padding: 0 1rem;
  height: 3rem;
  color: var(--ch-text);
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 0.9375rem;
  line-height: 1.5;
  transition: border-color var(--ch-duration) var(--ch-ease),
              background var(--ch-duration) var(--ch-ease),
              box-shadow var(--ch-duration) var(--ch-ease);
  appearance: none;
  outline: none;
}
.ch-input::placeholder,
.ch-textarea::placeholder { color: var(--ch-text-muted); }
.ch-input:hover,
.ch-textarea:hover { border-color: var(--ch-border-strong); }
.ch-input:focus,
.ch-textarea:focus {
  border-color: var(--ch-accent);
  background: var(--ch-surface-2);
  box-shadow: 0 0 0 4px var(--ch-accent-soft);
}
.ch-textarea {
  height: auto;
  padding: 0.875rem 1rem;
  min-height: 9rem;
  resize: vertical;
  line-height: 1.6;
}

.ch-form-error {
  font-size: 0.875rem;
  color: #ff8a8a;
  background: rgba(255, 80, 80, 0.08);
  border: 1px solid rgba(255, 80, 80, 0.25);
  border-radius: var(--ch-radius-button);
  padding: 0.75rem 1rem;
}
.ch-form-success {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  padding: 2rem;
  background: var(--ch-surface);
  border: 1px solid var(--ch-border);
  border-radius: var(--ch-radius-card);
  color: var(--ch-text-soft);
}
.ch-form-success strong { color: var(--ch-text); font-weight: 500; font-size: 1.125rem; }
.ch-form-success p { margin: 0; }

/* ---- Prose (long-form copy: about, legal, blog post body) ---- */
.ch-prose {
  color: var(--ch-text-soft);
  font-size: 1rem;
  line-height: 1.75;
  font-family: var(--font-body), 'Inter Tight', sans-serif;
}
.ch-prose > * + * { margin-top: 1.25rem; }
/* Each blog body "text" block from the API can itself contain several
   sibling block elements in its raw HTML (e.g. more than one <p> between two
   widgets) — wrapped in one div per block, so they're no longer direct
   children of .ch-prose and the rule above never reaches them, leaving
   .ch-prose p's margin: 0 with nothing to fill the gap. Additive sibling
   rules, not a broader override, so this doesn't touch legacy posts (whose
   paragraphs are direct children already, correctly spaced by the rule
   above) or the other .ch-prose usages (about/terms/privacy). */
.ch-prose p + p,
.ch-prose p + ul,
.ch-prose p + ol,
.ch-prose ul + p,
.ch-prose ol + p,
.ch-prose blockquote + p,
.ch-prose p + blockquote {
  margin-top: 1.25rem;
}
.ch-prose h2,
.ch-prose h3 {
  font-family: var(--font-serif), 'Times New Roman', serif;
  font-weight: 400;
  letter-spacing: -0.01em;
  color: var(--ch-text);
}
.ch-prose h2 {
  font-size: 1.625rem;
  line-height: 1.2;
  margin-top: 3rem;
}
.ch-prose h2:first-child { margin-top: 0; }
.ch-prose h3 {
  font-size: 1.25rem;
  line-height: 1.3;
  margin-top: 2rem;
}
.ch-prose p { margin: 0; }
.ch-prose ul { margin: 0; padding-left: 1.5rem; list-style: disc; }
.ch-prose ol { margin: 0; padding-left: 1.5rem; list-style: decimal; }
.ch-prose li + li { margin-top: 0.5rem; }
.ch-prose li::marker { color: var(--ch-text-soft); }
.ch-prose strong { color: var(--ch-text); font-weight: 500; }
.ch-prose a {
  color: var(--ch-text);
  text-decoration: underline;
  text-decoration-color: var(--ch-border-strong);
  text-underline-offset: 0.25em;
  transition: text-decoration-color var(--ch-duration) var(--ch-ease);
}
.ch-prose a:hover { text-decoration-color: var(--ch-accent); }
.ch-prose hr {
  border: 0;
  border-top: 1px solid var(--ch-line);
  margin: 3rem 0;
}
.ch-prose blockquote {
  border-left: 2px solid var(--ch-accent);
  padding-left: 1.25rem;
  font-style: italic;
  color: var(--ch-text);
}
.ch-prose table {
  width: 100%;
  border-collapse: collapse;
  font-size: 0.9375rem;
}
.ch-prose th,
.ch-prose td {
  padding: 0.625rem 0.875rem;
  text-align: left;
  border-bottom: 1px solid var(--ch-line);
}
.ch-prose th { color: var(--ch-text); font-weight: 500; }
.ch-prose tr:last-child td { border-bottom: 0; }

/* Blog body image widgets (3-up / 2-up / single) — editorial-style breaks in
   the article flow. Each sits in its own .ch-postbody__widget wrapper (see
   below) so it fills the text column rather than the narrower prose
   measure. Placeholder slots are grey until a real image is attached in
   Statamic; ImageWidget always renders one slot per column regardless of
   how many images actually exist yet. */
.ch-blog-widget {
  display: grid;
  gap: 0.75rem;
  margin: 0;
}
.ch-blog-widget--3 { grid-template-columns: repeat(3, 1fr); }
.ch-blog-widget--2 { grid-template-columns: repeat(2, 1fr); }
.ch-blog-widget--1 { grid-template-columns: 1fr; }
/* Narrow screens: the 3-up becomes one landscape image over a pair, rather
   than a 2 + 1 grid that strands the third image alone on its row. */
@media (max-width: 599px) {
  .ch-blog-widget--3 { grid-template-columns: repeat(2, 1fr); }
  .ch-blog-widget--3 .ch-blog-widget__slot:first-child {
    grid-column: 1 / -1;
    aspect-ratio: 3 / 2;
  }
}
.ch-blog-widget__slot {
  position: relative;
  display: block;
  overflow: hidden;
  background: var(--ch-border);
}
.ch-blog-widget--3 .ch-blog-widget__slot,
.ch-blog-widget--2 .ch-blog-widget__slot { aspect-ratio: 4 / 5; }
.ch-blog-widget--1 .ch-blog-widget__slot { aspect-ratio: 3 / 2; }
.ch-blog-widget__image { object-fit: cover; }
.ch-blog-widget__slot--placeholder { background: var(--ch-border); }
.ch-blog-widget__caption {
  grid-column: 1 / -1;
  font-size: 0.8125rem;
  color: var(--ch-text-soft);
  text-align: center;
}

/* Post body + sidebar, same two-column rail as .ch-chalet__layout */
.ch-postbody {
  display: grid;
  grid-template-columns: 1fr;
  gap: 3rem;
  align-items: start;
}
@media (min-width: 960px) {
  .ch-postbody {
    grid-template-columns: minmax(0, 1fr) clamp(18rem, 26%, 21rem);
    gap: 4rem;
  }
}
.ch-postbody__main { min-width: 0; }
.ch-postbody__aside {
  display: flex;
  flex-direction: column;
  gap: 1.5rem;
  min-width: 0;
}
@media (min-width: 960px) {
  .ch-postbody__aside {
    position: sticky;
    top: 96px;
  }
}
/* Image widgets fill the text column (.ch-postbody__main) edge to edge,
   wider than the 720px prose measure centred inside it but clear of the
   sidebar. The prose supplies its own bottom margin above a widget; a
   heading opening the segment after one drops its top margin so the space
   below the widget isn't doubled. */
.ch-postbody__widget { margin: 3.5rem 0; }
.blog-page .ch-postbody__widget + .blog-post-body > :first-child > h2:first-child,
.blog-page .ch-postbody__widget + .blog-post-body > :first-child > h3:first-child { margin-top: 0; }
/* Blog post FAQ — native <details>/<summary>, no JS dependency (unlike the
   Webflow-driven accordion on resort pages, whose interactions script this
   page doesn't load), and content stays in the DOM regardless of expanded
   state so it's fully crawlable. */
/* Sits in the text column with the same 720px measure as .blog-post-body,
   styled as one more article section: hairline rules, the article's light
   sans h2, and the --cx-* palette the rest of .blog-page reads from. */
.ch-blog-faq {
  max-width: 720px;
  margin: 3rem auto 0;
  padding-top: 2.5rem;
  border-top: 1px solid rgba(16, 29, 51, 0.14);
}
.ch-blog-faq__title {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  letter-spacing: -0.03em;
  font-size: clamp(24px, 2.2vw, 31px);
  color: var(--cx-ink);
  margin: 0 0 0.75rem;
}
.ch-blog-faq__item {
  border-bottom: 1px solid rgba(16, 29, 51, 0.14);
  padding: 1.125rem 0;
}
.ch-blog-faq__question {
  cursor: pointer;
  font-size: 16.5px;
  font-weight: 500;
  color: var(--cx-ink);
  list-style: none;
}
.ch-blog-faq__question::-webkit-details-marker { display: none; }
.ch-blog-faq__question::after {
  content: '+';
  float: right;
  margin-left: 1rem;
  color: var(--cx-muted);
}
.ch-blog-faq__item[open] .ch-blog-faq__question::after { content: '−'; }
.ch-blog-faq__answer {
  margin: 0.875rem 0 0;
  font-size: 16.5px;
  line-height: 1.75;
  color: var(--cx-muted);
}

.ch-postbody__card { padding: 26px 28px 28px; }
.ch-postbody__card-eyebrow {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 1.3px;
  text-transform: uppercase;
  margin: 0 0 10px;
}
.ch-postbody__card-title {
  font-size: 22px;
  letter-spacing: -0.03em;
  margin: 0 0 10px;
}
.ch-postbody__card-copy {
  font-size: 14px;
  line-height: 1.6;
  margin: 0 0 18px;
}
.ch-postbody__card-cta {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.02em;
  padding: 12px 20px;
  text-decoration: none;
}

/* Stat row used inside prose blocks */
.ch-stats {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1.5rem;
  margin: 3rem 0;
  padding: 2rem;
  background: var(--ch-surface);
  border: 1px solid var(--ch-border);
  border-radius: var(--ch-radius-card);
}
@media (min-width: 768px) {
  .ch-stats { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
.ch-stat__value {
  font-family: var(--font-serif), serif;
  font-size: 2.25rem;
  line-height: 1;
  color: var(--ch-text);
  display: block;
}
.ch-stat__label {
  display: block;
  margin-top: 0.5rem;
  font-size: 0.75rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
}



/* ---- FAQ list (used on /faq) ---- */
.ch-faq-stack {
  display: flex;
  flex-direction: column;
  gap: 4rem;
  max-width: 56rem;
  margin-inline: auto;
}
.ch-faq-group__title {
  font-family: var(--font-serif), 'Times New Roman', serif;
  font-weight: 400;
  font-size: 1.5rem;
  line-height: 1.2;
  margin: 0 0 1.5rem;
  padding-bottom: 1rem;
  border-bottom: 1px solid var(--ch-line);
  color: var(--ch-text);
}
.ch-faq-group__items { display: grid; gap: 0.75rem; }
.ch-faq-item {
  border: 1px solid var(--ch-border);
  border-radius: var(--ch-radius-button);
  background: var(--ch-surface);
  padding: 1.25rem 1.5rem;
  transition: border-color var(--ch-duration) var(--ch-ease),
              background var(--ch-duration) var(--ch-ease);
}
.ch-faq-item:hover { border-color: var(--ch-border-strong); }
.ch-faq-item[open] {
  border-color: var(--ch-border-strong);
  background: var(--ch-surface-2);
}
.ch-faq-item__q {
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-weight: 500;
  font-size: 1rem;
  color: var(--ch-text);
  cursor: pointer;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 1.5rem;
  list-style: none;
  letter-spacing: -0.005em;
}
.ch-faq-item__q::-webkit-details-marker { display: none; }
.ch-faq-item__q::after {
  content: '';
  width: 1rem;
  height: 1rem;
  background-image:
    linear-gradient(currentColor, currentColor),
    linear-gradient(currentColor, currentColor);
  background-size: 100% 1px, 1px 100%;
  background-position: center, center;
  background-repeat: no-repeat;
  color: var(--ch-text-muted);
  transition: transform var(--ch-duration) var(--ch-ease);
  flex-shrink: 0;
}
.ch-faq-item[open] .ch-faq-item__q::after {
  background-size: 100% 1px, 1px 0;
  color: var(--ch-text);
}
.ch-faq-item__a {
  margin: 1rem 0 0;
  color: var(--ch-text-soft);
  line-height: 1.7;
  font-size: 0.9375rem;
  max-width: 60ch;
}



/* ---- Unified card system (blog + extensible to resorts/chalets later) ---- */
.ch-card-grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 1.75rem;
  grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));
}
.ch-card {
  background: var(--ch-surface);
  border: 1px solid var(--ch-border);
  border-radius: var(--ch-radius-card);
  overflow: hidden;
  transition: background var(--ch-duration) var(--ch-ease),
              border-color var(--ch-duration) var(--ch-ease),
              transform var(--ch-duration) var(--ch-ease);
}
.ch-card:hover { background: var(--ch-surface-2); border-color: var(--ch-border-strong); }
.ch-card__link {
  display: flex;
  flex-direction: column;
  height: 100%;
  text-decoration: none;
  color: inherit;
}
.ch-card__media {
  position: relative;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  background: var(--ch-surface-2);
}
.ch-card__media img {
  object-fit: cover;
  transition: transform var(--ch-duration-slow) var(--ch-ease);
}
.ch-card__link:hover .ch-card__media img { transform: scale(1.03); }
.ch-card__body {
  padding: 1.5rem;
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  flex: 1;
}
.ch-card__title {
  font-family: var(--font-serif), 'Times New Roman', serif;
  font-weight: 400;
  font-size: 1.25rem;
  line-height: 1.25;
  letter-spacing: -0.01em;
  color: var(--ch-text);
  margin: 0;
}
.ch-card__excerpt {
  font-size: 0.9375rem;
  line-height: 1.6;
  color: var(--ch-text-soft);
  margin: 0;
}
.ch-card-tag {
  display: inline-flex;
  align-self: flex-start;
  padding: 0.25rem 0.625rem;
  background: var(--ch-accent-soft);
  color: var(--ch-accent);
  border-radius: var(--ch-radius-pill);
  font-size: 0.6875rem;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}
.ch-card-meta {
  margin-top: auto;
  font-size: 0.75rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
  padding-top: 0.5rem;
}

/* Feature card (large hero card above grid) */
.ch-feature-card {
  display: grid;
  grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr);
  gap: 0;
  background: var(--ch-surface);
  border: 1px solid var(--ch-border);
  border-radius: var(--ch-radius-hero);
  overflow: hidden;
  text-decoration: none;
  color: inherit;
  margin-bottom: 3rem;
  transition: background var(--ch-duration) var(--ch-ease),
              border-color var(--ch-duration) var(--ch-ease);
}
.ch-feature-card:hover { background: var(--ch-surface-2); border-color: var(--ch-border-strong); }
@media (max-width: 900px) {
  .ch-feature-card { grid-template-columns: 1fr; }
}
.ch-feature-card__media {
  position: relative;
  aspect-ratio: 4 / 5;
}
@media (max-width: 900px) { .ch-feature-card__media { aspect-ratio: 16 / 10; } }
.ch-feature-card__media img {
  object-fit: cover;
  transition: transform var(--ch-duration-slow) var(--ch-ease);
}
.ch-feature-card:hover .ch-feature-card__media img { transform: scale(1.03); }
.ch-feature-card__body {
  padding: 3rem;
  display: flex;
  flex-direction: column;
  gap: 1rem;
  justify-content: center;
}
@media (max-width: 900px) { .ch-feature-card__body { padding: 2rem; } }
.ch-feature-card__title {
  font-family: var(--font-serif), 'Times New Roman', serif;
  font-weight: 400;
  font-size: clamp(1.75rem, 3vw, 2.5rem);
  line-height: 1.1;
  letter-spacing: -0.015em;
  color: var(--ch-text);
  margin: 0;
}
.ch-feature-card__excerpt {
  font-size: 1.0625rem;
  line-height: 1.6;
  color: var(--ch-text-soft);
  margin: 0;
}
.ch-feature-card__cta {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 0.875rem;
  font-weight: 500;
  letter-spacing: 0.02em;
  color: var(--ch-text);
  margin-top: 0.5rem;
}

/* ---- Blog post: shares the home-page editorial hero pattern ---- */
.ch-post {
  display: flex;
  flex-direction: column;
}

/* Post-specific overrides on top of the shared .ch-hero rail. */
.ch-hero--post .ch-hero__title {
  font-size: clamp(2.25rem, 4.2vw, 4.5rem);
  max-width: 22ch;
  line-height: 1.04;
}
.ch-hero--post .ch-hero__lede {
  font-style: italic;
  max-width: 44ch;
}
.ch-hero--post .ch-hero__plate--post { aspect-ratio: 16 / 9; }
@media (min-width: 900px) {
  .ch-hero--post .ch-hero__plate--post { aspect-ratio: 21 / 9; }
}
@media (max-width: 720px) {
  .ch-hero--post .ch-hero__plate--post { aspect-ratio: 4 / 5; }
}

/* Legacy fallback hero — kept only for the "no featured_image" branch
   (renders via Section/Container, not .ch-post__hero), so no longer needs
   the full-bleed treatment. */
.ch-post__back {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 0.8125rem;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--ch-text-soft);
  text-decoration: none;
  transition: color var(--ch-duration) var(--ch-ease);
  width: max-content;
}
.ch-post__back:hover { color: var(--ch-text); }
.ch-post__title {
  font-family: var(--font-serif), 'Times New Roman', serif;
  font-weight: 400;
  font-size: clamp(2.25rem, 5vw, 4rem);
  line-height: 1.05;
  letter-spacing: -0.015em;
  color: var(--ch-text);
  margin: 0;
  max-width: 20ch;
}
.ch-post__meta {
  font-size: 0.8125rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
}
.ch-post__lede {
  font-family: var(--font-serif), 'Times New Roman', serif;
  font-style: italic;
  font-size: 1.375rem;
  line-height: 1.5;
  color: var(--ch-text);
  margin: 0 0 3rem;
  padding-bottom: 2rem;
  border-bottom: 1px solid var(--ch-line);
}



/* ===================================================================
   FOOTER v2 — luxury, restrained
   ------------------------------------------------------------------- */
.ch-footer {
  position: relative;
  background: var(--ch-bg);
  border-top: 1px solid var(--ch-line);
  margin-top: auto;
}
.ch-footer::before {
  content: '';
  position: absolute;
  inset: 0 0 auto 0;
  height: 60%;
  background: radial-gradient(60% 100% at 50% 0%, var(--ch-accent-soft), transparent 70%);
  pointer-events: none;
  opacity: 0.6;
}
.ch-footer__inner {
  position: relative;
  padding-block: 5rem 2.5rem;
  display: flex;
  flex-direction: column;
  gap: 4rem;
}
@media (min-width: 1024px) {
  .ch-footer__inner { padding-block: 7rem 3rem; }
}
.ch-footer__top {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 3rem;
}
@media (min-width: 768px) {
  .ch-footer__top { grid-template-columns: minmax(0, 1.4fr) minmax(0, 2fr); gap: 4rem; }
}
.ch-footer__brand {
  display: flex;
  flex-direction: column;
  gap: 1.75rem;
  max-width: 28rem;
}
.ch-footer__logo {
  display: inline-block;
  width: max-content;
}
.ch-footer__logo img { display: block; height: auto; width: 13rem; }
/* Brand lockup theme variants — shared by the footer AND the header brand.
   --dark holds the white-ink artwork (for dark surfaces), --light the ink one.
   Default/fallback path (no data-theme, or light): show the dark-ink logo. */
.ch-logo-img--dark {
  display: none !important;
  opacity: 0 !important;
  visibility: hidden !important;
}
.ch-logo-img--light {
  display: block !important;
  opacity: 1 !important;
  visibility: visible !important;
}
/* Explicit dark theme: swap to white logo for contrast. */
html[data-theme='dark'] .ch-logo-img--dark {
  display: block !important;
  opacity: 1 !important;
  visibility: visible !important;
}
html[data-theme='dark'] .ch-logo-img--light {
  display: none !important;
  opacity: 0 !important;
  visibility: hidden !important;
}
/* Explicit light theme and fallback when data-theme is absent/invalid. */
html[data-theme='light'] .ch-logo-img--dark,
html:not([data-theme='dark']) .ch-logo-img--dark {
  display: none !important;
  opacity: 0 !important;
  visibility: hidden !important;
}
html[data-theme='light'] .ch-logo-img--light,
html:not([data-theme='dark']) .ch-logo-img--light {
  display: block !important;
  opacity: 1 !important;
  visibility: visible !important;
}
.ch-footer__pitch {
  font-size: 0.9375rem;
  line-height: 1.65;
  color: var(--ch-text-soft);
  margin: 0;
}
.ch-footer__contact {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  font-style: normal;
  font-size: 0.9375rem;
  line-height: 1.6;
  color: var(--ch-text-soft);
}
.ch-footer__contact a {
  color: var(--ch-text);
  text-decoration: none;
  transition: color 0.15s ease;
}
.ch-footer__contact a:hover {
  color: var(--ch-accent);
}
.ch-footer__socials {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  list-style: none;
  padding: 0;
  margin: 0;
}
.ch-footer__social {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.5rem;
  height: 2.5rem;
  border-radius: var(--ch-radius-pill);
  border: 1px solid var(--ch-border);
  color: var(--ch-text-soft);
  background: var(--ch-surface);
  transition: color var(--ch-duration) var(--ch-ease),
              border-color var(--ch-duration) var(--ch-ease),
              background var(--ch-duration) var(--ch-ease);
}
.ch-footer__social:hover {
  color: var(--ch-text);
  border-color: var(--ch-border-strong);
  background: var(--ch-surface-2);
}
.ch-footer__nav {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 2.5rem;
}
@media (min-width: 640px) {
  .ch-footer__nav { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
.ch-footer__col ul {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.875rem;
}
.ch-footer__col-title {
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 0.6875rem;
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
  margin: 0 0 1.25rem;
}
.ch-footer__link {
  font-size: 0.9375rem;
  color: var(--ch-text-soft);
  text-decoration: none;
  transition: color var(--ch-duration) var(--ch-ease);
}
.ch-footer__link:hover { color: var(--ch-text); }
.ch-footer__bottom {
  position: relative;
  padding-top: 2rem;
  border-top: 1px solid var(--ch-line);
  display: flex;
  flex-direction: column;
  gap: 1rem;
  align-items: flex-start;
}
@media (min-width: 640px) {
  .ch-footer__bottom {
    flex-direction: row;
    justify-content: space-between;
    align-items: center;
  }
}
.ch-footer__copy {
  margin: 0;
  font-size: 0.8125rem;
  color: var(--ch-text-muted);
  letter-spacing: 0.01em;
}
.ch-footer__legal {
  display: flex;
  align-items: center;
  gap: 1.5rem;
  list-style: none;
  margin: 0;
  padding: 0;
}
.ch-footer__legal .ch-footer__link {
  font-size: 0.8125rem;
  color: var(--ch-text-muted);
}
.ch-footer__legal .ch-footer__link:hover { color: var(--ch-text); }

/* Screen-reader only utility */
.sr-only {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0,0,0,0);
  white-space: nowrap; border: 0;
}



/* ===================================================================
   TRUSTED HOSTS — logo card override
   -------------------------------------------------------------------
   Mixed logo sources (JPG photos, SVG, PNG, GIF) can't be safely
   filtered to monochrome white — that collapses anything with photo
   content into a silhouette. Until every host supplies a true
   monochrome SVG, render logos at their natural colours on a warm
   off-white card so they always read correctly. The row reads as one
   rhythm via fixed card height + max image height + mild desaturation.
   ------------------------------------------------------------------- */
.logo-slider-grid .logo-card {
  background: #f6f4ef; /* warm off-white — softer than pure #fff against the dark page */
  border: 1px solid var(--ch-border);
  border-radius: var(--ch-radius-card);
  padding: 28px 24px;
  height: 120px;
  align-items: center;
  justify-content: center;
  transition: transform var(--ch-duration) var(--ch-ease),
              box-shadow var(--ch-duration) var(--ch-ease);
}
.logo-slider-grid .logo-card:hover {
  transform: translateY(-1px);
  box-shadow: 0 14px 32px rgba(0, 0, 0, 0.35);
}
.logo-slider-grid .logo-card a,
.logo-slider-grid .logo-card > .logo-image-large {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
}
.logo-slider-grid .logo-image-large {
  max-width: 100%;
  max-height: 56px;
  width: auto;
  height: auto;
  object-fit: contain;
  /* Mild desaturation so the row reads as one tonal family.
     No brightness/invert — logos keep their actual artwork. */
  filter: grayscale(0.85) contrast(0.95);
  opacity: 0.9;
  transition: opacity var(--ch-duration) var(--ch-ease),
              filter var(--ch-duration) var(--ch-ease);
}
.logo-slider-grid .logo-card:hover .logo-image-large {
  filter: grayscale(0) contrast(1);
  opacity: 1;
}



/* ===================================================================
   CH HERO — magazine plate / editorial
   -------------------------------------------------------------------
   Layout (Cereal Magazine / MONOCLE print spread mechanic):
     [eyebrow  ──  pathway nav]
     [────── FRAMED IMAGE PLATE ──────]   (21:9, rounded, page bg shows around it)
     [editorial headline]
     [lede                            ]
     [search bar (restrained)         ]
   ------------------------------------------------------------------- */
.ch-hero {
  position: relative;
  background: #020617;
  padding-block: clamp(0.75rem, 1.5vh, 1.5rem) clamp(4rem, 8vh, 7rem);
  padding-inline: max(1.25rem, 5%);
  color: #fff;
}
html[data-theme='light'] .ch-hero {
  background: linear-gradient(180deg, #f4f8fb 0%, #eef4f8 100%);
  color: var(--fg-primary);
}

.ch-hero__inner {
  width: 100%;
  max-width: 100rem;
  margin-inline: auto;
  display: flex;
  flex-direction: column;
  gap: 0;
}
/* Spacing rhythm between hero blocks */
.ch-hero__top { margin-bottom: clamp(1rem, 2vh, 1.5rem); }

/* ── Top strip: eyebrow + pathway nav ───────────────────────────── */
.ch-hero__top {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: 1.5rem;
  padding-bottom: 0;
}

/* Kill the Webflow navbar underline + the vertical divider next to Sign up */
.navbar { border-bottom: 0 !important; }
.navigation-line-break { display: none !important; }

/* ── Navbar: mirror .ch-hero rail (outer pads 5%, inner caps at 100rem) ── */
.navbar {
  margin-left: 0 !important;
  margin-right: 0 !important;
  padding-inline: max(1.25rem, 5%);
  /* Slim rail — the bar is chrome, not a section. Height comes from the
     container's min-height so the logo can't stretch it. */
  padding-block: 0 !important;
  color: var(--ch-text);
  /* Was inherited from Webflow's .w-nav (removed so its nav JS can't toggle the
     mobile menu). The open menu is positioned absolute against this. */
  position: relative;
  z-index: 1000;
}

/* Hairline under the bar, in both themes (the Webflow border is killed above). */
.navbar::after {
  content: '';
  position: absolute;
  inset: auto 0 0;
  height: 1px;
  background: var(--ch-line);
  pointer-events: none;
}

/* Light theme navbar: keep controls legible over the pale rail. */
html[data-theme='light'] .navbar {
  color: var(--fg-primary);
  border-bottom-color: var(--border-subtle);
}
html[data-theme='light'] .navbar .navlink,
html[data-theme='light'] .navbar .navlink.text-black,
html[data-theme='light'] .navbar .text-block-7,
html[data-theme='light'] .navbar .avatar-role,
html[data-theme='light'] .navbar .w-icon-nav-menu {
  color: var(--fg-primary) !important;
}

/* Legacy scroll script toggles `.bgwhite`; in light theme ensure links and
   account text switch to dark-on-light instead of white-on-white. */
html[data-theme='light'] .navbar.bgwhite {
  color: var(--fg-primary);
  border-bottom-color: var(--border-subtle);
}
html[data-theme='light'] .navbar.bgwhite .navlink,
html[data-theme='light'] .navbar.bgwhite .navlink.text-black,
html[data-theme='light'] .navbar.bgwhite .text-block-7,
html[data-theme='light'] .navbar.bgwhite .avatar-role {
  color: var(--fg-primary) !important;
}
.navbar > .container-2 {
  width: 100%;
  max-width: 100rem;
  min-height: 68px;
  margin-inline: auto;
  padding-inline: 0;
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: 1rem;
}

.navbar > .container-2 > .brand { grid-column: 1; justify-self: start; }

/* Logo: the horizontal lockup at every breakpoint (was a circular badge on
   desktop and a different lockup on mobile). Which of the two theme variants
   is shown is handled by .ch-logo-img--dark/--light, shared with the footer.
   height:auto keeps the true 5.798:1 viewBox ratio — never letterboxed. */
.navbar .brand__lockup {
  height: auto;
  width: 186px;
  /* Override the global img { max-width: 100% }, which would otherwise cap the
     logo to the (narrow) brand grid cell. */
  max-width: none;
}
@media screen and (max-width: 991px) {
  /* Let the brand column size to the logo and keep the hamburger right. */
  .navbar > .container-2 { grid-template-columns: auto 1fr auto; }
  .navbar .brand__lockup { width: min(54vw, 210px); }
}
/* Below 768px the bar paints its own dark background (#020617) in BOTH themes,
   so the white-ink lockup is the correct variant there regardless of
   data-theme. Without this the light theme shows dark ink on a near-black bar.
   Higher specificity than the generic variant rules, so it wins. */
@media screen and (max-width: 767px) {
  .navbar .brand__lockup.ch-logo-img--dark {
    display: block !important;
    opacity: 1 !important;
    visibility: visible !important;
  }
  .navbar .brand__lockup.ch-logo-img--light {
    display: none !important;
    opacity: 0 !important;
    visibility: hidden !important;
  }

  /* The lockup got this treatment; the hamburger beside it did not. The rule
     at `html[data-theme='light'] .navbar .w-icon-nav-menu` forces the icon to
     --fg-primary (#111827) with !important, which on this near-black bar is
     ~1.1:1 — the button is there, sized and tappable, but invisible in light
     mode. Its 0.08/0.16 dark fill and border disappear with it. Needs
     !important and (0,4,1) to beat that rule. */
  html .navbar .menu-button-2 .w-icon-nav-menu {
    color: var(--ch-ondark-fg) !important;
  }
  html .navbar .menu-button-2 {
    background: var(--ch-ondark-fill) !important;
    border-color: var(--ch-ondark-line) !important;
  }
}
/* Dissolve div-block-4 so its children participate in container-2's grid */
.navbar > .container-2 > .div-block-4 { display: contents; }
.navbar > .container-2 > .div-block-4 > .div-block-5 {
  grid-column: 2;
  justify-self: center;
  flex: 0 0 auto;
}
.navbar > .container-2 > .div-block-4 > .navigation-button-bar {
  grid-column: 3;
  justify-self: end;
}

/* Auth area: reserve width so the bar doesn't jump when /api/auth/me resolves */
.navigation-button-bar {
  min-height: 36px;
  min-width: 132px;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 0.5rem;
}

/* Sign-up CTA: the one weighted element in the bar. Keep it small. */
.navbar .ch-btn--sm {
  height: 2.125rem;
  padding-inline: 0.95rem;
  border-radius: 999px;
  font-size: 0.8125rem;
  font-weight: 600;
}

/* "Log in" reads as a quiet text link, not a second button. */
.navbar .nav-top-auth .navlink {
  font-size: 0.875rem;
  font-weight: 500;
  color: var(--ch-text-muted);
  transition: color 0.16s ease;
}
.navbar .nav-top-auth .navlink:hover {
  color: var(--ch-text);
}

/* Desktop nav: a flat editorial rail. No pill container and no pipe
   separators — quiet muted labels that come forward on hover, with a hairline
   marker for the current page. Weight lives in the CTA, not the links. */
@media screen and (min-width: 992px) {
  .navbar .nav-menu.w-nav-menu {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    padding: 0;
    border: 0;
    background: none;
    box-shadow: none;
  }

  .navbar .nav-menu.w-nav-menu > .w-nav-link,
  .navbar .nav-menu.w-nav-menu > .ch-mega > .ch-mega__trigger {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    height: 2rem;
    padding: 0 0.75rem;
    border-radius: 8px;
    color: var(--ch-text-muted);
    font-size: 0.875rem;
    font-weight: 500;
    letter-spacing: 0.005em;
    line-height: 1;
    text-decoration: none;
    transition: color 0.16s ease;
  }

  /* Hairline that wipes in from the centre on hover / current page. */
  .navbar .nav-menu.w-nav-menu > .w-nav-link::after,
  .navbar .nav-menu.w-nav-menu > .ch-mega > .ch-mega__trigger::after {
    content: '';
    position: absolute;
    left: 0.75rem;
    right: 0.75rem;
    bottom: 0.1rem;
    height: 1px;
    background: currentColor;
    transform: scaleX(0);
    transform-origin: center;
    transition: transform 0.2s var(--ch-ease, ease);
  }

  .navbar .nav-menu.w-nav-menu > .w-nav-link:hover,
  .navbar .nav-menu.w-nav-menu > .ch-mega > .ch-mega__trigger:hover,
  .navbar .nav-menu.w-nav-menu > .ch-mega.is-open > .ch-mega__trigger {
    color: var(--ch-text);
  }

  .navbar .nav-menu.w-nav-menu > .w-nav-link:hover::after,
  .navbar .nav-menu.w-nav-menu > .ch-mega > .ch-mega__trigger:hover::after,
  .navbar .nav-menu.w-nav-menu > .ch-mega.is-open > .ch-mega__trigger::after {
    transform: scaleX(1);
  }

  .navbar .nav-menu.w-nav-menu > .w-nav-link[aria-current='page'] {
    color: var(--ch-text);
  }
  .navbar .nav-menu.w-nav-menu > .w-nav-link[aria-current='page']::after {
    transform: scaleX(1);
  }
}
/* Desktop auth row (icons + avatar/login). Hidden on mobile — see the media
   query below — where the hamburger is the only thing left in the bar. */
.nav-top-auth {
  display: flex;
  align-items: center;
  gap: 0.25rem;
}

/* Theme + locale pickers are utilities: ghost triggers that only take a
   surface on hover, with a hairline divider before the auth links. */
.nav-top-auth .theme-switcher__trigger,
.nav-top-auth .locale-switcher__trigger {
  height: 2rem;
  padding: 0 0.5rem;
  border: 0;
  border-radius: 8px;
  background: transparent;
  color: var(--ch-text-muted);
  font-size: 0.8125rem;
  letter-spacing: 0;
}
.nav-top-auth .theme-switcher__trigger:hover,
.nav-top-auth .locale-switcher__trigger:hover {
  background: color-mix(in srgb, var(--fg-primary) 7%, transparent);
  color: var(--ch-text);
}
.nav-top-auth .theme-switcher__caret,
.nav-top-auth .locale-switcher__caret {
  display: none;
}
.nav-top-auth .locale-switcher {
  margin-right: 0.375rem;
  padding-right: 0.625rem;
  border-right: 1px solid var(--ch-line);
}
.nav-auth-skeleton {
  display: inline-flex;
  align-items: center;
  gap: 0.75rem;
  opacity: 0;
}
.nav-auth-skeleton::before {
  content: '';
  width: 56px;
  height: 18px;
  border-radius: 4px;
  background: color-mix(in srgb, var(--fg-primary) 8%, transparent);
}
.nav-auth-skeleton::after {
  content: '';
  width: 72px;
  height: 34px;
  border-radius: 999px;
  background: color-mix(in srgb, var(--fg-primary) 8%, transparent);
}

/* ── Mobile navigation ────────────────────────────────────────────────
   The hamburger lives in the top bar; the menu itself is a full-screen sheet
   portalled to <body> (see Navbar.tsx) so it isn't clipped by the navbar's
   backdrop-filter / stacking context. */
@media screen and (max-width: 991px) {
  /* Hamburger trigger */
  .navbar .menu-button-2.w-nav-button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 44px;
    height: 44px;
    padding: 0;
    margin-left: 0.5rem;
    /* Match the logo's extra left inset so it isn't flush to the edge. */
    margin-right: 10px;
    border-radius: 10px;
    background: color-mix(in srgb, var(--fg-primary) 8%, transparent);
    border: 1px solid var(--ch-line, var(--border-subtle));
    transition: background 0.15s ease;
    touch-action: manipulation;
  }
  /* Only on real hover devices — avoids the iOS first-tap-is-hover delay. */
  @media (hover: hover) {
    .navbar .menu-button-2.w-nav-button:hover {
      background: color-mix(in srgb, var(--fg-primary) 16%, transparent);
    }
  }
  .navbar .menu-button-2 .w-icon-nav-menu {
    color: var(--ch-text, #e7e7ea);
    font-size: 22px;
  }

  /* The button bar carries a 132px min-width from its desktop (auth buttons)
     layout. On mobile it only holds the hamburger, so that min-width forces the
     navbar grid to overflow and shoves the burger hard against the edge. Reset
     it so the burger sits at a clean, symmetric inset (matching the menu's X). */
  .navbar .navigation-button-bar {
    min-width: 0;
    gap: 0;
  }

  /* Desktop nav links + top-bar auth are hidden on mobile (the sheet covers
     navigation). Keep .navigation-button-bar visible — it holds the hamburger. */
  .navbar .nav-menu.w-nav-menu,
  .navbar .nav-top-auth {
    display: none;
  }
}

/* ── Mobile menu sheet (portalled to <body>) ─────────────────────────── */
.ch-mnav {
  position: fixed;
  inset: 0;
  z-index: 2000;
  display: flex;
  flex-direction: column;
  /* Match the navbar's inline padding so the logo lands in the same place. */
  padding: 0 max(1.25rem, 5%) calc(2rem + env(safe-area-inset-bottom, 0px));
  background: var(--ch-surface, var(--bg-subtle));
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  animation: ch-mnav-in 0.2s ease;
}
@keyframes ch-mnav-in {
  from { opacity: 0; }
  to { opacity: 1; }
}

/* Top bar inside the sheet: logo + close */
.ch-mnav__bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  /* Mirror the navbar's box (80px tall) so the logo and X sit at the same height
     the logo/burger do in the closed navbar. The extra top padding offsets the
     navbar logo's slight downward bias from its inline image box. */
  min-height: 80px;
  padding: 26px 0 10px;
}
.ch-mnav__brand img {
  display: block;
  /* Match the lockup width/position used in the mobile navbar
     (.brand__lockup) so the logo doesn't jump when the menu opens. */
  width: min(54vw, 210px);
  max-width: none;
  height: auto;
}
.ch-mnav__close {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  /* Match the navbar hamburger exactly: same 44px box, radius, fill and the
     same 10px inset from the edge padding so it sits where the burger was. */
  width: 44px;
  height: 44px;
  margin-right: 10px;
  border-radius: 10px;
  background: color-mix(in srgb, var(--fg-primary) 8%, transparent);
  border: 1px solid var(--ch-line, var(--border-subtle));
  color: var(--ch-text, #f4f4f6);
  font-size: 22px;
  line-height: 1;
  cursor: pointer;
  transition: background 0.15s ease;
}
.ch-mnav__close:hover {
  background: color-mix(in srgb, var(--fg-primary) 16%, transparent);
}

/* ── Language switcher ────────────────────────────────────────────── */
.locale-switcher { position: relative; }
.locale-switcher__trigger {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 7px 10px;
  border-radius: 9px;
  background: color-mix(in srgb, var(--fg-primary) 8%, transparent);
  border: 1px solid var(--ch-line, var(--border-subtle));
  color: var(--ch-text, #e7e7ea);
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 0.02em;
  line-height: 1;
  cursor: pointer;
  transition: background 0.15s ease;
}
.locale-switcher__trigger:hover { background: color-mix(in srgb, var(--fg-primary) 16%, transparent); }
.locale-switcher__globe { opacity: 0.85; }
.locale-switcher__caret { font-size: 10px; opacity: 0.7; }
.locale-switcher__menu {
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  min-width: 176px;
  margin: 0;
  padding: 6px;
  list-style: none;
  background: var(--ch-surface, var(--bg-subtle));
  border: 1px solid var(--ch-line, var(--border-subtle));
  border-radius: 12px;
  box-shadow: 0 12px 32px rgba(0, 0, 0, 0.45);
  z-index: 2100;
}
.locale-switcher__option {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  padding: 9px 10px;
  border: 0;
  border-radius: 8px;
  background: transparent;
  color: var(--ch-text, #e7e7ea);
  font-size: 14px;
  text-align: left;
  cursor: pointer;
  transition: background 0.12s ease;
}
.locale-switcher__option:hover { background: color-mix(in srgb, var(--fg-primary) 12%, transparent); }
.locale-switcher__option.is-active { color: var(--ch-accent, #5ec8f5); }
.locale-switcher__option-code {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.04em;
  opacity: 0.55;
  min-width: 22px;
}
.locale-switcher__option.is-active .locale-switcher__option-code { opacity: 1; }

/* Sheet (mobile menu) variant — full-width control */
.locale-switcher--sheet { margin: 6px 0 2px; }
.locale-switcher--sheet .locale-switcher__trigger {
  width: 100%;
  justify-content: flex-start;
  gap: 10px;
  padding: 14px 16px;
  font-size: 15px;
  border-radius: 12px;
}
.locale-switcher--sheet .locale-switcher__caret { margin-left: auto; }
.locale-switcher--sheet .locale-switcher__menu { left: 0; right: 0; width: 100%; }

/* ── Theme switcher ───────────────────────────────────────────────── */
.theme-switcher { position: relative; }
.theme-switcher__trigger {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 7px 10px;
  border-radius: 9px;
  background: color-mix(in srgb, var(--fg-primary) 8%, transparent);
  border: 1px solid var(--ch-line, var(--border-subtle));
  color: var(--ch-text, #e7e7ea);
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 0.02em;
  line-height: 1;
  cursor: pointer;
  transition: background 0.15s ease;
}
.theme-switcher__trigger:hover { background: color-mix(in srgb, var(--fg-primary) 16%, transparent); }
.theme-switcher__icon { opacity: 0.85; }
.theme-switcher__caret { font-size: 10px; opacity: 0.7; }
.theme-switcher__menu {
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  min-width: 160px;
  margin: 0;
  padding: 6px;
  list-style: none;
  background: var(--ch-surface, var(--bg-subtle));
  border: 1px solid var(--ch-line, var(--border-subtle));
  border-radius: 12px;
  box-shadow: 0 12px 32px rgba(0, 0, 0, 0.45);
  z-index: 2100;
}
.theme-switcher__option {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  padding: 9px 10px;
  border: 0;
  border-radius: 8px;
  background: transparent;
  color: var(--ch-text, #e7e7ea);
  font-size: 14px;
  text-align: left;
  cursor: pointer;
  transition: background 0.12s ease;
}
.theme-switcher__option:hover { background: color-mix(in srgb, var(--fg-primary) 12%, transparent); }
.theme-switcher__option.is-active { color: var(--ch-accent, #5ec8f5); }
.theme-switcher__option-code {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.04em;
  opacity: 0.55;
  min-width: 22px;
}
.theme-switcher__option.is-active .theme-switcher__option-code { opacity: 1; }

.theme-switcher--sheet { margin: 6px 0 2px; }
.theme-switcher--sheet .theme-switcher__trigger {
  width: 100%;
  justify-content: flex-start;
  gap: 10px;
  padding: 14px 16px;
  font-size: 15px;
  border-radius: 12px;
}
.theme-switcher--sheet .theme-switcher__caret { margin-left: auto; }
.theme-switcher--sheet .theme-switcher__menu { left: 0; right: 0; width: 100%; }

/* Primary links — large serif, hairline dividers (Walpole-style) */
.ch-mnav__list {
  display: flex;
  flex-direction: column;
  margin-top: 1.5rem;
}
.ch-mnav__link {
  display: block;
  padding: 1rem 0;
  font-family: var(--font-serif), 'Fraunces', Georgia, serif;
  font-size: 1.7rem;
  font-weight: 400;
  line-height: 1.15;
  color: var(--ch-text, #f4f4f6);
  text-decoration: none;
  border-bottom: 1px solid var(--border-subtle);
  transition: color 0.15s ease, padding-left 0.15s ease;
}
.ch-mnav__link:hover {
  color: var(--ch-accent, #6cc7f5);
  padding-left: 0.35rem;
}

/* Auth area — pinned toward the bottom of the sheet */
.ch-mnav__auth {
  margin-top: auto;
  padding-top: 2rem;
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
}
.ch-mnav__label {
  font-family: var(--font-body, inherit);
  font-size: 11px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--ch-text-muted, var(--fg-secondary));
  padding: 0 0 0.5rem;
}
.ch-mnav__authlink {
  display: block;
  padding: 0.85rem 0;
  font-family: var(--font-serif), 'Fraunces', Georgia, serif;
  font-size: 1.25rem;
  color: var(--ch-text, #f4f4f6);
  text-decoration: none;
  border-bottom: 1px solid var(--border-subtle);
  text-align: left;
  background: none;
  cursor: pointer;
}
.ch-mnav__authlink:last-child {
  border-bottom: 0;
}
.ch-mnav__signout {
  border: 0;
  width: 100%;
  font: inherit;
  font-family: var(--font-serif), 'Fraunces', Georgia, serif;
  font-size: 1.25rem;
  color: var(--ch-text, #f4f4f6);
}

/* Logged-out: Log in + Sign up share one row */
.ch-mnav__row {
  display: flex;
  gap: 0.75rem;
  margin-top: 0.5rem;
}
.ch-mnav__login,
.ch-mnav__signup {
  flex: 1 1 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0.95rem 1rem;
  border-radius: 999px;
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 0.95rem;
  font-weight: 600;
  letter-spacing: 0.01em;
  text-decoration: none;
  transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}
.ch-mnav__login {
  color: var(--ch-text, #f4f4f6);
  background: transparent;
  border: 1px solid var(--ch-line-strong, var(--border-strong));
}
.ch-mnav__login:hover {
  background: color-mix(in srgb, var(--fg-primary) 12%, transparent);
  border-color: color-mix(in srgb, var(--border-strong) 82%, var(--fg-primary));
}
.ch-mnav__signup {
  color: var(--ch-bg, #0c0c11);
  background: var(--ch-text, #f4f4f6);
  border: 1px solid var(--ch-text, #f4f4f6);
}
.ch-mnav__signup:hover {
  background: color-mix(in srgb, var(--bg-inverse) 92%, var(--bg-base));
  border-color: color-mix(in srgb, var(--bg-inverse) 92%, var(--bg-base));
}

.ch-hero__eyebrow {
  font-family: var(--ch-font-display);
  font-size: 11px;
  font-weight: 400;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ch-text-dim);
}

.ch-hero__pathways {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
}
/* Blue pills */
.ch-hero__pathway {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.55rem 1.15rem;
  border-radius: 999px;
  background: var(--ch-accent, #6cc7f5);
  color: var(--accent-fg);
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 0.8125rem;
  font-weight: 600;
  letter-spacing: 0.01em;
  text-decoration: none;
  transition: background 0.15s ease, transform 0.15s ease;
}
.ch-hero__pathway-icon {
  width: 1.05em;
  height: 1.05em;
  flex: none;
}
.ch-hero__pathway:hover {
  background: color-mix(in srgb, var(--ch-accent) 86%, white);
  transform: translateY(-1px);
}

/* Desktop: pinned to the bottom-right of the hero plate, clear of the
   scroll indicator that lives in the same corner. */
.ch-hero__pathways--desktop {
  position: absolute;
  right: clamp(4rem, 7vw, 6rem);
  /* Raised ~0.75rem above the overlay baseline so the pills' centre line
     matches the (taller) search bar to their left. */
  bottom: calc(clamp(1.5rem, 4vh, 3rem) + 0.75rem);
  z-index: 2;
  justify-content: flex-end;
}
/* Mobile copy lives under the search form; hidden on desktop. */
.ch-hero__pathways--mobile {
  display: none;
}

/* The mobile host / register CTA row was removed from the hero — "List a
   property" now lives in the burger menu and both CTAs are restated in the
   host band above the footer. Its rules (.ch-hero__cta-row / __cta / __cta-icon)
   went with the markup. */

/* Below ~1200px the bottom-left search bar and bottom-right pills run
   out of room side by side, so move the pills under the search form. */
@media (max-width: 1200px) {
  .ch-hero__pathways--desktop {
    display: none;
  }
  .ch-hero__pathways--mobile {
    display: flex;
    /* A bit more breathing room between the search bar and the buttons. */
    margin-top: 0.9rem;
  }
}

@media (max-width: 720px) {
  /* Two pills share a row when the labels are short (English); longer
     translations (FR/DE) wrap the text and, if needed, the pills stack —
     never clip. A real flex-basis keeps them from collapsing to 0. */
  .ch-hero__pathways--mobile {
    flex-wrap: wrap;
  }
  .ch-hero__pathways--mobile .ch-hero__pathway {
    flex: 1 1 calc(50% - 0.3rem);
    min-width: 0;
    justify-content: center;
    text-align: center;
    gap: 0.4rem;
    padding-inline: 0.5rem;
    font-size: 0.75rem;
    line-height: 1.2;
    white-space: normal;
  }
  /* Ghost / outline treatment, so the white SEARCH button is the only filled
     control above the fold. Icons stay. min-height meets the 44px tap target
     the filled pills never did (they measured 32px). */
  .ch-hero__pathways--mobile .ch-hero__pathway {
    min-height: 44px;
    background: var(--ch-ondark-fill);
    border: 1px solid var(--ch-ondark-line);
    color: var(--ch-ondark-fg);
    font-weight: 500;
  }

  /* The eyebrow duplicates the headline's job on a phone; the subcopy stays.
     It is position:absolute, so this frees no height — it is decluttering
     only. The plate height below is what actually moves the fold. */
  .ch-hero--full .ch-hero__top {
    display: none;
  }

  /* Two lines, not three. 8.6vw ≈ 33.5px at 390 and holds the wrap up to the
     720px breakpoint; the clamp floor protects 320px devices. */
  .ch-hero--full .ch-hero__title {
    font-size: clamp(30px, 8.6vw, 36px);
    line-height: 1.04;
    letter-spacing: -0.02em;
  }
}

/* ── Image plate ──────────────────────────────────────────────────
   Rounded TOP only — the bottom fades into the page background via
   the veil gradient, so the plate visually dissolves into the dark
   page below. Headline + lede sit inside the plate at bottom-left. */
.ch-hero__plate {
  position: relative;
  isolation: isolate;
  margin: 0;
  width: 100%;
  aspect-ratio: 16 / 10;
  border-radius: var(--ch-radius-hero) var(--ch-radius-hero) 0 0;
  overflow: hidden;
  background: var(--bg-base);
}
@media (min-width: 900px) {
  /* 16/9 rather than the old 21/10: a taller plate gives the bottom-anchored
     overlay room for 4-line headlines in longer languages (FR/DE) without the
     text rising into / clipping at the top edge of the image. */
  .ch-hero__plate { aspect-ratio: 16 / 9; }
}
@media (max-width: 720px) {
  /* The plate GROWS to fit the overlay so no copy is ever clipped — the
     headline, lede and two CTA rows are taller in longer languages (FR/DE).
     The image is position:absolute (Next <Image fill>), so it covers whatever
     height the content needs; min-height keeps a strong hero when copy is short
     (English). justify-content:flex-end keeps the stack bottom-anchored. */
  .ch-hero__plate {
    aspect-ratio: auto;
    min-height: 70vh;
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
    border-radius: var(--ch-radius-card) var(--ch-radius-card) 0 0;
  }
  /* Overlay moves from absolute (bottom-anchored, clipping) into normal flow so
     it contributes to the plate's height; relative + z-index keeps it above the
     image/veil. Padding replaces the old inset offsets and gives top/bottom room.
     NOTE: scoped under .ch-hero__plate so it beats the base `.ch-hero__overlay`
     rule (position:absolute) that is defined LATER in this file — without the
     extra specificity the base wins on mobile and the headline clips at the top. */
  .ch-hero__plate .ch-hero__overlay {
    position: relative;
    inset: auto;
    max-width: none;
    padding: clamp(2rem, 6vh, 3rem) clamp(1.25rem, 5vw, 1.75rem);
    gap: 0.7rem;
  }
}

.ch-hero__image {
  object-fit: cover;
  object-position: 70% 50%;
  filter: saturate(0.85) brightness(0.78) contrast(1.08);
}
html[data-theme='light'] .ch-hero__image {
  filter: saturate(0.92) brightness(0.96) contrast(1.02);
}

.ch-hero__veil {
  position: absolute;
  inset: 0;
  background:
    /* Left-side fade for headline legibility */
    linear-gradient(90deg,
      rgba(0,0,0,0.65) 0%,
      rgba(0,0,0,0.30) 30%,
      rgba(0,0,0,0.05) 55%,
      rgba(0,0,0,0) 75%),
    /* Bottom fade to the page colour (#020617) — the image dissolves
       seamlessly into the page background rather than to pure black. */
    linear-gradient(180deg,
      rgba(2,6,23,0) 0%,
      rgba(2,6,23,0) 35%,
      rgba(2,6,23,0.35) 55%,
      rgba(2,6,23,0.82) 78%,
      #020617 100%);
}
html[data-theme='light'] .ch-hero__veil {
  background:
    linear-gradient(90deg,
      rgba(255,255,255,0.14) 0%,
      rgba(255,255,255,0.08) 35%,
      rgba(255,255,255,0) 70%),
    linear-gradient(180deg,
      rgba(255,255,255,0) 0%,
      rgba(245,249,252,0) 45%,
      rgba(245,249,252,0.56) 74%,
      #eef4f8 100%);
}

/* ── Headline + lede overlay (inside the plate, bottom-left) ────── */
.ch-hero__overlay {
  position: absolute;
  left: clamp(1.5rem, 4vw, 3.5rem);
  right: clamp(1.5rem, 4vw, 3.5rem);
  bottom: clamp(1.5rem, 4vh, 3rem);
  display: flex;
  flex-direction: column;
  gap: clamp(1rem, 1.8vh, 1.5rem);
  max-width: 44rem;
  z-index: 1;
}

/* Caption stack — sits inside the image plate (top-right) */
.ch-hero__caption {
  position: absolute;
  top: clamp(1rem, 2.5vh, 2rem);
  right: clamp(1rem, 2.5vw, 2rem);
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 1rem;
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--fg-primary) 58%, transparent);
}
.ch-hero__caption-label {
  position: relative;
  padding-right: 22px;
}
.ch-hero__caption-label::after {
  content: '';
  position: absolute;
  right: 0;
  top: 50%;
  width: 14px;
  height: 1px;
  background: currentColor;
  opacity: 0.6;
}
.ch-hero__regions {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 5px;
  color: color-mix(in srgb, var(--fg-primary) 75%, transparent);
  font-size: 11px;
  letter-spacing: 0.1em;
}
@media (max-width: 720px) {
  .ch-hero__caption { display: none; }
}

/* ── Headline + lede typography (rendered inside the plate overlay) ── */
.ch-hero__title {
  font-family: var(--font-serif), 'Fraunces', 'Times New Roman', serif;
  font-weight: 400;
  font-size: clamp(40px, 5.8vw, 96px);
  line-height: 0.98;
  letter-spacing: -0.025em;
  color: var(--fg-primary);
  margin: 0;
  max-width: 16ch;
  text-shadow: 0 2px 24px rgba(0, 0, 0, 0.45);
}

/* Hero copy sits on dark photography in both themes. Keep text light even
   when global foreground tokens switch to dark in light mode. */
html[data-theme='light'] .ch-hero__eyebrow,
html[data-theme='light'] .ch-hero__caption,
html[data-theme='light'] .ch-hero__regions,
html[data-theme='light'] .ch-hero__title,
html[data-theme='light'] .ch-hero__lede,
html[data-theme='light'] .ch-hero__search-label,
html[data-theme='light'] .ch-hero__scroll {
  color: #f4f4f6;
}
html[data-theme='light'] .ch-hero__eyebrow {
  color: color-mix(in srgb, var(--fg-primary) 72%, transparent);
  text-shadow: none;
}
.ch-hero__title em {
  font-style: italic;
  font-family: inherit;
  color: var(--ch-accent);
}

.ch-hero__lede {
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: clamp(0.9375rem, 1.05vw, 1.125rem);
  line-height: 1.55;
  color: color-mix(in srgb, var(--fg-primary) 84%, transparent);
  max-width: 52ch;
  margin: 0;
  text-shadow: 0 1px 12px rgba(0, 0, 0, 0.4);
}

/* ── Hero search — protagonist tool, inside the image plate ─────── */
.ch-hero__search {
  display: flex;
  flex-direction: column;
  gap: 0.875rem;
  max-width: 36rem;
  margin-top: clamp(0.75rem, 1.5vh, 1.5rem);
}
/* .ch-hero__search-label ("FIND ACCOMMODATION") removed with its markup — it
   restated the WHERE / WHEN / WHO / SEARCH card immediately beneath it. */
/* Override HomeSearchBar surface so it reads as a glass tool over the image */
.ch-hero__search .home-search-bar {
  background: rgba(15, 16, 20, 0.55);
  backdrop-filter: blur(20px) saturate(1.15);
  -webkit-backdrop-filter: blur(20px) saturate(1.15);
  border: 1px solid rgba(255, 255, 255, 0.10);
  border-radius: var(--ch-radius-pill);
  padding: 0.5rem 0.5rem 0.5rem 1.25rem;
  box-shadow: 0 24px 60px rgba(0, 0, 0, 0.45);
}
html[data-theme='light'] .ch-hero__search .home-search-bar {
  background: rgba(255, 255, 255, 0.84);
  border: 1px solid rgba(5, 38, 54, 0.16);
  backdrop-filter: blur(14px) saturate(1.06);
  -webkit-backdrop-filter: blur(14px) saturate(1.06);
  box-shadow: 0 12px 34px rgba(5, 38, 54, 0.14);
}
.ch-hero__search .home-search-input {
  background: transparent;
  color: var(--fg-primary);
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 1rem;
}
.ch-hero__search .home-search-input::placeholder {
  color: color-mix(in srgb, var(--fg-primary) 66%, transparent);
}
.ch-hero__search .home-search-submit {
  background: var(--bg-inverse);
  color: var(--ch-bg);
  border-radius: var(--ch-radius-pill);
  font-weight: 500;
  font-size: 0.9375rem;
  padding: 0.75rem 1.5rem;
  border: 0;
  cursor: pointer;
  transition: transform var(--ch-duration) var(--ch-ease),
              background var(--ch-duration) var(--ch-ease);
}
.ch-hero__search .home-search-submit:hover {
  background: color-mix(in srgb, var(--bg-inverse) 92%, var(--bg-base));
  transform: translateY(-1px);
}
.ch-hero__search .home-search-icon {
  color: color-mix(in srgb, var(--fg-primary) 74%, transparent);
}
/* Trim the hero search bar + button down a notch on mobile. */
@media (max-width: 720px) {
  .ch-hero__search .home-search-bar {
    padding: 0.3rem 0.3rem 0.3rem 0.85rem;
  }
  .ch-hero__search .home-search-input {
    font-size: 0.75rem;
  }
  .ch-hero__search .home-search-submit {
    font-size: 0.75rem;
    padding: 0.5rem 0.9rem;
  }
}

/* ── Hero plate scroll indicator (bottom-right of image) ─────────── */
.ch-hero__scroll {
  position: absolute;
  right: clamp(1rem, 2.5vw, 2rem);
  bottom: clamp(1.25rem, 3vh, 2.25rem);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.6rem;
  z-index: 1;
  pointer-events: none;
}
@media (max-width: 720px) {
  .ch-hero__scroll { display: none; }
}
.ch-hero__scroll-label {
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--fg-primary) 70%, transparent);
  writing-mode: vertical-rl;
  transform: rotate(180deg);
}
.ch-hero__scroll-line {
  position: relative;
  width: 2px;
  height: 72px;
  background: color-mix(in srgb, var(--fg-primary) 24%, transparent);
  border-radius: 2px;
  overflow: hidden;
}
.ch-hero__scroll-dot {
  position: absolute;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  width: 2px;
  height: 22px;
  background: var(--fg-primary);
  border-radius: 2px;
  box-shadow: 0 0 6px color-mix(in srgb, var(--fg-primary) 70%, transparent);
  animation: ch-hero-scroll-tick 2.2s cubic-bezier(0.6, 0, 0.4, 1) infinite;
}
@keyframes ch-hero-scroll-tick {
  0%   { transform: translate(-50%, -100%); opacity: 0; }
  15%  { opacity: 1; }
  85%  { opacity: 1; }
  100% { transform: translate(-50%, 72px); opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .ch-hero__scroll-dot { animation: none; top: 6px; }
}

/* The scroll cue was never removed from the full-bleed hero — it renders at
   the rail on desktop with its tick animation running. It is simply INVISIBLE
   in the light theme: label, line and dot are all painted from --fg-primary,
   which is #111827 against the always-dark #020617 plate (1.1:1). Fourth
   control hit by this, hence the shared --ch-ondark-* tokens. */
.ch-hero--full .ch-hero__scroll-label {
  color: color-mix(in srgb, var(--ch-ondark-fg) 72%, transparent);
}
.ch-hero--full .ch-hero__scroll-line {
  background: var(--ch-ondark-line);
}
.ch-hero--full .ch-hero__scroll-dot {
  background: var(--ch-ondark-fg);
  box-shadow: 0 0 6px color-mix(in srgb, var(--ch-ondark-fg) 70%, transparent);
}



/* ── Reveal-on-view utility — IntersectionObserver-driven ───────────
   Add data-reveal to any element to fade + translate-up on scroll.
   Add data-reveal-stagger to a parent and data-reveal on children
   for a 70ms-per-sibling cascade. Respects prefers-reduced-motion. */
[data-reveal] {
  opacity: 0;
  transform: translate3d(0, 14px, 0);
  transition:
    opacity 700ms cubic-bezier(0.22, 1, 0.36, 1),
    transform 700ms cubic-bezier(0.22, 1, 0.36, 1);
  will-change: opacity, transform;
}
[data-reveal].is-revealed {
  opacity: 1;
  transform: translate3d(0, 0, 0);
}
[data-reveal="up-sm"]      { transform: translate3d(0, 8px, 0); }
[data-reveal="up-lg"]      { transform: translate3d(0, 24px, 0); }
[data-reveal="fade"]       { transform: none; }
[data-reveal="left"]       { transform: translate3d(-16px, 0, 0); }
[data-reveal="right"]      { transform: translate3d(16px, 0, 0); }
[data-reveal="left-lg"]    { transform: translate3d(-40px, 0, 0); }
[data-reveal="right-lg"]   { transform: translate3d(40px, 0, 0); }
[data-reveal="scale"]      { transform: scale(0.94); }
[data-reveal="scale"].is-revealed { transform: scale(1); }
[data-reveal="blur"]       { filter: blur(8px); }
[data-reveal="blur"].is-revealed  { filter: blur(0); }
[data-reveal="blur"] {
  transition:
    opacity 800ms cubic-bezier(0.22, 1, 0.36, 1),
    transform 800ms cubic-bezier(0.22, 1, 0.36, 1),
    filter 800ms cubic-bezier(0.22, 1, 0.36, 1);
}

/* Stagger: cascade direct children that are themselves [data-reveal] */
[data-reveal-stagger] > [data-reveal]:nth-child(1)  { transition-delay: 0ms; }
[data-reveal-stagger] > [data-reveal]:nth-child(2)  { transition-delay: 70ms; }
[data-reveal-stagger] > [data-reveal]:nth-child(3)  { transition-delay: 140ms; }
[data-reveal-stagger] > [data-reveal]:nth-child(4)  { transition-delay: 210ms; }
[data-reveal-stagger] > [data-reveal]:nth-child(5)  { transition-delay: 280ms; }
[data-reveal-stagger] > [data-reveal]:nth-child(6)  { transition-delay: 320ms; }
[data-reveal-stagger] > [data-reveal]:nth-child(7)  { transition-delay: 360ms; }
[data-reveal-stagger] > [data-reveal]:nth-child(8)  { transition-delay: 400ms; }
[data-reveal-stagger] > [data-reveal]:nth-child(9)  { transition-delay: 440ms; }
[data-reveal-stagger] > [data-reveal]:nth-child(10) { transition-delay: 480ms; }
[data-reveal-stagger] > [data-reveal]:nth-child(n+11) { transition-delay: 520ms; }

@media (prefers-reduced-motion: reduce) {
  [data-reveal] {
    opacity: 1 !important;
    transform: none !important;
    filter: none !important;
    transition: none !important;
  }
}

/* On client-side navigation RevealOnView adds .reveal-instant to <html> for a
   couple of frames so in-view content for the new page appears immediately
   (no replayed fade) — page switching feels instant. Below-fold elements still
   animate on scroll once the class is removed. */
html.reveal-instant [data-reveal] {
  transition: none !important;
}

/* ── Page curtain ───────────────────────────────────────────────────
   Two panels sweep up over the page with a curved leading edge and carry on
   off the top to reveal the next route. Markup in components/PageTransition.tsx,
   animated by lib/curtain.ts — everything here is static; the panel transforms
   and the cap paths are written by the runtime, frame by frame.

   Above everything, including the enquiry/auth modal backdrops at 100000: the
   navbar is rendered per-page here rather than in the root layout, so unlike
   the site this is modelled on there's no persistent chrome to sit over the
   top — the curtain covers the lot while the route swaps underneath.

   The reveal-on-scroll system above already skips its entrance animation on
   client-side navigation (.reveal-instant), which is exactly right here: the
   new page is fully composed behind the curtain before it lifts. */
#page-transition {
  position: fixed;
  inset: 0;
  z-index: 1000000;
  pointer-events: none;
  opacity: 0;
  /* Contain the caps, which hang outside each panel. */
  overflow: hidden;
}

#page-transition.is-active {
  opacity: 1;
}

/* Covering the viewport: swallow clicks aimed at the page underneath. */
#page-transition.is-covering {
  pointer-events: auto;
}

/* Reduced motion: the curtain fades rather than sweeping (lib/curtain.ts
   skips the sweep entirely and drives these two classes instead). */
#page-transition.is-fading {
  opacity: 0;
  transition: opacity 0.3s ease;
}

.ch-curtain__panel {
  position: absolute;
  inset: 0;
  will-change: transform;
  /* Parked below the fold until the runtime takes over, so a transition can
     never start with a panel sitting across the page. */
  transform: translate3d(0, 114vh, 0);
}

/* Alpine blue leads the sweep in, and is the last to leave on the way out. */
.ch-curtain__panel--lead {
  background-color: #2a90c7;
}

.ch-curtain__panel--main {
  background-color: #081427;
}

/* The curved edges: SVGs hanging off the top and bottom of each panel, whose
   path the runtime bends in proportion to the panel's speed. 14vh matches
   CAP_RATIO in curtain.ts — the panels travel that much further to account
   for it. */
.ch-curtain__cap {
  position: absolute;
  left: 0;
  width: 100%;
  height: 14vh;
  display: block;
}

/* Overlapping the panel by a pixel hides the antialiasing seam at the join. */
.ch-curtain__cap--top {
  bottom: calc(100% - 1px);
}

.ch-curtain__cap--bottom {
  top: calc(100% - 1px);
}

.ch-curtain__panel--lead .ch-curtain__cap path {
  fill: #2a90c7;
}

.ch-curtain__panel--main .ch-curtain__cap path {
  fill: #081427;
}

/* Failsafe: if the runtime never arrives the curtain must not strand the user
   behind an opaque overlay. curtain.ts clears .ch-navigating as soon as the
   route commits, which cancels this. */
html.ch-navigating #page-transition {
  animation: ch-curtain-failsafe 0s linear 9s forwards;
}

@keyframes ch-curtain-failsafe {
  to {
    opacity: 0;
    pointer-events: none;
  }
}

/* ── Prevent iOS Safari auto-zoom on form-field focus ───────────────
   iOS zooms the viewport whenever a focused input/select/textarea has a
   computed font-size below 16px. Enforce a 16px floor on touch viewports
   so tapping any field never triggers a zoom. Pinch-zoom stays enabled. */
@media (max-width: 767px) {
  input:not([type="checkbox"]):not([type="radio"]):not([type="range"]),
  select,
  textarea,
  /* Explicit class overrides for fields whose own class rule sets <16px
     (a bare element selector can't beat their specificity). */
  .search-sort-select {
    font-size: 16px;
  }
}


/* ===================================================================
   ABOUT PAGE — editorial sections
   ------------------------------------------------------------------- */

/* Shared section-header block used across about-page sections */
.about-section__header {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  max-width: 64rem;
  margin-bottom: clamp(2.5rem, 5vh, 4rem);
}
.about-section__header--split {
  flex-direction: column;
  gap: 1.25rem;
  max-width: none;
}
@media (min-width: 900px) {
  .about-section__header--split {
    flex-direction: row;
    align-items: flex-end;
    justify-content: space-between;
    gap: 4rem;
  }
  .about-section__header--split > p { max-width: 36ch; }
}
.about-section__lede {
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 1.0625rem;
  line-height: 1.6;
  color: var(--ch-text-soft);
  max-width: 60ch;
  margin: 0;
}
@media (min-width: 768px) {
  .about-section__lede { font-size: 1.1875rem; line-height: 1.55; }
}

/* ── Manifesto + stats — text left, 2×2 stat grid right ───────────── */
.about-manifesto {
  padding-block: var(--section-pad-y);
  background: var(--ch-bg);
}
.about-manifesto__layout {
  display: grid;
  grid-template-columns: 1fr;
  gap: 3rem;
  align-items: center;
}
@media (min-width: 960px) {
  .about-manifesto__layout {
    grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr);
    gap: 5rem;
  }
}
.about-manifesto__body {
  display: flex;
  flex-direction: column;
  gap: 1.5rem;
}
.about-manifesto__statement {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: clamp(1.75rem, 3.8vw, 3.25rem);
  line-height: 1.08;
  letter-spacing: -0.02em;
  color: var(--ch-text);
  margin: 0.5rem 0 0;
  max-width: 22ch;
}
.about-manifesto__statement em {
  font-style: italic;
  color: var(--ch-accent);
}
.about-manifesto__support {
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 1.0625rem;
  line-height: 1.7;
  color: var(--ch-text-soft);
  max-width: 56ch;
  margin: 1rem 0 0;
}
.about-manifesto__stats {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  grid-template-rows: repeat(2, auto);
  border-top: 1px solid var(--ch-line);
  border-left: 1px solid var(--ch-line);
}
.about-stat {
  padding: 1.75rem 1.5rem;
  border-right: 1px solid var(--ch-line);
  border-bottom: 1px solid var(--ch-line);
}
.about-stat__value {
  display: block;
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: clamp(2.5rem, 4.2vw, 3.5rem);
  line-height: 1;
  color: var(--ch-text);
  letter-spacing: -0.02em;
}
.about-stat__label {
  display: block;
  margin-top: 0.75rem;
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
}

/* ── Principles — 4 pillars ─────────────────────────────────────── */
.about-principles {
  padding-block: var(--section-pad-y);
}
.about-principles__grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr;
  gap: 2.5rem;
}
@media (min-width: 768px) {
  .about-principles__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 3rem 4rem; }
}
.about-principle {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  padding-top: 1.5rem;
  border-top: 1px solid var(--ch-line);
}
.about-principle__num {
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.18em;
  color: var(--ch-accent);
}
.about-principle__title {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: clamp(1.375rem, 1.8vw, 1.625rem);
  line-height: 1.2;
  letter-spacing: -0.015em;
  color: var(--ch-text);
  margin: 0;
}
.about-principle__body {
  font-size: 0.9375rem;
  line-height: 1.7;
  color: var(--ch-text-soft);
  margin: 0;
  max-width: 48ch;
}

/* ── Split: image + body ──────────────────────────────────────────── */
.about-split {
  padding-block: var(--section-pad-y);
  background: rgba(255, 255, 255, 0.015);
  border-top: 1px solid var(--ch-line);
  border-bottom: 1px solid var(--ch-line);
}
.about-split__layout {
  display: grid;
  grid-template-columns: 1fr;
  gap: 3rem;
  align-items: center;
}
@media (min-width: 900px) {
  .about-split__layout {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr);
    gap: 5rem;
  }
}
.about-split__media {
  position: relative;
  margin: 0;
  aspect-ratio: 4 / 5;
  border-radius: var(--ch-radius-card);
  overflow: hidden;
  background: #020617;
}
@media (max-width: 720px) { .about-split__media { aspect-ratio: 4 / 3; } }
.about-split__img {
  object-fit: cover;
  filter: saturate(0.9) brightness(0.85);
}
.about-split__body { display: flex; flex-direction: column; gap: 1.25rem; }
.about-split__copy {
  font-size: 1.0625rem;
  line-height: 1.7;
  color: var(--ch-text-soft);
  margin: 0;
  max-width: 56ch;
}
.about-split__points {
  list-style: none;
  margin: 1rem 0 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.625rem;
}
.about-split__points li {
  position: relative;
  padding-left: 1.5rem;
  font-size: 0.9375rem;
  line-height: 1.55;
  color: var(--ch-text);
}
.about-split__points li::before {
  content: '';
  position: absolute;
  left: 0;
  top: 0.6em;
  width: 0.75rem;
  height: 1px;
  background: var(--ch-accent);
}

/* ── Process — horizontal numbered steps ──────────────────────────── */
.about-process {
  padding-block: var(--section-pad-y);
}
.about-process__steps {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr;
  gap: 2.5rem;
  counter-reset: process;
}
@media (min-width: 768px) {
  .about-process__steps { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 1100px) {
  .about-process__steps { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 2rem; }
}
.about-process__step {
  display: flex;
  flex-direction: column;
  gap: 0.875rem;
  padding-top: 1.25rem;
  border-top: 1px solid var(--ch-border);
  position: relative;
}
.about-process__num {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: 3rem;
  line-height: 1;
  color: var(--ch-text);
  letter-spacing: -0.02em;
}
.about-process__title {
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ch-accent);
  margin: 0;
}
.about-process__body {
  font-size: 0.9375rem;
  line-height: 1.7;
  color: var(--ch-text-soft);
  margin: 0;
}

/* ── Comparison — us vs the others ────────────────────────────────── */
.about-compare {
  padding-block: var(--section-pad-y);
}
.about-compare__table {
  display: grid;
  grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr) minmax(0, 1.15fr);
  border-top: 1px solid var(--ch-line);
}
.about-compare__head,
.about-compare__row {
  display: contents;
}
.about-compare__head > *,
.about-compare__row > * {
  padding: 1.25rem 1.5rem;
  border-bottom: 1px solid var(--ch-line);
  font-size: 0.9375rem;
  line-height: 1.55;
  color: var(--ch-text-soft);
  display: flex;
  align-items: center;
}
.about-compare__head > * {
  padding-block: 1rem;
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
}
.about-compare__row > .about-compare__col-label {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-size: 1rem;
  color: var(--ch-text);
}
.about-compare__row > .about-compare__col-us {
  color: var(--ch-text);
  position: relative;
}
.about-compare__row > .about-compare__col-us::before {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(94, 200, 245, 0.04), transparent);
  pointer-events: none;
}
.about-compare__head > .about-compare__col-us {
  color: var(--ch-accent);
}
@media (max-width: 760px) {
  .about-compare__table { grid-template-columns: 1fr; border-top: 0; }
  .about-compare__head { display: none; }
  .about-compare__row {
    display: grid;
    grid-template-columns: 1fr;
    padding: 1.25rem 0;
    border-bottom: 1px solid var(--ch-line);
  }
  .about-compare__row > * {
    padding: 0.35rem 0;
    border-bottom: 0;
  }
  .about-compare__row > .about-compare__col-label {
    font-family: var(--ch-font-display);
    font-size: 10px;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--ch-text-muted);
    padding-bottom: 0.5rem;
  }
  .about-compare__row > .about-compare__col-us {
    color: var(--ch-accent);
    font-family: var(--font-serif), 'Fraunces', serif;
    font-size: 1.0625rem;
  }
  .about-compare__row > .about-compare__col-us::before { display: none; }
  .about-compare__row > .about-compare__col-them {
    color: var(--ch-text-muted);
    font-size: 0.875rem;
  }
}

/* ── Countries ─────────────────────────────────────────────────── */
.about-countries {
  padding-block: var(--section-pad-y);
  background: rgba(255, 255, 255, 0.015);
  border-top: 1px solid var(--ch-line);
  border-bottom: 1px solid var(--ch-line);
}
.about-countries__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr;
  gap: 0;
  border-top: 1px solid var(--ch-line);
}
.about-country {
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: 1.5rem;
  padding: 1.5rem 0;
  border-bottom: 1px solid var(--ch-line);
  transition: background var(--ch-duration) var(--ch-ease);
}
.about-country__flag { font-size: 2rem; line-height: 1; }
.about-country__body { min-width: 0; }
.about-country__name {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: clamp(1.375rem, 2vw, 1.875rem);
  line-height: 1.1;
  letter-spacing: -0.015em;
  color: var(--ch-text);
  margin: 0 0 0.25rem;
}
.about-country__hubs {
  font-size: 0.875rem;
  line-height: 1.45;
  color: var(--ch-text-muted);
  margin: 0;
}
.about-country__count {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
}
.about-country__count-num {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-size: 1.75rem;
  line-height: 1;
  color: var(--ch-text);
}
.about-country__count-label {
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
  margin-top: 0.4rem;
}
@media (max-width: 600px) {
  .about-country { grid-template-columns: auto 1fr; }
  .about-country__count { grid-column: 2; align-items: flex-start; padding-top: 0.5rem; }
}

/* ── Pull quote ────────────────────────────────────────────────────── */
.about-quote {
  padding-block: var(--section-pad-y);
}
.about-quote__figure {
  margin: 0;
  max-width: 56rem;
  margin-inline: auto;
  text-align: center;
}
.about-quote__body {
  margin: 0;
}
.about-quote__body p {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: clamp(1.75rem, 3.4vw, 3rem);
  line-height: 1.18;
  letter-spacing: -0.015em;
  color: var(--ch-text);
  margin: 0;
}
.about-quote__body p em {
  font-style: italic;
  color: var(--ch-accent);
}
.about-quote__cite {
  margin-top: 2rem;
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
}
.about-quote__role { color: var(--ch-text-soft); }

/* ── Team ──────────────────────────────────────────────────────────── */
.about-team {
  padding-block: var(--section-pad-y);
  background: rgba(255, 255, 255, 0.015);
  border-top: 1px solid var(--ch-line);
  border-bottom: 1px solid var(--ch-line);
}
.about-team__grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr;
  gap: 2.5rem;
}
@media (min-width: 768px) {
  .about-team__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 2.5rem 3rem; }
}
.about-team-member {
  display: flex;
  flex-direction: column;
  gap: 0.625rem;
}
.about-team-member__avatar {
  width: 72px;
  height: 72px;
  border-radius: 50%;
  background: var(--ch-surface-2, rgba(255, 255, 255, 0.05));
  border: 1px solid var(--ch-border);
  color: var(--ch-text);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-serif), 'Fraunces', serif;
  font-size: 1.5rem;
  letter-spacing: 0.02em;
  margin-bottom: 0.75rem;
}
.about-team-member__name {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: 1.375rem;
  line-height: 1.2;
  letter-spacing: -0.015em;
  color: var(--ch-text);
  margin: 0;
}
.about-team-member__role {
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ch-accent);
}
.about-team-member__bio {
  font-size: 0.9375rem;
  line-height: 1.7;
  color: var(--ch-text-soft);
  margin: 0.25rem 0 0;
  max-width: 36ch;
}

/* ── CTA ───────────────────────────────────────────────────────────── */
.about-cta {
  padding-block: var(--section-pad-y);
  background: var(--ch-bg);
}
.about-cta__inner {
  display: flex;
  flex-direction: column;
  gap: 1.25rem;
  max-width: 56rem;
}
.about-cta__lede {
  font-size: 1.0625rem;
  line-height: 1.7;
  color: var(--ch-text-soft);
  max-width: 50ch;
  margin: 0 0 0.75rem;
}
.about-cta__actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
  margin-top: 0.75rem;
}


/* ===================================================================
   AUTH — pages (/login, /register) + AuthGateModal
   ------------------------------------------------------------------- */

/* ── Page shell (editorial split layout) ─────────────────────────── */
.ch-auth {
  background: var(--ch-bg);
  padding-block: clamp(3rem, 6vh, 5rem) clamp(4rem, 8vh, 7rem);
  padding-inline: max(1.25rem, 5%);
}
.ch-auth__inner {
  max-width: 100rem;
  margin-inline: auto;
}
.ch-auth__layout {
  display: grid;
  grid-template-columns: 1fr;
  gap: 3rem;
  align-items: stretch;
  min-height: 70vh;
}
@media (min-width: 960px) {
  .ch-auth__layout {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr);
    gap: 4rem;
    align-items: center;
  }
}

/* Form column */
.ch-auth__form-col { display: flex; align-items: center; }
.ch-auth__card {
  width: 100%;
  max-width: 28rem;
  margin-inline: auto;
  display: flex;
  flex-direction: column;
  gap: 1.25rem;
}

/* Once the layout goes two-column, `margin-inline: auto` above was centring the
   28rem card inside its 1fr track — at 1920px that pushed the H1 to x=302 while
   the navbar logo, footer and the art plate's right edge all sat on the 160/1760
   rail. Reads as though the section is ignoring the container. Pin the card to
   the track's inline start so the left edge lands on the rail too; the centring
   still applies below 960px, where the card is the whole single-column layout.
   The solo variant (/verify-email) centres via .ch-auth__solo and is excluded. */
@media (min-width: 960px) {
  .ch-auth:not(.ch-auth--solo) .ch-auth__card { margin-inline: 0; }
}

.ch-auth__eyebrow {
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
}
.ch-auth__title {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: clamp(2rem, 3.4vw, 3rem);
  line-height: 1.05;
  letter-spacing: -0.02em;
  color: var(--ch-text);
  margin: 0;
  max-width: 14ch;
}
.ch-auth__title em { font-style: italic; color: var(--ch-accent); }
.ch-auth__lede {
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 1rem;
  line-height: 1.55;
  color: var(--ch-text-soft);
  margin: 0 0 0.5rem;
  max-width: 36ch;
}
.ch-auth__switch {
  border-top: 1px solid var(--ch-line);
  padding-top: 1.25rem;
  margin-top: 0.5rem;
}
.ch-auth__switch-link {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 0.9375rem;
  color: var(--ch-text);
  text-decoration: none;
  transition: color var(--ch-duration) var(--ch-ease);
}
.ch-auth__switch-link:hover { color: var(--ch-accent); }
.ch-auth__switch-link:hover .ch-btn__arrow { transform: translateX(3px); }

/* Right column — editorial visual + proof points */
.ch-auth__art {
  display: flex;
  flex-direction: column;
  gap: 2rem;
}
.ch-auth__plate {
  position: relative;
  isolation: isolate;
  margin: 0;
  width: 100%;
  aspect-ratio: 4 / 5;
  border-radius: var(--ch-radius-card);
  overflow: hidden;
  background: #020617;
}
@media (min-width: 960px) {
  .ch-auth__plate { aspect-ratio: 3 / 2; max-height: 600px; }
}
@media (max-width: 720px) { .ch-auth__plate { aspect-ratio: 16 / 11; } }
.ch-auth__plate-img {
  object-fit: cover;
  object-position: 60% 50%;
  filter: saturate(0.85) brightness(0.78);
}
.ch-auth__plate-veil {
  position: absolute;
  inset: 0;
  background:
    linear-gradient(180deg,
      rgba(0,0,0,0.10) 0%,
      rgba(0,0,0,0.15) 40%,
      rgba(0,0,0,0.78) 88%,
      rgba(0,0,0,0.92) 100%);
}
.ch-auth__plate-caption {
  position: absolute;
  inset: auto 0 0 0;
  padding: clamp(1.5rem, 3vw, 2.5rem);
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 0.75rem;
  z-index: 1;
}
.ch-auth__plate-label {
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.6);
}
.ch-auth__plate-quote {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-style: italic;
  font-size: clamp(1.125rem, 1.6vw, 1.5rem);
  line-height: 1.3;
  color: #fff;
  margin: 0;
  max-width: 36ch;
}
.ch-auth__plate-cite {
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.55);
}

.ch-auth__proof {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr;
  border-top: 1px solid var(--ch-line);
}
@media (min-width: 720px) {
  .ch-auth__proof { grid-template-columns: repeat(3, 1fr); }
}
.ch-auth__proof-item {
  padding: 1.25rem 0;
  border-bottom: 1px solid var(--ch-line);
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}
@media (min-width: 720px) {
  .ch-auth__proof-item {
    padding: 1.5rem 1.25rem;
    border-bottom: 0;
    border-right: 1px solid var(--ch-line);
  }
  .ch-auth__proof-item:first-child { padding-left: 0; }
  .ch-auth__proof-item:last-child { border-right: 0; padding-right: 0; }
}
.ch-auth__proof-label {
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ch-accent);
}
.ch-auth__proof-body {
  font-size: 0.8125rem;
  line-height: 1.55;
  color: var(--ch-text-soft);
  margin: 0;
}

/* Hide the editorial column entirely below 960px to keep the page focused */
@media (max-width: 959px) {
  .ch-auth__art { display: none; }
  .ch-auth__layout { min-height: auto; }
  .ch-auth__card { padding-block: 2rem; }
}

/* ── Form structure (shared with modal) ───────────────────────────── */
.ch-auth-form {
  display: flex;
  flex-direction: column;
  gap: 1.125rem;
}
.ch-auth-form__row {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1.125rem;
}
@media (min-width: 480px) {
  .ch-auth-form__row { grid-template-columns: 1fr 1fr; }
}
.ch-auth-form__legal {
  font-size: 0.75rem;
  line-height: 1.5;
  color: var(--ch-text-muted);
  margin: 0;
}
.ch-auth-form__legal a {
  color: var(--ch-text-soft);
  text-decoration: underline;
  text-decoration-color: rgba(255, 255, 255, 0.18);
  text-underline-offset: 2px;
}
.ch-auth-form__legal a:hover { color: var(--ch-accent); }

.ch-field__label-row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1rem;
}
.ch-field__error {
  font-size: 0.75rem;
  color: #f87171;
}
.ch-input--invalid,
.ch-input--invalid:hover {
  border-color: #f87171;
}
.ch-input--invalid:focus {
  border-color: #f87171;
  box-shadow: 0 0 0 4px rgba(248, 113, 113, 0.15);
}
.ch-link-soft {
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 0.8125rem;
  color: var(--ch-text-muted);
  text-decoration: none;
  transition: color var(--ch-duration) var(--ch-ease);
}
.ch-link-soft:hover { color: var(--ch-accent); }

.ch-btn--full { width: 100%; }

.ch-form-error {
  background: rgba(248, 113, 113, 0.08);
  border: 1px solid rgba(248, 113, 113, 0.25);
  color: #fca5a5;
  padding: 0.75rem 1rem;
  border-radius: var(--ch-radius-button);
  font-size: 0.875rem;
}

/* Success state (register) */
.ch-auth-success {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1rem;
  text-align: center;
  padding-block: 1rem;
}
.ch-auth-success__icon {
  width: 56px;
  height: 56px;
  border-radius: 50%;
  background: rgba(94, 200, 245, 0.12);
  color: var(--ch-accent);
  display: flex;
  align-items: center;
  justify-content: center;
}
.ch-auth-success__title {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: 1.5rem;
  line-height: 1.2;
  color: var(--ch-text);
  margin: 0;
}
.ch-auth-success__copy {
  font-size: 0.9375rem;
  line-height: 1.6;
  color: var(--ch-text-soft);
  margin: 0;
  max-width: 36ch;
}

/* ── Modal (in-flow auth) ─────────────────────────────────────────── */
.ch-auth-modal__overlay {
  position: fixed;
  inset: 0;
  z-index: 9999;
  background: rgba(0, 0, 0, 0.72);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(1rem, 3vw, 2rem);
  animation: ch-auth-modal-fade 220ms cubic-bezier(0.22, 1, 0.36, 1);
}
@keyframes ch-auth-modal-fade {
  from { opacity: 0; }
  to   { opacity: 1; }
}
.ch-auth-modal {
  position: relative;
  width: 100%;
  max-width: 28rem;
  max-height: calc(100vh - 2rem);
  overflow-y: auto;
  background: var(--ch-bg);
  border: 1px solid var(--ch-line);
  border-radius: 20px;
  padding: clamp(1.75rem, 3vw, 2.5rem);
  display: flex;
  flex-direction: column;
  gap: 1rem;
  box-shadow: 0 30px 80px rgba(0, 0, 0, 0.45);
  outline: none;
  animation: ch-auth-modal-rise 280ms cubic-bezier(0.22, 1, 0.36, 1);
}
@keyframes ch-auth-modal-rise {
  from { opacity: 0; transform: translateY(12px); }
  to   { opacity: 1; transform: translateY(0); }
}
.ch-auth-modal__close {
  position: absolute;
  top: 0.875rem;
  right: 0.875rem;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid var(--ch-line);
  color: var(--ch-text-soft);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: background var(--ch-duration) var(--ch-ease),
              color var(--ch-duration) var(--ch-ease);
}
.ch-auth-modal__close:hover {
  background: rgba(255, 255, 255, 0.08);
  color: var(--ch-text);
}
.ch-auth-modal__eyebrow {
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
}
.ch-auth-modal__title {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: clamp(1.625rem, 2.4vw, 2rem);
  line-height: 1.1;
  letter-spacing: -0.015em;
  color: var(--ch-text);
  margin: 0;
}
.ch-auth-modal__title em { font-style: italic; color: var(--ch-accent); }
.ch-auth-modal__message {
  font-size: 0.9375rem;
  line-height: 1.55;
  color: var(--ch-text-soft);
  margin: 0;
}
.ch-auth-modal__tabs {
  display: grid;
  grid-template-columns: 1fr 1fr;
  background: rgba(255, 255, 255, 0.03);
  border: 1px solid var(--ch-line);
  border-radius: 999px;
  padding: 4px;
  margin-block: 0.5rem;
}
.ch-auth-modal__tab {
  border: 0;
  background: transparent;
  color: var(--ch-text-soft);
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: 0.02em;
  padding: 0.625rem 1rem;
  border-radius: 999px;
  cursor: pointer;
  transition: background var(--ch-duration) var(--ch-ease),
              color var(--ch-duration) var(--ch-ease);
}
.ch-auth-modal__tab:hover { color: var(--ch-text); }
.ch-auth-modal__tab.is-active {
  background: var(--ch-text);
  color: var(--ch-bg);
}
.ch-auth-modal__body { display: flex; flex-direction: column; gap: 1rem; }


/* ── Auth: solo (single-column) variant used by /verify-email ───── */
.ch-auth--solo .ch-auth__layout { display: block; }
.ch-auth__solo {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 60vh;
  padding-block: clamp(2rem, 6vh, 5rem);
}
.ch-auth__card--centered { text-align: center; align-items: center; max-width: 30rem; }
.ch-auth__card--centered .ch-auth__title { max-width: 18ch; }
.ch-auth__card--centered .ch-auth__lede { max-width: 38ch; }
.ch-auth__actions { display: flex; flex-direction: column; gap: 0.625rem; width: 100%; }

/* Status icons */
.ch-auth__status-icon {
  width: 56px;
  height: 56px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 0.25rem;
}
.ch-auth__status-icon--ok {
  background: rgba(94, 200, 245, 0.12);
  color: var(--ch-accent);
}
.ch-auth__status-icon--err {
  background: rgba(248, 113, 113, 0.10);
  color: #fca5a5;
}

/* Spinner */
.ch-auth-spinner {
  width: 36px;
  height: 36px;
  border-radius: 50%;
  border: 2px solid rgba(255, 255, 255, 0.08);
  border-top-color: var(--ch-accent);
  margin-bottom: 0.5rem;
  animation: ch-auth-spin 0.85s linear infinite;
}
@keyframes ch-auth-spin {
  to { transform: rotate(360deg); }
}
@media (prefers-reduced-motion: reduce) {
  .ch-auth-spinner { animation: none; }
}

/* Register success: resend block */
.ch-auth-success__actions {
  width: 100%;
  display: flex;
  flex-direction: column;
  gap: 0.625rem;
  margin-top: 0.5rem;
}
.ch-auth-success__resent {
  width: 100%;
  padding: 0.625rem 0.875rem;
  border-radius: var(--ch-radius-button);
  font-size: 0.8125rem;
  line-height: 1.45;
  text-align: left;
}
.ch-auth-success__resent--ok {
  background: rgba(94, 200, 245, 0.08);
  border: 1px solid rgba(94, 200, 245, 0.25);
  color: var(--ch-accent);
}
.ch-auth-success__resent--err {
  background: rgba(248, 113, 113, 0.08);
  border: 1px solid rgba(248, 113, 113, 0.25);
  color: #fca5a5;
}
.ch-auth-success__hint {
  font-size: 0.75rem;
  line-height: 1.5;
  color: var(--ch-text-muted);
  margin: 0.75rem 0 0;
  max-width: 36ch;
  text-align: center;
}
.ch-auth-success__hint a { color: var(--ch-text-soft); }
.ch-auth-success__hint a:hover { color: var(--ch-accent); }


/* ===================================================================
   ACCOUNT / PROFILE PAGE
   ------------------------------------------------------------------- */
.ch-account {
  background: var(--ch-bg);
  padding-block: clamp(2.5rem, 6vh, 5rem) clamp(4rem, 10vh, 8rem);
  min-height: 70vh;
}

/* Header — identity card across the top */
.ch-account__header {
  display: flex;
  flex-wrap: wrap;
  gap: 1.5rem 2rem;
  align-items: flex-end;
  justify-content: space-between;
  padding-bottom: clamp(1.5rem, 3vh, 2.5rem);
  margin-bottom: clamp(2rem, 4vh, 3.5rem);
  border-bottom: 1px solid var(--ch-line);
}
.ch-account__header-id {
  display: flex;
  align-items: center;
  gap: 1.25rem;
  min-width: 0;
}
.ch-account__avatar {
  width: 72px;
  height: 72px;
  flex: 0 0 auto;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.05);
  border: 1px solid var(--ch-line);
  color: var(--ch-text);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-serif), 'Fraunces', serif;
  font-size: 1.5rem;
  letter-spacing: 0.02em;
}
.ch-account__title {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: clamp(1.625rem, 2.8vw, 2.25rem);
  line-height: 1.05;
  letter-spacing: -0.02em;
  color: var(--ch-text);
  margin: 0.375rem 0 0.25rem;
}
.ch-account__email {
  margin: 0;
  color: var(--ch-text-soft);
  font-size: 0.9375rem;
}
.ch-account__nav {
  display: flex;
  gap: 1.5rem;
  flex-wrap: wrap;
}
.ch-account__nav-link {
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ch-text-soft);
  text-decoration: none;
  transition: color var(--ch-duration) var(--ch-ease);
}
.ch-account__nav-link:hover { color: var(--ch-accent); }

/* Stacked sections */
.ch-account__sections {
  display: flex;
  flex-direction: column;
  gap: clamp(1.5rem, 3vh, 2.5rem);
  max-width: 56rem;
}

/* Section card */
.ch-account-card {
  background: rgba(255, 255, 255, 0.02);
  border: 1px solid var(--ch-line);
  border-radius: 18px;
  padding: clamp(1.5rem, 3vw, 2.25rem);
  display: flex;
  flex-direction: column;
  gap: 1.5rem;
}
.ch-account-card__header { display: flex; flex-direction: column; gap: 0.625rem; }
.ch-account-card__title {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: clamp(1.375rem, 2vw, 1.75rem);
  line-height: 1.15;
  letter-spacing: -0.015em;
  color: var(--ch-text);
  margin: 0.25rem 0 0;
}
.ch-account-card__lede {
  font-size: 0.9375rem;
  line-height: 1.6;
  color: var(--ch-text-soft);
  margin: 0;
  max-width: 60ch;
}
.ch-account-card__actions {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.75rem 1rem;
  padding-top: 0.5rem;
}
.ch-account-card__saved {
  font-size: 0.8125rem;
  color: var(--ch-accent);
  letter-spacing: 0.02em;
}

/* Danger zone */
.ch-account-card--danger {
  border-color: rgba(248, 113, 113, 0.32);
  background: rgba(248, 113, 113, 0.04);
}
.section-eyebrow--danger { color: #fca5a5; }
.ch-account-card__delete-token {
  font-family: var(--ch-font-display);
  letter-spacing: 0.12em;
  color: #fca5a5;
}

/* Danger button */
.ch-btn--danger {
  background: rgba(248, 113, 113, 0.12);
  color: #fca5a5;
  border: 1px solid rgba(248, 113, 113, 0.4);
}
.ch-btn--danger:hover { background: rgba(248, 113, 113, 0.2); color: #fff; }
.ch-btn--danger:disabled {
  background: rgba(248, 113, 113, 0.08);
  color: rgba(252, 165, 165, 0.5);
}

/* Loading skeleton */
.ch-account__skeleton { display: flex; flex-direction: column; gap: 1rem; max-width: 56rem; }
.ch-account__skeleton-line {
  height: 28px;
  width: 240px;
  border-radius: 6px;
  background: linear-gradient(90deg, rgba(255,255,255,0.04), rgba(255,255,255,0.08), rgba(255,255,255,0.04));
  background-size: 200% 100%;
  animation: ch-skeleton-shimmer 1.4s linear infinite;
}
.ch-account__skeleton-line--sm { height: 16px; width: 160px; }
.ch-account__skeleton-card {
  height: 220px;
  border-radius: 18px;
  background: linear-gradient(90deg, rgba(255,255,255,0.03), rgba(255,255,255,0.06), rgba(255,255,255,0.03));
  background-size: 200% 100%;
  animation: ch-skeleton-shimmer 1.4s linear infinite;
}
@keyframes ch-skeleton-shimmer {
  0%   { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}
@media (prefers-reduced-motion: reduce) {
  .ch-account__skeleton-line, .ch-account__skeleton-card { animation: none; }
}


/* ===================================================================
   CHALET DETAIL PAGE — editorial dark theme
   ------------------------------------------------------------------- */
.ch-chalet {
  background: var(--ch-bg);
  padding-block: clamp(1.5rem, 4vh, 3rem) clamp(4rem, 9vh, 7rem);
  /* Shared right-hand rail width — gallery thumbnails + body sidebar use
     this identical fixed width so the right column is one aligned line. */
  --ch-chalet-rail: clamp(20rem, 26%, 23.5rem);
}
.ch-chalet > .ch-container + .ch-container { margin-top: 0; }

/* Breadcrumb */
.ch-chalet__crumb {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.6rem;
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
  margin-bottom: clamp(1.5rem, 3vh, 2.5rem);
}
.ch-chalet__crumb a {
  color: var(--ch-text-soft);
  text-decoration: none;
  transition: color var(--ch-duration) var(--ch-ease);
}
.ch-chalet__crumb a:hover { color: var(--ch-accent); }
.ch-chalet__crumb span[aria-hidden] { color: var(--ch-line-strong, rgba(255,255,255,0.25)); }

/* Title block */
.ch-chalet__head {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: 1.5rem 2.5rem;
  padding-bottom: clamp(1.5rem, 3vh, 2.25rem);
  border-bottom: 1px solid var(--ch-line);
  margin-bottom: clamp(1.5rem, 3vh, 2.5rem);
}
.ch-chalet__eyebrow {
  font-family: var(--ch-font-display);
  font-size: 12px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ch-accent);
  margin: 0 0 0.625rem;
}
.ch-chalet__title {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: clamp(2rem, 4.5vw, 3.5rem);
  line-height: 1.04;
  letter-spacing: -0.02em;
  color: var(--ch-text);
  margin: 0;
  max-width: 20ch;
}
.ch-chalet__facts {
  display: flex;
  gap: 2.5rem;
  list-style: none;
  margin: 0;
  padding: 0;
}
.ch-chalet__facts li { display: flex; flex-direction: column; gap: 0.25rem; }
.ch-chalet__fact-num {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-size: clamp(1.75rem, 3vw, 2.5rem);
  line-height: 1;
  color: var(--ch-text);
}
.ch-chalet__fact-label {
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
}

/* Hero mosaic — 1 hero + 2 stacked thumbnails, fixed height */
.ch-chalet__gallery {
  position: relative;
  display: grid;
  grid-template-columns: 1fr;
  gap: 0.5rem;
  margin-bottom: clamp(2rem, 4vh, 3.5rem);
}
@media (min-width: 960px) {
  .ch-chalet__gallery {
    grid-template-columns: minmax(0, 1fr) var(--ch-chalet-rail);
    grid-template-rows: clamp(340px, 40vw, 520px);
  }
  /* No thumbnails → hero takes the whole width */
  .ch-chalet__hero:only-child { grid-column: 1 / -1; }
}
.ch-chalet__hero {
  position: relative;
  margin: 0;
  aspect-ratio: 3 / 2;
  border-radius: var(--ch-radius-card);
  overflow: hidden;
  background: #020617;
}
@media (min-width: 960px) {
  .ch-chalet__hero { aspect-ratio: auto; height: 100%; }
}
.ch-chalet__hero-img { object-fit: cover; width: 100%; height: 100%; }

.ch-chalet__thumbs {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-auto-rows: 1fr;
  gap: 0.5rem;
}
@media (min-width: 960px) {
  /* Two thumbnails stacked vertically beside the hero */
  .ch-chalet__thumbs { height: 100%; grid-template-columns: 1fr; }
}
.ch-chalet__thumb {
  position: relative;
  margin: 0;
  aspect-ratio: 4 / 3;
  border-radius: var(--ch-radius-button);
  overflow: hidden;
  background: #020617;
}
@media (min-width: 960px) {
  .ch-chalet__thumb { aspect-ratio: auto; }
}
.ch-chalet__thumb-img { object-fit: cover; width: 100%; height: 100%; }

/* "See all photos" — glass pill overlaid bottom-right of the mosaic */
.ch-chalet__see-all {
  position: absolute;
  right: 1rem;
  bottom: 1rem;
  z-index: 2;
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.625rem 1rem;
  background: rgba(15, 16, 20, 0.72);
  backdrop-filter: blur(12px) saturate(1.2);
  -webkit-backdrop-filter: blur(12px) saturate(1.2);
  border: 1px solid rgba(255, 255, 255, 0.16);
  border-radius: 999px;
  color: #fff;
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: 0.01em;
  text-decoration: none;
  transition: background var(--ch-duration) var(--ch-ease),
              border-color var(--ch-duration) var(--ch-ease);
}
.ch-chalet__see-all:hover {
  background: rgba(15, 16, 20, 0.9);
  border-color: rgba(255, 255, 255, 0.32);
}

/* Two-column body */
.ch-chalet__layout {
  display: grid;
  grid-template-columns: 1fr;
  gap: 3rem;
  align-items: start;
}
@media (min-width: 960px) {
  .ch-chalet__layout {
    /* Same rail width as the gallery → right column is one aligned line */
    grid-template-columns: minmax(0, 1fr) var(--ch-chalet-rail);
    gap: 4rem;
  }
}
.ch-chalet__main {
  display: flex;
  flex-direction: column;
  gap: clamp(2.5rem, 5vh, 4rem);
}
.ch-chalet__section { display: flex; flex-direction: column; gap: 1.25rem; }
.ch-chalet__section-title {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: clamp(1.375rem, 2vw, 1.75rem);
  letter-spacing: -0.015em;
  color: var(--ch-text);
  margin: 0;
  padding-bottom: 0.875rem;
  border-bottom: 1px solid var(--ch-line);
}
.ch-chalet__prose {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}
.ch-chalet__prose p {
  font-size: 1rem;
  line-height: 1.7;
  color: var(--ch-text-soft);
  margin: 0;
}

/* Features */
.ch-chalet__feature-group { display: flex; flex-direction: column; gap: 0.875rem; }
.ch-chalet__feature-type {
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ch-accent);
  margin: 0;
}
.ch-chalet__feature-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr;
  gap: 0.625rem 1.5rem;
}
@media (min-width: 560px) {
  .ch-chalet__feature-list { grid-template-columns: 1fr 1fr; }
}
.ch-chalet__feature {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  font-size: 0.9375rem;
  color: var(--ch-text);
}
.ch-chalet__feature-tick {
  flex: none;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: rgba(94, 200, 245, 0.12);
  color: var(--ch-accent);
  display: flex;
  align-items: center;
  justify-content: center;
}

/* Sidebar */
.ch-chalet__aside {
  display: flex;
  flex-direction: column;
  gap: 1.25rem;
}
@media (min-width: 960px) {
  .ch-chalet__aside { position: sticky; top: 96px; }
}
.ch-chalet__card {
  background: rgba(255, 255, 255, 0.02);
  border: 1px solid var(--ch-line);
  border-radius: 18px;
  padding: clamp(1.5rem, 2.5vw, 2rem);
  display: flex;
  flex-direction: column;
  gap: 1rem;
}
.ch-chalet__card-eyebrow {
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ch-accent);
  margin: 0;
}
.ch-chalet__card-copy {
  font-size: 0.875rem;
  line-height: 1.6;
  color: var(--ch-text-soft);
  margin: 0;
}

/* Host card */
.ch-chalet__host-id {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  text-decoration: none;
}
.ch-chalet__host-logo {
  border-radius: 10px;
  object-fit: cover;
  border: 1px solid var(--ch-line);
}
.ch-chalet__host-name {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-size: 1.125rem;
  color: var(--ch-text);
}
.ch-chalet__host-bio {
  font-size: 0.875rem;
  line-height: 1.6;
  color: var(--ch-text-soft);
  margin: 0;
}

/* ── Chalet availability — month tabs + week cards ────────────────── */
.ch-avail { display: flex; flex-direction: column; gap: 1.5rem; }
.ch-avail__empty {
  font-size: 0.9375rem;
  line-height: 1.65;
  color: var(--ch-text-soft);
  margin: 0;
  padding: 1.25rem 1.5rem;
  background: rgba(255, 255, 255, 0.02);
  border: 1px solid var(--ch-line);
  border-radius: var(--ch-radius-button);
}

/* Month tabs */
.ch-avail__months {
  display: flex;
  gap: 0.5rem;
  overflow-x: auto;
  padding-bottom: 0.5rem;
  scrollbar-width: thin;
}
.ch-avail__month {
  flex: 0 0 auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.125rem;
  min-width: 72px;
  padding: 0.625rem 0.875rem;
  background: rgba(255, 255, 255, 0.02);
  border: 1px solid var(--ch-line);
  border-radius: var(--ch-radius-button);
  cursor: pointer;
  transition: border-color var(--ch-duration) var(--ch-ease),
              background var(--ch-duration) var(--ch-ease);
}
.ch-avail__month:hover { border-color: var(--ch-border-strong); }
.ch-avail__month.is-active {
  background: var(--ch-text);
  border-color: var(--ch-text);
}
.ch-avail__month-name {
  font-family: var(--ch-font-display);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ch-text);
}
.ch-avail__month.is-active .ch-avail__month-name { color: var(--ch-bg); }
.ch-avail__month-year {
  font-size: 10px;
  letter-spacing: 0.06em;
  color: var(--ch-text-muted);
}
.ch-avail__month.is-active .ch-avail__month-year { color: rgba(0,0,0,0.55); }
.ch-avail__month-count {
  margin-top: 0.25rem;
  min-width: 18px;
  height: 18px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 10px;
  font-weight: 600;
  border-radius: 999px;
  background: rgba(94, 200, 245, 0.14);
  color: var(--ch-accent);
}
.ch-avail__month.is-active .ch-avail__month-count {
  background: rgba(0,0,0,0.12);
  color: var(--ch-bg);
}

/* Week-card grid */
.ch-avail__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 0.875rem;
}
@media (min-width: 520px) { .ch-avail__grid { grid-template-columns: 1fr 1fr; } }
@media (min-width: 1100px) { .ch-avail__grid { grid-template-columns: 1fr 1fr 1fr; } }

.ch-avail-card {
  display: flex;
  flex-direction: column;
  gap: 0.875rem;
  padding: 1.125rem 1.25rem;
  background: rgba(255, 255, 255, 0.02);
  border: 1px solid var(--ch-line);
  border-radius: 14px;
  transition: border-color var(--ch-duration) var(--ch-ease);
}
.ch-avail-card:hover { border-color: var(--ch-border-strong); }
.ch-avail-card.is-unavailable { opacity: 0.55; }

.ch-avail-card__top {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  padding-bottom: 0.75rem;
  border-bottom: 1px solid var(--ch-line);
}
.ch-avail-card__dates {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-size: 1.0625rem;
  line-height: 1.2;
  color: var(--ch-text);
}
.ch-avail-card__nights {
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
}

.ch-avail-card__price {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 0.4rem 0.5rem;
}
.ch-avail-card__price-now {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-size: 1.5rem;
  line-height: 1;
  color: var(--ch-text);
}
.ch-avail-card__price-was {
  font-size: 0.8125rem;
  text-decoration: line-through;
  color: var(--ch-text-muted);
}
.ch-avail-card__price-unit {
  font-size: 0.75rem;
  color: var(--ch-text-muted);
}
.ch-avail-card__discount {
  font-family: var(--ch-font-display);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.06em;
  background: rgba(94, 200, 245, 0.14);
  color: var(--ch-accent);
  padding: 3px 7px;
  border-radius: 4px;
}
.ch-avail-card__actions {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  margin-top: auto;
}
.ch-avail-card__status {
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
  padding: 0.5rem 0;
}
.ch-avail__note {
  font-size: 0.8125rem;
  line-height: 1.55;
  color: var(--ch-text-muted);
  margin: 0;
}


/* ── Chalet section title with count + Gallery + Lightbox + Map ───── */
.ch-chalet__section-title {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1rem;
  flex-wrap: wrap;
}
.ch-chalet__section-count {
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
}

/* Photo grid */
.ch-gallery__grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0.75rem;
}
@media (min-width: 600px) { .ch-gallery__grid { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 1100px) { .ch-gallery__grid { grid-template-columns: repeat(4, 1fr); } }
.ch-gallery__cell { margin: 0; }
.ch-gallery__tile {
  position: relative;
  display: block;
  width: 100%;
  aspect-ratio: 4 / 3;
  padding: 0;
  border: 0;
  border-radius: var(--ch-radius-button);
  overflow: hidden;
  cursor: pointer;
  background: #020617;
}
.ch-gallery__tile img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1);
}
.ch-gallery__tile:hover img { transform: scale(1.05); }
.ch-gallery__zoom {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, 0.35);
  color: #fff;
  opacity: 0;
  transition: opacity var(--ch-duration) var(--ch-ease);
}
.ch-gallery__tile:hover .ch-gallery__zoom,
.ch-gallery__tile:focus-visible .ch-gallery__zoom { opacity: 1; }

/* Lightbox */
.ch-lightbox {
  position: fixed;
  inset: 0;
  z-index: 10000;
  background: rgba(0, 0, 0, 0.93);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(1rem, 4vw, 3rem);
  animation: ch-auth-modal-fade 200ms ease;
}
.ch-lightbox__stage {
  margin: 0;
  max-width: min(1200px, 92vw);
  max-height: 86vh;
  display: flex;
  flex-direction: column;
  gap: 0.875rem;
}
.ch-lightbox__stage img {
  max-width: 100%;
  max-height: 78vh;
  object-fit: contain;
  border-radius: var(--ch-radius-button);
  margin-inline: auto;
}
.ch-lightbox__caption {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1.5rem;
  font-size: 0.8125rem;
  color: var(--ch-text-soft);
}
.ch-lightbox__counter {
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.12em;
  color: var(--ch-text-muted);
  white-space: nowrap;
}
.ch-lightbox__close {
  position: absolute;
  top: 1.25rem;
  right: 1.25rem;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.08);
  border: 1px solid rgba(255, 255, 255, 0.16);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: background var(--ch-duration) var(--ch-ease);
}
.ch-lightbox__close:hover { background: rgba(255, 255, 255, 0.16); }
.ch-lightbox__nav {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 48px;
  height: 48px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.08);
  border: 1px solid rgba(255, 255, 255, 0.16);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: background var(--ch-duration) var(--ch-ease);
}
.ch-lightbox__nav:hover { background: rgba(255, 255, 255, 0.16); }
.ch-lightbox__nav--prev { left: clamp(0.75rem, 2vw, 1.75rem); }
.ch-lightbox__nav--next { right: clamp(0.75rem, 2vw, 1.75rem); }
@media (max-width: 600px) {
  .ch-lightbox__nav { width: 40px; height: 40px; }
}

/* Location map */
.ch-chalet__map {
  width: 100%;
  height: clamp(320px, 40vh, 440px);
  border-radius: var(--ch-radius-card);
  overflow: hidden;
  border: 1px solid var(--ch-line);
  background: var(--ch-surface);
}
/* Navy tile tint to match the page — canvas only, so the .ch-map-pin marker
   keeps its accent colour. */
.ch-chalet__map .mapboxgl-canvas {
  filter: sepia(0.5) saturate(1.5) hue-rotate(175deg) brightness(0.9) contrast(1.02);
}
.ch-map-pin {
  width: 18px;
  height: 18px;
  border-radius: 50%;
  background: var(--ch-accent);
  border: 3px solid #fff;
  box-shadow: 0 0 0 4px rgba(94, 200, 245, 0.35), 0 2px 8px rgba(0, 0, 0, 0.5);
  cursor: pointer;
}


/* ===================================================================
   HOST PROFILE PAGE — editorial dark theme
   ------------------------------------------------------------------- */
.ch-host {
  background: var(--ch-bg);
  padding-block: clamp(1.5rem, 4vh, 3rem) clamp(4rem, 9vh, 7rem);
  min-height: 70vh;
}

/* Header */
.ch-host__head {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  justify-content: space-between;
  gap: 2rem 3rem;
  padding-bottom: clamp(2rem, 4vh, 3rem);
  border-bottom: 1px solid var(--ch-line);
  margin-bottom: clamp(2.5rem, 5vh, 4rem);
}
.ch-host__id {
  display: flex;
  gap: 1.5rem;
  align-items: flex-start;
  min-width: 0;
}
.ch-host__avatar {
  position: relative;
  flex: 0 0 auto;
  width: 96px;
  height: 96px;
  border-radius: 18px;
  overflow: hidden;
  background: rgba(255, 255, 255, 0.05);
  border: 1px solid var(--ch-line);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-serif), 'Fraunces', serif;
  font-size: 2rem;
  color: var(--ch-text);
}
@media (min-width: 700px) {
  .ch-host__avatar { width: 120px; height: 120px; }
}
.ch-host__avatar-img { object-fit: cover; width: 100%; height: 100%; }
.ch-host__id-text { min-width: 0; display: flex; flex-direction: column; gap: 0.5rem; }
.ch-host__eyebrow {
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--ch-accent);
  margin: 0;
}
.ch-host__name {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: clamp(2rem, 4vw, 3.25rem);
  line-height: 1.04;
  letter-spacing: -0.02em;
  color: var(--ch-text);
  margin: 0;
}
.ch-host__bio {
  font-size: 1rem;
  line-height: 1.65;
  color: var(--ch-text-soft);
  margin: 0.25rem 0 0;
  max-width: 56ch;
}
.ch-host__links {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem 1.5rem;
  margin-top: 0.5rem;
}
.ch-host__link {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ch-text-soft);
  text-decoration: none;
  transition: color var(--ch-duration) var(--ch-ease);
}
.ch-host__link:hover { color: var(--ch-accent); }

/* Stats */
.ch-host__stats {
  display: flex;
  gap: 2.5rem;
  list-style: none;
  margin: 0;
  padding: 0;
}
.ch-host__stats li { display: flex; flex-direction: column; gap: 0.25rem; }
.ch-host__stat-num {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-size: clamp(1.75rem, 3vw, 2.5rem);
  line-height: 1;
  color: var(--ch-text);
}
.ch-host__stat-label {
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
}

/* Chalet grid */
.ch-host__chalets { display: flex; flex-direction: column; gap: 1.5rem; }
.ch-host__grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr;
  gap: 1.5rem;
}
@media (min-width: 640px) { .ch-host__grid { grid-template-columns: 1fr 1fr; } }
@media (min-width: 1080px) { .ch-host__grid { grid-template-columns: repeat(3, 1fr); } }

.ch-host-card { margin: 0; }
.ch-host-card__link {
  display: flex;
  flex-direction: column;
  height: 100%;
  text-decoration: none;
  background: rgba(255, 255, 255, 0.02);
  border: 1px solid var(--ch-line);
  border-radius: 16px;
  overflow: hidden;
  transition: border-color var(--ch-duration) var(--ch-ease),
              transform var(--ch-duration) var(--ch-ease);
}
.ch-host-card__link:hover {
  border-color: var(--ch-border-strong);
  transform: translateY(-3px);
}
.ch-host-card__media {
  position: relative;
  aspect-ratio: 3 / 2;
  background: #020617;
  overflow: hidden;
}
.ch-host-card__img {
  object-fit: cover;
  width: 100%;
  height: 100%;
  transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1);
}
.ch-host-card__link:hover .ch-host-card__img { transform: scale(1.05); }
.ch-host-card__body {
  display: flex;
  flex-direction: column;
  gap: 0.375rem;
  padding: 1.125rem 1.25rem 1.25rem;
}
.ch-host-card__resort {
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ch-accent);
  margin: 0;
}
.ch-host-card__name {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: 1.25rem;
  line-height: 1.2;
  letter-spacing: -0.015em;
  color: var(--ch-text);
  margin: 0;
}
.ch-host-card__meta {
  display: flex;
  flex-wrap: wrap;
  gap: 0.875rem;
  margin-top: 0.375rem;
  font-size: 0.8125rem;
  color: var(--ch-text-soft);
}
.ch-host-card__price {
  color: var(--ch-text);
  font-weight: 600;
}
@media (max-width: 640px) {
  .ch-host__head { flex-direction: column; }
  .ch-host__stats { gap: 1.75rem; }
}

/* ── Chalet save + share actions (sidebar card) ───────────────────── */
.ch-chalet__actions {
  display: flex;
  gap: 0.5rem;
}
.ch-chalet__share { position: relative; flex: 1; }
.ch-chalet__action {
  width: 100%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  padding: 0.625rem 0.875rem;
  background: rgba(255, 255, 255, 0.03);
  border: 1px solid var(--ch-line);
  border-radius: var(--ch-radius-button);
  color: var(--ch-text-soft);
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: 0.01em;
  cursor: pointer;
  transition: border-color var(--ch-duration) var(--ch-ease),
              color var(--ch-duration) var(--ch-ease),
              background var(--ch-duration) var(--ch-ease);
}
.ch-chalet__actions > .ch-chalet__action { flex: 1; }
.ch-chalet__action:hover {
  border-color: var(--ch-border-strong);
  color: var(--ch-text);
}
.ch-chalet__action:disabled { opacity: 0.6; cursor: default; }
.ch-chalet__action.is-active {
  color: var(--ch-accent);
  border-color: rgba(94, 200, 245, 0.4);
  background: rgba(94, 200, 245, 0.08);
}

/* Share dropdown */
.ch-chalet__share-menu {
  position: absolute;
  z-index: 30;
  top: calc(100% + 0.5rem);
  right: 0;
  min-width: 11rem;
  display: flex;
  flex-direction: column;
  padding: 0.375rem;
  background: var(--ch-bg);
  border: 1px solid var(--ch-line);
  border-radius: var(--ch-radius-button);
  box-shadow: 0 16px 40px rgba(0, 0, 0, 0.5);
  animation: ch-auth-modal-fade 160ms ease;
}
.ch-chalet__share-item {
  display: block;
  width: 100%;
  text-align: left;
  padding: 0.5rem 0.75rem;
  background: none;
  border: 0;
  border-radius: 8px;
  color: var(--ch-text-soft);
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 0.8125rem;
  text-decoration: none;
  cursor: pointer;
  transition: background var(--ch-duration) var(--ch-ease),
              color var(--ch-duration) var(--ch-ease);
}
.ch-chalet__share-item:hover {
  background: rgba(255, 255, 255, 0.05);
  color: var(--ch-text);
}

/* ── Similar chalets section ──────────────────────────────────────── */
.ch-similar {
  margin-top: clamp(3rem, 6vh, 5rem);
  padding-top: clamp(2.5rem, 5vh, 4rem);
  border-top: 1px solid var(--ch-line);
}
.ch-similar__head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1.5rem;
  margin-bottom: 1.75rem;
}
.ch-similar__head .ch-chalet__section-title {
  border-bottom: 0;
  padding-bottom: 0;
  margin: 0;
}
.ch-similar__head .ch-link-soft { white-space: nowrap; }
/* Similar chalets always sit 4-in-a-row from tablet width up */
@media (min-width: 768px) {
  .ch-similar__grid { grid-template-columns: repeat(4, 1fr); }
}


/* ===================================================================
   LUXURY SKI TRAVEL ADVISOR (AI Concierge)
   ------------------------------------------------------------------- */
.ch-advisor {
  display: flex;
  flex-direction: column;
  gap: 1.75rem;
  background: rgba(255, 255, 255, 0.02);
  border: 1px solid var(--ch-line);
  border-radius: 22px;
  padding: clamp(1.5rem, 3.5vw, 3rem);
}
.ch-advisor__intro { display: flex; flex-direction: column; gap: 0.75rem; }
.ch-advisor__eyebrow {
  font-family: var(--ch-font-display);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ch-accent);
}
.ch-advisor__heading {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: clamp(1.75rem, 3vw, 2.5rem);
  line-height: 1.1;
  letter-spacing: -0.02em;
  color: var(--ch-text);
  margin: 0;
}
.ch-advisor__lede {
  font-size: 1rem;
  line-height: 1.6;
  color: var(--ch-text-soft);
  margin: 0;
  max-width: 64ch;
}

/* Input */
.ch-advisor__form { display: flex; flex-direction: column; gap: 0.875rem; }
.ch-advisor__input {
  width: 100%;
  resize: vertical;
  min-height: 5.5rem;
  background: var(--ch-bg);
  border: 1px solid var(--ch-border);
  border-radius: 14px;
  padding: 1rem 1.125rem;
  color: var(--ch-text);
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 1rem;
  line-height: 1.55;
  outline: none;
  transition: border-color var(--ch-duration) var(--ch-ease),
              box-shadow var(--ch-duration) var(--ch-ease);
}
.ch-advisor__input::placeholder { color: var(--ch-text-muted); }
.ch-advisor__input:focus {
  border-color: var(--ch-accent);
  box-shadow: 0 0 0 4px var(--ch-accent-soft);
}
.ch-advisor__form-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  flex-wrap: wrap;
}
.ch-advisor__hint {
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
}

/* Example prompts */
.ch-advisor__examples {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  align-items: center;
}
.ch-advisor__examples-label {
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ch-text-muted);
  margin-right: 0.25rem;
}
.ch-advisor__example {
  text-align: left;
  background: rgba(255, 255, 255, 0.03);
  border: 1px solid var(--ch-line);
  border-radius: 999px;
  padding: 0.5rem 0.875rem;
  color: var(--ch-text-soft);
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 0.8125rem;
  line-height: 1.3;
  cursor: pointer;
  transition: border-color var(--ch-duration) var(--ch-ease),
              color var(--ch-duration) var(--ch-ease);
  max-width: 100%;
}
.ch-advisor__example:hover { border-color: var(--ch-border-strong); color: var(--ch-text); }

.ch-advisor__error {
  background: rgba(248, 113, 113, 0.08);
  border: 1px solid rgba(248, 113, 113, 0.25);
  color: #fca5a5;
  padding: 0.875rem 1rem;
  border-radius: 12px;
  font-size: 0.9375rem;
}

/* Results */
.ch-advisor__results { display: flex; flex-direction: column; gap: 1.5rem; }
.ch-advisor__interpreted { display: flex; flex-direction: column; gap: 0.625rem; }
.ch-advisor__interpreted-label,
.ch-advisor__examples-label { flex: none; }
.ch-advisor__interpreted-label {
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ch-accent);
}
.ch-advisor__chips { display: flex; flex-wrap: wrap; gap: 0.5rem; list-style: none; margin: 0; padding: 0; }
.ch-advisor__chip {
  background: rgba(94, 200, 245, 0.1);
  border: 1px solid rgba(94, 200, 245, 0.25);
  color: var(--ch-accent);
  border-radius: 999px;
  padding: 0.3rem 0.75rem;
  font-size: 0.8125rem;
}
.ch-advisor__results-title {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: 1.375rem;
  color: var(--ch-text);
  margin: 0;
  padding-top: 0.5rem;
  border-top: 1px solid var(--ch-line);
}
.ch-advisor__empty {
  font-size: 0.9375rem;
  line-height: 1.6;
  color: var(--ch-text-soft);
  margin: 0;
}
.ch-advisor__footnote {
  font-size: 0.75rem;
  line-height: 1.55;
  color: var(--ch-text-muted);
  margin: 0;
}
.ch-advisor__reset {
  align-self: flex-start;
  background: none;
  border: 0;
  cursor: pointer;
  font-size: 0.8125rem;
}

/* Result cards */
.ch-advisor__grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr;
  gap: 1rem;
}
@media (min-width: 720px) { .ch-advisor__grid { grid-template-columns: 1fr 1fr; } }
@media (min-width: 1100px) { .ch-advisor__grid { grid-template-columns: repeat(3, 1fr); } }

.ch-advisor-card {
  display: flex;
  flex-direction: column;
  background: var(--ch-bg);
  border: 1px solid var(--ch-line);
  border-radius: 16px;
  overflow: hidden;
}
.ch-advisor-card__media {
  display: block;
  aspect-ratio: 3 / 2;
  background: #020617;
  overflow: hidden;
}
.ch-advisor-card__media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.ch-advisor-card__noimg { display: block; width: 100%; height: 100%; background: var(--ch-surface); }
.ch-advisor-card__body { display: flex; flex-direction: column; gap: 0.5rem; padding: 1rem 1.125rem 1.125rem; }
.ch-advisor-card__resort {
  font-family: var(--ch-font-display);
  font-size: 10px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ch-accent);
  margin: 0;
}
.ch-advisor-card__name {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-weight: 400;
  font-size: 1.1875rem;
  line-height: 1.2;
  margin: 0;
}
.ch-advisor-card__name a { color: var(--ch-text); text-decoration: none; }
.ch-advisor-card__name a:hover { color: var(--ch-accent); }
.ch-advisor-card__meta {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
  font-size: 0.8125rem;
  color: var(--ch-text-soft);
}
.ch-advisor-card__price { color: var(--ch-text); font-weight: 600; }
.ch-advisor-card__reasons {
  list-style: none;
  margin: 0.25rem 0 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.375rem;
}
.ch-advisor-card__reasons li {
  display: flex;
  gap: 0.5rem;
  font-size: 0.8125rem;
  line-height: 1.45;
  color: var(--ch-text-soft);
}
.ch-advisor-card__tick { color: var(--ch-accent); flex: none; }
.ch-advisor-card__actions { display: flex; gap: 0.5rem; margin-top: 0.75rem; }
.ch-advisor-card__actions .ch-btn { flex: 1; }

/* ── Homepage compact advisor entry point ─────────────────────────── */
.ch-advisor-prompt {
  padding-block: var(--section-pad-y);
  background: rgba(255, 255, 255, 0.015);
  border-top: 1px solid var(--ch-line);
  border-bottom: 1px solid var(--ch-line);
}
.ch-advisor-prompt__inner {
  display: grid;
  grid-template-columns: 1fr;
  gap: 2rem;
  align-items: center;
}
@media (min-width: 960px) {
  .ch-advisor-prompt__inner { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 4rem; }
}
.ch-advisor-prompt__copy { display: flex; flex-direction: column; gap: 0.875rem; }
.ch-advisor-prompt__lede {
  font-size: 1rem;
  line-height: 1.6;
  color: var(--ch-text-soft);
  margin: 0;
  max-width: 48ch;
}
.ch-advisor-prompt__form {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
}
@media (min-width: 520px) {
  .ch-advisor-prompt__form { flex-direction: row; }
  .ch-advisor-prompt__form .ch-advisor-prompt__input { flex: 1 1 0; }
  .ch-advisor-prompt__form .ch-btn { flex: none; }
}
/* ── centred ────────────────────────────────────────────────────────────────
 * Was a 50/50 grid above 960px: copy pinned left, form pinned right, 4rem of
 * gap between them and the two never reading as one unit. Collapsed to a
 * single centred column so the ask and the answer stack.
 * The input's own text stays left-aligned — a centred placeholder that jumps
 * to the left as soon as you type is worse than one that never moves. */
.ch-advisor-prompt__inner {
  grid-template-columns: minmax(0, 1fr);
  justify-items: center;
  text-align: center;
}
@media (min-width: 960px) {
  /* Overrides the two-column rule defined above. */
  .ch-advisor-prompt__inner {
    grid-template-columns: minmax(0, 1fr);
    gap: 2rem;
  }
}
.ch-advisor-prompt__copy {
  align-items: center;
}
.ch-advisor-prompt__lede {
  margin-inline: auto;
}
.ch-advisor-prompt__form {
  width: min(100%, 44rem);
  text-align: initial;
}

.ch-advisor-prompt__input {
  flex: 0 0 auto;
  min-width: 0;
  height: 3.5rem;
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid var(--ch-line);
  border-radius: var(--ch-radius-pill, 999px);
  padding: 0 1.5rem;
  color: var(--ch-text);
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: 0.9375rem;
  outline: none;
  transition: border-color var(--ch-duration) var(--ch-ease),
              box-shadow var(--ch-duration) var(--ch-ease);
}
.ch-advisor-prompt__input::placeholder { color: var(--ch-text-muted); }
.ch-advisor-prompt__input:focus {
  border-color: var(--ch-accent);
  box-shadow: 0 0 0 4px var(--ch-accent-soft);
}

/* ── Chalet FAQ section ───────────────────────────────────────────── */
.ch-chalet__faqs {
  margin: 0;
  display: flex;
  flex-direction: column;
}
.ch-chalet__faq {
  padding: 1.25rem 0;
  border-bottom: 1px solid var(--ch-line);
}
.ch-chalet__faq:first-child { padding-top: 0; }
.ch-chalet__faq-q {
  font-family: var(--font-serif), 'Fraunces', serif;
  font-size: 1.0625rem;
  line-height: 1.35;
  color: var(--ch-text);
  margin: 0 0 0.5rem;
}
.ch-chalet__faq-a {
  margin: 0;
  font-size: 0.9375rem;
  line-height: 1.65;
  color: var(--ch-text-soft);
  max-width: 64ch;
}

/* ── Ski-chalet-finder hero — the AI concierge is the hero ────────── */
.ch-finder-hero {
  background: var(--ch-bg);
  padding-block: clamp(2rem, 5vh, 4rem) clamp(3rem, 6vh, 5rem);
}

/* ── Back-to-top button ──────────────────────────────────────────────
   Floating pill, bottom-right. Hidden (and out of the tab order via the
   component's tabIndex) until scrolled past the fold, then fades/slides in. */
.ch-back-to-top {
  position: fixed;
  right: clamp(1rem, 3vw, 2rem);
  bottom: clamp(1rem, 3vw, 2rem);
  bottom: calc(clamp(1rem, 3vw, 2rem) + env(safe-area-inset-bottom, 0px));
  z-index: 900;

  display: grid;
  place-items: center;
  width: 48px;
  height: 48px;
  margin: 0;
  padding: 0;

  color: var(--ch-text, #f4f4f6);
  background: color-mix(in srgb, var(--ch-surface-2, #191b21) 82%, transparent);
  -webkit-backdrop-filter: blur(12px);
  backdrop-filter: blur(12px);
  border: 1px solid var(--ch-border-strong, rgba(255, 255, 255, 0.12));
  border-radius: var(--ch-radius-pill, 9999px);
  box-shadow: var(--ch-shadow-md);
  cursor: pointer;

  opacity: 0;
  transform: translateY(12px) scale(0.92);
  pointer-events: none;
  transition:
    opacity 0.28s var(--ch-ease, ease),
    transform 0.28s var(--ch-ease, ease),
    color 0.2s ease,
    border-color 0.2s ease,
    background 0.2s ease;
}

.ch-back-to-top[data-visible='true'] {
  opacity: 1;
  transform: translateY(0) scale(1);
  pointer-events: auto;
}

.ch-back-to-top:hover {
  color: var(--ch-accent, #6cc7f5);
  border-color: var(--ch-accent-strong, rgba(108, 199, 245, 0.22));
  background: color-mix(in srgb, var(--ch-surface-3, #20232a) 86%, transparent);
}

.ch-back-to-top:active {
  transform: translateY(0) scale(0.95);
}

.ch-back-to-top:focus-visible {
  outline: 2px solid var(--ch-accent, #6cc7f5);
  outline-offset: 2px;
}

.ch-back-to-top svg {
  display: block;
  transition: transform 0.2s var(--ch-ease, ease);
}

.ch-back-to-top:hover svg {
  transform: translateY(-2px);
}

@media (prefers-reduced-motion: reduce) {
  .ch-back-to-top,
  .ch-back-to-top svg {
    transition: opacity 0.2s linear;
    transform: none;
  }
  .ch-back-to-top[data-visible='true'] {
    transform: none;
  }
}

/* ── Shortlist (saved chalets) — right-edge tab + slide-out drawer ────
   Tab self-hides on mobile (favourites live in the mobile nav there) and the
   component itself only renders when logged-in with ≥1 saved chalet. */
.ch-shortlist-tab {
  position: fixed;
  top: 42%;
  right: 0;
  z-index: 901;

  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 3px;
  padding: 12px 9px;
  margin: 0;

  color: var(--ch-text, #f4f4f6);
  background: color-mix(in srgb, var(--ch-surface-2, #191b21) 86%, transparent);
  -webkit-backdrop-filter: blur(12px);
  backdrop-filter: blur(12px);
  border: 1px solid var(--ch-border-strong, rgba(255, 255, 255, 0.12));
  border-right: none;
  border-radius: 14px 0 0 14px;
  box-shadow: var(--ch-shadow-md);
  cursor: pointer;
  transition: color 0.2s ease, background 0.2s ease, transform 0.25s var(--ch-ease, ease);
}

.ch-shortlist-tab:hover {
  color: #e74c3c;
  transform: translateX(-2px);
}

.ch-shortlist-tab:focus-visible {
  outline: 2px solid var(--ch-accent, #6cc7f5);
  outline-offset: 2px;
}

.ch-shortlist-tab__count {
  font-size: 13px;
  font-weight: 700;
  line-height: 1;
  color: var(--ch-text, #f4f4f6);
}

/* Drawer */
.ch-shortlist-backdrop {
  position: fixed;
  inset: 0;
  z-index: 1100;
  background: rgba(0, 0, 0, 0.55);
  -webkit-backdrop-filter: blur(3px);
  backdrop-filter: blur(3px);
  animation: chShortlistFade 0.2s ease-out;
}

.ch-shortlist-panel {
  position: fixed;
  top: 0;
  right: 0;
  z-index: 1101;
  display: flex;
  flex-direction: column;
  width: min(380px, 88vw);
  height: 100%;
  background: var(--ch-surface, #121317);
  border-left: 1px solid var(--ch-line, rgba(255, 255, 255, 0.12));
  box-shadow: var(--ch-shadow-lg);
  animation: chShortlistSlide 0.28s var(--ch-ease, ease);
  outline: none;
}

@keyframes chShortlistFade {
  from { opacity: 0; }
  to { opacity: 1; }
}

@keyframes chShortlistSlide {
  from { transform: translateX(100%); }
  to { transform: translateX(0); }
}

.ch-shortlist__header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 20px 20px 16px;
  border-bottom: 1px solid var(--ch-line, rgba(255, 255, 255, 0.1));
}

.ch-shortlist__title {
  margin: 0;
  font-size: 17px;
  font-weight: 600;
  color: var(--ch-text, #f4f4f6);
}

.ch-shortlist__close {
  display: grid;
  place-items: center;
  width: 32px;
  height: 32px;
  padding: 0;
  color: var(--ch-text-soft, #b8b9c2);
  background: var(--ch-surface-2, #191b21);
  border: 1px solid var(--ch-line, rgba(255, 255, 255, 0.1));
  border-radius: 50%;
  cursor: pointer;
  transition: color 0.15s ease, background 0.15s ease;
}

.ch-shortlist__close:hover {
  color: var(--ch-text, #f4f4f6);
  background: var(--ch-surface-3, #20232a);
}

.ch-shortlist__list {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  padding: 12px;
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.ch-shortlist__item {
  display: flex;
  align-items: center;
  gap: 6px;
  border-radius: 14px;
  transition: background 0.15s ease;
}

.ch-shortlist__item:hover {
  background: var(--ch-surface-2, #191b21);
}

.ch-shortlist__link {
  display: flex;
  align-items: center;
  gap: 12px;
  flex: 1;
  min-width: 0;
  padding: 8px;
  text-decoration: none;
  color: inherit;
}

.ch-shortlist__thumb {
  flex: 0 0 auto;
  width: 72px;
  height: 54px;
  border-radius: 10px;
  overflow: hidden;
  background: var(--ch-surface-3, #20232a);
}

.ch-shortlist__thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.ch-shortlist__info {
  display: flex;
  flex-direction: column;
  gap: 3px;
  min-width: 0;
}

.ch-shortlist__name {
  font-size: 14px;
  font-weight: 600;
  color: var(--ch-text, #f4f4f6);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.ch-shortlist__meta {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 12.5px;
  color: var(--ch-text-muted, #7a7b85);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.ch-shortlist__flag {
  font-size: 13px;
  line-height: 1;
}

.ch-shortlist__remove {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 30px;
  height: 30px;
  margin-right: 6px;
  padding: 0;
  color: var(--ch-text-muted, #7a7b85);
  background: transparent;
  border: none;
  border-radius: 50%;
  cursor: pointer;
  transition: color 0.15s ease, background 0.15s ease;
}

.ch-shortlist__remove:hover {
  color: #e74c3c;
  background: var(--ch-surface-3, #20232a);
}

.ch-shortlist__empty {
  margin: 24px 12px;
  font-size: 14px;
  line-height: 1.5;
  color: var(--ch-text-muted, #7a7b85);
  text-align: center;
}

.ch-shortlist__footer {
  padding: 14px 16px;
  border-top: 1px solid var(--ch-line, rgba(255, 255, 255, 0.1));
}

.ch-shortlist__viewall {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  padding: 11px 16px;
  font-size: 14px;
  font-weight: 600;
  color: var(--ch-bg, #0a0b0e);
  background: var(--ch-text, #f4f4f6);
  border-radius: var(--ch-radius-button, 12px);
  text-decoration: none;
  transition: transform 0.15s ease, box-shadow 0.15s ease;
}

.ch-shortlist__viewall:hover {
  transform: translateY(-1px);
  box-shadow: 0 8px 18px rgba(0, 0, 0, 0.3);
}

/* Skeleton */
.ch-shortlist__item--skeleton {
  padding: 8px;
  pointer-events: none;
}

.ch-shortlist__skel {
  background: var(--ch-surface-3, #20232a);
  border-radius: 8px;
  animation: chShortlistPulse 1.2s ease-in-out infinite;
}

.ch-shortlist__item--skeleton .ch-shortlist__thumb {
  background: var(--ch-surface-3, #20232a);
}

.ch-shortlist__skel--line {
  height: 12px;
  width: 70%;
}

.ch-shortlist__skel--short {
  width: 45%;
}

@keyframes chShortlistPulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.5; }
}

@media (prefers-reduced-motion: reduce) {
  .ch-shortlist-tab,
  .ch-shortlist-backdrop,
  .ch-shortlist-panel,
  .ch-shortlist__skel {
    animation: none;
    transition: none;
  }
}

/* Hide the side tab on mobile — favourites live in the mobile nav. */
@media (max-width: 767px) {
  .ch-shortlist-tab {
    display: none;
  }
}

/* ============================================================
   Destinations mega menu
   Desktop = hover/click dropdown panel anchored to the trigger.
   Mobile  = accordion inside the existing .ch-mnav sheet.
   Links are server-rendered (present even when the panel is closed)
   so crawlers discover the indexable resort pages from every page.
   ============================================================ */
.ch-mega {
  position: relative;
  display: inline-flex;
}
.ch-mega__trigger {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
  background: none;
  border: none;
  cursor: pointer;
  font-family: inherit;
  font-size: 16px;
  font-weight: 400;
  line-height: 1.3;
  color: inherit;
  letter-spacing: normal;
}
.ch-mega__chevron {
  transition: transform 0.18s ease;
}
.ch-mega.is-open .ch-mega__chevron {
  transform: rotate(180deg);
}
.ch-mega__panel {
  position: absolute;
  top: calc(100% + 12px);
  left: 50%;
  transform: translateX(-50%) translateY(-6px);
  width: min(920px, 92vw);
  background: var(--ch-surface, #121317);
  border: 1px solid var(--ch-border-strong, rgba(255, 255, 255, 0.12));
  border-radius: 16px;
  box-shadow: var(--ch-shadow-lg);
  padding: 1.5rem 1.75rem 1.25rem;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity 0.18s ease, transform 0.18s ease, visibility 0.18s;
  z-index: 1001;
}
.ch-mega.is-open .ch-mega__panel {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: translateX(-50%) translateY(0);
}
/* Invisible bridge so the cursor can cross the gap from trigger to panel
   without triggering mouseleave (which would close it). */
.ch-mega__panel::before {
  content: '';
  position: absolute;
  top: -14px;
  left: 0;
  right: 0;
  height: 14px;
}
.ch-mega__cols {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: 1.25rem 1.5rem;
}
.ch-mega__country {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--ch-text-muted, #7a7b85);
  margin-bottom: 0.55rem;
}
.ch-mega__resorts {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
}
.ch-mega__resort {
  display: block;
  padding: 0.3rem 0;
  font-size: 0.95rem;
  color: var(--ch-text-soft, #b8b9c2);
  text-decoration: none;
  transition: color 0.13s ease, padding-left 0.13s ease;
}
.ch-mega__resort:hover {
  color: var(--ch-accent, #6cc7f5);
  padding-left: 0.25rem;
}
.ch-mega__col--type {
  border-left: 1px solid var(--ch-border, rgba(255, 255, 255, 0.06));
  padding-left: 1.25rem;
}
.ch-mega__footer {
  margin-top: 1.1rem;
  padding-top: 0.9rem;
  border-top: 1px solid var(--ch-border, rgba(255, 255, 255, 0.06));
}
.ch-mega__viewall {
  font-size: 0.9rem;
  font-weight: 600;
  color: var(--ch-text, #f4f4f6);
  text-decoration: none;
}
.ch-mega__viewall:hover {
  color: var(--ch-accent, #6cc7f5);
}
/* Desktop affordance only; the mobile sheet uses the accordion below. (The
   parent .nav-menu is already hidden at this breakpoint, but be explicit.) */
@media (max-width: 991px) {
  .ch-mega {
    display: none;
  }
}

/* ---- Mobile accordion (inside .ch-mnav sheet) ---- */
.ch-mnav__group {
  border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.ch-mnav__accordion {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
  width: 100%;
  background: none;
  text-align: left;
  cursor: pointer;
  border: none;
  border-bottom: none;
}
.ch-mnav__accordion svg {
  flex: 0 0 auto;
  transition: transform 0.18s ease;
}
.ch-mnav__accordion.is-open svg {
  transform: rotate(180deg);
}
.ch-mnav__sub {
  padding: 0 0 1rem;
}
.ch-mnav__subgroup {
  margin-bottom: 0.85rem;
}
.ch-mnav__subhead {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--ch-text-muted, #7a7b85);
  margin-bottom: 0.3rem;
}
.ch-mnav__sublink {
  display: block;
  padding: 0.45rem 0 0.45rem 0.9rem;
  font-size: 1.05rem;
  color: var(--ch-text-soft, #b8b9c2);
  text-decoration: none;
}
.ch-mnav__sublink:hover {
  color: var(--ch-accent, #6cc7f5);
}
.ch-mnav__viewall {
  font-weight: 600;
  color: var(--ch-text, #f4f4f6);
}

/* ── Resort cluster article (blog/[resort]/[article]) ─────────────────────── */
.ch-post__crumb {
  display: flex;
  flex-wrap: wrap;
  gap: 0.25rem;
  align-items: center;
  font-size: 0.85rem;
  color: var(--ch-text-muted, #b6b6c2);
  margin-bottom: 1rem;
}
.ch-post__crumb a {
  color: inherit;
  text-decoration: none;
}
.ch-post__crumb a:hover {
  color: var(--ch-text, #f4f4f6);
}
.ch-post__eyebrow {
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--ch-accent, #c9a15a);
  margin-bottom: 0.5rem;
}
.ch-post__draft {
  border: 1px dashed var(--ch-border, #3a3a44);
  border-radius: 8px;
  padding: 0.75rem 1rem;
  margin-top: 1.25rem;
  font-size: 0.9rem;
  color: var(--ch-text-muted, #b6b6c2);
}
.ch-post__answer {
  font-weight: 600;
  color: var(--ch-text, #f4f4f6);
}
.ch-post__section-title {
  font-size: 1.25rem;
  font-weight: 700;
  margin-bottom: 0.75rem;
}
.ch-post__related {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 0.6rem;
}
.ch-post__related li {
  line-height: 1.4;
}
.ch-post__related a {
  font-weight: 600;
  color: var(--ch-text, #f4f4f6);
}
.ch-post__related-sub {
  color: var(--ch-text-muted, #b6b6c2);
  font-size: 0.9rem;
}

/* Blog index "Browse by resort" cluster card */
.ch-cluster-card {
  border: 1px solid var(--ch-border, #3a3a44);
  border-radius: 12px;
  padding: 1.25rem 1.4rem;
  background: var(--ch-surface, rgba(255, 255, 255, 0.02));
  display: grid;
  gap: 0.6rem;
}
.ch-cluster-card .ch-card__title a {
  color: var(--ch-text, #f4f4f6);
  text-decoration: none;
}
.ch-cluster-card .ch-card__title a:hover {
  text-decoration: underline;
}

/* ── Editorial review panel (internal, draft cluster articles only) ───────── */
.ch-editorial {
  border: 1px dashed var(--ch-accent, #c9a15a);
  border-radius: 10px;
  padding: 1rem 1.25rem;
  margin-top: 1.25rem;
  background: rgba(201, 161, 90, 0.06);
  font-size: 0.9rem;
  color: var(--ch-text, #f4f4f6);
}
.ch-editorial__head {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  align-items: center;
  margin-bottom: 0.75rem;
}
.ch-editorial__tag {
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-size: 0.7rem;
  font-weight: 700;
  color: var(--ch-accent, #c9a15a);
}
.ch-editorial__status,
.ch-editorial__ready {
  font-size: 0.72rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  padding: 0.15rem 0.5rem;
  border-radius: 999px;
  border: 1px solid var(--ch-border, #3a3a44);
}
.ch-editorial__status--review { color: #f4c430; border-color: #f4c430; }
.ch-editorial__status--ready { color: #6fcf97; border-color: #6fcf97; }
.ch-editorial__status--published { color: #6fcf97; border-color: #6fcf97; }
.ch-editorial__ready--yes { color: #6fcf97; border-color: #6fcf97; }
.ch-editorial__ready--no { color: #eb8c8c; border-color: #eb8c8c; }
.ch-editorial__checks {
  list-style: none;
  margin: 0 0 0.75rem;
  padding: 0;
  display: grid;
  gap: 0.3rem;
}
.ch-editorial__checks li.is-ok { color: var(--ch-text, #f4f4f6); }
.ch-editorial__checks li.is-warn { color: #eb8c8c; }
.ch-editorial__detail { color: var(--ch-text-muted, #b6b6c2); }
.ch-editorial__notes {
  border-top: 1px solid var(--ch-border, #3a3a44);
  padding-top: 0.75rem;
  margin-bottom: 0.5rem;
}
.ch-editorial__notes ul { margin: 0.25rem 0 0.6rem 1rem; }
.ch-editorial__meta { color: var(--ch-text-muted, #b6b6c2); font-size: 0.8rem; margin: 0; }

/* ═══════════════════════════════════════════════════════════════════════════
 * FULL-BLEED HERO  (.ch-hero--full)
 * ═══════════════════════════════════════════════════════════════════════════
 * Opt-in modifier that turns the inset "magazine plate" hero into a 100svw ×
 * 100svh frame. Everything inside it — veil, caption, scroll cue, overlay —
 * keeps working unchanged; only the container geometry differs.
 *
 * svw/svh rather than vw/vh deliberately: on mobile the dynamic units resize as
 * the browser chrome hides and shows, which would make the whole landscape
 * jump on every scroll. The small viewport unit is stable.
 *
 * The navbar is in normal flow (position: relative), so a literal 100svh plate
 * would push the bottom of the hero — which is where the search bar lives —
 * below the fold. The plate is therefore 100svh MINUS the navbar, so the hero
 * occupies exactly the screen the visitor can actually see. The navbar is a
 * constant 68px at every breakpoint (its padding-block is zeroed !important
 * and its height comes from the brand lockup).
 */

.ch-hero--full {
  --ch-nav-h: 68px;
  /* Exposed so the scene inside can size its 16:9 cover box against the real
     plate height rather than against the viewport. */
  --ch-hero-plate-h: calc(100svh - var(--ch-nav-h));
  padding: 0;
  overflow: clip;

  /* ── the rail ─────────────────────────────────────────────────────────────
   * Only the ARTWORK bleeds edge to edge. The copy stays on the same rail the
   * navbar uses, or the two drift apart badly on wide screens: measured at
   * 2560px the nav brand sits at 480px while an edge-anchored headline sits at
   * 56px.
   *
   * The navbar rail is `padding-inline: max(1.25rem, 5%)` with its inner
   * content capped at 100rem and centred — so past 1600px of inner width the
   * gutters grow rather than the content. Reproduced here as a single inset,
   * because the hero's children are absolutely positioned against the plate
   * and cannot simply inherit a container's padding.
   *
   * Verified to match the nav at 1440 / 1600 / 2000 / 2560. */
  --ch-rail-pad: max(1.25rem, 5%);
  --ch-rail-inset: calc(
    var(--ch-rail-pad) + max(0px, (100% - 2 * var(--ch-rail-pad) - 100rem) / 2)
  );
}

/* Copy, caption and scroll cue all align to the nav rail. */
.ch-hero--full .ch-hero__top {
  left: var(--ch-rail-inset);
  right: var(--ch-rail-inset);
}

/* The overlay only takes the rail while it is absolutely positioned against the
   plate. At 720px and below it drops into normal flow (position: relative) so it
   can contribute to the plate's height — and there `left` no longer anchors the
   box, it NUDGES it. Applying the inset unconditionally shifted the whole copy
   stack 20px right, so the headline, search bar and pill rows all ran to the
   viewport edge and were clipped by the `overflow: clip` on .ch-hero--full,
   while carrying a doubled gutter on the left. In flow the overlay's own
   padding is the gutter. */
@media (min-width: 721px) {
  .ch-hero--full .ch-hero__overlay {
    left: var(--ch-rail-inset);
    right: var(--ch-rail-inset);
  }

  /* Two lines on desktop too. The base 16ch measure forced a third line from
     1440 up; 24ch is the widest that still breaks "…mountains you love." onto
     a second line rather than pulling it onto the first at 1920+.
     The overlay descendant selector is deliberate: `.ch-hero--full
     .ch-hero__overlay > *` caps every child at 44rem further down this file,
     and at equal specificity that 704px cap wins and re-breaks the headline to
     three lines at 1920+. (0,3,0) beats it without touching the lede's own
     measure. Measured 2 lines at 1024 / 1280 / 1440 / 1920 / 2560. */
  .ch-hero--full .ch-hero__overlay .ch-hero__title {
    max-width: 24ch;
    font-size: clamp(40px, 5vw, 84px);
  }
}

.ch-hero--full .ch-hero__caption,
.ch-hero--full .ch-hero__scroll {
  right: var(--ch-rail-inset);
}

/* The pathway pills sit one step inside the rail, preserving the 4rem stagger
   they had from the scroll cue in the base component — otherwise both land on
   the rail edge and collide. */
.ch-hero--full .ch-hero__pathways--desktop {
  right: calc(var(--ch-rail-inset) + 4rem);
}

/* The overlay caps its own measure; without this it would stretch to the full
   rail on wide screens and the headline would set far too wide. */
.ch-hero--full .ch-hero__overlay {
  max-width: none;
}

.ch-hero--full .ch-hero__overlay > * {
  max-width: 44rem;
}

.ch-hero--full .ch-hero__inner {
  max-width: none;
}

.ch-hero--full .ch-hero__plate {
  /* 100% of the (already full-bleed) section, NOT 100svw: viewport units
     include the classic scrollbar gutter, so 100svw is ~15px wider than the
     available content width and pushes a horizontal scrollbar onto the page. */
  width: 100%;
  height: var(--ch-hero-plate-h);
  /* Beats the aspect-ratio rules in the base component, including the
     min-width: 900px and max-width: 720px overrides. */
  aspect-ratio: auto;
  border-radius: 0;
}

/* The eyebrow was a block above the plate; full-bleed, it belongs inside it. */
.ch-hero--full .ch-hero__top {
  position: absolute;
  z-index: 2;
  top: clamp(1rem, 2.5svh, 2rem);
  margin-bottom: 0;
  pointer-events: none;
}

/* Give the bottom-left overlay a little more room now it has a whole screen.
   Gated for the same reason as the rail inset above: below 720px the overlay
   is position:relative, where `bottom` does not anchor it — it lifts it. That
   was pushing the copy stack ~51px up off the plate floor and leaving a dead
   band under the pills that read as "the hero is too tall". */
@media (min-width: 721px) {
  .ch-hero--full .ch-hero__overlay {
    bottom: clamp(2rem, 6svh, 4.5rem);
  }
}

@media (max-width: 720px) {
  /* The base component lets the plate GROW to fit the overlay on small
     screens; at full-bleed the overlay is inside a fixed 100svh frame, so that
     must not apply or the hero exceeds the viewport. */
  .ch-hero--full .ch-hero__plate {
    height: var(--ch-hero-plate-h);
    min-height: 0;
  }

  /* Now that the overlay's padding IS the gutter, take it from the same rail
     the eyebrow uses, so the headline starts on the eyebrow's left edge at
     every width rather than drifting a couple of px at the wider end. */
  .ch-hero--full .ch-hero__overlay {
    padding-inline: var(--ch-rail-inset);
  }

  /* ── the fold ─────────────────────────────────────────────────────────────
   * A 100svh hero shows the visitor a phone-shaped poster and no evidence the
   * page continues. Trimming the plate is the ONLY lever that moves the fold:
   * everything inside it is bottom-anchored in a fixed frame, so removing the
   * eyebrow and the CTA row just grew the dead band at the bottom.
   *
   * Measured, not guessed: the copy stack needs 477px (title 70 + lede 70 +
   * search 200 + pills 44 + gaps + padding). 74svh left it 81px of slack and
   * the first card still landed 23px under the fold, so 66svh — 557px at 844,
   * ~45px of card showing. The 490px floor is the content height plus a hair,
   * for short viewports (iPhone SE at 667 would otherwise ask for 440). */
  .ch-hero--full {
    --ch-hero-plate-h: clamp(490px, 66svh, 620px);
  }

  .ch-hero--full .ch-hero__overlay {
    padding-block: clamp(1.25rem, 3.5svh, 2rem);
  }

  /* ── picker stacking ──────────────────────────────────────────────────────
   * The WHERE / WHEN / WHO sheets are position:fixed, so they escape the
   * plate's overflow geometrically — but NOT its stacking order. Their
   * z-index:60 is scoped inside .ch-hero__overlay (z-index:1), and the
   * sections below the hero carry data-reveal transforms, which make their own
   * stacking contexts and paint later in DOM order. Result: the sheet was
   * drawn under them from roughly its own midpoint down, so hit-testing the
   * lower two thirds of the calendar returned .section-large-2 and the dates
   * there could not be tapped at all.
   *
   * Same trap, and the same remedy, as the resort rail at the top of this file
   * (search "traps the sheet's stacking"): lift the trapping ancestors. 900
   * clears the revealed sections while staying under the navbar's 1000, so the
   * sheet still tucks beneath the bar rather than covering it. The plate clips
   * its own content, so nothing but the fixed sheet is affected. */
  .ch-hero--full .ch-hero__plate,
  .ch-hero--full .ch-hero__overlay {
    z-index: 900;
  }
}

/* ── the full-bleed hero is always dark ─────────────────────────────────────
 * The base hero flips with the theme, because it was built around a
 * photograph that dissolves into the page: in light mode the veil fades the
 * plate to #eef4f8 and the section background goes pale.
 *
 * That washes out the blue-hour landscape — the whole point of which is a dark
 * frame with one warm light in it. So the full-bleed variant keeps the dark
 * treatment in both themes and meets the light page below it on a clean edge,
 * the way a dark magazine plate does. Only these four rules need reverting;
 * the rest of the hero copy is already #f4f4f6 in light mode.
 */

html[data-theme='light'] .ch-hero--full {
  background: #020617;
  color: #fff;
}

html[data-theme='light'] .ch-hero--full .ch-hero__veil {
  background:
    linear-gradient(
      90deg,
      rgba(0, 0, 0, 0.65) 0%,
      rgba(0, 0, 0, 0.3) 30%,
      rgba(0, 0, 0, 0.05) 55%,
      rgba(0, 0, 0, 0) 75%
    ),
    linear-gradient(
      180deg,
      rgba(2, 6, 23, 0) 0%,
      rgba(2, 6, 23, 0) 35%,
      rgba(2, 6, 23, 0.35) 55%,
      rgba(2, 6, 23, 0.82) 78%,
      #020617 100%
    );
}

/* The base light theme darkens the eyebrow for a pale plate; over the dark
   landscape it has to go back to light. */
html[data-theme='light'] .ch-hero--full .ch-hero__eyebrow {
  color: rgba(244, 244, 246, 0.72);
}

/* One blue on the plate, in both themes. Was a light-theme-only #5ec8f5 patch
   over a base rule that resolved to #2a90c7 (3.3:1 here) — now a single token
   the ghost pills share, so the hero cannot drift out of sync again. */
.ch-hero--full .ch-hero__title em {
  color: var(--ch-ondark-accent);
}

/* ── host band ──────────────────────────────────────────────────────────────
 * Home for the two CTAs displaced from the mobile hero. Sits above the footer,
 * where a "list your place" ask belongs — after the visitor has seen what the
 * marketplace actually contains, rather than competing with Search. */
.ch-hostband {
  padding-block: var(--section-pad-y);
  border-top: 1px solid var(--ch-line);
}
.ch-hostband__title {
  font-family: var(--font-serif), 'Fraunces', 'Times New Roman', serif;
  font-weight: 400;
  font-size: clamp(1.75rem, 3.2vw, 2.75rem);
  line-height: 1.1;
  letter-spacing: -0.02em;
  color: var(--fg-primary);
  margin: 0 0 0.5rem;
}
.ch-hostband__lede {
  font-family: var(--font-body), 'Inter Tight', sans-serif;
  font-size: clamp(0.9375rem, 1.05vw, 1.0625rem);
  line-height: 1.55;
  color: color-mix(in srgb, var(--fg-primary) 78%, transparent);
  max-width: 46ch;
  margin: 0;
}
.ch-hostband__actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
}
@media (max-width: 720px) {
  /* Full-width stacked buttons read as one decision per row on a phone. */
  .ch-hostband__actions {
    width: 100%;
  }
  .ch-hostband__actions .ch-btn {
    flex: 1 1 100%;
  }
}

/* (The .ch-hero__cta light-theme override that lived here went with the CTA
   row itself. The ghost pills that replaced it use --ch-hero-* tokens, which
   are theme-independent by design — the full-bleed plate is always dark.) */

/* ── navbar vertical centring ───────────────────────────────────────────────
 * `.container-2` is `display: grid`, but it inherits Webflow's `.w-container`
 * clearfix pseudo-elements — `content: " "; display: table` — which are pinned
 * to grid row 1. In a grid they aren't clearfixes at all: they occupy a real
 * track, so the resolved rows were `8px 44px` and every actual nav item landed
 * in row 2, sitting 12px below the bar's centre line (item centre 46 vs bar
 * centre 34 in a 68px bar).
 *
 * A float clearfix has no purpose in a grid container, so remove them and the
 * grid collapses to the single row `align-items: center` was written for.
 */
.navbar .container-2::before,
.navbar .container-2::after {
  content: none;
}

/* ── Borderless chalet card ──────────────────────────────────────────
   The card was a bordered, tinted box holding a second rounded rectangle,
   which fought the photography it was meant to present. The image now sits
   directly on the page with the type hanging beneath it, so a grid reads as
   pictures rather than widgets.

   Appended at the end, and repeated at the light-theme selector's
   specificity, because html[data-theme='light'] .section-large-2 .chalet-card
   earlier in this file would otherwise win on the homepage grid. */
.chalet-card,
html[data-theme='light'] .section-large-2 .chalet-card {
  background: transparent;
  border: 0;
  border-radius: 0;
  padding: 0;
  overflow: visible;
  box-shadow: none;
  transition: none;
}

.chalet-card:hover,
html[data-theme='light'] .section-large-2 .chalet-card:hover {
  background: transparent;
  border-color: transparent;
  transform: none;
  box-shadow: none;
}

/* Lift the image, not the whole card. With no surface behind the text,
   moving it too just reads as a layout shift. */
.chalet-card .headerimagecard {
  transition: transform 0.3s ease, box-shadow 0.3s ease;
}

.chalet-card:hover .headerimagecard {
  transform: translateY(-4px);
  box-shadow: 0 18px 34px -18px rgba(0, 0, 0, 0.4);
}

.chalet-card .column-regular {
  padding: 14px 2px 0;
  gap: 6px;
}

.chalet-card .column-xx-small {
  gap: 6px;
}

.chalet-card .chalet-card-name {
  font-size: 19px;
  line-height: 1.25;
  font-weight: 600;
  letter-spacing: -0.3px;
  color: var(--fg-primary);
}

.chalet-card .chalet-card-place {
  display: flex;
  align-items: center;
  gap: 5px;
  min-width: 0;
  font-size: 14px;
  line-height: 1.35;
  color: var(--fg-secondary);
}

.chalet-card .chalet-card-flag {
  flex: 0 0 auto;
  font-size: 12px;
  line-height: 1;
}

.chalet-card .chalet-card-place-text {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.chalet-card .chalet-card-place-link {
  color: inherit;
  text-decoration: none;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.chalet-card .chalet-card-place-link:hover {
  color: var(--fg-primary);
  text-decoration: underline;
}

.chalet-card .chalet-card-specs {
  font-size: 14px;
  line-height: 1.35;
  color: var(--fg-secondary);
}

/* The heart sat on a dark scrim suited to the old dark card. */
.chalet-card .product-like {
  background: rgba(255, 255, 255, 0.92);
  color: #121214;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.18);
}

.chalet-card .product-like:hover {
  background: #fff;
  color: #121214;
}

/* ── Section header action ──────────────────────────────────────────
   Baseline-aligned with the title on desktop; wraps beneath it on narrow
   screens so a long heading never squeezes the link to nothing. */
.ch-section-header--with-action {
  max-width: none;
}

.ch-section-header__row {
  align-self: stretch;
  width: 100%;
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 16px 24px;
  flex-wrap: wrap;
}

.ch-section-header__row > .ch-heading {
  margin-bottom: 0;
}

.ch-section-header__action {
  flex: 0 0 auto;
}

.ch-section-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 15px;
  font-weight: 500;
  color: var(--fg-primary);
  text-decoration: none;
  white-space: nowrap;
  border-bottom: 1px solid color-mix(in srgb, var(--fg-primary) 30%, transparent);
  padding-bottom: 2px;
  transition: color 0.2s ease, border-color 0.2s ease, gap 0.2s ease;
}

.ch-section-link:hover {
  color: var(--ch-accent, #2f7fa8);
  border-bottom-color: currentColor;
  gap: 10px;
}

/* ── Editorial chalet card ───────────────────────────────────────────
   Marketing card for short, curated grids (homepage featured, resort
   pages). Square corners after the Walpole reference, but the palette and
   type come from the /finder-concept direction: cool near-white surfaces on
   a lavender-grey page, navy #101d33, and the body sans at weight 200 rather
   than a serif. */
.chalet-ed {
  --ed-ink: #101d33;
  --ed-muted: #69718a;
  --ed-accent: #2a90c7;
  --ed-surface: #ffffff;
  --ed-hairline: rgba(16, 29, 51, 0.14);

  display: flex;
  flex-direction: column;
  height: 100%;
  /* .section-large-2 sets text-align: center for its heading block; the card
     is a left-aligned object inside it. */
  text-align: left;
  background: var(--ed-surface);
  border: 0;
  border-radius: 0;
  cursor: pointer;
  overflow: hidden;
  box-shadow: 0 16px 44px -20px rgba(16, 29, 51, 0.24);
  transition: box-shadow 0.3s ease, transform 0.3s ease;
}

.chalet-ed:hover {
  transform: translateY(-3px);
  box-shadow: 0 26px 56px -22px rgba(16, 29, 51, 0.34);
}

.chalet-ed__media {
  position: relative;
  aspect-ratio: 16 / 10;
  overflow: hidden;
  background: #e9ecf5;
}

.chalet-ed__fav {
  position: absolute;
  inset: 12px 12px auto auto;
  z-index: 2;
}

.chalet-ed__body {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  flex: 1;
  padding: 0 28px 26px;
}

/* Pulled up so it straddles the photo edge. It lives in the body because
   .chalet-ed__media clips its overflow. */
.chalet-ed__badge {
  width: 78px;
  height: 78px;
  margin: -39px 0 18px;
  border-radius: 50%;
  background: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  box-shadow: 0 10px 28px -10px rgba(16, 29, 51, 0.35);
}

.chalet-ed__badge img {
  width: 78%;
  height: 78%;
  object-fit: contain;
}

.chalet-ed__badge-initial {
  font-size: 26px;
  font-weight: 300;
  color: var(--ed-muted);
}

/* PaleTheme notes that custom.css forces a serif onto every h1-h6, so the
   family, weight and rule all have to be stated here to win. */
.chalet-ed__name {
  border: 0;
  padding: 0;
  margin: 0 0 14px;
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-size: clamp(25px, 2.1vw, 33px);
  font-weight: 200;
  line-height: 1.1;
  letter-spacing: -0.03em;
  color: var(--ed-ink);
}

.chalet-ed__cats,
.chalet-ed__region {
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: 1.3px;
  text-transform: uppercase;
  line-height: 1.55;
}

.chalet-ed__cats {
  color: var(--ed-muted);
}

.chalet-ed__region {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-top: 3px;
  /* Was --ed-accent (#2a90c7), which is 3.55:1 on the card's white surface —
     under the floor for 11.5px bold. Darkened on the same reasoning the
     --cx-accent-ink token was introduced for. */
  color: #175a80;
}

.chalet-ed__flag {
  font-size: 12px;
  line-height: 1;
}

/* Grouped at the left, as in the reference — not spread to the card edges.
   Stated explicitly: the body is align-items:flex-start, so a stretched row
   with space-between would collapse to the same thing by accident. */
.chalet-ed__actions {
  display: flex;
  align-items: center;
  justify-content: flex-start;
  gap: 28px;
  margin-top: auto;
  padding-top: 26px;
}

.chalet-ed__stat {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 1.1px;
  text-transform: uppercase;
  color: var(--ed-muted);
  border-top: 1px solid var(--ed-hairline);
  padding-top: 10px;
}

.chalet-ed__link {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding-top: 10px;
  border: 0;
  border-top: 1px solid var(--ed-ink);
  border-radius: 0;
  background: none;
  font: inherit;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 1.1px;
  text-transform: uppercase;
  color: var(--ed-ink);
  cursor: pointer;
  transition: gap 0.2s ease, color 0.2s ease;
}

.chalet-ed__link:hover {
  gap: 12px;
  color: var(--ed-accent);
}

/* Three across, and never rounded. */
.product-grid--editorial {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 32px;
}

@media (max-width: 1199px) {
  .product-grid--editorial { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 767px) {
  .product-grid--editorial { grid-template-columns: 1fr; gap: 24px; }
  .chalet-ed__body { padding: 0 20px 22px; }
}

/* ── finder-concept direction ────────────────────────────────────────
   Palette, type and surface treatment from /finder-concept, shared by the
   concierge prompt and the why-book-direct band: body sans at weight 200,
   navy ink, muted blue-grey, and content raised onto soft white glass over a
   cool lavender wash.

   The two sections are adjacent on the homepage and are styled as one
   continuous band — the why block picks the gradient up at the exact colour
   the prompt hands off, with no rule between them.

   Every rule below is scoped to one of these two sections on purpose —
   .editorial-headline and .section-eyebrow are shared with six other pages
   that still use the serif. */
.ch-advisor-prompt,
.why-section,
.popular-section,
.where-section,
.browse-section,
.answers-section,
.members-section,
.ch-hostband,
.ch-home-featured,
/* The resort hub below its hero, and the search results page — same band,
   different pages. Defined here so there is one set of token values, not a
   second copy that drifts. */
.resort-page,
.search-page,
.blog-page,
.chalet-page,
.about-page,
.host-page,
.host-profile-page,
.auth-page,
.not-found-page {
  --cx-ink: #101d33;
  /* Was #69718a. That cleared 4.5:1 on the white glass cards (4.65) but landed
     at 4.49 on the plain page background the between-sections copy sits on —
     under the floor for 13–19px body text. Three levels darker clears both
     (4.63 on the page, 4.80 on glass) and is visually indistinguishable. */
  --cx-muted: #666e87;
  --cx-accent: #2a90c7;
  /* Accent darkened for text sitting on the tinted glass — the display accent
     only clears 4.3:1 against it. */
  --cx-accent-ink: #175a80;
  --cx-spark: #7c74d6;
  /* Text-safe lilac, the same idea as --cx-accent-ink above. --cx-spark is a
     display colour: at 12px it reaches only 3.62:1 on the wash and 3.81:1 on
     the glass cards, under the 4.5:1 floor for small text — which is exactly
     what it did when the about/host/auth eyebrows first used it. This clears
     5.11:1 and 5.39:1, with enough headroom that a slightly different backdrop
     can't put it back under (the note on --cx-muted is about a near-miss at
     4.49 that had to be darkened again). */
  --cx-spark-ink: #645bbd;

  /* One glass recipe for every raised surface in the band: the pillar cards,
     the stats pill and the CTA chips. Translucent white over the wash rather
     than backdrop-filter — the backdrop is a flat gradient, so blurring it
     costs GPU time for no visible difference. */
  --cx-glass: linear-gradient(180deg, rgba(255, 255, 255, 0.94), rgba(255, 255, 255, 0.62));
  --cx-glass-line: rgba(255, 255, 255, 0.9);
  --cx-glass-shadow: 0 1px 1px rgba(16, 29, 51, 0.04), 0 20px 44px -26px rgba(16, 29, 51, 0.34);
  --cx-glass-shadow-hi: 0 1px 2px rgba(16, 29, 51, 0.05), 0 30px 58px -26px rgba(16, 29, 51, 0.45);
}

/* ── Section dividers ────────────────────────────────────────────────
   One fading hairline per boundary, from the concierge prompt down to the
   footer. Every section draws its own TOP rule and the last one also draws a
   bottom rule — rather than each section drawing both edges, which would put
   two stacked 1px lines at every join and read as a 2px border. It also means
   the set self-heals: .popular-section and .browse-section render
   conditionally, and whichever section follows still draws the boundary.

   The joins inside the tinted band are the ones that have to carry
   themselves. Elsewhere there's a tonal step between sections helping the eye;
   between the prompt and the why block both sides are the same colour, so the
   hairline is the only signal there.

   Inset to the rail the content sits on: .ch-container and .container-large
   both resolve to min(viewport − 2 gutters, 1600px) centred, so a single
   expression lines every rule up with the copy above it at every width.
   Percentages on an absolutely positioned box resolve against the padding
   box, which here is the full section width.

   Fades out across the outer sixth at each end so no rule terminates in a
   hard stub. */
.ch-advisor-prompt,
.why-section,
.where-section,
.answers-section,
.members-section,
.ch-hostband {
  position: relative;
}

.ch-advisor-prompt::before,
.why-section::before,
.popular-section.section-large-2::before,
.where-section::before,
.browse-section.section-large-2::before,
.answers-section::before,
.members-section::before,
.ch-hostband::before,
.ch-hostband::after {
  content: '';
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  width: min(100% - 2 * max(1.25rem, 5%), 1600px);
  height: 1px;
  background: linear-gradient(
    90deg,
    transparent 0%,
    rgba(16, 29, 51, 0.16) 16%,
    rgba(16, 29, 51, 0.16) 84%,
    transparent 100%
  );
  pointer-events: none;
}

.ch-advisor-prompt::before,
.why-section::before,
.popular-section.section-large-2::before,
.where-section::before,
.browse-section.section-large-2::before,
.answers-section::before,
.members-section::before,
.ch-hostband::before {
  top: 0;
}

/* Last section on the page — closes the run off against the footer. */
.ch-hostband::after {
  bottom: 0;
}

/* .where-section is display:none under 720px, so its two rules disappear with
   it. .browse-section draws its own top rule, which keeps the
   popular → browse boundary marked on a phone. */

.ch-advisor-prompt {
  border-top: 0;
  border-bottom: 0;
  /* Two soft colour fields over the wash give the band depth without needing
     decorative elements in the markup.
     Both are anchored in px and stop at 66% of their radius, so they fade out
     well inside the section — a radial still carrying alpha at a section edge
     gets cut flat by the next section and draws a hard line across the page. */
  background:
    radial-gradient(40rem 16rem at 22% 200px, rgba(124, 116, 214, 0.22), transparent 66%),
    radial-gradient(38rem 15rem at 80% calc(100% - 210px), rgba(42, 144, 199, 0.18), transparent 66%),
    linear-gradient(180deg, #f2f4fb 0%, #eaedf7 42%, #e7e5f4 76%, #eceef8 100%);
}

.ch-advisor-prompt .section-eyebrow {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-size: 13px;
  letter-spacing: 0;
  text-transform: none;
  color: var(--cx-muted);
  margin-bottom: 18px;
}

.ch-advisor-prompt .editorial-headline {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  font-size: clamp(2.1rem, 5.2vw, 4.6rem);
  line-height: 1.04;
  letter-spacing: -0.035em;
  color: var(--cx-ink);
}

/* The concept headline is one weight throughout — an italic serif clause in
   the middle of a 200-weight sans line reads as a different typeface. */
.ch-advisor-prompt .editorial-headline em {
  font-style: normal;
  font-family: inherit;
  font-weight: inherit;
  color: #2a90c7;
}

.ch-advisor-prompt__lede {
  max-width: 46ch;
  margin-inline: auto;
  font-size: 16px;
  line-height: 1.6;
  color: var(--cx-muted);
}

.ch-advisor-prompt__form {
  display: flex;
  justify-content: center;
  margin-top: 34px;
}

.ch-advisor-prompt__field {
  display: flex;
  align-items: center;
  gap: 12px;
  width: min(660px, 100%);
  padding: 7px 7px 7px 9px;
  background: #fff;
  border: 1px solid rgba(255, 255, 255, 0.95);
  border-radius: 999px;
  /* Hairline + contact shadow + long diffuse drop, so the pill reads as a card
     floating over the wash rather than a field cut into it. */
  box-shadow:
    0 0 0 1px rgba(16, 29, 51, 0.04),
    0 2px 3px rgba(16, 29, 51, 0.04),
    0 26px 58px -24px rgba(16, 29, 51, 0.42);
  transition: box-shadow 0.25s ease, transform 0.25s ease;
}

.ch-advisor-prompt__field:focus-within {
  transform: translateY(-1px);
  box-shadow:
    0 0 0 1px rgba(42, 144, 199, 0.24),
    0 0 0 6px rgba(42, 144, 199, 0.1),
    0 30px 66px -24px rgba(16, 29, 51, 0.48);
}

.ch-advisor-prompt__spark {
  display: flex;
  flex: 0 0 auto;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background: linear-gradient(140deg, rgba(124, 116, 214, 0.18), rgba(42, 144, 199, 0.14));
  color: var(--cx-spark);
}

.ch-advisor-prompt__input {
  flex: 1;
  min-width: 0;
  border: 0;
  background: none;
  padding: 12px 0;
  font-size: 15.5px;
  color: var(--cx-ink);
}

.ch-advisor-prompt__input::placeholder {
  color: #9aa1b4;
}

.ch-advisor-prompt__input:focus {
  outline: none;
}

.ch-advisor-prompt__submit {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  flex: 0 0 auto;
  padding: 13px 24px;
  border: 0;
  border-radius: 999px;
  background: var(--cx-ink);
  color: #fff;
  font: inherit;
  font-size: 14.5px;
  font-weight: 500;
  cursor: pointer;
  transition: background 0.2s ease, gap 0.2s ease;
}

.ch-advisor-prompt__submit:hover {
  background: #1c2a44;
  gap: 12px;
}

@media (max-width: 599px) {
  .ch-advisor-prompt__field {
    flex-wrap: wrap;
    border-radius: 24px;
    padding: 10px 10px 10px 12px;
  }

  .ch-advisor-prompt__submit {
    width: 100%;
    justify-content: center;
  }
}

/* ── Why book direct, same direction ─────────────────────────────── */

/* Starts on the colour the prompt's gradient ends on and fades out to the
   page below, so the pair reads as one surface instead of two slabs. */
.why-section {
  /* Both edges are drawn by the shared ::after hairline above. */
  border-top: 0;
  border-bottom: 0;
  background:
    radial-gradient(42rem 17rem at 86% 320px, rgba(124, 116, 214, 0.14), transparent 66%),
    /* Final stop is --ch-bg, the page colour the next section sits on. Landing
       on #fbfbfd instead left a ~7-level step across the whole width at the
       boundary, which read as a second, full-bleed line running past the ends
       of the inset hairline. */
    linear-gradient(180deg, #eceef8 0%, #f2f3fa 44%, #f4f6fb 100%);
}

.why-section .why-header {
  margin-bottom: 56px;
}

.why-section .section-eyebrow {
  /* --ch-font-display (Cabinet Grotesk) left these two as the only eyebrows on
     the page in a different face once the sections below were converted. */
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-size: 13px;
  letter-spacing: 0;
  text-transform: none;
  color: var(--cx-muted);
}

.why-section .editorial-headline {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  font-size: clamp(2.1rem, 5vw, 4.4rem);
  line-height: 1.06;
  letter-spacing: -0.035em;
  color: var(--cx-ink);
}

.why-section .editorial-headline em {
  font-style: normal;
  font-family: inherit;
  font-weight: inherit;
  color: var(--cx-accent);
}

.why-section .why-subhead {
  color: var(--cx-muted);
}

/* Stats read as data, so they keep the light weight but drop the serif. The
   row is a single floating pill — .why-headline-row centres its children on
   the cross axis, so it sizes to its content without extra wrapping markup. */
.why-section .why-meta-stats {
  gap: 0.75rem 1rem;
  margin-top: 2rem;
  padding: 0.8rem 1.6rem;
  max-width: 100%;
  border: 1px solid var(--cx-glass-line);
  border-radius: 999px;
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
}

/* Once the labels wrap (FR/DE run long) a 999px radius reads as a lozenge
   round a paragraph — square it off. */
@media (max-width: 560px) {
  .why-section .why-meta-stats {
    border-radius: 20px;
  }
}

.why-section .why-meta-stat-num {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 300;
  font-style: normal;
  color: var(--cx-ink);
}

.why-section .why-meta-stat-label,
.why-section .why-meta-stats-sep {
  color: var(--cx-muted);
}

/* ── Pillars as glass cards ──────────────────────────────────────── */

/* The rule above the pillars and the wide 48px gutters were doing the work of
   separating four columns of bare text; the cards do it now. */
.why-section .why-pillars {
  border-top: 0;
  padding-top: 0;
  gap: 20px;
}

.why-section .why-pillar {
  gap: 10px;
  padding: 26px 24px 28px;
  border: 1px solid var(--cx-glass-line);
  border-radius: 22px;
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
  /* Repeats [data-reveal]'s opacity/transform timings verbatim: this selector
     outranks it, and a bare `transition: box-shadow` here would silently kill
     the scroll reveal. The cards aren't links, so hover raises the shadow
     only — no lift, which would imply they're clickable. */
  transition:
    opacity 700ms cubic-bezier(0.22, 1, 0.36, 1),
    transform 700ms cubic-bezier(0.22, 1, 0.36, 1),
    box-shadow 300ms ease,
    border-color 300ms ease;
}

.why-section .why-pillar:hover {
  border-color: #fff;
  box-shadow: var(--cx-glass-shadow-hi);
}

.why-section .why-pillar-num {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  align-self: flex-start;
  min-width: 2rem;
  height: 2rem;
  padding: 0 0.625rem;
  margin-bottom: 2px;
  border-radius: 999px;
  background: linear-gradient(140deg, rgba(42, 144, 199, 0.16), rgba(124, 116, 214, 0.14));
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-style: normal;
  font-weight: 500;
  font-size: 12px;
  letter-spacing: 0.04em;
  font-variant-numeric: tabular-nums;
  color: var(--cx-accent-ink);
}

.why-section .why-pillar-title {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 500;
  font-size: 20px;
  line-height: 1.25;
  letter-spacing: -0.015em;
  color: var(--cx-ink);
  /* ch-2026.css rules every h3 on the site; inside a card it reads as a
     divider that isn't part of the design. */
  border-bottom: 0;
  padding-bottom: 0;
}

.why-section .why-pillar-body {
  color: var(--cx-muted);
  font-size: 14.5px;
  line-height: 1.65;
  /* The card is the measure now — a 34ch cap left a ragged gap inside it. */
  max-width: none;
}

/* ── CTA chips, same glass ───────────────────────────────────────── */
.why-section .why-cta-row {
  gap: 12px;
  margin-top: 48px;
}

.why-section .why-cta-chip {
  padding: 12px 20px;
  border: 1px solid var(--cx-glass-line);
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
  color: var(--cx-ink);
  font-weight: 500;
}

.why-section .why-cta-chip:hover {
  transform: translateY(-2px);
  border-color: #fff;
  background: #fff;
  box-shadow: var(--cx-glass-shadow-hi);
  color: var(--cx-ink);
}

.why-section .why-cta-chip span {
  color: var(--cx-accent-ink);
}

@media (prefers-reduced-motion: reduce) {
  .ch-advisor-prompt__field,
  .why-section .why-cta-chip {
    transition: none;
  }

  .ch-advisor-prompt__field:focus-within,
  .why-section .why-cta-chip:hover {
    transform: none;
  }
}

/* ══════════════════════════════════════════════════════════════════════
   finder-concept direction — the rest of the home page
   ══════════════════════════════════════════════════════════════════════
   Carries the palette, type and glass surfaces of the concierge band down
   through the remaining home sections to the footer.

   Everything is scoped to a home section on purpose. The header classes are
   shared: .section-eyebrow/.editorial-headline with six other pages, and
   .ch-eyebrow/.ch-heading/.ch-lede (the <SectionHeader> component) with seven
   — contact, privacy, faq, terms and both blog pages. .alerts-card is also on
   /alerts and .faq-item on /faq. Unscoped, this block would restyle all of
   them.

   The home page runs two different header systems side by side:
   <SectionHeader> on the featured/popular/browse sections, and hand-rolled
   .section-eyebrow + .editorial-headline markup on the rest. Both are
   converted so the page reads as one voice. */

/* ── Eyebrows ─────────────────────────────────────────────────────────
   Plain sentence case at 13px, not 12px uppercase with 0.1em tracking. */
.ch-home-featured .ch-eyebrow,
.popular-section .ch-eyebrow,
.browse-section .ch-eyebrow,
.where-section .section-eyebrow,
.answers-section .section-eyebrow,
.members-section .section-eyebrow {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-size: 13px;
  font-weight: 400;
  letter-spacing: 0;
  text-transform: none;
  color: var(--cx-muted);
}

/* ── Headlines ───────────────────────────────────────────────────────
   Fraunces at 400 out, Inter Tight at 200 in, matching the band. */
.ch-home-featured .ch-heading,
.popular-section .ch-heading,
.browse-section .ch-heading,
.where-section .editorial-headline,
.answers-section .editorial-headline,
.members-section .editorial-headline,
.ch-hostband__title {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  letter-spacing: -0.035em;
  line-height: 1.06;
  color: var(--cx-ink);
}

/* One weight throughout — an italic serif clause inside a 200-weight sans
   line reads as a different typeface, so the emphasis is carried by colour. */
.ch-home-featured .ch-heading em,
.popular-section .ch-heading em,
.browse-section .ch-heading em,
.where-section .editorial-headline em,
.answers-section .editorial-headline em,
.members-section .editorial-headline em,
.ch-hostband__title em {
  font-style: normal;
  font-family: inherit;
  font-weight: inherit;
  color: var(--cx-accent);
}

/* Normalised onto the band's scale. The answers headline was clamping to 72px
   against a 60ch subhead, which made it the largest thing on the page. */
.ch-home-featured .ch-heading,
.popular-section .ch-heading,
.browse-section .ch-heading,
.where-section .editorial-headline,
.answers-section .editorial-headline,
.members-section .editorial-headline {
  font-size: clamp(2.1rem, 5vw, 4.4rem);
}

/* ── Ledes and subheads ──────────────────────────────────────────── */
.ch-home-featured .ch-lede,
.popular-section .ch-lede,
.browse-section .ch-lede,
.where-section .where-subhead,
.answers-section .answers-subhead,
.members-section .members-subhead,
.ch-hostband__lede {
  color: var(--cx-muted);
}

/* ── Sub-headings ────────────────────────────────────────────────────
   The remaining serif runs: FAQ questions, member benefits, the alerts card
   heading, resort names in the map list. All to sans 500, as .why-pillar-title. */
.answers-section .faq-question,
.answers-section .editorial-subheadline,
.members-benefit-title,
.where-row-name,
.where-map-overlay-title {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 500;
  font-style: normal;
  letter-spacing: -0.015em;
  color: var(--cx-ink);
}

/* ch-2026.css rules every h3 on the site; inside a card it reads as a divider
   the design doesn't have. Same fix as .why-pillar-title. */
.answers-section .faq-question,
.members-benefit-title {
  border-bottom: 0;
  padding-bottom: 0;
}

/* ── Section backgrounds ─────────────────────────────────────────────
   The band opens the page with the lavender wash and .ch-hostband closes it;
   the sections between sit on the page's own cool near-white and are separated
   by the hairlines instead. Alternating tints down a seven-section run would
   read as stripes. .answers-section takes a faint wash because it's the
   densest block on the page and benefits from being set apart. */
.answers-section {
  background:
    radial-gradient(44rem 18rem at 82% 280px, rgba(124, 116, 214, 0.1), transparent 66%),
    linear-gradient(180deg, #f7f8fc 0%, #f2f3fa 50%, #f7f8fc 100%);
}

/* Peaks in the middle and returns to --ch-bg at both ends — the colour the
   members section above and .ch-footer below both sit on. Deepening all the
   way down into the footer left a step at that boundary. */
.ch-hostband {
  background:
    radial-gradient(38rem 15rem at 24% 190px, rgba(124, 116, 214, 0.16), transparent 66%),
    linear-gradient(180deg, #f4f6fb 0%, #eaedf7 55%, #f4f6fb 100%);
}

/* ── Popular resorts — tiles as glass cards ──────────────────────── */
.popular-section .resort-tile {
  gap: 14px;
  padding: 18px 20px;
  border: 1px solid var(--cx-glass-line);
  border-radius: 18px;
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
  color: var(--cx-ink);
  /* Repeats [data-reveal]'s opacity/transform timings: this selector outranks
     it, and a bare `transition: box-shadow` would kill the scroll reveal. */
  transition:
    opacity 700ms cubic-bezier(0.22, 1, 0.36, 1),
    transform 700ms cubic-bezier(0.22, 1, 0.36, 1),
    box-shadow 300ms ease,
    border-color 300ms ease;
}

.popular-section .resort-tile:hover {
  border-color: #fff;
  background: #fff;
  box-shadow: var(--cx-glass-shadow-hi);
}

.popular-section .resort-tile-name {
  font-weight: 500;
  font-size: 16px;
  letter-spacing: -0.015em;
  color: var(--cx-ink);
}

.popular-section .resort-tile-meta {
  color: var(--cx-muted);
}

.popular-section .resort-tile-arrow {
  color: var(--cx-muted);
}

.popular-section .resort-tile:hover .resort-tile-arrow {
  color: var(--cx-accent);
}

/* ── Where we are — list rows and map ────────────────────────────── */
.where-section .where-list {
  border-top: 0;
}

.where-section .where-row {
  padding: 16px 18px;
  margin-bottom: 8px;
  border-bottom: 0;
  border: 1px solid var(--cx-glass-line);
  border-radius: 16px;
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
  transition:
    opacity 700ms cubic-bezier(0.22, 1, 0.36, 1),
    transform 700ms cubic-bezier(0.22, 1, 0.36, 1),
    box-shadow 300ms ease,
    border-color 300ms ease;
}

/* The old hover shifted padding left and right, which moved every cell in the
   row; on glass the raised shadow carries it without the reflow. */
.where-section .where-row:hover,
.where-section .where-row.is-active {
  padding-left: 18px;
  padding-right: 18px;
  border-color: #fff;
  background: #fff;
  box-shadow: var(--cx-glass-shadow-hi);
}

.where-section .where-row.is-active .where-row-name {
  color: var(--cx-accent);
}

.where-section .where-row-flag {
  background: rgba(16, 29, 51, 0.05);
}

.where-section .where-row-name {
  font-size: 19px;
}

.where-section .where-row-meta,
.where-section .where-row-price-label {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  letter-spacing: 0.06em;
  color: var(--cx-muted);
}

.where-section .where-row-price-amount {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 300;
  font-size: 19px;
  color: var(--cx-ink);
  font-variant-numeric: tabular-nums;
}

.where-section .where-map-wrapper {
  border-radius: 22px;
  overflow: hidden;
  box-shadow: var(--cx-glass-shadow);
  /* Both of these resolved through --ch-* theme tokens, which on this band are
     the wrong set: in dark theme the frame was a white hairline and the
     pre-tile fill a near-black slab that flashed in before Mapbox loaded. */
  border-color: rgba(16, 29, 51, 0.08);
  background: #eef0f8;
}

/* ── Browse by country — chips as glass pills ────────────────────────
   These were background rgba(255,255,255,0.04) on a 0.12 white border: a
   white chip with a white edge on a near-white page. In dark theme that read
   as a faint frosted pill; pinned light, it was invisible. */
.browse-section .country-chip {
  padding: 12px 20px;
  border: 1px solid var(--cx-glass-line);
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
  color: var(--cx-ink);
  font-weight: 500;
}

.browse-section .country-chip:hover {
  transform: translateY(-2px);
  border-color: #fff;
  background: #fff;
  box-shadow: var(--cx-glass-shadow-hi);
  color: var(--cx-ink);
}

.browse-section .country-chip-count {
  color: var(--cx-muted);
}

/* ── Answers — FAQ cards and the alerts card ─────────────────────────
   Scoped to .answers-section: .faq-item is also on /faq and .alerts-card on
   /alerts, and neither page has been converted to this direction. */
.answers-section .faq-item {
  border: 1px solid var(--cx-glass-line);
  border-radius: 18px;
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
  transition:
    opacity 700ms cubic-bezier(0.22, 1, 0.36, 1),
    transform 700ms cubic-bezier(0.22, 1, 0.36, 1),
    box-shadow 300ms ease,
    border-color 300ms ease;
}

.answers-section .faq-item:hover,
.answers-section .faq-item.is-open {
  border-color: #fff;
  background: #fff;
  box-shadow: var(--cx-glass-shadow-hi);
}

.answers-section .faq-icon {
  color: var(--cx-accent);
}

.answers-section .faq-answer {
  color: var(--cx-muted);
}

.answers-section .alerts-card {
  border: 1px solid var(--cx-glass-line);
  border-radius: 22px;
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
}

.answers-section .alerts-eyebrow {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-size: 13px;
  letter-spacing: 0;
  text-transform: none;
  color: var(--cx-muted);
}

.answers-section .alerts-copy,
.answers-section .alerts-footnote {
  color: var(--cx-muted);
}

/* Field and button match the concierge prompt's pill, one step smaller. */
.answers-section .alerts-input {
  padding: 12px 18px;
  background: #fff;
  border: 1px solid rgba(16, 29, 51, 0.12);
  color: var(--cx-ink);
  box-shadow: 0 1px 2px rgba(16, 29, 51, 0.04);
  transition: border-color 0.2s ease, box-shadow 0.2s ease;
}

.answers-section .alerts-input::placeholder {
  color: #9aa1b4;
}

.answers-section .alerts-input:focus {
  border-color: rgba(42, 144, 199, 0.5);
  box-shadow: 0 0 0 4px rgba(42, 144, 199, 0.12);
}

/* Was #0a0a0f text on the mid-blue --ch-accent: near-black on a saturated
   blue fill, which measured 4.0:1 and sat under the 4.5:1 floor for 14px
   semibold. Navy fill with white text instead, as the prompt's submit. */
.answers-section .alerts-submit {
  padding: 13px 24px;
  background: var(--cx-ink);
  color: #fff;
  font-weight: 500;
}

.answers-section .alerts-submit:hover {
  background: #1c2a44;
}

.answers-section .alerts-success {
  background: rgba(42, 144, 199, 0.1);
  border-color: rgba(42, 144, 199, 0.3);
  color: var(--cx-accent-ink);
}

/* ── Members — benefits as glass cards ───────────────────────────── */
.members-section .members-benefits {
  padding-top: 0;
  border-top: 0;
  gap: 20px;
}

.members-section .members-benefit {
  align-items: flex-start;
  gap: 8px;
  padding: 26px 24px 28px;
  text-align: left;
  border: 1px solid var(--cx-glass-line);
  border-radius: 22px;
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
  transition:
    opacity 700ms cubic-bezier(0.22, 1, 0.36, 1),
    transform 700ms cubic-bezier(0.22, 1, 0.36, 1),
    box-shadow 300ms ease,
    border-color 300ms ease;
}

.members-section .members-benefit:hover {
  border-color: #fff;
  box-shadow: var(--cx-glass-shadow-hi);
}

/* Same numbered pill badge as the why-book-direct cards. */
.members-section .members-benefit-num {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 2rem;
  height: 2rem;
  padding: 0 0.625rem;
  margin-bottom: 2px;
  border-radius: 999px;
  background: linear-gradient(140deg, rgba(42, 144, 199, 0.16), rgba(124, 116, 214, 0.14));
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-style: normal;
  font-weight: 500;
  font-size: 12px;
  letter-spacing: 0.04em;
  font-variant-numeric: tabular-nums;
  color: var(--cx-accent-ink);
}

.members-section .members-benefit-title {
  font-size: 18px;
  margin-bottom: 4px;
}

.members-section .members-benefit-body {
  color: var(--cx-muted);
  font-size: 14.5px;
  line-height: 1.65;
  max-width: none;
}

/* Was a white pill on a near-white section — the primary action on the block
   had no edge at all. Navy, as the concierge submit. */
.members-section .members-cta {
  padding: 14px 26px;
  background: var(--cx-ink);
  color: #fff;
  font-weight: 500;
  box-shadow: 0 1px 2px rgba(16, 29, 51, 0.06), 0 14px 30px -16px rgba(16, 29, 51, 0.4);
}

.members-section .members-cta:hover {
  background: #1c2a44;
}

.members-section .members-signin {
  color: var(--cx-muted);
}

.members-section .members-signin a {
  color: var(--cx-accent-ink);
}

/* ── Host band — closes the page ─────────────────────────────────── */
.ch-hostband {
  border-top: 0;
}

.ch-hostband__title {
  font-size: clamp(1.75rem, 3.2vw, 2.6rem);
}

.ch-hostband .ch-btn--primary {
  border-radius: 999px;
  background: var(--cx-ink);
  color: #fff;
  box-shadow: 0 1px 2px rgba(16, 29, 51, 0.06), 0 14px 30px -16px rgba(16, 29, 51, 0.4);
}

.ch-hostband .ch-btn--primary:hover {
  background: #1c2a44;
}

.ch-hostband .ch-btn--ghost {
  border: 1px solid var(--cx-glass-line);
  border-radius: 999px;
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
  color: var(--cx-ink);
}

.ch-hostband .ch-btn--ghost:hover {
  border-color: #fff;
  background: #fff;
  box-shadow: var(--cx-glass-shadow-hi);
  color: var(--cx-ink);
}

/* ── Host band composition ───────────────────────────────────────────
   The band was a headline left, two buttons right, and a third of the page
   empty in between — it read as a footer strip rather than the page's last
   ask. It's now the /finder-concept composition: copy holding the centre,
   circular chalet cutouts drifting down each margin, hairlines threading
   between them, and three glass pills carrying what a host wants to know.
   Markup: <HostBand /> (server-rendered — the drift is CSS, no JS).

   Stacking inside the band, bottom to top:
     0  .ch-hostband__blooms / __threads / __cutouts   decorative
     1  .ch-hostband__pills                            content, in the margins
     2  .ch-hostband__core                             content, holds the centre

   The core's soft halo (below) is what makes the margins safe: FR/DE pills run
   up to 1.8× longer than the English, and rather than sizing everything for
   the worst case, a pill that grows far enough to reach the centre fades out
   under the halo instead of colliding with the headline.

   Below 1024px the whole decorative layer changes job: the cutouts collapse
   into an overlapping cluster above the copy and the pills drop back to
   `position: static` — which makes their inline top/left/right inert — and
   wrap into a row under the buttons. */
.ch-hostband {
  /* The cutouts sit at the section's edges and drift vertically; without this
     the outermost ones can put the page into a horizontal scrollbar. */
  overflow: hidden;
  /* --section-pad-y is 8.5rem at the top end, which on top of the stage's own
     min-height made the band nearly a full viewport of mostly empty wash. */
  padding-block: clamp(3rem, 5vw, 4.5rem);
  /* .container-large is full-bleed (max-width 1600, no gutters) — every other
     section on this page supplies the 5% rail itself via `padding: ... 5%`,
     and this band never did, so its headline used to start at x=0 on any
     viewport under 1600px. The cutouts made that obvious: at 0% inset they
     were cut in half by the section edge. */
  padding-inline: 5%;
}

/* Sits under .container-large, so the container needs its own layer. */
.ch-hostband__blooms {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background:
    radial-gradient(32rem 20rem at 78% 32%, rgba(42, 144, 199, 0.16), transparent 66%),
    radial-gradient(30rem 18rem at 12% 74%, rgba(168, 140, 220, 0.16), transparent 66%);
}

.ch-hostband > .container-large {
  position: relative;
  z-index: 1;
}

.ch-hostband__stage {
  position: relative;
}

/* ── The copy, centred ───────────────────────────────────────────── */
.ch-hostband__core {
  position: relative;
  z-index: 2;
  max-width: 44rem;
  margin-inline: auto;
  padding: clamp(0.5rem, 2vw, 1.75rem) clamp(0.5rem, 2.5vw, 2.25rem);
  text-align: center;
}

.ch-hostband__eyebrow {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-size: 13px;
  font-weight: 400;
  letter-spacing: 0;
  color: var(--cx-muted);
  margin: 0 0 0.75rem;
}

/* Onto the band's headline scale — it was clamping to 2.6rem while every
   other section on the page runs to 4.4rem, which is part of why the band
   read as a footer. The copy is three words, so it can carry the full size. */
.ch-hostband__title {
  font-size: clamp(2.1rem, 5vw, 4.4rem);
  margin: 0;
}

.ch-hostband__lede {
  max-width: 44ch;
  margin: 1rem auto 0;
}

.ch-hostband__actions {
  justify-content: center;
  margin-top: 1.75rem;
}

/* ── Pills ───────────────────────────────────────────────────────── */
.ch-hostband__pills {
  list-style: none;
  margin: 0;
  padding: 0;
}

.ch-hostband__pill {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 6px 18px 6px 6px;
  border: 1px solid var(--cx-glass-line);
  border-radius: 999px;
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-size: 14px;
  font-weight: 500;
  line-height: 1.3;
  letter-spacing: -0.005em;
  color: var(--cx-ink);
  text-align: left;
}

.ch-hostband__pill-icon {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  border-radius: 999px;
}

.ch-hostband__pill-icon svg {
  width: 16px;
  height: 16px;
}

/* Three tints, one per claim — the same set the concierge prompt uses. */
.ch-hostband__pill-icon--spark {
  background: #efecff;
  color: #6a61cc;
}

.ch-hostband__pill-icon--check {
  background: #e6f6ee;
  color: #27835a;
}

.ch-hostband__pill-icon--blue {
  background: #e9f2fb;
  color: var(--cx-accent-ink);
}

/* ── Cutouts ─────────────────────────────────────────────────────────
   Sized through a custom property set inline per circle, not through inline
   width/height — that's what lets the mobile cluster resize them without
   !important. */
.ch-hostband__cutout {
  width: var(--ch-cutout-size, 120px);
  height: var(--ch-cutout-size, 120px);
  border-radius: 50%;
  overflow: hidden;
  box-shadow:
    inset 0 0 0 1px rgba(255, 255, 255, 0.75),
    0 18px 50px -12px rgba(16, 29, 51, 0.35);
}

.ch-hostband__cutout-img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* ── Panels ──────────────────────────────────────────────────────────
   Two fragments of the product: an enquiry arriving, and a listing live on
   the site. Both are illustration — they only restate a pill, never carry a
   claim on their own — which is why they can be dropped entirely below
   1280px, where a 44rem core leaves no margin to put them in.

   Each is tilted through --ch-hb-rot. The drift keyframes below re-apply that
   rotation, because a bare `transform: translate3d()` in an animation would
   replace the tilt rather than compose with it. */
.ch-hostband__panels {
  display: none;
}

.ch-hostband__panel {
  position: absolute;
  width: min(17rem, 22%);
  padding: 14px;
  border: 1px solid var(--cx-glass-line);
  border-radius: 18px;
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.97), rgba(255, 255, 255, 0.86));
  box-shadow: var(--cx-glass-shadow-hi);
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  text-align: left;
  transform: rotate(var(--ch-hb-rot, 0deg));
  animation: ch-hostband-float-tilt 11s ease-in-out infinite;
}

.ch-hostband__panel--enquiry {
  top: 0;
  left: 2%;
}

.ch-hostband__panel--listing {
  top: 62%;
  right: 6%;
}

.ch-hostband__panel-head {
  display: flex;
  align-items: center;
  gap: 8px;
}

.ch-hostband__panel-badge {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  border-radius: 999px;
}

.ch-hostband__panel-badge svg {
  width: 15px;
  height: 15px;
}

.ch-hostband__panel-badge--check {
  background: #e6f6ee;
  color: #27835a;
}

.ch-hostband__panel-label {
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.02em;
  color: var(--cx-muted);
}

.ch-hostband__panel-message {
  margin: 10px 0 0;
  font-size: 14px;
  line-height: 1.45;
  color: var(--cx-ink);
}

/* Deliberately quieter than .ch-btn--primary. In navy it was the second
   filled dark pill in the band and pulled against "List a property", which is
   the only thing here anyone can actually click. */
.ch-hostband__panel-action {
  display: inline-block;
  margin-top: 12px;
  padding: 6px 14px;
  border: 1px solid rgba(16, 29, 51, 0.12);
  border-radius: 999px;
  background: #fff;
  font-size: 12.5px;
  font-weight: 500;
  color: var(--cx-muted);
}

.ch-hostband__panel-listing {
  display: flex;
  align-items: center;
  gap: 12px;
}

.ch-hostband__panel-thumb {
  flex: 0 0 auto;
  width: 56px;
  height: 56px;
  border-radius: 14px;
  object-fit: cover;
}

.ch-hostband__panel-live {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 11.5px;
  font-weight: 500;
  letter-spacing: 0.02em;
  color: #27835a;
}

.ch-hostband__panel-dot {
  width: 7px;
  height: 7px;
  border-radius: 999px;
  background: #2f9e6b;
  box-shadow: 0 0 0 3px rgba(47, 158, 107, 0.18);
}

.ch-hostband__panel-name {
  margin-top: 3px;
  font-size: 14px;
  font-weight: 500;
  line-height: 1.25;
  color: var(--cx-ink);
}

.ch-hostband__panel-meta {
  margin-top: 2px;
  font-size: 12px;
  color: var(--cx-muted);
}

.ch-hostband__panel-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-top: 12px;
}

.ch-hostband__panel-chip {
  padding: 4px 10px;
  border-radius: 999px;
  font-size: 11.5px;
  font-weight: 500;
}

.ch-hostband__panel-chip--spark {
  background: #efecff;
  color: #6a61cc;
}

.ch-hostband__panel-chip--blue {
  background: #e9f2fb;
  color: var(--cx-accent-ink);
}

/* ── Phones and tablets ──────────────────────────────────────────────
   Cutouts become an overlapping cluster above the copy (the first four of the
   five — any more and they shrink past recognition), and the pills wrap into a
   row under the buttons. */
@media (max-width: 1023px) {
  .ch-hostband__threads {
    display: none;
  }

  .ch-hostband__cutouts {
    display: flex;
    justify-content: center;
    margin-bottom: 1.75rem;
  }

  .ch-hostband__cutout {
    width: 74px;
    height: 74px;
    margin-left: -16px;
  }

  .ch-hostband__cutout:first-child {
    margin-left: 0;
  }

  .ch-hostband__cutout:nth-child(n + 5) {
    display: none;
  }

  .ch-hostband__pills {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 10px;
    margin-top: 1.5rem;
  }
}

/* ── Desktop: the floated composition ───────────────────────────── */
@media (min-width: 1024px) {
  .ch-hostband__stage {
    display: flex;
    align-items: center;
    /* Tall enough for five elements down each margin without the columns
       crowding: photo, pill, photo, pill, photo on the left; photo, pill,
       photo, panel on the right. */
    min-height: 600px;
  }

  .ch-hostband__core {
    /* Percentage cap as well as the rem one: at 1024–1400px a fixed 44rem
       would run into the margin bands the cutouts and pills occupy. */
    max-width: min(44rem, 52%);
    /* The halo, in the band's own wash rather than white so it has no visible
       edge. It also fades the hairlines out as they approach the centre,
       which is what stops them reading as a diagram. */
    /* #eaedf7 is the section gradient's own mid-point colour, which is the row
       the core sits on — any lighter and the halo reads as a visible plate. */
    background: radial-gradient(
      80% 86% at 50% 50%,
      rgba(234, 237, 247, 0.9) 0%,
      rgba(234, 237, 247, 0.58) 50%,
      rgba(234, 237, 247, 0) 100%
    );
  }

  .ch-hostband__threads,
  .ch-hostband__cutouts,
  .ch-hostband__pills {
    position: absolute;
    inset: 0;
    pointer-events: none;
  }

  .ch-hostband__threads,
  .ch-hostband__cutouts {
    z-index: 0;
  }

  .ch-hostband__threads {
    width: 100%;
    height: 100%;
  }

  .ch-hostband__pills {
    z-index: 1;
  }

  .ch-hostband__cutout {
    position: absolute;
    animation: ch-hostband-float 9s ease-in-out infinite;
  }

  .ch-hostband__pill {
    position: absolute;
    /* Keeps a translated pill inside its margin band; anything longer wraps
       to a second line rather than reaching for the headline. */
    max-width: min(15rem, 21%);
  }
}

/* The panels need the margin a 44rem core only leaves from ~1280px up; below
   that the bottom-right cutout (--swap) stands in for the listing panel. */
@media (min-width: 1280px) {
  .ch-hostband__panels {
    display: block;
    position: absolute;
    inset: 0;
    z-index: 1;
    pointer-events: none;
  }

  .ch-hostband__cutout--swap {
    display: none;
  }
}

@keyframes ch-hostband-float {
  0%,
  100% {
    transform: translate3d(0, 0, 0);
  }
  50% {
    transform: translate3d(0, -14px, 0);
  }
}

/* Same drift, with the panel's tilt carried through each keyframe — see the
   note on .ch-hostband__panel. */
@keyframes ch-hostband-float-tilt {
  0%,
  100% {
    transform: rotate(var(--ch-hb-rot, 0deg)) translate3d(0, 0, 0);
  }
  50% {
    transform: rotate(var(--ch-hb-rot, 0deg)) translate3d(0, -12px, 0);
  }
}

/* ── Featured chalets — header only ──────────────────────────────────
   The .chalet-ed cards in this section were already built in the
   finder-concept direction (--ed-ink/--ed-muted/--ed-accent); only the
   section header was still serif. */
.ch-home-featured .ch-section-link {
  color: var(--cx-accent-ink);
}

@media (prefers-reduced-motion: reduce) {
  .browse-section .country-chip,
  .members-section .members-cta,
  .ch-hostband .ch-btn {
    transition: none;
  }

  .browse-section .country-chip:hover,
  .members-section .members-cta:hover,
  .ch-hostband .ch-btn:hover {
    transform: none;
  }

  .ch-hostband__cutout,
  .ch-hostband__panel {
    animation: none;
  }
}

/* These three carried border-top AND border-bottom in --ch-line, which would
   now sit alongside the hairline dividers as a second, non-fading rule at
   every boundary. The dividers own the section edges. */
.where-section,
.answers-section,
.members-section {
  border-top: 0;
  border-bottom: 0;
}

/* .ch-footer carries its own full-width border-top, which landed on exactly
   the same pixel row as .ch-hostband::after — two stacked 1px lines, and the
   footer's ran full-bleed past the ends of the inset hairline.
   Scoped through the adjacent sibling so only the home page is affected:
   .ch-hostband is home-only, and every other page keeps the footer's border
   as its single divider. */
.ch-hostband + .ch-footer {
  border-top: 0;
}

/* ══════════════════════════════════════════════════════════════════════════
   RESORT HUB — converted to the home page's band direction
   Markup: src/app/[locale]/resort/[country]/[slug]/page.tsx, plus the
   <ResortGuide> and <NearbyResorts> components, which share this page's class
   vocabulary.

   The hero is deliberately untouched. Everything below it was still the
   original Webflow layer — serif .h3-heading-3 headings, .text-block-6 ledes,
   the .faq_accordion dropdowns, the .logo-slider — while the home page moved
   to the pale band: sans at weight 200, cool near-white glass on a
   lavender-grey wash, one fading hairline per section boundary.

   Every rule is scoped to .resort-page (the hook is on <main>) because none of
   these classes belong to this page: .h3-heading-3 and .paragraph-large are
   sitewide Webflow, .faq-tabs-title and .faq_accordion are shared with /faq,
   and .why-cta-chip/.why-cta-row come from the home page's why-book-direct
   block. Unscoped, this would restyle all of them.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Section rhythm and dividers ─────────────────────────────────────
   The page sits on the band's wash rather than white, and each section draws
   its own top hairline — the same self-healing arrangement as the home page
   (several of these sections render conditionally, so whichever one follows
   still marks the boundary). Inset to the content rail and faded at both ends
   so no rule terminates in a hard stub. */
.resort-page,
.search-page,
.blog-page,
.chalet-page,
.about-page,
.host-page,
.host-profile-page,
.auth-page,
.not-found-page {
  background:
    radial-gradient(42rem 18rem at 18% 12%, rgba(124, 116, 214, 0.1), transparent 66%),
    radial-gradient(38rem 16rem at 84% 62%, rgba(42, 144, 199, 0.08), transparent 66%),
    linear-gradient(180deg, #f7f8fc 0%, #f2f3fa 45%, #f7f8fc 100%);
}

.resort-page > section,
.resort-page .section-large-2,
.resort-page .section-medium {
  position: relative;
  border-top: 0;
  border-bottom: 0;
  background: transparent;
  /* --section-pad-y is 9vw — 129.6px a side at 1440, so 259px of empty wash at
     every join. That reads as generous on the home page, whose sections carry
     600–900px of content each; here the guide, hosts and popular-search blocks
     are 257–567px, so half of each section was padding and the page read as
     sparse rather than airy. Roughly halved, which keeps the band's rhythm
     without the holes. */
  padding-block: clamp(2.75rem, 4.5vw, 4.25rem);
}

/* #resort-about / #resort-facet-copy set their own padding at ID specificity
   further up the file. */
.resort-page #resort-about,
.resort-page #resort-facet-copy {
  padding-block: clamp(2.75rem, 4.5vw, 4.25rem);
}

.resort-page > section + section::before {
  content: '';
  position: absolute;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  width: min(100% - 2 * max(1.25rem, 5%), 1600px);
  height: 1px;
  background: linear-gradient(
    90deg,
    transparent 0%,
    rgba(16, 29, 51, 0.16) 16%,
    rgba(16, 29, 51, 0.16) 84%,
    transparent 100%
  );
  pointer-events: none;
}

/* ── Headings and body copy ──────────────────────────────────────────
   Fraunces 400 out, Inter Tight 200 in, on the band's type scale. The
   #resort-about / #resort-facet-copy rules further up this file are
   ID-specificity, so those headings have to be named explicitly to be
   overridden. */
.resort-page .h3-heading-3,
.resort-page #resort-about .h3-heading-3,
.resort-page #resort-facet-copy .h3-heading-3,
.resort-page .h1-heading {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  font-size: clamp(2rem, 4vw, 3.4rem);
  line-height: 1.06;
  letter-spacing: -0.035em;
  color: var(--cx-ink);
}

.resort-page .h3-heading-3 em,
.resort-page .h1-heading em {
  font-style: normal;
  font-weight: inherit;
  color: var(--cx-accent);
}

/* The section lede: 13px sentence case, not 12px uppercase with tracking. */
.resort-page .text-block-6,
.resort-page .body-x-large {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-size: 15px;
  font-weight: 400;
  letter-spacing: 0;
  text-transform: none;
  line-height: 1.6;
  color: var(--cx-muted);
}

.resort-page .paragraph-x-large-2,
.resort-page #resort-about .paragraph-x-large-2,
.resort-page #resort-facet-copy .paragraph-x-large-2,
.resort-page .paragraph-large {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-size: 16.5px;
  line-height: 1.68;
  color: var(--cx-muted);
}

.resort-page .paragraph-x-large-2 strong,
.resort-page #resort-about .paragraph-x-large-2 strong,
.resort-page #resort-facet-copy .paragraph-x-large-2 strong {
  color: var(--cx-ink);
  font-weight: 500;
}

/* Sub-headings inside the popular-search panes, and the guide's section
   titles: sans 500, and without the h3 underline ch-2026.css applies. */
.resort-page .subheading-small,
.resort-page .ch-post__section-title {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 500;
  font-size: 17px;
  letter-spacing: -0.015em;
  color: var(--cx-ink);
  border-bottom: 0;
  padding-bottom: 0;
}

.resort-page .faq-tabs-title {
  margin-bottom: 34px;
}

/* ── Chips (about, guide, nearby) ────────────────────────────────────
   The same glass pill as the home page's why-book-direct row; that treatment
   is scoped to .why-section there, so it has to be restated here. */
.resort-page .why-cta-chip,
.not-found-page .why-cta-chip {
  padding: 12px 20px;
  border: 1px solid var(--cx-glass-line);
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
  color: var(--cx-ink);
  font-weight: 500;
}

.resort-page .why-cta-chip:hover,
.not-found-page .why-cta-chip:hover {
  transform: translateY(-2px);
  border-color: #fff;
  background: #fff;
  box-shadow: var(--cx-glass-shadow-hi);
  color: var(--cx-ink);
}

.resort-page .why-cta-chip span,
.not-found-page .why-cta-chip span {
  color: var(--cx-accent-ink);
}

.resort-page .why-cta-chip--primary,
.not-found-page .why-cta-chip--primary {
  border-color: transparent;
  background: var(--cx-ink);
  color: #fff;
  box-shadow: 0 1px 2px rgba(16, 29, 51, 0.06), 0 14px 30px -16px rgba(16, 29, 51, 0.4);
}

.resort-page .why-cta-chip--primary:hover,
.not-found-page .why-cta-chip--primary:hover {
  background: #1c2a44;
  border-color: transparent;
  color: #fff;
}

.resort-page .why-cta-chip--primary span,
.not-found-page .why-cta-chip--primary span {
  color: #fff;
}

/* ── Featured chalets — four across ──────────────────────────────────
   The editorial card is shared with the home page; only the column count
   differs. Four holds to 1400px, then steps down so a card never goes narrower
   than about 260px, which is where its name starts wrapping to three lines. */
.product-grid--editorial-4 {
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 28px;
}

@media (max-width: 1399px) {
  .product-grid--editorial-4 {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

@media (max-width: 1099px) {
  .product-grid--editorial-4 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 599px) {
  .product-grid--editorial-4 {
    grid-template-columns: 1fr;
    gap: 24px;
  }
}

/* Every editorial card is an <a> (TrackedChaletLink) — resort hub, home page
   and search results alike — so the anchor's underline has to go and its
   colour has to be the card's ink rather than whatever it inherits (#111827
   from the page). */
.chalet-ed--anchor {
  color: var(--ed-ink);
  text-decoration: none;
}

/* Two adjustments for four-up. The home page's cards are ~490px wide in a
   three-column grid; these are ~300px, where the shared card's 33px name and
   28px gutters are out of proportion — and its type scale is set in vw, so it
   doesn't come down on its own. */
.product-grid--editorial-4 .chalet-ed__name {
  font-size: clamp(19px, 1.45vw, 23px);
  margin-bottom: 10px;
}

/* The shared body has no top padding: on the home page the host-logo badge
   straddles the photo edge and provides that separation. This card carries no
   badge (the resort endpoint doesn't return the host), so without a top pad
   the name would sit flush against the photograph. */
.product-grid--editorial-4 .chalet-ed__body {
  padding: 20px 20px 22px;
}

/* Availability rows — the one thing the resort card carries that the home
   page's doesn't. Hairline-separated, tabular figures so the prices align
   down the column. */
.chalet-ed__avail {
  list-style: none;
  margin: 14px 0 0;
  padding: 0;
  border-top: 1px solid var(--ed-hairline, rgba(16, 29, 51, 0.14));
}

.chalet-ed__avail li {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 10px;
  padding: 8px 0;
  border-bottom: 1px solid var(--ed-hairline, rgba(16, 29, 51, 0.14));
}

.chalet-ed__avail-range {
  font-size: 11.5px;
  letter-spacing: 0.06em;
  color: var(--ed-muted, #69718a);
}

.chalet-ed__avail-price {
  font-weight: 500;
  font-size: 14px;
  font-variant-numeric: tabular-nums;
  color: var(--ed-ink, #101d33);
  white-space: nowrap;
}

/* Availability badge over the photograph (last-minute / offer). */
.chalet-ed__tag {
  position: absolute;
  inset: 12px auto auto 12px;
  z-index: 2;
  padding: 5px 12px;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.94);
  box-shadow: 0 1px 2px rgba(16, 29, 51, 0.08);
  font-size: 11.5px;
  font-weight: 500;
  letter-spacing: 0.02em;
  color: var(--ed-ink, #101d33);
}

/* ── Trusted hosts ───────────────────────────────────────────────────
   The Webflow slider keeps its markup and JS; the slides become glass tiles
   and the arrows/dots lose the default chrome. */
.resort-page .logo-slider {
  background: transparent;
}

/* The grid is eight fixed 141px columns sitewide, so a resort with one host
   put a small tile at the far left of a 1296px row with the rest empty — which
   read as a broken layout rather than a short list. Auto-fit and centred: one
   host centres, a full roster still fills the row. */
.resort-page .logo-slider-grid {
  grid-template-columns: repeat(auto-fit, minmax(150px, 170px));
  justify-content: center;
}

/* Solid white, not the band's translucent glass and not the #f6f4ef these
   tiles carry sitewide: that warm off-white was chosen to be "softer than pure
   #fff against the dark page", and host logos are artwork drawn for a white
   background — on a tinted tile the transparent PNGs pick up the cast. The
   hairline and shadow come from the band so the tile still belongs to it. */
.resort-page .logo-slider-grid .logo-card {
  background: #fff;
  border: 1px solid rgba(16, 29, 51, 0.08);
  border-radius: 18px;
  box-shadow: var(--cx-glass-shadow);
}

/* The sitewide hover shadow is 0.35 black, tuned for the dark page. */
.resort-page .logo-slider-grid .logo-card:hover {
  box-shadow: var(--cx-glass-shadow-hi);
}

/* Drop the contrast filter, which was drawing a grey rectangle behind every
   logo on this page.

   The sitewide rule carries `filter: grayscale(0.85) contrast(0.95)`. Contrast
   scales each channel away from mid-grey, so it moves white DOWN: 1.0 becomes
   (1.0 - 0.5) × 0.95 + 0.5 = 0.975, i.e. #F9F9F9. That is invisible on the
   #f6f4ef tile the filter was tuned against, and obvious on this page's #fff
   tile.

   It shows at all because these assets are not the transparent PNGs the tile
   comment above assumes — More Mountain's is an opaque 512×512 WebP in RGB
   with no alpha channel, so the "background" being tinted is real pixels, and
   the logo reads as a grey square floating on a white card.

   grayscale() and opacity are left alone: neither can shift a white pixel
   (grey 255 is still 255, and white at 90% over white is still white), so they
   cost nothing here and the row keeps its tonal treatment and hover. */
.resort-page .logo-slider-grid .logo-image-large {
  filter: grayscale(0.85);
}
.resort-page .logo-slider-grid .logo-card:hover .logo-image-large {
  filter: grayscale(0);
}

.resort-page .logo-arrow {
  color: var(--cx-muted);
}

.resort-page .logo-slide-navigation {
  color: var(--cx-accent);
}

/* ── Popular searches ────────────────────────────────────────────────
   Each pane becomes one glass card. The dashed SVG rule inside the pane is a
   Webflow artifact that reads as a second, competing divider next to the
   card's own edge — hidden, and the header keeps a hairline instead. */
.resort-page .faq-pane-wrapper {
  padding: 26px 24px 20px;
  border: 1px solid var(--cx-glass-line);
  border-radius: 22px;
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
}

.resort-page .faq-pane-wrapper .horizontal-divider {
  display: none;
}

.resort-page .faq-tab-header {
  padding-bottom: 14px;
  margin-bottom: 6px;
  border-bottom: 1px solid rgba(16, 29, 51, 0.1);
}

.resort-page .location-link {
  color: var(--cx-ink);
  border-bottom: 1px solid rgba(16, 29, 51, 0.08);
}

.resort-page .location-link:hover {
  color: var(--cx-accent-ink);
}

/* ── FAQs ────────────────────────────────────────────────────────────
   Same glass accordion as the home page's "before you book" block. The
   Webflow dropdown behaviour is untouched — only the surface changes. */
.resort-page .faq_accordion {
  margin-bottom: 12px;
  border: 1px solid var(--cx-glass-line);
  border-radius: 18px;
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
  overflow: hidden;
  transition: box-shadow 0.3s ease, border-color 0.3s ease;
}

.resort-page .faq_accordion:hover {
  border-color: #fff;
  box-shadow: var(--cx-glass-shadow-hi);
}

.resort-page .faq_question {
  padding: 18px 22px;
  background: transparent;
  border: 0;
}

.resort-page .faq_question .body-large {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 500;
  font-size: 16.5px;
  letter-spacing: -0.015em;
  color: var(--cx-ink);
}

.resort-page .faq_arrow {
  color: var(--cx-accent);
}

.resort-page .faq_content {
  padding: 0 22px 20px;
}

.resort-page .faq_content .body-medium {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-size: 15.5px;
  line-height: 1.65;
  color: var(--cx-muted);
}

@media (prefers-reduced-motion: reduce) {
  .resort-page .why-cta-chip,
  .not-found-page .why-cta-chip,
  .resort-page .faq_accordion {
    transition: none;
  }

  .resort-page .why-cta-chip:hover,
  .not-found-page .why-cta-chip:hover {
    transform: none;
  }
}

/* The cluster-article list, when any are published. */
.resort-page .resort-guide__plan {
  margin-top: 34px;
  padding-top: 26px;
  border-top: 1px solid rgba(16, 29, 51, 0.1);
}

.resort-page .ch-post__related {
  list-style: none;
  margin: 14px 0 0;
  padding: 0;
  display: grid;
  gap: 10px;
}

.resort-page .ch-post__related a {
  font-weight: 500;
  color: var(--cx-ink);
}

.resort-page .ch-post__related a:hover {
  color: var(--cx-accent-ink);
}

.resort-page .ch-post__related-sub {
  color: var(--cx-muted);
}

/* ── Search results in the pale style ────────────────────────────────
   /search-chalets on the same treatment as the resort hub: --cx-* tokens and
   the wash come from the shared blocks above, this part restyles the results
   furniture the page doesn't share with anything else.

   Everything is scoped to .search-page on purpose. .product-grid, .chalet-card
   and .search-* are Webflow/legacy classes shared with the favourites page,
   the homepage featured grid and the host dashboard, all of which still run
   the dark treatment. */

/* The editorial card, same as the home page's featured grid.
   .product-grid--editorial is already 3 / 2 / 1 across with its own gap, so
   nothing here needs to restate the columns.

   Fixed layout: every row as tall as the tallest card in it, so the photos
   line up across the grid regardless of how long a name ran or whether a card
   has a category line. .chalet-ed is already height: 100%, so cards fill it. */
.search-page .product-grid--editorial {
  grid-auto-rows: 1fr;
}

@media (max-width: 767px) {
  .search-page .product-grid--editorial {
    /* One per row: equal heights would pad every short card up to the tallest
       on the page. */
    grid-auto-rows: auto;
  }
}


/* ── Results header ──────────────────────────────────────────────── */

.search-page .search-results-header {
  border-bottom: 1px solid rgba(16, 29, 51, 0.12);
}

.search-page .search-results-count {
  font-size: 15px;
  color: var(--cx-muted);
}

.search-page .search-results-count strong {
  font-weight: 500;
  color: var(--cx-ink);
}

/* Was near-black on #1a1a1e from the dark treatment — invisible on the wash. */
.search-page .search-sort-select,
.search-page .search-share-btn {
  background-color: rgba(255, 255, 255, 0.9);
  border: 1px solid rgba(16, 29, 51, 0.14);
  color: var(--cx-ink);
}

.search-page .search-sort-select:hover,
.search-page .search-share-btn:hover {
  border-color: rgba(16, 29, 51, 0.3);
}

.search-page .search-empty,
.search-page .search-clear-all,
.search-page .search-page-info {
  /* #9b9ba1 was a dark-treatment grey; on the wash it read at 2.56:1. */
  color: var(--cx-muted);
}

.search-page .search-empty h3 {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  color: var(--cx-ink);
}

/* Skeletons, so the loading state doesn't flash dark blocks on the wash. */
.search-page .search-skeleton-card {
  background: transparent;
  box-shadow: none;
}

.search-page .search-skeleton-image {
  aspect-ratio: 16 / 10;
  height: auto;
  background: #e9ecf5;
}

.search-page .search-skeleton-text {
  background: #e9ecf5;
}

/* ── Search chrome on the wash ───────────────────────────────────────
   The sticky rail, the mobile trigger and the mobile sheet were all built
   for the dark treatment and are near-black. On the pale wash the stuck rail
   reads as a black band across the top of the results.

   These carry !important because the rules they override do — and match or
   beat their specificity (#search-rail.is-stuck is 1-1-0, so the scoped
   .search-page #search-rail.is-stuck is 1-2-0). */
.search-page #search-rail.is-stuck {
  background: rgba(247, 248, 252, 0.82) !important;
  backdrop-filter: saturate(140%) blur(12px);
  -webkit-backdrop-filter: saturate(140%) blur(12px);
  box-shadow: 0 10px 30px -18px rgba(16, 29, 51, 0.4) !important;
  border-bottom: 1px solid rgba(16, 29, 51, 0.08);
}

@media screen and (max-width: 767px) {
  /* The collapsed pill that replaces the bar on mobile. */
  .search-page .resort-search-trigger {
    background: rgba(255, 255, 255, 0.92);
    border: 1px solid rgba(16, 29, 51, 0.14);
    color: var(--cx-ink);
    box-shadow: 0 10px 28px -18px rgba(16, 29, 51, 0.4);
  }

  .search-page .resort-search-trigger__text {
    color: var(--cx-muted);
  }

  /* The full-screen sheet the pill opens. */
  .search-page #search-rail.is-msearch-open {
    background: #f7f8fc !important;
  }

  .search-page #search-rail.is-msearch-open .resort-search-sheet-title {
    color: var(--cx-ink);
  }
}

/* ── Filters modal in the pale style ─────────────────────────────────
   Portalled to <body>, so .search-page can't reach it — these override the
   dark values in place rather than scoping. Safe to do globally: the modal
   markup exists only in SearchClient, which is the page being restyled.

   Kept at the same specificity as the originals and placed after them, so
   they win on order without needing !important. */
.filter-modal-backdrop {
  background: rgba(16, 29, 51, 0.42);
  backdrop-filter: saturate(120%) blur(6px);
  -webkit-backdrop-filter: saturate(120%) blur(6px);
}

.filter-modal {
  background: #f7f8fc;
  border: 1px solid rgba(16, 29, 51, 0.1);
  box-shadow: 0 40px 90px -40px rgba(16, 29, 51, 0.55);
}

.filter-modal-header {
  border-bottom: 1px solid rgba(16, 29, 51, 0.1);
}

.filter-modal-title {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-size: 22px;
  font-weight: 200;
  letter-spacing: -0.02em;
  color: #101d33;
}

.filter-modal-close {
  background: rgba(16, 29, 51, 0.06);
  color: #101d33;
}

.filter-modal-close:hover {
  background: rgba(16, 29, 51, 0.12);
}

.filter-modal-empty {
  color: #666e87;
}

/* The same uppercase meta treatment the cards use for their region line. */
.filter-modal-section-title {
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: 1.3px;
  color: #666e87;
}

.filter-modal-chip {
  border: 1px solid rgba(16, 29, 51, 0.14);
  background: rgba(255, 255, 255, 0.86);
  color: #101d33;
}

.filter-modal-chip:hover {
  background: #fff;
  border-color: rgba(16, 29, 51, 0.3);
}

/* Selected chips stay the inverse of the surface, as before — now dark on
   pale rather than white on dark. */
.filter-modal-chip.is-active {
  background: #101d33;
  color: #f7f8fc;
  border-color: #101d33;
}

.filter-modal-chip-count {
  opacity: 0.55;
}

.filter-modal-footer {
  border-top: 1px solid rgba(16, 29, 51, 0.1);
}

.filter-modal-clear {
  color: #666e87;
}

.filter-modal-clear:hover {
  color: #101d33;
}

.filter-modal-apply {
  background: #101d33;
  color: #f7f8fc;
  font-weight: 500;
}

.filter-modal-apply:hover {
  background: #1d2f4d;
}

/* ── Blog in the pale style ──────────────────────────────────────────
   The journal index and both article templates. --cx-* tokens and the wash
   come from the shared blocks above; this is the furniture on top.

   Scoped to .blog-page throughout: .ch-card, .ch-prose and .ch-post-* are
   shared with other editorial pages that haven't moved yet. */

/* ── Index: header ────────────────────────────────────────────────── */

/* The display serif goes, as it did everywhere else in the pale style.
   Stated with the family and weight together because custom.css forces a
   serif onto every h1–h6 further up. */
.blog-page .ch-heading,
.blog-page .ch-postheader__title {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  letter-spacing: -0.035em;
  line-height: 1.06;
  color: var(--cx-ink);
}

.blog-page .ch-heading em {
  font-style: normal;
  /* The display accent only reaches 3.28:1 on the wash; --cx-accent-ink is
     the variant that exists for accent text, as its own comment explains. */
  color: var(--cx-accent-ink);
}

.blog-page .ch-eyebrow,
.blog-page .ch-postheader__eyebrow {
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: 1.3px;
  text-transform: uppercase;
  color: var(--cx-muted);
}

.blog-page .ch-lede {
  color: var(--cx-muted);
}

/* ── Index: cards ─────────────────────────────────────────────────── */

.blog-page .ch-card-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 32px;
  /* Fixed layout: rows as tall as their tallest card, so the images line up
     across the grid however long a title or excerpt runs. */
  grid-auto-rows: 1fr;
  list-style: none;
  margin: 0;
  padding: 0;
}

@media (max-width: 1199px) {
  .blog-page .ch-card-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 767px) {
  .blog-page .ch-card-grid {
    grid-template-columns: 1fr;
    grid-auto-rows: auto;
  }
}

/* Photo to the card edges, then a tinted panel under it. Square corners and
   no shadow — the panel's tint is what separates the card from the wash. */
.blog-page .ch-card {
  height: 100%;
  background: transparent;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  overflow: hidden;
}

.blog-page .ch-card__link {
  display: flex;
  flex-direction: column;
  height: 100%;
  text-decoration: none;
  color: inherit;
}

.blog-page .ch-card__media {
  position: relative;
  aspect-ratio: 16 / 10;
  width: 100%;
  border-radius: 0;
  overflow: hidden;
  background: #e9ecf5;
}

.blog-page .ch-card__media img {
  object-fit: cover;
  transition: transform 0.5s ease;
}

.blog-page .ch-card__link:hover .ch-card__media img {
  transform: scale(1.03);
}

.blog-page .ch-card__body {
  display: flex;
  flex-direction: column;
  flex: 1;
  gap: 0;
  padding: 22px 24px 26px;
  background: rgba(255, 255, 255, 0.72);
  border-radius: 0;
}

/* Category left, date right, with a short rule beneath. */
.blog-page .ch-card__meta {
  position: relative;
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
  padding-bottom: 16px;
  margin-bottom: 18px;
}

.blog-page .ch-card__meta::after {
  content: '';
  position: absolute;
  left: 0;
  bottom: 0;
  width: 38px;
  height: 2px;
  background: var(--cx-accent);
}

.blog-page .ch-card__cat,
.blog-page .ch-card__date {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 1.3px;
  text-transform: uppercase;
  line-height: 1.4;
}

.blog-page .ch-card__cat {
  color: var(--cx-accent-ink);
}

.blog-page .ch-card__date {
  flex: 0 0 auto;
  color: var(--cx-muted);
}

.blog-page .ch-card__title {
  margin: 0 0 12px;
  border: 0;
  padding: 0;
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-size: clamp(19px, 1.5vw, 23px);
  font-weight: 200;
  line-height: 1.15;
  letter-spacing: -0.03em;
  color: var(--cx-ink);
}

.blog-page .ch-card__excerpt {
  margin: 0;
  font-size: 14.5px;
  line-height: 1.6;
  color: var(--cx-muted);
}

/* ── Index: resort cluster cards ──────────────────────────────────── */

.blog-page .ch-cluster-card {
  padding: 26px 28px 28px;
  background: rgba(255, 255, 255, 0.72);
  border-radius: 0;
}

.blog-page .ch-post__section-title {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  letter-spacing: -0.03em;
  color: var(--cx-ink);
}

/* ── Article header ───────────────────────────────────────────────── */

/* Words in a narrow left column, photograph filling the right and running off
   the edge of the viewport. Asymmetric on purpose: the text column is sized
   for a comfortable measure at this type size, and the image takes whatever
   is left rather than the two splitting evenly.

   The left padding reproduces .ch-container's rail — padding-inline of
   max(1.25rem, 5%) against a 100rem cap — so the title starts on the same
   vertical line as the navbar and the body copy below. There is no right
   padding: the bleed is the point. */
.blog-page .ch-postheader {
  display: grid;
  grid-template-columns: minmax(0, 27rem) minmax(0, 1fr);
  align-items: center;
  gap: clamp(2rem, 4vw, 4.5rem);
  /* No top padding: the photograph runs flush to the underside of the navbar,
     as in the reference. The text column is vertically centred against it, so
     it doesn't need the padding to sit away from the top either. */
  padding-top: 0;
  padding-bottom: clamp(2rem, 4vw, 3.5rem);
  padding-left: max(max(1.25rem, 5%), calc((100% - 100rem) / 2));
  padding-right: 0;
}

/* No photograph: nothing to bleed to, so the header returns to the rail and
   the text sits in a normal measure. */
.blog-page .ch-postheader--noimage {
  grid-template-columns: minmax(0, 46rem);
  /* Nothing to run flush to the navbar here, so the top spacing comes back. */
  padding-top: clamp(2rem, 4vw, 3.5rem);
  padding-right: max(max(1.25rem, 5%), calc((100% - 100rem) / 2));
  padding-bottom: clamp(1.5rem, 3vw, 2.5rem);
}

.blog-page .ch-postheader__text {
  min-width: 0;
}

.blog-page .ch-postheader__nav {
  margin-bottom: 26px;
}

.blog-page .ch-postheader__back {
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: 1.3px;
  text-transform: uppercase;
  color: var(--cx-muted);
  text-decoration: none;
}

.blog-page .ch-postheader__back:hover {
  color: var(--cx-ink);
}

.blog-page .ch-postheader__title {
  margin: 0;
  font-size: clamp(2rem, 3.4vw, 3rem);
}

.blog-page .ch-postheader__lede {
  margin: 18px 0 0;
  font-size: 16.5px;
  line-height: 1.6;
  color: var(--cx-muted);
}

/* Category and date on one line, with the hairline under them separating the
   headline block from the byline. */
.blog-page .ch-postheader__meta {
  display: flex;
  align-items: baseline;
  gap: 18px;
  margin: 24px 0 0;
  padding-bottom: 18px;
  border-bottom: 1px solid rgba(16, 29, 51, 0.14);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 1.3px;
  text-transform: uppercase;
}

.blog-page .ch-postheader__cat {
  color: var(--cx-accent-ink);
}

.blog-page .ch-postheader__date {
  color: var(--cx-muted);
}

.blog-page .ch-postheader__reading-time {
  color: var(--cx-muted);
}

.blog-page .ch-postheader__byline {
  display: flex;
  flex-direction: column;
  gap: 4px;
  margin: 18px 0 0;
}

.blog-page .ch-postheader__byline-label {
  font-size: 13px;
  color: var(--cx-muted);
}

.blog-page .ch-postheader__byline-name {
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: 1.3px;
  text-transform: uppercase;
  color: var(--cx-accent-ink);
}

.blog-page .ch-postheader__media {
  position: relative;
  /* Was 4/3, which at this column width ran ~660px tall and pushed the body
     copy well below the fold. 16/9 is the same width for three quarters of
     the height (w x 0.5625 against w x 0.75). */
  aspect-ratio: 16 / 9;
  min-height: 18rem;
  margin: 0;
  overflow: hidden;
  background: #e9ecf5;
}

.blog-page .ch-postheader__image {
  object-fit: cover;
}

/* Stacked below the split's breakpoint: image first, then the words, so the
   photograph still opens the article. */
@media (max-width: 899px) {
  .blog-page .ch-postheader {
    grid-template-columns: 1fr;
    gap: 2rem;
    padding-left: max(1.25rem, 5%);
    padding-right: max(1.25rem, 5%);
  }

  .blog-page .ch-postheader__text {
    order: 2;
  }

  .blog-page .ch-postheader__media {
    order: 1;
    aspect-ratio: 16 / 10;
    min-height: 0;
    /* Full-bleed across the stacked layout rather than inset by the gutter. */
    width: 100vw;
    margin-left: calc(50% - 50vw);
  }
}

/* ── Article body ─────────────────────────────────────────────────── */

.blog-page .ch-prose {
  color: var(--cx-ink);
}

.blog-page .ch-prose p,
.blog-page .ch-prose li {
  color: var(--cx-muted);
  font-size: 16.5px;
  line-height: 1.75;
}

.blog-page .ch-prose li::marker {
  color: var(--cx-muted);
}

.blog-page .ch-prose h2,
.blog-page .ch-prose h3 {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  letter-spacing: -0.03em;
  color: var(--cx-ink);
}

.blog-page .ch-prose h2 {
  font-size: clamp(24px, 2.2vw, 31px);
  margin-top: 2.2em;
}

.blog-page .ch-prose h3 {
  font-size: clamp(19px, 1.6vw, 23px);
  margin-top: 1.8em;
}

.blog-page .ch-prose strong {
  color: var(--cx-ink);
  font-weight: 500;
}

.blog-page .ch-prose a {
  color: var(--cx-ink);
  text-decoration: underline;
  text-decoration-color: color-mix(in srgb, var(--cx-ink) 35%, transparent);
  text-underline-offset: 0.18em;
}

.blog-page .ch-prose a:hover {
  text-decoration-color: var(--cx-ink);
}

.blog-page .ch-prose th,
.blog-page .ch-prose td {
  border-bottom-color: rgba(16, 29, 51, 0.14);
}

.blog-page .ch-prose th {
  color: var(--cx-ink);
}

/* ── Article sidebar ─────────────────────────────────────────────────
   Square corners and the glass-card tint used everywhere else in the pale
   style (matches .ch-card__body, .ch-cluster-card). */
.blog-page .ch-postbody__card {
  background: rgba(255, 255, 255, 0.72);
}

.blog-page .ch-postbody__card-eyebrow {
  color: var(--cx-accent-ink);
}

.blog-page .ch-postbody__card-title {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  color: var(--cx-ink);
}

.blog-page .ch-postbody__card-copy {
  color: var(--cx-muted);
}

.blog-page .ch-postbody__card-cta {
  color: #fff;
  background: var(--cx-ink);
}

.blog-page .ch-postbody__card-cta:hover {
  background: #1c2a44;
}

/* The generic newsletter box, squared off and glass-tinted to match the
   other cards on this page. Base .newsletter-signup is a centred, dark-theme
   band (see the NEWSLETTER section above) built for a full-width section, so
   this overrides layout as well as colour for the narrow sidebar rail. */
.blog-page .newsletter-signup {
  align-items: flex-start;
  text-align: left;
  gap: 1rem;
  padding: 26px 28px 28px;
  max-width: none;
  border: 1px solid var(--cx-glass-line);
  border-radius: 0;
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
}

.blog-page .newsletter-title {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  font-size: 22px;
  letter-spacing: -0.03em;
  color: var(--cx-ink);
}

.blog-page .newsletter-sub {
  font-size: 14px;
  color: var(--cx-muted);
}

.blog-page .newsletter-form {
  flex-direction: column;
  align-items: stretch;
  max-width: none;
}

.blog-page .newsletter-input {
  background: #fff;
  border: 1px solid rgba(16, 29, 51, 0.12);
  color: var(--cx-ink);
}

.blog-page .newsletter-input::placeholder {
  color: #9aa1b4;
}

.blog-page .newsletter-input:focus {
  border-color: rgba(42, 144, 199, 0.5);
  box-shadow: 0 0 0 4px rgba(42, 144, 199, 0.12);
}

.blog-page .newsletter-submit {
  background: var(--cx-ink);
  color: #fff;
}

.blog-page .newsletter-submit:hover {
  background: #1c2a44;
}

.blog-page .newsletter-success {
  background: rgba(42, 144, 199, 0.1);
  border-color: rgba(42, 144, 199, 0.3);
  color: var(--cx-accent-ink);
}

.blog-page .ch-post__crumb,
.blog-page .ch-post__eyebrow,
.blog-page .ch-post__back {
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: 1.3px;
  text-transform: uppercase;
  color: var(--cx-muted);
}

.blog-page .ch-post__crumb a,
.blog-page .ch-post__back a {
  color: var(--cx-muted);
}

.blog-page .ch-post__crumb a:hover,
.blog-page .ch-post__back a:hover {
  color: var(--cx-ink);
}

.blog-page .ch-post__title {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  letter-spacing: -0.035em;
  line-height: 1.06;
  color: var(--cx-ink);
}

.blog-page .ch-post__lede {
  color: var(--cx-muted);
}

/* ── Chalet detail in the pale style ─────────────────────────────────
   --cx-* tokens and the wash come from the shared blocks above; this is the
   furniture on top. Scoped to .chalet-page: .ch-chalet__*, .ch-host-card and
   .ch-similar are shared with the host profile page, which now has its own
   pale rules for the same classes under .host-profile-page below. */

/* ── Type ─────────────────────────────────────────────────────────── */

/* Fraunces out, body sans at 200 in, as everywhere else in the pale style.
   The family has to be restated because custom.css forces a serif onto every
   h1–h6 further up the file. */
.chalet-page .ch-chalet__title,
.chalet-page .ch-chalet__section-title,
.chalet-page .ch-chalet__fact-num,
.chalet-page .ch-chalet__host-name,
.chalet-page .ch-host-card__name {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  letter-spacing: -0.03em;
  color: var(--cx-ink);
}

.chalet-page .ch-chalet__title {
  letter-spacing: -0.035em;
  line-height: 1.06;
}

.chalet-page .ch-chalet__section-title {
  border-bottom-color: rgba(16, 29, 51, 0.14);
}

/* The uppercase meta treatment the cards and facet pages use. */
.chalet-page .ch-chalet__eyebrow,
.chalet-page .ch-chalet__card-eyebrow,
.chalet-page .ch-chalet__crumb,
.chalet-page .ch-chalet__fact-label,
.chalet-page .ch-chalet__feature-type,
.chalet-page .ch-host-card__resort {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 1.3px;
  text-transform: uppercase;
}

.chalet-page .ch-chalet__eyebrow,
.chalet-page .ch-chalet__card-eyebrow,
.chalet-page .ch-host-card__resort {
  color: var(--cx-accent-ink);
}

.chalet-page .ch-chalet__crumb,
.chalet-page .ch-chalet__fact-label,
.chalet-page .ch-chalet__feature-type {
  color: var(--cx-muted);
}

.chalet-page .ch-chalet__crumb a:hover {
  color: var(--cx-ink);
}

.chalet-page .ch-chalet__prose,
.chalet-page .ch-chalet__prose p,
.chalet-page .ch-chalet__host-bio,
.chalet-page .ch-chalet__card-copy,
.chalet-page .ch-chalet__feature,
.chalet-page .ch-chalet__faq-a {
  color: var(--cx-muted);
}

.chalet-page .ch-chalet__faq-q {
  color: var(--cx-ink);
}

/* ── Surfaces ─────────────────────────────────────────────────────── */

/* Square corners and a white panel, matching .chalet-ed and the blog cards.
   The old 18px radius and 2%-white fill were built for the dark treatment
   and read as barely-there grey boxes on the wash. */
.chalet-page .ch-chalet__card,
.chalet-page .ch-host-card__link {
  background: rgba(255, 255, 255, 0.72);
  border: 1px solid rgba(16, 29, 51, 0.1);
  border-radius: 0;
}

.chalet-page .ch-host-card__link:hover {
  background: #fff;
  border-color: rgba(16, 29, 51, 0.22);
}

/* Square the big surfaces — the gallery figure, its tiles and the map — to
   match the cards. Controls keep their radius: the pale style squares panels
   and photography, not buttons (the filters modal's apply button is 12px). */
.chalet-page .ch-chalet__hero,
.chalet-page .ch-chalet__thumb,
.chalet-page .ch-gallery__tile,
.chalet-page .ch-chalet__map,
.chalet-page .ch-chalet__host-logo,
.chalet-page .ch-avail__empty,
.chalet-page .ch-host-card__media,
.chalet-page .ch-host-card__img {
  border-radius: 0;
}

/* Image placeholders were #020617 — near-black behind every photo, which on
   the wash flashes as a dark block until the image decodes. The same pale
   grey the other cards use. */
.chalet-page .ch-chalet__hero,
.chalet-page .ch-chalet__thumb,
.chalet-page .ch-gallery__tile,
.chalet-page .ch-host-card__media {
  background-color: #e9ecf5;
}

.chalet-page .ch-chalet__host-logo {
  background: #fff;
  border: 1px solid rgba(16, 29, 51, 0.1);
}

/* ── Controls ─────────────────────────────────────────────────────── */

.chalet-page .ch-btn--secondary {
  background: rgba(255, 255, 255, 0.86);
  border: 1px solid rgba(16, 29, 51, 0.16);
  color: var(--cx-ink);
}

.chalet-page .ch-btn--secondary:hover {
  background: #fff;
  border-color: rgba(16, 29, 51, 0.3);
}

/* Links that sit on the page background. .ch-chalet__see-all is deliberately
   NOT in this list: it is an overlay button on a translucent black pill over
   a photograph, so it keeps a near-white label. Giving it the accent put dark
   blue on a dark scrim at 2.5:1. */
.chalet-page .ch-link-soft,
.chalet-page .ch-chalet__back {
  color: var(--cx-accent-ink);
}

.chalet-page .ch-chalet__feature-tick {
  color: var(--cx-accent);
}

/* ── Similar chalets ──────────────────────────────────────────────── */

.chalet-page .ch-similar {
  border-top: 1px solid rgba(16, 29, 51, 0.12);
}

.chalet-page .ch-host-card__price {
  color: var(--cx-ink);
  font-weight: 500;
}

.chalet-page .ch-host-card__meta {
  color: var(--cx-muted);
}

/* ── Host profile page in the pale style ──────────────────────────────
   Not .host-page: that name already belongs to /host, the become-a-host
   marketing page, which shares .about-* furniture with /about — a real host's
   profile is a different page reusing .ch-chalet__crumb/section-title and
   .ch-host-card from the chalet detail page, so it gets its own scope. */

.host-profile-page .ch-chalet__crumb span[aria-hidden] {
  color: rgba(16, 29, 51, 0.3);
}

.host-profile-page .ch-chalet__crumb a {
  color: var(--cx-muted);
}

.host-profile-page .ch-chalet__crumb a:hover,
.host-profile-page .ch-chalet__crumb [aria-current] {
  color: var(--cx-ink);
}

.host-profile-page .ch-chalet__section-title {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  letter-spacing: -0.03em;
  color: var(--cx-ink);
  border-bottom-color: rgba(16, 29, 51, 0.14);
}

.host-profile-page .ch-chalet__section-count {
  color: var(--cx-muted);
}

.host-profile-page .ch-host__head {
  border-bottom-color: rgba(16, 29, 51, 0.14);
}

.host-profile-page .ch-host__avatar {
  background: #fff;
  border: 1px solid rgba(16, 29, 51, 0.1);
  border-radius: 0;
}

.host-profile-page .ch-host__eyebrow {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 1.3px;
  text-transform: uppercase;
  color: var(--cx-accent-ink);
}

.host-profile-page .ch-host__name {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  letter-spacing: -0.035em;
  line-height: 1.06;
  color: var(--cx-ink);
}

.host-profile-page .ch-host__bio {
  color: var(--cx-muted);
}

.host-profile-page .ch-host__link {
  color: var(--cx-muted);
}

.host-profile-page .ch-host__link:hover {
  color: var(--cx-accent-ink);
}

.host-profile-page .ch-host__stat-num {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  color: var(--cx-ink);
}

.host-profile-page .ch-host__stat-label {
  color: var(--cx-muted);
}

/* Square corners and a white panel, matching .chalet-page's own cards. */
.host-profile-page .ch-host-card__link {
  background: rgba(255, 255, 255, 0.72);
  border: 1px solid rgba(16, 29, 51, 0.1);
  border-radius: 0;
}

.host-profile-page .ch-host-card__link:hover {
  background: #fff;
  border-color: rgba(16, 29, 51, 0.22);
}

.host-profile-page .ch-host-card__media,
.host-profile-page .ch-host-card__img {
  border-radius: 0;
}

/* Image placeholder was #020617 — near-black behind every photo, which on
   the wash flashes as a dark block until the image decodes. */
.host-profile-page .ch-host-card__media {
  background-color: #e9ecf5;
}

.host-profile-page .ch-host-card__resort {
  color: var(--cx-accent-ink);
}

.host-profile-page .ch-host-card__name {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  letter-spacing: -0.03em;
  color: var(--cx-ink);
}

.host-profile-page .ch-host-card__meta {
  color: var(--cx-muted);
}

.host-profile-page .ch-host-card__price {
  color: var(--cx-ink);
  font-weight: 500;
}

/* Contact fields on the enquiry modal.
   Two across on desktop for name/email, phone on its own row — the modal is
   narrow, and three stacked inputs above the message push the send button
   below the fold on a laptop. */
.enquiry-modal-fields {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px 16px;
  margin-bottom: 16px;
}

/* Phone spans both columns so it doesn't sit beside an empty cell. */
.enquiry-modal-fields .ch-field:last-child {
  grid-column: 1 / -1;
}

.enquiry-modal-fields + .ch-field__label {
  display: block;
  margin-bottom: 6px;
}

/* The challenge widget only occupies space when Cloudflare wants an
   interaction, so this margin collapses to nothing the rest of the time. */
.enquiry-modal .ch-turnstile:not(:empty) {
  margin-top: 12px;
}

@media (max-width: 599px) {
  .enquiry-modal-fields {
    grid-template-columns: 1fr;
  }
}


/* ══════════════════════════════════════════════════════════════════════════
   ABOUT, HOST AND AUTH IN THE PALE STYLE
   ──────────────────────────────────────────────────────────────────────────
   Fifth, sixth and seventh scope hooks after .resort-page / .search-page /
   .blog-page / .chalet-page. The --cx-* tokens and the page wash come from the
   two shared blocks above rather than a copy each, so there is still one
   definition of the palette to change.

   Scoped throughout, because none of these classes belong to these pages:
   .ch-hero is shared with the home page and the blog, the about-* sections are
   shared between /about and /host, and .ch-auth / .ch-auth-form are shared
   with AuthGateModal and /verify-email. Unscoped, this would restyle all of
   them.

   /about and /host are styled as one pair. They share the same section
   furniture — the host page is built almost entirely from about-principles,
   about-countries and about-cta — so splitting them into two blocks would mean
   maintaining the same rules twice.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Section rhythm ──────────────────────────────────────────────────
   These sections set --section-pad-y (9vw, so 130px a side at 1440). That
   reads as generous where a section carries 600–900px of content; the
   manifesto and principles blocks here are a third of that, so half of each
   section was padding and the page opened a ~500px hole between the stat grid
   and the next heading. Roughly halved, matching .resort-page. */
.about-page > section,
.host-page > section {
  position: relative;
  background: transparent;
  padding-block: clamp(2.75rem, 4.5vw, 4.25rem);
}

/* One fading hairline per boundary, drawn by the section that follows — the
   same self-healing arrangement as the home page and the resort hub. Several
   of these sections render conditionally (about-countries needs resorts,
   about-team needs members), and whichever one follows still marks the join.
   Inset to the content rail and faded at both ends so no rule ends in a stub. */
.about-page > section + section::before,
.host-page > section + section::before {
  content: '';
  position: absolute;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  width: min(100% - 2 * max(1.25rem, 5%), 1600px);
  height: 1px;
  background: linear-gradient(
    90deg,
    transparent 0%,
    rgba(16, 29, 51, 0.16) 16%,
    rgba(16, 29, 51, 0.16) 84%,
    transparent 100%
  );
  pointer-events: none;
}

/* ── Hero ────────────────────────────────────────────────────────────
   .ch-hero is #020617 with white text. The light-theme variant of it is behind
   html[data-theme='light'], and no theme attribute is set since the dark theme
   was removed — so this hero renders dark, and dropped a near-black band above
   a pale page. It now sits on the wash like everything else. */
/* `main` is in the chain to match the specificity of
   `html[data-theme='light'] .ch-hero`, which repaints this section with its
   own pale-blue gradient; a bare two-class scope loses to it and the hero kept
   a visible tonal step against the wash below it. Equal specificity, and this
   block is later in the file. */
main.about-page .ch-hero,
main.host-page .ch-hero {
  background: transparent;
  color: var(--cx-ink);
  padding-block: clamp(1rem, 2vh, 2rem) clamp(2rem, 4vw, 3.5rem);
}

/* The display serif goes, as it did everywhere else in the pale style. Family
   and weight are stated together because custom.css forces a serif onto every
   h1–h6 further up the file. */
/* `.ch-hero` is in the chain for the hero selectors on purpose. A theme
   bootstrap script sets data-theme="light" on <html> after hydration, and
   `html[data-theme='light'] .ch-hero__title` (0,2,1) forces #f4f4f6 on the
   whole hero group — it exists because this copy used to sit on dark
   photography. A two-class scope loses to it, which rendered the about H1
   near-white on a near-white wash: legible in the static HTML and invisible
   in a browser. Three classes clear it. */
.about-page .ch-hero .ch-hero__title,
.host-page .ch-hero .ch-hero__title,
.about-page .editorial-headline,
.host-page .editorial-headline,
.about-page .about-manifesto__statement,
.about-page .about-principle__title,
.host-page .about-principle__title,
.about-page .about-stat__value,
.host-page .about-stat__value,
.about-page .about-cta .editorial-headline {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  letter-spacing: -0.035em;
  line-height: 1.06;
  color: var(--cx-ink);
  /* Existed to lift white type off a photograph; on the wash it reads as a
     grey halo around every letter. */
  text-shadow: none;
}

/* The italic blue accent was the serif's; upright and in the text accent here.
   --cx-accent only reaches 3.28:1 on the wash, which is why --cx-accent-ink
   exists (see its comment in the token block). */
.about-page .ch-hero .ch-hero__title em,
.host-page .ch-hero .ch-hero__title em,
.about-page .editorial-headline em,
.host-page .editorial-headline em,
.about-page .about-manifesto__statement em,
.about-page .about-cta .editorial-headline em {
  font-style: normal;
  color: var(--cx-accent-ink);
}

.about-page .ch-hero__words,
.host-page .ch-hero__words {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  max-width: 60rem;
  margin-block: clamp(1.25rem, 3vw, 2.25rem) clamp(1.5rem, 3.5vw, 2.75rem);
}

.about-page .ch-hero .ch-hero__lede,
.host-page .ch-hero .ch-hero__lede {
  /* Was italic and white, for reading over a photograph. */
  font-style: normal;
  color: var(--cx-muted);
  font-size: clamp(1rem, 1.2vw, 1.1875rem);
  line-height: 1.6;
  max-width: 52ch;
  text-shadow: none;
}

.about-page .ch-hero .ch-hero__eyebrow,
.host-page .ch-hero .ch-hero__eyebrow,
.about-page .section-eyebrow,
.host-page .section-eyebrow,
.about-page .about-principle__num,
.host-page .about-principle__num,
.about-page .about-stat__label,
.host-page .about-stat__label {
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: 1.3px;
  text-transform: uppercase;
  color: var(--cx-muted);
}

/* The eyebrow and the section numbers carry the one spot of lilac, which is
   what --cx-spark is for. */
.about-page .ch-hero .ch-hero__eyebrow,
.host-page .ch-hero .ch-hero__eyebrow,
.about-page .about-principle__num,
.host-page .about-principle__num {
  color: var(--cx-spark-ink);
}

.about-page .about-section__lede,
.host-page .about-section__lede,
.about-page .about-manifesto__support,
.about-page .about-principle__body,
.host-page .about-principle__body,
.about-page .about-split__copy,
.about-page .about-cta__lede,
.host-page .about-cta__lede {
  color: var(--cx-muted);
}

/* Photography is square in this style; only controls keep a radius. The
   placeholder colour matters because these are priority images on a pale page
   — #020617 flashed a near-black block over the wash until the image decoded. */
.about-page .ch-hero__plate,
.host-page .ch-hero__plate,
.about-page .about-split__media {
  border-radius: 0;
  background: #e9ecf5;
}

/* The veil existed to darken the photograph enough for white type on top of
   it. The type has moved off the image, so it only muddies the picture now. */
.about-page .ch-hero__veil,
.host-page .ch-hero__veil {
  display: none;
}

/* The caption still sits on the image, so it stays white rather than joining
   the accent-ink group above — and it carries its own scrim, the same
   translucent-dark-over-photography treatment the chalet page's overlay button
   uses.

   A text-shadow alone wasn't enough. Removing the veil (which used to darken
   the whole plate for the headline) left this label on whatever happens to be
   behind it, and on the about photograph that is the sun: white-on-flare, and
   unreadable however much shadow it carries. A scrim doesn't depend on where
   the bright part of the picture is. It keeps a radius because it's an overlay
   control, not a panel. */
.about-page .ch-hero .ch-hero__caption,
.host-page .ch-hero .ch-hero__caption {
  color: rgba(255, 255, 255, 0.95);
  background: rgba(16, 29, 51, 0.42);
  backdrop-filter: blur(6px);
  border-radius: 10px;
  padding: 0.5rem 0.75rem;
}

/* ── Controls: the hero pathways ─────────────────────────────────────
   Glass pills, the same recipe as the home page's CTA chips. Controls are the
   one thing in this style that keeps a radius.

   The CTA buttons at the foot of both pages are deliberately absent from this
   block: they are .why-cta-chip from the home page's why-book-direct band,
   which is already in this style and reads the --cx-* tokens the hook
   provides, so they arrive correct with no rule here. */
.about-page .ch-hero .ch-hero__pathway,
.host-page .ch-hero .ch-hero__pathway {
  border-radius: 999px;
  border: 1px solid var(--cx-glass-line);
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
  color: var(--cx-ink);
  transition:
    box-shadow 0.35s cubic-bezier(0.22, 1, 0.36, 1),
    transform 0.35s cubic-bezier(0.22, 1, 0.36, 1);
}

.about-page .ch-hero .ch-hero__pathway:hover,
.host-page .ch-hero .ch-hero__pathway:hover {
  box-shadow: var(--cx-glass-shadow-hi);
  transform: translateY(-1px);
  color: var(--cx-ink);
}

/* ── Panels: principles, stats, countries, team, compare ─────────────
   Raised glass rather than hairline-separated text. This is the part that
   takes its cue from the reference: light cards floating on a tinted wash,
   with the shadow doing the separating instead of a rule. Square, because
   panels and photography are square in this style. */
.about-page .about-principle,
.host-page .about-principle,
.about-page .about-stat,
.host-page .about-stat,
.about-page .about-team-member {
  border: 1px solid var(--cx-glass-line);
  border-top: 1px solid var(--cx-glass-line);
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
  border-radius: 0;
  padding: clamp(1.25rem, 2vw, 1.75rem);
}

.about-page .about-principle,
.host-page .about-principle {
  /* Was a border-top rule with padding-top and no sides. */
  gap: 0.625rem;
}

/* ch-2026.css puts `border-bottom: 1px solid #0000001c; padding-bottom: 10px`
   on every h3 in the document. Inside a card that reads as a divider between
   the title and the body — a stray rule nobody drew on purpose. Same
   statement the journal cards needed for the same reason. */
.about-page .about-principle__title,
.host-page .about-principle__title,
.about-page .about-country__name,
.host-page .about-country__name,
.about-page .about-team-member__name {
  border-bottom: 0;
  padding-bottom: 0;
  margin-top: 0;
}

.about-page .about-stat,
.host-page .about-stat {
  /* The 2×2 grid drew its own internal hairlines; each cell is its own panel
     now, so the grid just needs a gutter. */
  border-color: var(--cx-glass-line);
}

.about-page .about-manifesto__stats,
.host-page .about-manifesto__stats {
  gap: 1rem;
  border: 0;
}

.about-page .about-stat__value,
.host-page .about-stat__value {
  font-size: clamp(2rem, 3vw, 2.75rem);
}

/* Sections that carried a near-transparent white fill designed for a dark
   page. On the wash it reads as nothing, so it goes and the wash shows. */
.about-page .about-split,
.about-page .about-countries,
.about-page .about-team,
.about-page .about-manifesto,
.about-page .about-cta,
.host-page .about-countries,
.host-page .about-principles,
.host-page .about-cta {
  background: transparent;
}

/* The serif on these two sits a level deeper than the class the section is
   named for — on `.about-quote__body p`, not the blockquote — so a rule on the
   parent was inherited straight past. */
.about-page .about-quote__body p,
.about-page .about-team-member__name {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  letter-spacing: -0.025em;
  line-height: 1.18;
  color: var(--cx-ink);
}

.about-page .about-quote__body p em {
  font-style: normal;
  color: var(--cx-accent-ink);
}

.about-page .about-team-member__role {
  color: var(--cx-spark-ink);
}

/* 10px label in the display accent — 3.28:1 on the wash, the same failure the
   journal heading had. --cx-accent-ink is the variant for accent text. */
.about-page .about-compare__col-us,
.about-page .about-compare__col-label {
  color: var(--cx-accent-ink);
}

.about-page .about-team-member__bio {
  color: var(--cx-muted);
}

/* The avatar keeps its circle — it's a control-sized token, not a panel or a
   photograph, and a 72px square of initials reads as a missing image. */
.about-page .about-team-member__avatar {
  background: #e9ecf5;
  border: 1px solid var(--cx-glass-line);
  color: var(--cx-muted);
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
}

/* ── Auth (/login, /register, /verify-email) ─────────────────────────
   The split layout stays; the surfaces and the type change. */
.auth-page .ch-auth {
  /* Was var(--ch-bg) — a flat near-white that painted over the wash. */
  background: transparent;
}

.auth-page .ch-auth__title {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  letter-spacing: -0.035em;
  line-height: 1.06;
  color: var(--cx-ink);
  max-width: 18ch;
}

.auth-page .ch-auth__title em {
  font-style: normal;
  color: var(--cx-accent-ink);
}

.auth-page .ch-auth__eyebrow {
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: 1.3px;
  text-transform: uppercase;
  color: var(--cx-spark-ink);
}

.auth-page .ch-auth__lede {
  color: var(--cx-muted);
}

/* The form gets a panel of its own. Against a tinted wash an unpanelled form
   reads as floating loose on the page, and the fields lose their edges. */
.auth-page .ch-auth__card {
  border: 1px solid var(--cx-glass-line);
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
  padding: clamp(1.5rem, 2.5vw, 2.25rem);
  max-width: 30rem;
}

.auth-page .ch-auth__switch {
  border-top-color: rgba(16, 29, 51, 0.1);
}

.auth-page .ch-auth__switch-link {
  color: var(--cx-accent-ink);
}

/* Photography square, with the pale placeholder rather than near-black. */
.auth-page .ch-auth__plate {
  border-radius: 0;
  background: #e9ecf5;
}

/* Excluded from the accent-ink group on purpose: this caption sits on a
   translucent scrim over a photograph, so dark-blue text would put dark on
   dark. It keeps a near-white label. */
.auth-page .ch-auth__plate-caption,
.auth-page .ch-auth__plate-quote {
  color: rgba(255, 255, 255, 0.95);
}
.auth-page .ch-auth__plate-quote {
  font-style: normal;
}

.auth-page .ch-auth__proof-item {
  border: 1px solid var(--cx-glass-line);
  background: var(--cx-glass);
  box-shadow: var(--cx-glass-shadow);
  padding: clamp(0.875rem, 1.4vw, 1.125rem);
}

/* The three-up row separated its items with a right-hand rule on each and no
   gutter, so as panels they fused into one wide box split by two lines.
   Restated with a gap and no divider — the shadow separates them now. */
.auth-page .ch-auth__proof {
  gap: 0.75rem;
}

@media (min-width: 600px) {
  .auth-page .ch-auth__proof-item,
  .auth-page .ch-auth__proof-item:first-child,
  .auth-page .ch-auth__proof-item:last-child {
    border-right: 1px solid var(--cx-glass-line);
    padding-left: clamp(0.875rem, 1.4vw, 1.125rem);
    padding-right: clamp(0.875rem, 1.4vw, 1.125rem);
  }
}

/* The pull-quote was the display serif. It goes, as it did everywhere else in
   this style — stated with the family because the serif is forced onto this
   class further up the file. */
.auth-page .ch-auth__plate-quote {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  letter-spacing: -0.02em;
}

.auth-page .ch-auth__proof-label {
  color: var(--cx-spark-ink);
}

.auth-page .ch-auth__proof-body {
  color: var(--cx-muted);
}


/* ══════════════════════════════════════════════════════════════════════════
   404 PAGE IN THE PALE STYLE
   ──────────────────────────────────────────────────────────────────────────
   Ninth scope hook, .not-found-page on <main> (app/[locale]/not-found.tsx).
   The --cx-* tokens and the page wash come from the two shared blocks above,
   and the CTA chips reuse the .resort-page glass-pill rules, which now list
   this hook alongside .resort-page. Everything else the page needs is here
   and scoped, because .section-eyebrow and .why-cta-chip are shared with
   pages that still carry the older treatment.

   The page has to hold up at every locale: FR and DE copy runs half again as
   long as the English, so nothing here is fixed-width or nowrap.
   ══════════════════════════════════════════════════════════════════════════ */
.not-found-page .nf {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: min(64vh, 720px);
  padding-block: clamp(3rem, 7vw, 6rem);
  padding-inline: max(1.25rem, 5%);
  background: transparent;
  text-align: center;
}

.not-found-page .nf__inner {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1.25rem;
  max-width: 44rem;
}

.not-found-page .nf__eyebrow {
  color: var(--cx-spark-ink);
  letter-spacing: 0.18em;
}

/* Sans at 200, as on every other pale-style heading. Family and weight are
   stated together because custom.css forces the serif onto every h1-h6
   further up the file, and the light-theme hero rules would otherwise paint
   an h1 near-white on the near-white wash. */
.not-found-page .nf__title {
  font-family: var(--font-body), ui-sans-serif, system-ui, sans-serif;
  font-weight: 200;
  font-size: clamp(2.4rem, 6vw, 5.25rem);
  line-height: 1.02;
  letter-spacing: -0.035em;
  margin: 0;
  color: var(--cx-ink);
  text-shadow: none;
  text-wrap: balance;
}

/* Upright accent, as on the about and host heroes; --cx-accent-ink because the
   display accent only clears 3.28:1 on the wash. */
.not-found-page .nf__title em {
  font-style: normal;
  color: var(--cx-accent-ink);
}

.not-found-page .nf__lede {
  margin: 0;
  max-width: 34rem;
  font-size: clamp(1.05rem, 1.4vw, 1.25rem);
  line-height: 1.55;
  color: var(--cx-muted);
}

.not-found-page .nf__actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.75rem;
  margin-top: 0.75rem;
}
