/* ============================================================
   REDREALTY — immo-neuf.css
   Styles for the "Immobilier neuf" listing + single-programme
   pages. Loads AFTER main.css and reuses its :root tokens
   (--color-primary, --radius-*, --shadow-*, --transition-*, …)
   so both areas of the site stay visually identical.
   ============================================================ */

:root {
  --color-success:       #1d8f4c;
  --color-success-light: #eaf7ef;
  --color-warning:       #b0740f;
  --color-warning-light: #fdf3e2;
  --color-sold-light:    #eef0f2;
}

/* ── Shared container ───────────────────────────────────── */
.in-container {
  max-width: 1240px;
  width: 100%;
  margin: 0 auto;
  /* Bottom padding (not margin) so the gap above the footer is fixed by
     construction, regardless of what element happens to be last on a
     given page — a margin-bottom on the last child would collapse right
     through this box otherwise (no top/bottom border or other margin-
     collapse guard existed here before), which is why the previous fix
     (applied to one page's last section, not this shared wrapper) never
     held consistently across programme.php / lot.php / immobilier-neuf.php.
     52px reuses the same vertical rhythm as .section's own margin-bottom
     rather than introducing a new spacing value. */
  padding: 0 32px 52px;
}
@media (max-width: 768px) { .in-container { padding: 0 20px 52px; } }

/* This padding only blocks collapse for the FOOTER side of the equation —
   the last child's own margin-bottom (e.g. .section's 52px, .pagination's
   64px) becomes real/uncollapsed space *inside* .in-container instead,
   stacking on top of the padding above (104px / 116px) instead of the
   intended 52px. Whatever ends up last on a given page — a plain
   .product-layout with no margin of its own, a trailing .section, a
   .pagination bar — must all produce the exact same gap, so the last
   child's own trailing margin is zeroed here, leaving .in-container's
   padding-bottom as the one and only source of the footer gap everywhere. */
.in-container > *:last-child { margin-bottom: 0; }

/* Sticky footer: no such mechanism existed before this fix (body had no
   min-height/flex layout at all), so on a short page (e.g. a lot with
   little content) the footer just trailed the content wherever that
   happened to end, instead of sitting at the bottom of the viewport. This
   makes .in-container (the one always-present block between <nav>/<header>
   and <footer> on every page using body.page-immo-neuf) absorb any leftover
   viewport height, pushing the footer down to the bottom on short pages
   while leaving long-page behaviour unchanged (content already exceeds the
   viewport, so there's no leftover space to absorb). .in-container is only
   ever used on these three pages, so this can't affect anything else. */
body.page-immo-neuf {
  background: var(--color-bg);
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}
.in-container { flex: 1 0 auto; }

/* ── Breadcrumb ─────────────────────────────────────────── */
.breadcrumb {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 6px;
  font-size: .8125rem;
  color: var(--color-text-soft);
  margin: 24px 0 20px;
}
/* Breadcrumb links are a documented, partial exception to the 44px rule
   (same spirit as WCAG 2.5.8's own inline-text-link allowance) — this is
   dense wayfinding text, and forcing full 44px here would make a
   supposed-to-be-compact trail nearly as tall as the navbar above it.
   padding is a modest, real improvement over the ~17px it had (not a
   claim of full compliance). */
.breadcrumb a { display: inline-flex; align-items: center; padding: 6px 2px; color: var(--color-text-soft); }
.breadcrumb a:hover { color: var(--color-primary); text-decoration: none; }
.breadcrumb__sep { opacity: .5; }
.breadcrumb__current { color: var(--color-text); font-weight: 600; }

/* ── Buttons — extra variants used on these pages ─────────── */
.btn-outline {
  background: transparent;
  color: var(--color-primary);
  border: 1.5px solid var(--color-primary);
}
.btn-outline:hover { background: var(--color-primary); color: var(--color-white); }
.btn-sm { padding: 10px 20px; font-size: .8125rem; min-height: 44px; }
.btn-block { width: 100%; }

.icon-btn {
  width: 44px; height: 44px;
  border-radius: 50%;
  border: 1.5px solid var(--color-border);
  background: var(--color-white);
  display: flex; align-items: center; justify-content: center;
  cursor: pointer;
  color: var(--color-text-soft);
  transition: border-color var(--transition-normal), color var(--transition-normal), background var(--transition-normal);
  flex-shrink: 0;
}
.icon-btn:hover { border-color: var(--color-primary); color: var(--color-primary); }
.icon-btn--active { color: var(--color-accent); border-color: var(--color-accent); }
.icon-btn--active svg { fill: currentColor; }

/* ── Badges / status pills ─────────────────────────────────── */
.badge {
  display: inline-flex;
  align-items: center;
  padding: 5px 12px;
  border-radius: var(--radius-full);
  font-size: .66rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .04em;
  white-space: nowrap;
}
.badge--new         { background: var(--color-primary); color: #fff; }
.badge--exclusive   { background: #17181a; color: #fff; }
.badge--delivered   { background: var(--color-success); color: #fff; }
.badge--construction{ background: var(--color-warning-light); color: var(--color-warning); }
.badge--soft         { background: var(--color-primary-light); color: var(--color-primary-dark); }

.status-pill {
  display: inline-block;
  padding: 4px 12px;
  border-radius: var(--radius-full);
  font-size: .7rem;
  font-weight: 700;
}
.status-pill--available { background: var(--color-success-light); color: var(--color-success); }
.status-pill--reserved  { background: var(--color-warning-light); color: var(--color-warning); }
.status-pill--sold      { background: var(--color-sold-light); color: var(--color-text-soft); }

/* ── Hero (listing page) ───────────────────────────────────── */
.in-hero {
  position: relative;
  overflow: hidden;
  background: linear-gradient(155deg, var(--color-primary-dark) 0%, var(--color-primary) 78%);
  color: #fff;
  padding: 64px 0 110px;
}
.in-hero__shape {
  position: absolute;
  border-radius: 50%;
  background: rgba(255,255,255,.06);
}
.in-hero__shape--a { width: 420px; height: 420px; top: -160px; right: -100px; }
.in-hero__shape--b { width: 260px; height: 260px; bottom: -120px; left: 6%; background: rgba(255,255,255,.045); }
.in-hero__shape--c { width: 140px; height: 140px; top: 30%; right: 18%; background: rgba(255,255,255,.05); }

.in-hero__inner { position: relative; z-index: 2; }
.in-hero__eyebrow {
  display: inline-block;
  background: rgba(255,255,255,.14);
  color: #fff;
  font-size: .7rem;
  font-weight: 700;
  letter-spacing: .1em;
  text-transform: uppercase;
  padding: 5px 14px;
  border-radius: var(--radius-full);
  margin-bottom: 18px;
}
.in-hero__title {
  font-size: 2.75rem;
  font-weight: 800;
  letter-spacing: -.02em;
  line-height: 1.12;
  max-width: 640px;
  margin-bottom: 14px;
}
.in-hero__subtitle {
  font-size: 1.0625rem;
  color: rgba(255,255,255,.82);
  max-width: 560px;
  line-height: 1.6;
  margin-bottom: 30px;
}
.in-hero__stats { display: flex; gap: 40px; flex-wrap: wrap; }
.in-hero__stat-value { font-size: 1.6rem; font-weight: 800; letter-spacing: -.01em; }
.in-hero__stat-label { font-size: .74rem; color: rgba(255,255,255,.7); text-transform: uppercase; letter-spacing: .04em; margin-top: 2px; }

@media (max-width: 768px) {
  .in-hero { padding: 44px 0 130px; }
  .in-hero__title { font-size: 2rem; }
}

/* ── Filter bar ─────────────────────────────────────────────── */
.filter-bar {
  position: relative;
  z-index: 10;
  margin-top: -70px;
  background: var(--color-white);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-lg);
  padding: 22px 24px 18px;
  display: flex;
  gap: 14px;
  flex-wrap: wrap;
  align-items: flex-end;
}
.filter-field {
  display: flex;
  flex-direction: column;
  gap: 6px;
  flex: 1 1 150px;
  min-width: 150px;
}
.filter-field label {
  font-size: .68rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--color-text-soft);
}
.filter-field select,
.filter-field input {
  height: 46px;
  border: 1.5px solid var(--color-border);
  border-radius: var(--radius-md);
  padding: 0 12px;
  font-size: .875rem;
  color: var(--color-text);
  background: var(--color-white);
  outline: none;
  appearance: none;
  transition: border-color var(--transition-normal);
}
.filter-field select { cursor: pointer; background-image: none; }
.filter-field select:focus,
.filter-field input:focus { border-color: var(--color-primary); }
.filter-field--select { position: relative; }
.filter-field--select::after {
  content: '';
  position: absolute;
  right: 14px; bottom: 19px;
  width: 0; height: 0;
  border-left: 4.5px solid transparent;
  border-right: 4.5px solid transparent;
  border-top: 5.5px solid var(--color-text-soft);
  pointer-events: none;
}
.filter-bar__submit { height: 46px; flex-shrink: 0; padding: 0 30px; }

.filter-chips {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  margin: 20px 0 28px;
}
.filter-chip {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: 8px 16px;
  border: 1.5px solid var(--color-border);
  border-radius: var(--radius-full);
  font-size: .8125rem;
  font-weight: 600;
  color: var(--color-text-soft);
  background: var(--color-white);
  cursor: pointer;
  transition: border-color var(--transition-fast), color var(--transition-fast), background var(--transition-fast);
  user-select: none;
}
.filter-chip:hover { border-color: var(--color-primary); color: var(--color-primary); }
.filter-chip--active { background: var(--color-primary); border-color: var(--color-primary); color: #fff; }

.filter-chips__reset {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  margin-left: 6px;
  padding: 0 6px;
  font-size: .8125rem;
  color: var(--color-text-soft);
}

@media (max-width: 768px) {
  .filter-bar { margin-top: -50px; padding: 18px 16px 14px; }
  .filter-field { flex: 1 1 100%; }
  .filter-bar__submit { width: 100%; }
}

/* ── Results header ─────────────────────────────────────────── */
.results-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 12px;
  margin-bottom: 20px;
}
.results-count { font-size: .9375rem; color: var(--color-text-soft); }
.results-count strong { color: var(--color-text); }
.sort-field { display: flex; align-items: center; gap: 10px; }
.sort-field label { font-size: .8125rem; color: var(--color-text-soft); white-space: nowrap; }
.sort-field select {
  height: 44px;
  border: 1.5px solid var(--color-border);
  border-radius: var(--radius-md);
  padding: 0 34px 0 14px;
  font-size: .8125rem;
  color: var(--color-text);
  background: var(--color-white);
  cursor: pointer;
  outline: none;
  appearance: none;
}
.sort-field select:focus { border-color: var(--color-primary); }

/* ── Programme grid + card ─────────────────────────────────── */
.section { margin-bottom: 52px; }
.section__title {
  font-size: 1.375rem;
  font-weight: 800;
  letter-spacing: -.01em;
  color: var(--color-text);
  margin-bottom: 20px;
}
.section__head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
  margin-bottom: 20px;
}
.section__head p { color: var(--color-text-soft); font-size: .9375rem; }

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

.programme-card {
  background: var(--color-white);
  border: 1.5px solid var(--color-border);
  border-radius: var(--radius-lg);
  overflow: hidden;
  display: flex;
  flex-direction: column;
  transition: transform var(--transition-normal), box-shadow var(--transition-normal), border-color var(--transition-normal);
}
.programme-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-lg); border-color: #e3cdce; }

.programme-card__media { position: relative; aspect-ratio: 4 / 3; overflow: hidden; background: var(--color-border); }
.programme-card__media img {
  width: 100%; height: 100%; object-fit: cover; display: block;
  position: absolute; inset: 0; opacity: 0; transition: opacity .35s ease;
}
.programme-card__media img.is-active { opacity: 1; }

.programme-card__badges { position: absolute; top: 12px; left: 12px; display: flex; gap: 6px; z-index: 2; flex-wrap: wrap; max-width: calc(100% - 60px); }

.programme-card__fav {
  position: absolute; top: 10px; right: 10px; z-index: 3;
  width: 34px; height: 34px; border-radius: 50%;
  background: rgba(255,255,255,.92);
  border: none; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  color: var(--color-text-soft);
  transition: color .2s, transform .2s;
}
.programme-card__fav:hover { transform: scale(1.08); }
/* design.md §4 touch target, padded hit area — see .vite-modal__close */
.programme-card__fav::before { content: ''; position: absolute; inset: -5px; }
.programme-card__fav svg { pointer-events: none; }
.programme-card__fav--active { color: var(--color-accent); }
.programme-card__fav--active svg { fill: currentColor; }

.programme-card__nav {
  position: absolute; top: 50%; transform: translateY(-50%);
  width: 28px; height: 28px; border-radius: 50%;
  background: rgba(255,255,255,.85);
  border: none; z-index: 3; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  color: var(--color-text);
  opacity: 0; transition: opacity .2s;
}
.programme-card__media:hover .programme-card__nav { opacity: 1; }
.programme-card__nav--prev { left: 10px; }
.programme-card__nav--next { right: 10px; }
/* design.md §4 touch target, padded hit area — see .vite-modal__close.
   translateY(-50%) already establishes the transform box as the ::before's
   containing block, no extra position needed. */
.programme-card__nav::before { content: ''; position: absolute; inset: -8px; }

.programme-card__dots { position: absolute; bottom: 10px; left: 0; right: 0; z-index: 3; display: flex; justify-content: center; gap: 8px; }
.programme-card__dot { position: relative; width: 6px; height: 6px; border-radius: 50%; background: rgba(255,255,255,.55); transition: background .2s, transform .2s; cursor: pointer; }
.programme-card__dot.is-active { background: #fff; transform: scale(1.35); }
/* design.md §4 flags nav dots explicitly for the 44px touch-target rule,
   but these sit only 14px apart centre-to-centre (6px dot + 8px gap) — a
   full 44px hit area per dot would overlap its neighbours by more than
   half its own size, making adjacent dots harder to tell apart, not
   easier to tap. Documented tradeoff, not full compliance: a partial
   18x18 hit area (still well short of 44px) meaningfully improves the tap
   target without that overlap; the arrows (already ≥44px) and swipe
   remain the primary, fully-compliant way to change photos. */
.programme-card__dot::before { content: ''; position: absolute; inset: -6px; }

.programme-card__body { padding: 18px 18px 20px; display: flex; flex-direction: column; flex: 1; }
.programme-card__location { display: flex; align-items: center; gap: 5px; font-size: .76rem; color: var(--color-text-soft); margin-bottom: 7px; }
.programme-card__location svg { width: 13px; height: 13px; flex-shrink: 0; }
.programme-card__title { font-size: 1.0625rem; font-weight: 700; color: var(--color-text); line-height: 1.3; margin-bottom: 12px; }
.programme-card__title a { color: inherit; }
.programme-card__title a:hover { color: var(--color-primary); text-decoration: none; }

.programme-card__price-label { font-size: .7rem; color: var(--color-text-soft); text-transform: uppercase; letter-spacing: .03em; }
.programme-card__price { font-size: 1.28rem; font-weight: 800; color: var(--color-primary); margin-top: 2px; }

.programme-card__meta { display: flex; gap: 14px; flex-wrap: wrap; margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--color-bg); }
.programme-card__meta-item { display: flex; align-items: center; gap: 5px; font-size: .78rem; color: var(--color-text-soft); }
.programme-card__meta-item svg { width: 15px; height: 15px; color: var(--color-primary); flex-shrink: 0; }

.programme-card__cta { margin-top: 16px; width: 100%; justify-content: center; }

.empty-state {
  text-align: center;
  padding: 70px 20px;
  border: 1.5px dashed var(--color-border);
  border-radius: var(--radius-lg);
  color: var(--color-text-soft);
}
.empty-state svg { color: var(--color-border); margin-bottom: 14px; }
.empty-state__title { font-size: 1.05rem; font-weight: 700; color: var(--color-text); margin-bottom: 6px; }
.empty-state__text { font-size: .9375rem; margin-bottom: 20px; }

/* ── Pagination ─────────────────────────────────────────────── */
.pagination { display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: 8px; margin: 40px 0 64px; }
.pagination__btn {
  min-width: 44px; height: 44px; padding: 0 12px;
  border-radius: var(--radius-full);
  border: 1.5px solid var(--color-border);
  background: var(--color-white);
  display: flex; align-items: center; justify-content: center; gap: 6px;
  font-size: .8125rem; font-weight: 600; color: var(--color-text-soft);
  cursor: pointer; transition: all var(--transition-fast);
}
.pagination__btn:hover { border-color: var(--color-primary); color: var(--color-primary); }
.pagination__btn--active { background: var(--color-primary); border-color: var(--color-primary); color: #fff; }

/* ============================================================
   SINGLE PROGRAMME PAGE
   ============================================================ */

.product-header { display: flex; justify-content: space-between; align-items: flex-start; gap: 20px; flex-wrap: wrap; margin-bottom: 22px; }
.product-title-row { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 8px; }
.product-title { font-size: 2rem; font-weight: 800; letter-spacing: -.02em; color: var(--color-text); }
.product-ref { font-size: .74rem; font-weight: 700; color: var(--color-text-soft); background: var(--color-bg); padding: 5px 12px; border-radius: var(--radius-full); }
.product-location { display: flex; align-items: center; gap: 6px; color: var(--color-text-soft); font-size: .9375rem; margin-bottom: 14px; }
.product-location svg { width: 16px; height: 16px; color: var(--color-primary); }
.product-badges { display: flex; gap: 8px; flex-wrap: wrap; }
.product-actions { display: flex; gap: 10px; flex-shrink: 0; }

/* Gallery */
.gallery { display: grid; grid-template-columns: 1.6fr 1fr; gap: 10px; height: 440px; border-radius: var(--radius-lg); overflow: hidden; margin-bottom: 36px; }
.gallery__main { position: relative; cursor: pointer; overflow: hidden; }
.gallery__main img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .5s ease; }
.gallery__main:hover img { transform: scale(1.035); }
.gallery__side { display: grid; grid-template-rows: 1fr 1fr; gap: 10px; }
.gallery__thumb { position: relative; overflow: hidden; cursor: pointer; }
.gallery__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .5s ease; }
.gallery__thumb:hover img { transform: scale(1.06); }
.gallery__more {
  position: absolute; inset: 0;
  background: rgba(15,15,15,.52);
  color: #fff; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px;
  font-weight: 700; font-size: .9375rem;
}
@media (max-width: 900px) {
  .gallery { grid-template-columns: 1fr; height: 280px; }
  .gallery__side { display: none; }
}

/* Lightbox */
.lightbox { position: fixed; inset: 0; z-index: 1000; background: rgba(10,10,10,.95); display: flex; align-items: center; justify-content: center; opacity: 0; pointer-events: none; transition: opacity .25s; }
.lightbox.is-open { opacity: 1; pointer-events: all; }
.lightbox__img-wrap { max-width: 88vw; max-height: 80vh; }
.lightbox__img-wrap img { max-width: 88vw; max-height: 80vh; object-fit: contain; border-radius: var(--radius-md); display: block; }
.lightbox__close, .lightbox__nav {
  position: absolute;
  background: rgba(255,255,255,.1);
  border: none; color: #fff; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  transition: background .2s;
}
.lightbox__close:hover, .lightbox__nav:hover { background: rgba(255,255,255,.2); }
.lightbox__close { top: 22px; right: 24px; width: 44px; height: 44px; border-radius: 50%; font-size: 1.1rem; }
.lightbox__nav { top: 50%; transform: translateY(-50%); width: 50px; height: 50px; border-radius: 50%; }
.lightbox__nav--prev { left: 18px; }
.lightbox__nav--next { right: 18px; }
.lightbox__counter { position: absolute; bottom: 22px; left: 50%; transform: translateX(-50%); color: rgba(255,255,255,.75); font-size: .8125rem; }
@media (max-width: 640px) { .lightbox__nav { width: 44px; height: 44px; } }

/* Two-column layout */
.product-layout { display: grid; grid-template-columns: 1fr 360px; gap: 44px; align-items: flex-start; }
@media (max-width: 980px) { .product-layout { grid-template-columns: 1fr; } }

/* A CSS grid item's default min-width is `auto`, which resolves to its
   content's min-content size — .stat-grid's `minmax(148px,1fr)` tracks
   pushed that min-content floor to ~454px (2 columns' worth), forcing
   .product-main (and everything inside it: tabs, description text) that
   wide even at a 320px viewport with only ~280px actually available.
   Confirmed live: this was the real source of the horizontal-overflow
   design.md §4 failure on programme-neuf.html at 320/375/390px — not the
   card-grid `minmax(300px,1fr)` guessed at going in, which turned out to
   already be fine (see §4 Programme cards note below). min-width:0 is the
   standard fix for this well-known grid/flex sizing default. */
.product-main { min-width: 0; }

/* Stat grid */
.stat-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(148px, 1fr)); gap: 12px; margin-bottom: 36px; }
.stat-card { border: 1.5px solid var(--color-border); border-radius: var(--radius-md); padding: 14px 16px; display: flex; flex-direction: column; gap: 8px; }
.stat-card svg { width: 19px; height: 19px; color: var(--color-primary); }
.stat-card__label { font-size: .66rem; text-transform: uppercase; letter-spacing: .04em; color: var(--color-text-soft); font-weight: 700; }
.stat-card__value { font-size: 1.05rem; font-weight: 700; color: var(--color-text); }

/* Tabs */
/* overflow-x:auto with overflow-y left at its default (visible) makes the
   browser implicitly resolve overflow-y to auto too (CSS overflow spec) —
   the ~1.5px of ink overflow from .tab-btn::after (positioned at
   bottom:-1.5px so the active underline sits flush with this border-bottom)
   was enough to create a real, phantom-scrollable vertical region. Pinning
   overflow-y:hidden kills that; padding-bottom gives the underline room so
   overflow-y:hidden doesn't clip it in turn (2px = 1.5px of actual
   protrusion + a small rounding safety margin). overflow-x stays auto so
   horizontal scrolling on narrow viewports (many tabs) still works. */
.tabs { display: flex; gap: 0; border-bottom: 1.5px solid var(--color-border); margin-bottom: 28px; overflow-x: auto; overflow-y: hidden; padding-bottom: 2px; }
.tab-btn {
  padding: 14px 2px; margin-right: 28px;
  background: none; border: none;
  font-size: .9375rem; font-weight: 600; color: var(--color-text-soft);
  cursor: pointer; position: relative; white-space: nowrap;
}
.tab-btn::after { content: ''; position: absolute; left: 0; right: 0; bottom: -1.5px; height: 2.5px; background: transparent; border-radius: 2px; transition: background .2s; }
.tab-btn--active { color: var(--color-primary); }
.tab-btn--active::after { background: var(--color-primary); }
.tab-panel { display: none; }
.tab-panel.is-active { display: block; }

/* Description */
.product-description p { color: var(--color-text-soft); line-height: 1.75; font-size: .9375rem; margin-bottom: 16px; }
.product-description h3 { font-size: 1.05rem; font-weight: 700; color: var(--color-text); margin: 26px 0 10px; }
.product-description h3:first-child { margin-top: 0; }

/* Amenities */
.amenities-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 14px; }
.amenity { display: flex; align-items: center; gap: 12px; padding: 14px 16px; border: 1.5px solid var(--color-border); border-radius: var(--radius-md); font-size: .875rem; font-weight: 500; color: var(--color-text); }
.amenity svg { width: 20px; height: 20px; color: var(--color-primary); flex-shrink: 0; }

/* Lot table */
.lot-filters { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 18px; }
.lot-table-wrap { position: relative; overflow-x: auto; border: 1.5px solid var(--color-border); border-radius: var(--radius-md); }
/* design.md §4: a scroll affordance so a touch user isn't left guessing
   that more columns exist off-screen — a static right-edge fade (simplest
   option that needs no JS/scroll-position tracking; shows even once fully
   scrolled or when the table already fits, which is an acceptable
   trade-off for a lightweight hint rather than a scroll-aware one). */
.lot-table-wrap::after {
  content: '';
  position: absolute;
  top: 0; right: 0; bottom: 0;
  width: 28px;
  background: linear-gradient(to right, transparent, rgba(255,255,255,.95));
  pointer-events: none;
}
.lot-table { width: 100%; border-collapse: collapse; min-width: 680px; }
.lot-table th {
  text-align: left; font-size: .68rem; text-transform: uppercase; letter-spacing: .04em;
  color: var(--color-text-soft); padding: 13px 16px; background: var(--color-bg);
  border-bottom: 1.5px solid var(--color-border);
}
.lot-table td { padding: 14px 16px; font-size: .875rem; color: var(--color-text); border-bottom: 1px solid var(--color-bg); }
.lot-table tbody tr:last-child td { border-bottom: none; }
.lot-table tbody tr:hover td { background: var(--color-primary-light); }
.lot-table tr.is-hidden { display: none; }

/* Localisation */
.location-block { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
.location-map { height: 320px; border-radius: var(--radius-lg); overflow: hidden; border: 1.5px solid var(--color-border); }
.poi-list { display: flex; flex-direction: column; gap: 10px; }
.poi-item { display: flex; align-items: center; gap: 12px; padding: 12px 14px; border: 1.5px solid var(--color-border); border-radius: var(--radius-md); }
.poi-item svg { width: 18px; height: 18px; color: var(--color-primary); flex-shrink: 0; }
.poi-item__name { flex: 1; font-size: .875rem; font-weight: 500; color: var(--color-text); }
.poi-item__dist { font-size: .8rem; color: var(--color-text-soft); font-weight: 600; white-space: nowrap; }
@media (max-width: 900px) { .location-block { grid-template-columns: 1fr; } }

/* Sidebar */
.product-sidebar { position: sticky; top: calc(var(--navbar-h) + 24px); }
.sidebar-card { border: 1.5px solid var(--color-border); border-radius: var(--radius-lg); padding: 26px; box-shadow: var(--shadow-md); background: var(--color-white); }
.sidebar-card__price-label { font-size: .74rem; color: var(--color-text-soft); text-transform: uppercase; letter-spacing: .04em; }
.sidebar-card__price { font-size: 1.85rem; font-weight: 800; color: var(--color-primary); margin: 4px 0 20px; letter-spacing: -.01em; }
.sidebar-card__price span { font-size: .85rem; color: var(--color-text-soft); font-weight: 600; }
.sidebar-card__divider { height: 1px; background: var(--color-bg); margin: 20px 0; }
.sidebar-card__cta-group { display: flex; flex-direction: column; gap: 10px; }
.sidebar-agent { display: flex; align-items: center; gap: 12px; }
.sidebar-agent__avatar { width: 44px; height: 44px; border-radius: 50%; background: var(--color-primary-light); color: var(--color-primary-dark); display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: .9rem; flex-shrink: 0; }
.sidebar-agent__name { font-size: .875rem; font-weight: 700; color: var(--color-text); }
.sidebar-agent__role { font-size: .76rem; color: var(--color-text-soft); }
.sidebar-trust { display: flex; align-items: center; gap: 8px; font-size: .78rem; color: var(--color-text-soft); margin-top: 16px; }
.sidebar-trust svg { width: 15px; height: 15px; color: var(--color-success); flex-shrink: 0; }

/* Similar programmes carousel */
.similar-carousel { position: relative; }
.similar-carousel__track {
  display: flex; gap: 20px; overflow-x: auto; padding-bottom: 8px;
  scroll-behavior: smooth; scrollbar-width: none;
}
.similar-carousel__track::-webkit-scrollbar { display: none; }
.similar-carousel__track .programme-card { min-width: 290px; max-width: 290px; flex-shrink: 0; }
.similar-carousel__nav {
  position: absolute; top: 38%; transform: translateY(-50%);
  width: 38px; height: 38px; border-radius: 50%;
  background: var(--color-white); border: 1.5px solid var(--color-border); box-shadow: var(--shadow-md);
  display: flex; align-items: center; justify-content: center; cursor: pointer; z-index: 5;
}
/* design.md §4 touch target, padded hit area — see .vite-modal__close for
   why this is -4.5px, not -3px (1.5px border eats into the padding box
   the inset is relative to). */
.similar-carousel__nav::before { content: ''; position: absolute; inset: -4.5px; }
.similar-carousel__nav--prev { left: -18px; }
.similar-carousel__nav--next { right: -18px; }
@media (max-width: 768px) { .similar-carousel__nav { display: none; } }

/* Mobile sticky action bar */
.product-sticky-bar { display: none; }
@media (max-width: 980px) {
  .product-sidebar { display: none; }
  .product-sticky-bar {
    display: flex; position: fixed; bottom: 0; left: 0; right: 0; z-index: 80;
    background: var(--color-white); border-top: 1.5px solid var(--color-border);
    padding: 12px 20px; align-items: center; justify-content: space-between; gap: 14px;
    box-shadow: 0 -4px 16px rgba(0,0,0,.06);
  }
  .product-sticky-bar__price { font-size: 1.05rem; font-weight: 800; color: var(--color-primary); }
  .product-sticky-bar__price-label { font-size: .68rem; color: var(--color-text-soft); text-transform: uppercase; }
  body.has-sticky-bar { padding-bottom: 76px; }
}

/* Contact modal (reuses .vite-overlay / .vite-modal from main.css) */
.contact-modal__two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
@media (max-width: 420px) { .contact-modal__two-col { grid-template-columns: 1fr; } }

/* Share modal (reuses .vite-overlay / .vite-modal from main.css) */
.share-copy-row { display: flex; gap: 8px; }
.share-copy-row input {
  flex: 1;
  min-width: 0;
  padding: 12px 14px;
  border: 1.5px solid var(--color-border);
  border-radius: var(--radius-md);
  font-size: .8125rem;
  color: var(--color-text-soft);
  background: var(--color-surface);
}
.share-copy-row .btn { flex-shrink: 0; display: inline-flex; align-items: center; gap: 6px; }

.share-channels { display: flex; gap: 10px; margin-top: 20px; }
.share-channel {
  flex: 1;
  display: flex; flex-direction: column; align-items: center; gap: 6px;
  padding: 14px 8px;
  border: 1.5px solid var(--color-border);
  border-radius: var(--radius-md);
  color: var(--color-text);
  font-size: .75rem;
  font-weight: 600;
  text-decoration: none;
  transition: border-color var(--transition-normal), color var(--transition-normal), background var(--transition-normal);
}
.share-channel:hover { border-color: var(--color-primary); color: var(--color-primary); background: var(--color-surface); }