/* ============================================================
   O'LELESHWA — production design system
   Direction B: "Evening on the Escarpment"
   Dark ground, fire and lamplight; long reading on cream plates.

   This file is the single shared stylesheet for every page.
   Pages link it with:  <link rel="stylesheet" href="assets/site.css">
   Component usage rules: see docs/components.md
============================================================ */

/* ------------------------------------------------------------
   1. FONTS  (exactly two faces — Source Serif 4 + Inter)
------------------------------------------------------------ */
@font-face {
  font-family: 'Source Serif 4';
  src: url('fonts/SourceSerif4-sub.ttf') format('truetype-variations');
  font-weight: 200 900; font-style: normal; font-display: swap;
}
@font-face {
  font-family: 'Source Serif 4';
  src: url('fonts/SourceSerif4-Italic-sub.ttf') format('truetype-variations');
  font-weight: 200 900; font-style: italic; font-display: swap;
}
@font-face {
  font-family: 'Inter';
  src: url('fonts/Inter-sub.ttf') format('truetype-variations');
  font-weight: 100 900; font-style: normal; font-display: swap;
}
@font-face {
  font-family: 'Inter';
  src: url('fonts/Inter-Italic-sub.ttf') format('truetype-variations');
  font-weight: 100 900; font-style: italic; font-display: swap;
}

/* ------------------------------------------------------------
   2. TOKENS
------------------------------------------------------------ */
:root {
  /* -- color -- */
  --night:          #131A0E;                    /* dominant dark ground */
  --night-deep:     #0C1108;                    /* footer / deepest band */
  --cream:          #EFE8D5;                    /* reading plates */
  --ink:            #232014;                    /* ink on cream (warm near-black) */
  --ink-soft:       rgba(35, 32, 20, 0.72);     /* captions/secondary on cream */
  --dust:           #C8B48A;                    /* rift-dust: micro-labels on dark */
  --cream-ink:      #EFE8D5;                    /* ink on dark */
  --cream-dim:      rgba(239, 232, 213, 0.74);  /* secondary text on dark */
  --cream-faint:    rgba(239, 232, 213, 0.5);   /* captions on dark */
  --hairline-dark:  rgba(200, 180, 138, 0.22);  /* rules on dark */
  --hairline-cream: rgba(35, 32, 20, 0.16);     /* rules on cream */
  --label-cream:    #6E6444;                    /* micro-labels on cream */

  /* -- type -- */
  --serif: 'Source Serif 4', Georgia, serif;
  --sans:  'Inter', system-ui, sans-serif;
  --fz-micro:      11px;                           /* micro-label */
  --fz-caption:    12px;                           /* caption */
  --fz-body:       17.5px;                         /* body (root) */
  --fz-body-sm:    1.03rem;                        /* short dark-ground prose */
  --fz-head:       clamp(1.7rem, 2.7vw, 2.35rem);  /* section head on cream */
  --fz-duet-head:  clamp(1.9rem, 3.4vw, 2.8rem);   /* head in a duet band */
  --fz-dark-head:  clamp(2.1rem, 4vw, 3.4rem);     /* big head on dark */
  --fz-display:    clamp(2.9rem, 6vw, 5rem);       /* h1 in the hero */
  --fz-line:       clamp(1.6rem, 3.1vw, 2.5rem);   /* inscription line */
  --fz-line-close: clamp(1.5rem, 2.8vw, 2.2rem);   /* closing doorway line */
  --fz-line-quiet: clamp(1.35rem, 2.4vw, 1.9rem);  /* quieter closing line */

  /* -- layout -- */
  --axis:     clamp(1.25rem, 7vw, 8.5rem);  /* the one left axis */
  --axis-r:   clamp(1.25rem, 5vw, 5rem);    /* right margin */
  --marg-w:   10.5rem;                      /* margin column (labels/captions) */
  --marg-gap: 4rem;                         /* gap between margin + content */
  --content-w: 37rem;                       /* reading column (~65ch) */
  --fig-w:     47rem;                       /* in-plate figure column */
  --wide-w:    76rem;                       /* widest content (cards, footer) */

  /* -- space -- */
  --sp-band:    clamp(4.5rem, 10vh, 7.5rem);  /* dark band vertical padding */
  --sp-plate-t: clamp(4rem, 9vh, 7rem);       /* cream plate top padding */
  --sp-plate-b: clamp(4.5rem, 9vh, 7rem);     /* cream plate bottom padding */
  --sp-row:     clamp(3rem, 6vh, 4.5rem);     /* between blocks in a plate */
  --sp-fig:     clamp(2.5rem, 6vh, 4rem);     /* above in-plate figures */
  --sp-close:   clamp(5.5rem, 12vh, 8.5rem);  /* closing doorway padding */
}

/* ------------------------------------------------------------
   3. BASE
------------------------------------------------------------ */
* { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
  background: var(--night);
  color: var(--cream-ink);
  font-family: var(--serif);
  font-size: var(--fz-body);
  line-height: 1.7;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
}
img { display: block; max-width: 100%; height: auto; }
a { color: inherit; text-decoration: none; }
a:hover { opacity: 0.75; }
::selection { background: var(--dust); color: var(--night); }

/* ------------------------------------------------------------
   4. TYPE ROLES (five only: display / head / body / caption / micro)
------------------------------------------------------------ */
.micro {
  font-family: var(--sans);
  font-size: var(--fz-micro); font-weight: 500;
  letter-spacing: 0.2em; text-transform: uppercase;
  color: var(--dust);
}
.plate .micro { color: var(--label-cream); }

.caption {
  font-family: var(--sans);
  font-size: var(--fz-caption); font-weight: 400;
  letter-spacing: 0.015em; line-height: 1.6;
  color: var(--cream-faint);
}
.plate .caption { color: var(--ink-soft); }

.textlink {
  font-family: var(--sans); font-size: var(--fz-micro); font-weight: 500;
  letter-spacing: 0.15em; text-transform: uppercase;
  color: var(--dust); border-bottom: 1px solid var(--hairline-dark);
  padding-bottom: 3px;
}
.plate .textlink { color: var(--ink); border-bottom-color: var(--hairline-cream); }
.textlink-row { margin-top: 2.2rem; }

/* ------------------------------------------------------------
   5. SKIP LINK
   <a class="skip-link" href="#main">Skip to main content</a>
------------------------------------------------------------ */
.skip-link {
  position: fixed; top: -4rem; left: 0; z-index: 100;
  background: var(--cream); color: var(--ink);
  font-family: var(--sans); font-size: 0.8125rem; letter-spacing: 0.06em;
  padding: 0.7rem 1.2rem; transition: top 0.15s ease;
}
.skip-link:focus { top: 0; }

/* ------------------------------------------------------------
   6. HEADER + NAV (chrome). Sits over the hero.
   Active page: aria-current="page" on the nav link.
   Mobile menu: <details class="menu"> — pure CSS, no JS.
------------------------------------------------------------ */
header.site {
  position: absolute; top: 0; left: 0; right: 0; z-index: 10;
  display: flex; align-items: baseline; gap: 2rem;
  padding: 1.6rem var(--axis-r) 0 var(--axis);
}
.wordmark {
  font-family: var(--serif); font-size: 1.3rem; font-weight: 450;
  letter-spacing: 0.005em; color: var(--cream-ink);
}
nav.primary { display: flex; gap: 1.25rem; margin-left: auto; }
nav.primary a, .enquire, .menu summary {
  font-family: var(--sans); font-size: var(--fz-micro); font-weight: 500;
  letter-spacing: 0.15em; text-transform: uppercase;
  color: var(--cream-ink);
}
/* Seven items + the chrome CTA: tracking at the floor of the micro-label
   range (0.12em) so no nav item breaks across two lines above 1180px. */
nav.primary a { letter-spacing: 0.12em; white-space: nowrap; }
nav.primary a[aria-current="page"] {
  color: var(--dust);
  border-bottom: 1px solid var(--hairline-dark);
  padding-bottom: 2px;
}
.enquire {
  color: var(--dust);
  border-bottom: 1px solid var(--dust);
  padding-bottom: 2px;
  margin-left: 2rem; white-space: nowrap;
}

/* mobile menu (hidden on desktop) */
.menu { display: none; position: relative; margin-left: auto; }
.menu summary { cursor: pointer; list-style: none; }
.menu summary::-webkit-details-marker { display: none; }
.menu[open] summary { color: var(--dust); }
.menu .panel {
  position: absolute; top: calc(100% + 1rem); right: -0.5rem;
  min-width: 15rem;
  background: var(--night-deep);
  border: 1px solid var(--hairline-dark);
  padding: 1.5rem 1.75rem;
  display: flex; flex-direction: column; gap: 1.05rem;
}
.menu .panel a {
  font-family: var(--sans); font-size: var(--fz-micro); font-weight: 500;
  letter-spacing: 0.15em; text-transform: uppercase;
  color: var(--cream-ink);
}
.menu .panel a[aria-current="page"] { color: var(--dust); }

/* The seven-item nav needs ~1180px to stand on one line without shrinking
   or eating the right margin; below that the chrome uses the mobile menu. */
@media (max-width: 1180px) {
  nav.primary { display: none; }
  .menu { display: block; }
  .enquire { margin-left: 0; }
}

/* ------------------------------------------------------------
   7. HERO (dark; image + scrim + eyebrow/title, then either
      a sub-sentence + one quiet link, or epigraph + spec-line)
------------------------------------------------------------ */
.hero { position: relative; min-height: 100vh; min-height: 100svh; display: flex; align-items: flex-end; }
.hero img.bg {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; object-position: center 45%;
  z-index: 0;                             /* layer 0 — the still, always present */
}
/* Optional silent hero loop (index.html only). The <img class="bg"> stays in
   the markup as the fallback and the mobile experience; the video is layered
   directly over it, so the photograph is what shows until the loop's first
   frame (or its poster) arrives — never a black frame. Layers, bottom to top:
   0 img.bg / 1 video / 2 scrim / 3 copy. Phones and prefers-reduced-motion
   never load a frame of it: display:none keeps the still and saves the data. */
.hero .bg-video {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; object-position: center 50%;
  z-index: 1;
  pointer-events: none;                   /* no controls, nothing to click */
}
@media (prefers-reduced-motion: reduce) { .hero .bg-video { display: none; } }
.hero::after {
  content: ''; position: absolute; inset: 0; z-index: 2;
  background: linear-gradient(to top,
    rgba(12, 17, 8, 0.88) 0%,
    rgba(12, 17, 8, 0.42) 31%,
    rgba(12, 17, 8, 0) 57%,
    rgba(12, 17, 8, 0.5) 100%);
  pointer-events: none;
}
/* The default scrim is tuned to a blue-hour photograph. A daylight loop under
   it is brighter and moving, and the 11px eyebrow is the first thing to go:
   deepen the scrim wherever the loop actually shows (which is why the query
   mirrors the two rules that hide it). Measured over the loop's poster this
   returns the eyebrow to 4.3:1 and the sub-sentence to 8.6:1. */
@media (min-width: 701px) and (prefers-reduced-motion: no-preference) {
  .hero:has(.bg-video)::after {
    background: linear-gradient(to top,
      rgba(12, 17, 8, 0.94) 0%,
      rgba(12, 17, 8, 0.66) 36%,
      rgba(12, 17, 8, 0.14) 64%,
      rgba(12, 17, 8, 0.58) 100%);
  }
}
.hero-copy {
  position: absolute; left: 0; bottom: 0; z-index: 3;
  padding: 0 var(--axis-r) clamp(3rem, 7vh, 5.5rem) var(--axis);
  max-width: min(54rem, 100%);
  box-sizing: border-box;
}
/* Two quiet links on one baseline row (homepage hero only). */
.hero-links { display: flex; gap: 2.25rem; flex-wrap: wrap; align-items: baseline; }
.hero-copy .micro { display: block; margin-bottom: 1.4rem; }
h1.display {
  font-size: var(--fz-display);
  font-weight: 400; line-height: 1.02; letter-spacing: -0.015em;
  margin-bottom: 1.4rem;
}
.hero-sub {
  font-size: clamp(1.05rem, 1.5vw, 1.25rem);
  line-height: 1.55; color: var(--cream-dim);
  max-width: 34rem; margin-bottom: 1.8rem;
}
.hero-epigraph {
  font-style: italic;
  font-size: clamp(1.05rem, 1.5vw, 1.3rem);
  line-height: 1.5; color: var(--cream-dim);
  max-width: 33rem; margin-bottom: 1.6rem;
}
.hero-spec {
  font-family: var(--sans); font-size: var(--fz-micro); font-weight: 500;
  letter-spacing: 0.18em; text-transform: uppercase; color: var(--dust);
}

/* ------------------------------------------------------------
   8. INSCRIPTION (the mission band — structural position 2
      on the homepage; also any single carved sentence on dark)
------------------------------------------------------------ */
.inscription {
  padding: clamp(5rem, 10vh, 7.5rem) var(--axis-r) clamp(4rem, 8vh, 6rem) var(--axis);
}
.rule { width: 3.5rem; height: 1px; background: var(--dust); opacity: 0.6; margin-bottom: 2.2rem; }
.inscription p.line {
  font-size: var(--fz-line);
  line-height: 1.3; font-weight: 400; letter-spacing: -0.008em;
  max-width: 44rem;
}
.inscription .micro { display: block; margin-top: 2rem; }

/* ------------------------------------------------------------
   9. FULL-BLEED FIGURE (dark ground). Aspect modifiers:
      .bleed--panorama 8:3  (16:11 on mobile)
      .bleed--wide     21:10 (4:3 on mobile)
      .bleed--room     21:11 (4:3 on mobile)
      Standalone bleeds (direct children of <main>) carry their
      own bottom clearance so the caption never crowds what follows.
------------------------------------------------------------ */
figure.bleed { position: relative; }
figure.bleed img { width: 100%; height: auto; object-fit: cover; }
figure.bleed figcaption {
  padding: 0.9rem var(--axis-r) 0 var(--axis);
  max-width: 46rem;
}
main > figure.bleed { padding-bottom: clamp(2.75rem, 6vh, 4.5rem); }
.bleed--panorama img { aspect-ratio: 8 / 3; }
.bleed--wide img     { aspect-ratio: 21 / 10; }
.bleed--room img     { aspect-ratio: 21 / 11; }
@media (max-width: 720px) {
  .bleed--panorama img { aspect-ratio: 16 / 11; }
  .bleed--wide img,
  .bleed--room img     { aspect-ratio: 4 / 3; }
}

/* ------------------------------------------------------------
   10. CREAM PLATE — the reading surface.
       .plate > .plate-pad > (.row | .fig-in | .fig-row)*
       .row = margin column (label/caption) + reading column.
       Blocks inside a plate space themselves automatically.
------------------------------------------------------------ */
.plate { background: var(--cream); color: var(--ink); }
.plate-pad { padding: var(--sp-plate-t) var(--axis-r) var(--sp-plate-b) var(--axis); }
.plate-pad > * + * { margin-top: var(--sp-row); }
.plate-pad > .fig-in + *,
.plate-pad > .fig-row + * { margin-top: var(--sp-row); }
.plate-pad > .flush { margin-top: 0; }

.row {
  display: grid;
  grid-template-columns: var(--marg-w) minmax(0, var(--content-w));
  column-gap: var(--marg-gap);
  align-items: start;
}
.row .marg { padding-top: 0.4rem; }
h2.head {
  font-size: var(--fz-head);
  font-weight: 400; line-height: 1.18; letter-spacing: -0.012em;
  margin-bottom: 1.4rem;
}
.plate p.body { color: var(--ink); max-width: 65ch; }
.plate p.body + p.body { margin-top: 1.2rem; }
.plate .textlink-row { margin-top: 2rem; }
@media (max-width: 860px) {
  .row { grid-template-columns: 1fr; row-gap: 1.1rem; }
}

/* In-plate figure: image in the content column (wider than text),
   caption in the margin column, bottom-aligned. */
.fig-in {
  display: grid;
  grid-template-columns: var(--marg-w) minmax(0, var(--fig-w));
  column-gap: var(--marg-gap);
  margin-top: var(--sp-fig);
}
.fig-in figcaption { align-self: end; padding-bottom: 0.35rem; }
.fig-in img { width: 100%; }
@media (max-width: 860px) {
  .fig-in { grid-template-columns: 1fr; }
  .fig-in figcaption { order: 2; padding-top: 0.8rem; }
  .fig-in img { order: 1; }
}

/* Two-up / three-up figure rows inside a plate. Portrait crops,
   equal heights via aspect-ratio + object-fit. */
.fig-row {
  display: grid;
  grid-template-columns: var(--marg-w) minmax(0, var(--fig-w));
  column-gap: var(--marg-gap);
  margin-top: var(--sp-fig);
}
.fig-row .set { display: grid; grid-template-columns: 1fr 1fr; gap: 2rem; }
.fig-row--three .set { grid-template-columns: 1fr 1fr 1fr; gap: 1.75rem; }
.fig-row figure img { width: 100%; aspect-ratio: 4 / 5; object-fit: cover; }
.fig-row--three figure img { aspect-ratio: 3 / 4; }
.fig-row figure figcaption { padding-top: 0.7rem; }
@media (max-width: 860px) {
  .fig-row { grid-template-columns: 1fr; }
  .fig-row .set, .fig-row--three .set { grid-template-columns: 1fr; gap: 2.5rem; }
}

/* ------------------------------------------------------------
   11. VILLA PEER CARDS (three peers on a cream plate).
       Equal image heights: fixed aspect-ratio + object-fit.
------------------------------------------------------------ */
.villas-grid {
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: 2.5rem;
  margin-top: var(--sp-fig);
  max-width: var(--wide-w);
}
.villa-card { display: grid; grid-template-rows: auto auto auto 1fr auto; }
.villa-card img { width: 100%; aspect-ratio: 4 / 5; object-fit: cover; }
.villa-card .v-name {
  font-family: var(--serif); font-size: 1.35rem; font-weight: 450;
  letter-spacing: -0.005em; margin-top: 1.2rem;
}
.villa-card .v-place {
  font-family: var(--serif); font-style: italic; font-size: 1rem;
  color: var(--ink-soft); margin-top: 0.15rem;
}
.villa-card .v-line { font-size: 0.98rem; line-height: 1.6; margin-top: 0.7rem; color: var(--ink); }
.villa-card .v-spec {
  font-family: var(--sans); font-size: var(--fz-micro); font-weight: 500;
  letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--label-cream); margin-top: 0.9rem;
}
@media (max-width: 860px) {
  .villas-grid { grid-template-columns: 1fr; gap: 3.25rem; }
  .villa-card img { aspect-ratio: 4 / 4.4; }
}

/* ------------------------------------------------------------
   12. DARK BAND — short copy on the night ground, usually
       followed by a full-bleed figure inside the band.
------------------------------------------------------------ */
.band { padding: var(--sp-band) 0; }
.band .band-copy { padding: 0 var(--axis-r) 0 var(--axis); max-width: 56rem; }
.band .micro { display: block; margin-bottom: 1.3rem; }
.band h2.dark-head, .band p.dark-head {
  font-size: var(--fz-dark-head);
  font-weight: 400; line-height: 1.08; letter-spacing: -0.014em;
  max-width: 26ch;
}
.dark-body { margin-top: 1.6rem; color: var(--cream-dim); max-width: 36rem; font-size: var(--fz-body-sm); }
.band figure.bleed { margin-top: clamp(2.75rem, 7vh, 4.5rem); }

/* ------------------------------------------------------------
   13. DUET — a vertical figure beside short copy, on dark.
       Default: bottom-aligned, figure 26rem / copy 33rem.
       .duet--center centres and narrows the figure (24/34).
       .duet--flush-b removes bottom padding (before a closing).
       Fine-tune per use with --duet-fig / --duet-copy inline.
------------------------------------------------------------ */
.duet {
  --duet-fig: 26rem; --duet-copy: 33rem;
  display: grid;
  grid-template-columns: minmax(0, var(--duet-fig)) minmax(0, var(--duet-copy));
  column-gap: clamp(3rem, 6vw, 6rem);
  padding: var(--sp-band) var(--axis-r) var(--sp-band) var(--axis);
  align-items: end;
}
.duet--center { align-items: center; --duet-fig: 24rem; --duet-copy: 34rem; }
.duet--flush-b { padding-bottom: 0; }
.duet figure img { width: 100%; aspect-ratio: 3 / 4; object-fit: cover; }
.duet--tall figure img { aspect-ratio: 4 / 5; }
.duet figure figcaption { padding-top: 0.8rem; }
.duet .micro { display: block; margin-bottom: 1.3rem; }
.duet .micro.kicker { margin-bottom: 1.6rem; }
.duet h2 {
  font-size: var(--fz-duet-head);
  font-weight: 400; line-height: 1.12; letter-spacing: -0.012em;
}
.duet .dark-body { margin-top: 1.5rem; max-width: 34rem; }
.duet p.line {
  font-size: clamp(1.6rem, 2.9vw, 2.3rem);
  line-height: 1.25; letter-spacing: -0.01em; max-width: 20ch;
}
@media (max-width: 860px) {
  .duet { grid-template-columns: 1fr; row-gap: 2.5rem; align-items: start; }
  .duet figure { max-width: 24rem; }
}

/* ------------------------------------------------------------
   14. FACTS LIST (on dark) — hairline-ruled label + sentence
       rows. Lives in the copy column of a duet, or standalone
       in a band-copy.
------------------------------------------------------------ */
.facts .fact { border-top: 1px solid var(--hairline-dark); padding: 1.15rem 0; }
.facts .fact:last-child { border-bottom: 1px solid var(--hairline-dark); }
.facts .fact .micro { display: block; margin-bottom: 0.35rem; }
.facts .fact p { color: var(--cream-dim); font-size: 1.02rem; line-height: 1.55; margin: 0; }

/* ------------------------------------------------------------
   15. PULL-QUOTE (on dark) — an outside voice, attributed.
------------------------------------------------------------ */
.pullquote {
  padding: var(--sp-band) var(--axis-r) var(--sp-band) var(--axis);
}
.pullquote blockquote p {
  font-style: italic;
  font-size: clamp(1.6rem, 3vw, 2.4rem);
  line-height: 1.32; letter-spacing: -0.008em;
  max-width: 40rem;
}
.pullquote figcaption {
  margin-top: 1.8rem;
  font-family: var(--sans); font-size: var(--fz-micro); font-weight: 500;
  letter-spacing: 0.2em; text-transform: uppercase; color: var(--dust);
}

/* ------------------------------------------------------------
   16. SPEC BLOCK (Fogo model) — the villa in fact, on dark.
------------------------------------------------------------ */
.spec { padding: var(--sp-band) var(--axis-r) var(--sp-band) var(--axis); }
.spec .micro.kicker { display: block; margin-bottom: 2.2rem; }
.spec dl { max-width: 46rem; border-top: 1px solid var(--hairline-dark); }
.spec .spec-row {
  display: grid; grid-template-columns: var(--marg-w) minmax(0, 1fr);
  column-gap: var(--marg-gap); padding: 1.15rem 0;
  border-bottom: 1px solid var(--hairline-dark);
}
.spec dt {
  font-family: var(--sans); font-size: var(--fz-micro); font-weight: 500;
  letter-spacing: 0.2em; text-transform: uppercase; color: var(--dust);
  padding-top: 0.35rem;
}
.spec dd { color: var(--cream-dim); font-size: 1.02rem; line-height: 1.55; }
@media (max-width: 640px) {
  .spec .spec-row { grid-template-columns: 1fr; row-gap: 0.3rem; padding: 1rem 0; }
}

/* ------------------------------------------------------------
   17. ACCORDION (cream plate) — native details/summary.
       Use inside a plate's reading column for practicalities.
------------------------------------------------------------ */
details.accordion { border-top: 1px solid var(--hairline-cream); }
details.accordion:last-of-type { border-bottom: 1px solid var(--hairline-cream); }
.accordion summary {
  display: flex; justify-content: space-between; align-items: baseline; gap: 2rem;
  padding: 1.15rem 0;
  font-family: var(--serif); font-size: 1.1rem; line-height: 1.45;
  cursor: pointer; list-style: none;
}
.accordion summary::-webkit-details-marker { display: none; }
.accordion summary::after {
  content: '+';
  font-family: var(--sans); font-size: 1rem; font-weight: 400;
  color: var(--label-cream); flex-shrink: 0;
}
.accordion[open] summary::after { content: '\2212'; }
.accordion .acc-body { padding: 0.1rem 0 1.4rem; max-width: 60ch; }
.accordion .acc-body p + p { margin-top: 1rem; }

/* ------------------------------------------------------------
   17b. EDITORIAL LIST (cream plate) — hairline-separated entries
        that reuse the plate's .row grid: micro-label in the margin
        column, entry in the reading column. Used for The Place's
        O'Leleshwa Circuit. NO new type size: the entry title is the
        body role at 600 weight, so the five type roles still hold.
------------------------------------------------------------ */
.entry-list .row { border-top: 1px solid var(--hairline-cream); padding-top: 1.5rem; }
.entry-list .row + .row { margin-top: 2rem; }
.entry-list h3 {
  font-family: var(--serif); font-size: 1rem; font-weight: 600;
  line-height: 1.5; letter-spacing: 0.005em; margin-bottom: 0.55rem;
}

/* ------------------------------------------------------------
   18. ENQUIRY FORM (cream plate). Give the wrapping section
       id="enquire". Labels are micro-labels; fields are quiet
       1px boxes; one solid-ink submit.
------------------------------------------------------------ */
.enquiry-form { max-width: 40rem; color-scheme: light; }
.enquiry-form .field { display: flex; flex-direction: column; gap: 0.5rem; }
.enquiry-form > * + * { margin-top: 1.6rem; }
.enquiry-form .field-grid {
  display: grid; grid-template-columns: 1fr 1fr; gap: 1.6rem 2rem;
}
.enquiry-form label {
  font-family: var(--sans); font-size: var(--fz-micro); font-weight: 500;
  letter-spacing: 0.2em; text-transform: uppercase; color: var(--label-cream);
}
.enquiry-form input,
.enquiry-form select,
.enquiry-form textarea {
  font-family: var(--serif); font-size: 1rem; line-height: 1.5;
  color: var(--ink); background: transparent;
  border: 1px solid var(--hairline-cream); border-radius: 0;
  padding: 0.7rem 0.85rem;
  width: 100%;
}
.enquiry-form textarea { min-height: 9rem; resize: vertical; }
.enquiry-form input:focus,
.enquiry-form select:focus,
.enquiry-form textarea:focus {
  outline: none; border-color: var(--ink);
}
.enquiry-form .form-note { font-size: 0.95rem; color: var(--ink-soft); margin-top: 1.4rem; max-width: 55ch; }
.btn {
  display: inline-block; margin-top: 2rem;
  font-family: var(--sans); font-size: var(--fz-micro); font-weight: 500;
  letter-spacing: 0.15em; text-transform: uppercase;
  color: var(--cream); background: var(--ink);
  border: 1px solid var(--ink); border-radius: 0;
  padding: 1rem 2.4rem; cursor: pointer;
}
.btn:hover { opacity: 0.85; }
@media (max-width: 640px) {
  .enquiry-form .field-grid { grid-template-columns: 1fr; }
}

/* ------------------------------------------------------------
   19. CLOSING DOORWAY — every page ends with exactly one.
       .closing--quiet for the smaller line on content pages.
------------------------------------------------------------ */
.closing { padding: var(--sp-close) var(--axis-r) var(--sp-close) var(--axis); }
.closing .rule { margin-bottom: 2.2rem; }
.closing p.line {
  font-size: var(--fz-line-close);
  line-height: 1.32; max-width: 38rem; letter-spacing: -0.008em;
}
.closing--quiet { padding-top: clamp(4rem, 9vh, 6rem); }
.closing--quiet p.line { font-size: var(--fz-line-quiet); line-height: 1.35; max-width: 36rem; letter-spacing: -0.006em; }
.closing .sig { display: block; margin-top: 1.1rem; font-style: italic; font-size: 1rem; color: var(--cream-faint); }
.closing .textlink-row { margin-top: 2.4rem; }
.closing .links { margin-top: 2.4rem; display: flex; gap: 2.5rem; flex-wrap: wrap; align-items: baseline; }
.closing .links .secondary { color: var(--cream-dim); border-bottom-color: transparent; }

/* ------------------------------------------------------------
   20. FOOTER — text wordmark, mission line, page nav,
       reservations (mailto/tel), estate, "Reservations open".
------------------------------------------------------------ */
footer.site-footer {
  background: var(--night-deep);
  border-top: 1px solid var(--hairline-dark);
  padding: 3.5rem var(--axis-r) 2.5rem var(--axis);
}
.footer-grid {
  display: grid; grid-template-columns: 1.3fr 0.8fr 1fr 1fr; gap: 3rem;
  max-width: var(--wide-w);
}
.footer-wordmark { font-family: var(--serif); font-size: 1.25rem; font-weight: 450; }
.footer-mission { margin-top: 0.8rem; font-size: 0.95rem; color: var(--cream-dim); max-width: 24rem; }
.footer-col .micro { display: block; margin-bottom: 0.9rem; }
/* second label inside a column (e.g. "Follow" under Reservations) */
.footer-col .micro.follow { margin-top: 1.6rem; }
.footer-col p, .footer-col a {
  font-family: var(--sans); font-size: 0.85rem; line-height: 1.9;
  color: var(--cream-dim); display: block;
}
.footer-base {
  margin-top: 3rem; padding-top: 1.5rem;
  border-top: 1px solid var(--hairline-dark);
  display: flex; justify-content: space-between; gap: 1rem; flex-wrap: wrap;
  font-family: var(--sans); font-size: var(--fz-micro); letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--cream-faint);
}
@media (max-width: 1080px) { .footer-grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 640px)  { .footer-grid { grid-template-columns: 1fr; gap: 2.25rem; } }

/* ------------------------------------------------------------
   21. SOLO PAGE (404, enquiry-received) — a single inscription
       with no hero image, centred in the viewport. Mirrors
       .inscription p.line type on the h1. Applied as
       <section class="inscription solo">.
------------------------------------------------------------ */
.solo { min-height: 82vh; display: flex; flex-direction: column; justify-content: center; padding-top: 7rem; }
.solo h1.line { font-size: var(--fz-line); line-height: 1.3; font-weight: 400; letter-spacing: -0.008em; max-width: 44rem; }
.solo .dark-body { margin-top: 1.6rem; }
.solo .dark-body a { border-bottom: 1px solid var(--hairline-dark); padding-bottom: 1px; }
.solo .links { margin-top: 2.6rem; display: flex; gap: 2.5rem; flex-wrap: wrap; align-items: baseline; }
.solo .links .secondary { color: var(--cream-dim); border-bottom-color: var(--hairline-dark); }
.solo .links .secondary:hover { color: var(--cream-ink); border-bottom-color: var(--dust); }

/* ------------------------------------------------------------
   22. FILM BLOCK (inside a dark .band) — a single column of
       <video> plates on the night ground. Used on gallery.html
       (five films) and, one film at a time, on the-experience.html
       and our-mission.html, where a film block counts as that
       section's image.
       Sits on the page's left axis like .band-copy, but runs
       wider: plate width capped at 1100px. Each film is a
       <figure class="film"> holding one <video controls
       preload="none" poster="…" playsinline> and a .caption.
       16/9 with a near-black ground so nothing flashes while the
       poster and file load. No JS: native controls, nothing
       autoplays, and the page is complete without them.
------------------------------------------------------------ */
.films {
  margin-top: clamp(2.75rem, 7vh, 4.5rem);
  padding: 0 var(--axis-r) 0 var(--axis);
  display: grid;
  gap: clamp(3.25rem, 8vh, 5.5rem);
}
.film { max-width: 68.75rem; }            /* 1100px at the 16px root */
.film video {
  display: block; width: 100%;
  aspect-ratio: 16 / 9;
  background: #05070A;                    /* near-black while loading */
}
.film figcaption { padding-top: 0.85rem; }

/* 22. Focus visibility (build) */
a:focus-visible, summary:focus-visible, button:focus-visible {
  outline: 2px solid var(--rift-dust, #C8B48A); outline-offset: 3px;
}
.plate a:focus-visible { outline-color: var(--moss, #4A5A2A); }
.fig-in img { height: auto; }
img { max-width: 100%; }
