/* ═══════════ SIENNA — Interior Architecture ═══════════
   Luxury restraint: two warm colours only. Charcoal carries the page,
   travertine carries every accent. The photography supplies all other colour. */
:root {
  --char:     #0d0d0d;   /* deep matte charcoal */
  --char-2:   #161514;
  --trav:     #d4b896;   /* warm travertine / sand */
  --trav-dim: rgba(212, 184, 150, 0.55);
  --trav-faint: rgba(212, 184, 150, 0.16);
  /* Marcellus, not a didone. Bodoni's extreme contrast is a fashion-magazine
     voice — loud where this studio is quiet, and its hairlines break up at the
     smaller sizes, which is what read as cheap. Marcellus is drawn from Roman
     inscriptional capitals: even stroke weight that never thins to nothing, so
     it holds at 10rem over a photograph and at 1rem in a member list alike.
     A studio that works in cut stone should be set in letters that look cut. */
  --display: 'Marcellus', 'Trajan Pro', Georgia, serif;
  /* --serif is kept as a name so the twenty rules using it need no edit; it
     now resolves to the same single face the headlines use. */
  --serif: 'Marcellus', 'Trajan Pro', Georgia, serif;
  --sans:  'Inter', -apple-system, sans-serif;
  --hand:  'Architects Daughter', cursive;   /* the pencilled asides */
  --ease:  cubic-bezier(.22, 1, .36, 1);

  /* Display type is the whole identity here: enormous and nearly weightless.
     Set once so every headline on the page is provably on the same scale. */
  --d-xl: clamp(3.2rem, 11.5vw, 11rem);   /* section statements */
  --d-lg: clamp(2.4rem, 7vw, 6.4rem);
  --d-md: clamp(1.8rem, 4.2vw, 3.4rem);
}

* { margin: 0; padding: 0; box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
  background: var(--char);
  color: var(--trav);
  font-family: var(--sans);
  font-weight: 300;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}
::selection { background: var(--trav); color: var(--char); }
img { display: block; }
a { color: inherit; text-decoration: none; }

/* ── Lenis ──
   Only applied once Lenis has taken over (it stamps these on <html>), so
   nothing here affects the page when the library is absent. Its easing and the
   browser's own smooth-scroll would otherwise fight each other. */
html.lenis, html.lenis body { height: auto; }
.lenis.lenis-smooth { scroll-behavior: auto !important; }
.lenis.lenis-stopped { overflow: hidden; }

/* ═══ NAV ═══
   Retracts on the way down and returns the moment you reverse, so the bar is
   out of the way while reading but never more than a flick away. */
.nav {
  position: fixed; inset: 0 0 auto 0; z-index: 60;
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
  padding: 1.5rem clamp(1.2rem, 4vw, 3rem);
  transition: transform .25s ease-out;
}
/* a scrim rather than mix-blend-mode: the bar has to stay readable over a
   bright room as well as a dark one, and difference-blending inverted it */
.nav::before {
  content: ''; position: absolute; inset: 0; z-index: -1; pointer-events: none;
  background: linear-gradient(180deg, rgba(13,13,13,.72), rgba(13,13,13,.28) 60%, transparent);
}
.nav.retracted { transform: translateY(-100%); }
.brand { display: inline-flex; align-items: center; gap: .6rem; font-size: .82rem; letter-spacing: .42em; font-weight: 500; min-width: 0; }
.nav-cta, .nav-mid { flex-shrink: 0; }
.brand-mark { width: 9px; height: 9px; border: 1px solid currentColor; border-radius: 1px; transform: rotate(45deg); }
.nav-mid { font-size: .6rem; letter-spacing: .34em; text-transform: uppercase; opacity: .6; }
.nav-cta { font-size: .6rem; letter-spacing: .3em; text-transform: uppercase; border-bottom: 1px solid currentColor; padding-bottom: .25rem; }
@media (max-width: 720px) { .nav-mid { display: none; } }

/* ═══════════ THE WALK ═══════════
   One tall scroll track with a pinned stage. Every room is a full-bleed layer
   stacked in the same box; scroll drives a push-in on the room you're in while
   the next room opens through a doorway-shaped portal in front of it. */
.walk { position: relative; }               /* height set from JS: rooms × 100vh */
.walk-stage {
  position: sticky; top: 0; height: 100svh; overflow: hidden;
  background: var(--char);
}
/* the film fills the stage at any viewport ratio; object-fit keeps the
   architecture's geometry honest instead of stretching it */
.tour-video {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
}

/* ── loader: holds the walk until the film is fully local ── */
.loader {
  position: absolute; inset: 0; z-index: 9;
  display: grid; place-items: center;
  background: var(--char);
  transition: opacity .8s var(--ease), visibility .8s;
}
.loader.gone { opacity: 0; visibility: hidden; }
.loader-inner { display: flex; flex-direction: column; align-items: center; gap: 1.1rem; }
.loader-kicker { font-size: .6rem; letter-spacing: .42em; text-transform: uppercase; color: var(--trav-dim); }
.loader-bar { width: min(15rem, 54vw); height: 1px; background: var(--trav-faint); }
.loader-fill { display: block; height: 100%; width: 0%; background: var(--trav); transition: width .25s linear; }
.loader-label { font-family: var(--serif); font-size: .95rem; color: var(--trav-dim); }

.haze {
  position: absolute; inset: 0; z-index: 5; pointer-events: none;
  /* must be the same black as --char, or the film's edges read lighter than the page */
  background:
    linear-gradient(180deg, rgba(13,13,13,.72) 0%, rgba(13,13,13,.08) 30%, rgba(13,13,13,.30) 62%, rgba(13,13,13,.94) 100%),
    radial-gradient(ellipse 66% 58% at 50% 50%, transparent 38%, rgba(13,13,13,.72) 100%);
}
.grain {
  position: absolute; inset: 0; z-index: 6; pointer-events: none; opacity: .45; mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)' opacity='0.42'/%3E%3C/svg%3E");
  background-size: 140px 140px;
}

/* ── the name plate, keyed to whichever room you are inside ── */
.plate {
  position: absolute; z-index: 8; left: clamp(1.2rem, 5vw, 4.5rem);
  bottom: clamp(3.4rem, 11vh, 7rem); max-width: min(32rem, 76vw);
  will-change: opacity, transform;
}
.plate-num { font-family: var(--serif); font-size: .95rem; letter-spacing: .3em; color: var(--trav-dim); display: block; margin-bottom: .8rem; }
.plate-name { font-family: var(--serif); font-weight: 300; font-size: clamp(2.4rem, 7vw, 5.4rem); line-height: .96; }
.plate-sub { margin-top: 1rem; font-size: .9rem; line-height: 1.85; color: var(--trav-dim); }

.walkbar {
  position: absolute; z-index: 8; left: clamp(1.2rem, 5vw, 4.5rem);
  right: clamp(1.2rem, 5vw, 4.5rem); bottom: 1.8rem; height: 1px;
  background: var(--trav-faint);
}
.walkbar-fill { display: block; height: 100%; width: 0%; background: var(--trav); box-shadow: 0 0 10px var(--trav-dim); }

.cue {
  position: absolute; z-index: 8; right: clamp(1.2rem, 5vw, 4.5rem); bottom: clamp(3.4rem, 11vh, 7rem);
  display: flex; flex-direction: column; align-items: center; gap: .7rem;
  font-size: .55rem; letter-spacing: .4em; text-transform: uppercase; color: var(--trav-dim);
  transition: opacity .6s var(--ease);
}
.cue i { display: block; width: 1px; height: 40px; background: var(--trav-faint); position: relative; overflow: hidden; }
.cue i::after { content: ''; position: absolute; left: 0; top: -40%; width: 100%; height: 40%; background: var(--trav); animation: cue 2.4s ease-in-out infinite; }
@keyframes cue { to { top: 110%; } }
@media (max-width: 720px) { .cue { display: none; } }

.kicker { font-size: .6rem; letter-spacing: .42em; text-transform: uppercase; color: var(--trav-dim); }

/* ── the one reveal primitive the whole page below the walk shares.
      Driven from the scroll handler in main.js, not IntersectionObserver, so a
      single code path decides what is on screen. ── */
.rise {
  display: block;
  opacity: 0; transform: translateY(26px);
  transition: opacity 1s var(--ease), transform 1s var(--ease);
  transition-delay: calc(var(--d, 0) * 110ms);
}
.rise.in { opacity: 1; transform: none; }

/* ── the display headline system ──
   Massive and nearly weightless. Every statement on the page is built from
   this, so the whole site reads as one voice rather than a set of sections. */
.display {
  /* 400 is Bodoni's lightest cut, but at these sizes its hairlines already
     read thinner than Cormorant at 200 did — the contrast does the work the
     weight used to, and nothing disappears against a bright photograph. */
  font-family: var(--display); font-weight: 400; line-height: 1.06;
  /* a hair of positive tracking, for the same reason as .h-mega */
  letter-spacing: .005em; text-wrap: balance;
}
/* No italic: Marcellus ships roman only, so `font-style: italic` would make the
   browser synthesise one by shearing the glyphs — on an inscriptional face that
   looks like a mistake rather than an emphasis. The stressed phrase is set
   apart by colour and a touch more tracking instead, which is how carved
   inscriptions have always done it. */
.display em {
  font-style: normal; color: var(--trav); opacity: 1;
  letter-spacing: .06em;
}
.d-xl { font-size: var(--d-xl); }
.d-lg { font-size: var(--d-lg); }
.d-md { font-size: var(--d-md); }
/* every section opens the same way — small kicker, then the statement */
.kicker + .display { margin-top: 1.2rem; }

/* A didone needs size to work: below about a rem its hairlines thin to nothing
   and the numbers read as broken rather than delicate. The small counters and
   labels go back to the sans, which is what carries every other small thing
   on the page anyway. */
.plate-num, .idx-num, .rail-count, .pal-num, .loader-label, .studio-city {
  font-family: var(--sans); font-weight: 300;
}

/* Words are wrapped by JS, then each rises out of its own clipped box a beat
   after the one before it. The mask is the point: the word arrives from
   nowhere rather than fading in place. */
.w { display: inline-block; overflow: hidden; vertical-align: bottom; }
.w > i {
  display: inline-block; font-style: inherit;
  transform: translateY(105%);
  transition: transform .95s var(--ease);
  transition-delay: calc(var(--w, 0) * 55ms);
}
.split.in .w > i { transform: none; }
/* if the splitter never runs, the text must still be readable */
.split:not(.done) .w > i { transform: none; }

/* ═══ MANIFESTO ═══ */
.manifesto {
  min-height: 92svh; display: flex; flex-direction: column; justify-content: center;
  padding: 12vh clamp(1.2rem, 5vw, 4.5rem);
}
.manifesto-mark { margin-bottom: clamp(2rem, 6vh, 4rem); }
.manifesto-line { max-width: 18ch; }
.manifesto-foot {
  margin-top: clamp(2.5rem, 7vh, 5rem); display: grid;
  grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); gap: 1.6rem 3rem;
  max-width: 62rem;
}
.manifesto-foot p { font-size: .92rem; line-height: 1.95; color: var(--trav-dim); }

/* ═══ THREE PILLARS ═══ */
.pillars {
  display: grid; grid-template-columns: repeat(3, 1fr);
  border-top: 1px solid var(--trav-faint);
}
.pillar {
  padding: clamp(2.4rem, 7vh, 4.6rem) clamp(1.2rem, 3vw, 2.6rem);
  border-left: 1px solid var(--trav-faint);
  display: flex; flex-direction: column; gap: 1rem;
  transition: background .6s var(--ease);
}
.pillar:first-child { border-left: 0; }
.pillar:hover { background: var(--char-2); }
.pillar-num { font-size: .6rem; letter-spacing: .3em; color: var(--trav-dim); }
.pillar-name { font-family: var(--serif); font-weight: 200; font-size: clamp(1.5rem, 3vw, 2.4rem); line-height: 1.05; }
.pillar-copy { font-size: .87rem; line-height: 1.95; color: var(--trav-dim); }
.pillar-link { margin-top: auto; padding-top: 1.4rem; font-size: .6rem; letter-spacing: .28em; text-transform: uppercase; color: var(--trav-dim); }
.pillar-link::after { content: ' →'; }
.pillar:hover .pillar-link { color: var(--trav); }
@media (max-width: 860px) {
  .pillars { grid-template-columns: 1fr; }
  .pillar { border-left: 0; border-top: 1px solid var(--trav-faint); }
  .pillar:first-child { border-top: 0; }
}

/* ═══ WHAT WE TAKE ON — the categories ═══ */
.cats { padding: clamp(4rem, 11vh, 8rem) clamp(1.2rem, 5vw, 4.5rem); }
.cats-head { margin-bottom: clamp(2.5rem, 7vh, 4.5rem); }
.cat {
  position: relative; display: grid; align-items: center; gap: 1.5rem;
  grid-template-columns: 4rem minmax(0, 1fr) 9rem;
  padding: clamp(1.4rem, 3.4vh, 2.4rem) 0;
  border-top: 1px solid var(--trav-faint);
  overflow: hidden;
}
.cats > .cat:last-of-type { border-bottom: 1px solid var(--trav-faint); }
.cat-num { font-size: .62rem; letter-spacing: .28em; color: var(--trav-dim); }
.cat-name { font-family: var(--serif); font-weight: 200; font-size: clamp(1.7rem, 4.6vw, 3.4rem); line-height: 1; }
.cat-count { font-size: .62rem; letter-spacing: .24em; text-transform: uppercase; color: var(--trav-dim); text-align: right; }
/* a thumbnail strip that slides in from the right edge on hover */
.cat-strip {
  position: absolute; right: 9.5rem; top: 50%; translate: 0 -50%;
  display: flex; gap: .5rem; pointer-events: none;
  opacity: 0; transform: translateX(28px);
  transition: opacity .6s var(--ease), transform .7s var(--ease);
}
.cat-strip img { width: 5.6rem; height: 3.6rem; object-fit: cover; border-radius: 1px; }
.cat:hover .cat-strip { opacity: 1; transform: none; }
.cat:hover .cat-name { color: #fff; }
@media (max-width: 860px) {
  .cat { grid-template-columns: 3rem minmax(0,1fr); }
  .cat-count { grid-column: 2; text-align: left; }
  .cat-strip { display: none; }
}

/* ═══ PHILOSOPHY ═══ */
.philosophy {
  padding: clamp(5rem, 14vh, 10rem) clamp(1.2rem, 5vw, 4.5rem);
  background: var(--char-2);
}
.philosophy-line { max-width: 15ch; }
.philosophy-grid {
  margin-top: clamp(3rem, 8vh, 5rem);
  display: grid; grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); gap: 2rem 3rem;
  max-width: 70rem;
}
.philosophy-grid h4 { font-family: var(--serif); font-weight: 300; font-size: 1.15rem; margin-bottom: .7rem; }
.philosophy-grid p { font-size: .87rem; line-height: 1.95; color: var(--trav-dim); }

/* ═══ TEAM ═══ */
.team { padding: clamp(4rem, 11vh, 8rem) clamp(1.2rem, 5vw, 4.5rem); }
.team-head { margin-bottom: clamp(2.5rem, 6vh, 4rem); }
.team-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr)); gap: 1px; background: var(--trav-faint); border: 1px solid var(--trav-faint); }
.member { background: var(--char); padding: clamp(1.4rem, 3vw, 2.2rem); transition: background .5s var(--ease); }
.member:hover { background: var(--char-2); }
.member-name { font-family: var(--serif); font-weight: 300; font-size: 1.3rem; }
.member-role { display: block; margin-top: .5rem; font-size: .6rem; letter-spacing: .24em; text-transform: uppercase; color: var(--trav-dim); }
.member-since { display: block; margin-top: 1.4rem; padding-top: .9rem; border-top: 1px solid var(--trav-faint); font-size: .7rem; color: var(--trav-dim); }

/* ═══ THE INDEX ═══ */
.index { padding: clamp(4rem, 10vh, 8rem) clamp(1.2rem, 5vw, 4.5rem) clamp(6rem, 14vh, 10rem); position: relative; }
.index-head { margin-bottom: clamp(3rem, 8vh, 5rem); }

.idx { list-style: none; border-top: 1px solid var(--trav-faint); }
.idx-row {
  position: relative; display: grid; align-items: baseline; gap: 1rem;
  grid-template-columns: 3.2rem minmax(0, 1fr) auto;
  padding: clamp(1.1rem, 2.6vh, 1.9rem) 0;
  border-bottom: 1px solid var(--trav-faint);
  transition: opacity .5s var(--ease), padding-left .6s var(--ease);
}
.idx-num  { font-family: var(--serif); font-size: .85rem; letter-spacing: .24em; color: var(--trav-dim); }
.idx-name { font-family: var(--serif); font-weight: 300; font-size: clamp(1.6rem, 4.4vw, 3.1rem); line-height: 1; }
.idx-meta { font-size: .72rem; letter-spacing: .16em; text-transform: uppercase; color: var(--trav-dim); text-align: right; }
/* a hairline that wipes across the row from the left on hover */
.idx-row::after {
  content: ''; position: absolute; left: 0; right: 0; bottom: -1px; height: 1px;
  background: var(--trav); transform: scaleX(0); transform-origin: left;
  transition: transform .7s var(--ease);
}
/* dim every sibling so the hovered line is the only lit thing on screen */
.idx:hover .idx-row { opacity: .34; }
.idx .idx-row.on { opacity: 1; padding-left: 1.1rem; }
.idx .idx-row.on::after { transform: scaleX(1); }

/* the room that follows the pointer */
.peek {
  position: fixed; top: 0; left: 0; z-index: 40; pointer-events: none;
  width: clamp(16rem, 25vw, 24rem); aspect-ratio: 16 / 9; overflow: hidden;
  border-radius: 2px; opacity: 0;
  transform: translate3d(-50%, -50%, 0) scale(.94);
  transition: opacity .45s var(--ease), scale .45s var(--ease);
}
.peek.on { opacity: 1; scale: 1; }
.peek-img { width: 100%; height: 100%; object-fit: cover; }
.peek-plan { position: absolute; inset: 12%; opacity: .85; }
.peek-plan svg { width: 100%; height: 100%; }
.peek-plan path, .peek-plan line, .peek-plan rect, .peek-plan circle {
  stroke: var(--trav); fill: none; stroke-width: 1.1; vector-effect: non-scaling-stroke;
}
/* no hover on touch — the peek can never be triggered, so it never renders */
@media (hover: none), (max-width: 720px) {
  .peek { display: none; }
  .idx:hover .idx-row { opacity: 1; }
  .idx-row { grid-template-columns: 2.4rem minmax(0, 1fr); }
  .idx-meta { grid-column: 2; text-align: left; margin-top: .5rem; }
}

/* ═══ THE RAIL — horizontal gallery driven by vertical scroll ═══ */
.rail { position: relative; }              /* height set from JS */
.rail-pin {
  position: sticky; top: 0; height: 100svh; overflow: hidden;
  display: flex; flex-direction: column; justify-content: center;
  background: var(--char);
}
.rail-head {
  position: absolute; top: clamp(1.6rem, 5vh, 3rem); left: clamp(1.2rem, 5vw, 4.5rem);
  right: clamp(1.2rem, 5vw, 4.5rem);
  display: flex; justify-content: space-between; align-items: baseline;
}
.rail-count { font-family: var(--serif); font-size: .9rem; letter-spacing: .18em; color: var(--trav-dim); }
.rail-count b { font-weight: 300; color: var(--trav); }
.rail-count i { font-style: normal; padding: 0 .45rem; opacity: .5; }

.rail-track {
  display: flex; gap: clamp(1rem, 2.4vw, 2rem);
  padding-inline: clamp(1.2rem, 5vw, 4.5rem);
  will-change: transform;
}
.rail-card { flex: 0 0 auto; width: clamp(17rem, 34vw, 30rem); }
.rail-figure {
  position: relative; overflow: hidden; border-radius: 2px;
  aspect-ratio: 4 / 5; background: var(--char-2);
}
.rail-figure img { width: 100%; height: 100%; object-fit: cover; will-change: transform; }
.rail-cap { display: flex; justify-content: space-between; gap: 1rem; margin-top: .9rem; }
.rail-name { font-family: var(--serif); font-size: clamp(1.05rem, 2vw, 1.45rem); }
.rail-meta { font-size: .66rem; letter-spacing: .18em; text-transform: uppercase; color: var(--trav-dim); align-self: end; }
.rail-bar {
  position: absolute; bottom: clamp(1.6rem, 5vh, 3rem);
  left: clamp(1.2rem, 5vw, 4.5rem); right: clamp(1.2rem, 5vw, 4.5rem);
  height: 1px; background: var(--trav-faint);
}
.rail-bar span { display: block; height: 100%; width: 0%; background: var(--trav); }

/* ═══ TWO MATERIALS ═══ */
.palette { display: grid; grid-template-columns: 1fr 1fr; }
.pal {
  position: relative; min-height: 74svh; padding: clamp(2.5rem, 7vh, 5rem) clamp(1.4rem, 4vw, 3.4rem);
  display: flex; flex-direction: column; justify-content: flex-end; gap: .9rem;
  background: var(--fill); overflow: hidden;
}
.pal-light { color: var(--char); }
.pal-light .pal-num, .pal-light .pal-desc { color: rgba(18, 18, 18, .62); }
.pal-num  { font-family: var(--serif); font-size: .85rem; letter-spacing: .3em; color: var(--trav-dim); }
.pal-name { font-family: var(--serif); font-weight: 300; font-size: clamp(2.2rem, 6vw, 4.6rem); line-height: 1; }
.pal-desc { max-width: 32ch; font-size: .88rem; line-height: 1.9; color: var(--trav-dim); }
/* the material itself, shown plainly at the top of its own panel */
.pal-chip {
  position: absolute; top: 0; left: 0; right: 0; height: 34%;
  filter: brightness(1.08);
  border-bottom: 1px solid rgba(212, 184, 150, .14);
}
@media (max-width: 720px) { .palette { grid-template-columns: 1fr; } .pal { min-height: 58svh; } }

/* ═══ THE PRACTICE — figures ═══ */
.stats {
  display: grid; grid-template-columns: repeat(4, 1fr);
  border-top: 1px solid var(--trav-faint); border-bottom: 1px solid var(--trav-faint);
}
.stat {
  padding: clamp(2.6rem, 8vh, 5rem) clamp(.8rem, 2vw, 2rem);
  text-align: center; border-left: 1px solid var(--trav-faint);
}
.stat:first-child { border-left: 0; }
.stat-num {
  display: block; font-family: var(--serif); font-weight: 300;
  font-size: clamp(2.6rem, 7vw, 5.4rem); line-height: 1;
  font-variant-numeric: tabular-nums;      /* stops the width jittering as it counts */
}
.stat-label { display: block; margin-top: .9rem; font-size: .62rem; letter-spacing: .28em; text-transform: uppercase; color: var(--trav-dim); }
@media (max-width: 720px) {
  .stats { grid-template-columns: 1fr 1fr; }
  .stat:nth-child(3) { border-left: 0; }
  .stat:nth-child(-n+2) { border-bottom: 1px solid var(--trav-faint); }
}

/* ═══ FAQ ═══ */
.faq { padding: clamp(4rem, 11vh, 8rem) clamp(1.2rem, 5vw, 4.5rem); }
.faq-head { margin-bottom: clamp(2.4rem, 6vh, 4rem); }
.faq-list { list-style: none; border-top: 1px solid var(--trav-faint); }
.faq-item { border-bottom: 1px solid var(--trav-faint); }
.faq-q {
  width: 100%; background: none; border: 0; color: inherit; font: inherit; text-align: left;
  cursor: pointer;                          /* <button> defaults to an arrow */
  display: flex; align-items: center; gap: 1.2rem;
  padding: clamp(1.1rem, 2.6vh, 1.7rem) 0;
  font-family: var(--serif); font-size: clamp(1.05rem, 2.4vw, 1.6rem);
  transition: color .4s var(--ease);
}
.faq-q:hover { color: #fff; }
.faq-mark {
  margin-left: auto; flex: 0 0 auto; width: 13px; height: 13px; position: relative;
}
.faq-mark::before, .faq-mark::after {
  content: ''; position: absolute; inset: 50% 0 auto 0; height: 1px; background: currentColor;
}
.faq-mark::after { transition: transform .5s var(--ease); transform: rotate(90deg); }
.faq-item.open .faq-mark::after { transform: rotate(0deg); }
/* 0fr → 1fr is the one way to animate to an unknown content height without JS measuring it */
.faq-a { display: grid; grid-template-rows: 0fr; transition: grid-template-rows .55s var(--ease); }
.faq-item.open .faq-a { grid-template-rows: 1fr; }
.faq-a > div { overflow: hidden; }
.faq-a p { padding-bottom: 1.6rem; max-width: 58ch; font-size: .9rem; line-height: 1.95; color: var(--trav-dim); }

/* ═══ ENQUIRE ═══ */
.enquire {
  padding: clamp(4rem, 12vh, 9rem) clamp(1.2rem, 5vw, 4.5rem);
  background: radial-gradient(ellipse at 50% 0%, var(--char-2), var(--char) 68%);
}
.enquire-grid { display: grid; grid-template-columns: 1fr 1.15fr; gap: clamp(2.5rem, 6vw, 6rem); align-items: start; }
@media (max-width: 900px) { .enquire-grid { grid-template-columns: 1fr; } }
.enquire-title { font-family: var(--serif); font-weight: 300; margin: 1.2rem 0 1.3rem; font-size: clamp(2rem, 4.6vw, 3.6rem); line-height: 1.06; }
.enquire-title em { font-style: normal; color: var(--trav); opacity: 1; letter-spacing: .06em; }
.enquire-copy { color: var(--trav-dim); line-height: 1.9; max-width: 36ch; font-size: .92rem; }

.contact { margin-top: clamp(2rem, 5vh, 3.2rem); display: grid; gap: 1.1rem; }
.contact div { display: grid; grid-template-columns: 7.5rem 1fr; gap: 1rem; align-items: baseline;
  padding-top: 1.1rem; border-top: 1px solid var(--trav-faint); }
.contact dt { font-size: .6rem; letter-spacing: .26em; text-transform: uppercase; color: var(--trav-dim); }
.contact dd { font-size: .9rem; line-height: 1.7; }
.contact a { border-bottom: 1px solid var(--trav-faint); transition: border-color .4s; }
.contact a:hover { border-color: var(--trav); }

/* ── the form ── */
.form { display: grid; grid-template-columns: 1fr 1fr; gap: 1.6rem 1.2rem; }
@media (max-width: 560px) { .form { grid-template-columns: 1fr; } }
.field { position: relative; }
.field-wide { grid-column: 1 / -1; }
.field input, .field select, .field textarea {
  width: 100%; background: none; border: 0; border-bottom: 1px solid var(--trav-faint);
  color: var(--trav); font: inherit;
  /* 16px floor, not .95rem: iOS zooms the whole page in whenever a focused
     field is set below 16px, and the visitor is then left panned sideways on
     a page that never intended to scroll horizontally. */
  font-size: 1rem;
  padding: 1.5rem 0 .6rem;
  border-radius: 0; transition: border-color .45s var(--ease);
}
.field textarea { resize: vertical; min-height: 4.6rem; }
.field select { appearance: none; color: var(--trav); }
.field select option { background: var(--char-2); color: var(--trav); }
.field-select::after {
  content: ''; position: absolute; right: 2px; bottom: 1.15rem; width: 7px; height: 7px;
  border-right: 1px solid var(--trav-dim); border-bottom: 1px solid var(--trav-dim);
  transform: rotate(45deg); pointer-events: none;
}
.field label {
  position: absolute; left: 0; top: 1.5rem; pointer-events: none;
  /* matches the input it floats over, or the label sits off the baseline */
  font-size: 1rem; color: var(--trav-dim);
  transition: transform .4s var(--ease), font-size .4s var(--ease), letter-spacing .4s var(--ease);
  transform-origin: left top;
}
/* :placeholder-shown is what lets the label sit down again when the field is emptied */
.field input:focus + label, .field textarea:focus + label,
.field input:not(:placeholder-shown) + label, .field textarea:not(:placeholder-shown) + label,
.field select:focus + label, .field select:valid + label {
  transform: translateY(-1.45rem); font-size: .58rem; letter-spacing: .26em;
  text-transform: uppercase;
}
.field input:focus, .field select:focus, .field textarea:focus { outline: none; border-bottom-color: var(--trav); }
.field.bad input, .field.bad select, .field.bad textarea { border-bottom-color: #a86b5b; }

.form-send {
  grid-column: 1 / -1; justify-self: start; margin-top: .6rem;
  background: none; border: 0; color: inherit; font-family: var(--serif);
  font-size: clamp(1.1rem, 2.4vw, 1.5rem); padding: 0; cursor: pointer;
}
.form-send[disabled] { cursor: default; }
.form-send span { position: relative; display: inline-block; padding-bottom: .45rem; }
.form-send span::after {
  content: ''; position: absolute; left: 0; bottom: 0; width: 100%; height: 1px;
  background: var(--trav); transform: scaleX(.3); transform-origin: left;
  transition: transform .7s var(--ease);
}
.form-send:hover span::after { transform: scaleX(1); }
.form-send[disabled] { opacity: .45; }
.form-note { grid-column: 1 / -1; min-height: 1.2rem; font-size: .78rem; letter-spacing: .04em; color: var(--trav-dim); }
.form-note.ok { color: var(--trav); }

/* ═══ MARQUEE ═══ */
.marquee { overflow: hidden; border-top: 1px solid var(--trav-faint); padding: clamp(1.4rem, 4vh, 2.6rem) 0; }
.marquee-track { display: flex; width: max-content; animation: drift 44s linear infinite; }
.marquee-track span {
  font-family: var(--serif); font-size: clamp(1.6rem, 4.6vw, 3.4rem);
  color: var(--trav-dim); opacity: .4; white-space: nowrap; padding-right: 2rem;
}
@keyframes drift { to { transform: translateX(-50%); } }

.foot { border-top: 1px solid var(--trav-faint); padding: clamp(2.5rem, 7vh, 4.5rem) clamp(1.2rem, 5vw, 4.5rem) 2rem; }
.foot-top {
  display: grid; grid-template-columns: 1.4fr 1fr; gap: clamp(2rem, 5vw, 5rem);
  padding-bottom: clamp(2.5rem, 6vh, 4rem);
}
@media (max-width: 860px) { .foot-top { grid-template-columns: 1fr; } }

.studios { display: grid; grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr)); gap: 1.6rem 1.2rem; }
.studio-city { font-family: var(--serif); font-size: 1.1rem; }
.studio-line { display: block; margin-top: .45rem; font-size: .75rem; line-height: 1.7; color: var(--trav-dim); }

.signup-label { font-size: .6rem; letter-spacing: .28em; text-transform: uppercase; color: var(--trav-dim); }
.signup { display: flex; gap: 1rem; align-items: flex-end; margin-top: 1.2rem; }
.signup .field { flex: 1; }
.signup button {
  background: none; border: 0; color: inherit; cursor: pointer; padding: 0 0 .6rem;
  font-family: var(--serif); font-size: 1.05rem; border-bottom: 1px solid var(--trav-dim);
  transition: border-color .4s, color .4s;
}
.signup button:hover { border-color: var(--trav); color: #fff; }
.signup-note { margin-top: .9rem; min-height: 1.1rem; font-size: .74rem; color: var(--trav-dim); }
.signup-note.ok { color: var(--trav); }

.foot-base {
  display: flex; justify-content: space-between; flex-wrap: wrap; gap: .8rem;
  padding-top: 1.8rem; border-top: 1px solid var(--trav-faint);
  font-size: .62rem; letter-spacing: .22em; text-transform: uppercase;
}
.foot-dim { color: var(--trav-dim); }
.foot-social { display: flex; gap: 1.6rem; }
.foot-social a { color: var(--trav-dim); transition: color .4s; }
.foot-social a:hover { color: var(--trav); }

/* ═══ SCROLL-LINKED TEXT FILL ═══
   The statement writes itself in as you scroll: characters ahead of the read
   position sit dim, characters behind it are full colour. Split per character
   rather than per word so the boundary can land inside a word, which is what
   makes it read as reading rather than as a row of switches. */
.fill { color: var(--trav-faint); }
.fill .c { transition: color .45s var(--ease); }
.fill .c.lit { color: var(--trav); }
.fill:not(.done) { color: var(--trav); }   /* legible if the splitter never runs */

/* ═══ SIDE WIPE ═══
   Each frame opens from its outer edge as it arrives, so the photo appears to
   slide in from off the page rather than simply fading up. */
.wipe-l { clip-path: inset(0 0 0 var(--wipe, 0%)); }
.wipe-r { clip-path: inset(0 var(--wipe, 0%) 0 0); }

/* ═══ STATEMENT ROWS ═══
   The figure is a fixed-height mask and the photo inside it is taller, so the
   photo travels through the mask as the row is scrolled. */
.s-statement { padding-block: clamp(2rem, 6vh, 4rem); }
.split-row {
  display: grid; grid-template-columns: 48% 1fr;
  gap: clamp(1.5rem, 4vw, 4rem); align-items: center;
  padding-block: clamp(3.5rem, 11vh, 8rem);
  padding-inline: clamp(1.2rem, 5vw, 4.5rem);
}
.split-row.reverse { grid-template-columns: 1fr 48%; }
.split-row.reverse .bleed { order: 2; }
.split-row.reverse .note { order: 1; }

.bleed { position: relative; overflow: hidden; height: clamp(18rem, 42vw, 36rem); }
.bleed img { width: 100%; height: 125%; object-fit: cover; will-change: transform; }
/* the photo runs past the page gutter rather than stopping politely inside it */
.bleed-left  { margin-left: calc(clamp(1.2rem, 5vw, 4.5rem) * -1); }
.bleed-right { margin-right: calc(clamp(1.2rem, 5vw, 4.5rem) * -1); }

@media (max-width: 860px) {
  .split-row, .split-row.reverse { grid-template-columns: 1fr; }
  .split-row.reverse .bleed { order: 0; }
  .split-row.reverse .note { order: 1; }
  .bleed { height: clamp(14rem, 58vw, 24rem); }
  .bleed-left, .bleed-right { margin-inline: calc(clamp(1.2rem, 5vw, 4.5rem) * -1); }
}

/* ═══ BALANCE — the frame opens to full bleed, then the words cross it ═══ */
.h-mega {
  font-family: var(--display); font-weight: 400;
  font-size: clamp(3.4rem, 10vw, 9rem); line-height: 1;
  /* inscriptional capitals were cut with space around them — crowding them
     with negative tracking is what makes carved letterforms look clumsy */
  letter-spacing: .04em; text-transform: uppercase; white-space: nowrap;
  color: var(--trav); text-shadow: 0 4px 40px rgba(0,0,0,.45);
}
.s-balance { position: relative; }          /* height measured in main.js */
.balance-stage { position: sticky; top: 0; height: 100svh; overflow: hidden; display: flex; align-items: center; }
.balance-fig {
  position: relative; overflow: hidden;
  width: var(--w, 35%); height: var(--h, 62svh); margin-left: var(--ml, 0px);
}
.balance-img { width: 100%; height: 100%; object-fit: cover; will-change: transform; }
.balance-veil {
  position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(180deg, rgba(13,13,13,.25), rgba(13,13,13,.05) 45%, rgba(13,13,13,.55));
}
.h-mega.enter { position: absolute; left: 100%; bottom: clamp(2rem, 9vh, 6rem); z-index: 2; will-change: transform; }

/* ═══ FOOTER LOCKUP ═══
   Both lines have to span the page and they are different lengths, so the size
   is measured in main.js rather than guessed at in vw. */
.foot-lockup { margin-top: clamp(2.5rem, 8vh, 5rem); line-height: .84; overflow: hidden; }
.foot-name, .foot-sub {
  font-family: var(--display); font-weight: 400; text-transform: uppercase;
  letter-spacing: -.02em; white-space: nowrap;
  /* width:max-content shrink-wraps to the glyphs while staying block-level, so
     main.js can measure the real text width — a plain block would always
     report the container's width and the fit would resolve to 1 */
  display: block; width: max-content;
  font-size: var(--fit, 14vw);
}
.foot-sub { color: var(--trav-faint); }

/* ═══ PENCILLED NOTE ═══ */
.note { display: flex; flex-direction: column; gap: .6rem; align-items: flex-start; }
.scribble {
  display: block; font-family: var(--hand); text-transform: uppercase;
  font-size: clamp(.95rem, 1.5vw, 1.3rem); line-height: 1.45; letter-spacing: .04em;
  color: var(--trav);
}
.note-arrow { width: clamp(3.4rem, 6vw, 5.2rem); height: auto; }
.note-arrow path {
  /* --len is measured per path in main.js: one figure cannot fit two different
     arrows, and a wrong dasharray leaves the stroke visibly part-drawn */
  stroke: var(--trav); stroke-width: 1.4; fill: none; vector-effect: non-scaling-stroke;
  stroke-dasharray: var(--len, 900); stroke-dashoffset: var(--len, 900);
  transition: stroke-dashoffset 1.5s var(--ease) .25s, fill .6s var(--ease) 1.2s;
}
.note.in .note-arrow path { stroke-dashoffset: 0; fill: var(--trav); }
.note:not(.measured) .note-arrow path { stroke-dashoffset: 0; fill: var(--trav); }

/* ═══ CONCIERGE ═══
   A vertical tab on the right edge rather than a floating corner pill — the
   pill sat on top of whatever photo scrolled under it and always looked like
   it was covering something. */
.cx-open {
  position: fixed; top: 50%; right: 0; z-index: 80; transform: translateY(-50%);
  display: flex; flex-direction: column; align-items: center; gap: .8rem;
  padding: 1.4rem .85rem; cursor: pointer;
  background: var(--char-2); color: var(--trav);
  border: 1px solid var(--trav-dim); border-right: 0;
  box-shadow: -6px 0 24px rgba(0,0,0,.45);
  font: inherit; font-size: .6rem; letter-spacing: .28em; text-transform: uppercase;
  transition: border-color .4s var(--ease), background .4s var(--ease), padding-right .35s var(--ease), opacity .35s;
}
.cx-open:hover { border-color: var(--trav); background: var(--char); padding-right: 1.15rem; }
.cx-open-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--trav); flex: 0 0 auto; }
.cx-open-label { writing-mode: vertical-rl; white-space: nowrap; }
.cx-open.away { opacity: 0; pointer-events: none; }

.cx {
  position: fixed; z-index: 81;
  right: clamp(1.2rem, 5vw, 4.5rem); bottom: clamp(1.2rem, 3vh, 2.2rem);
  width: min(24rem, calc(100vw - 2.4rem));
  max-height: min(34rem, calc(100svh - 6rem));
  display: flex; flex-direction: column;
  background: var(--char); border: 1px solid var(--trav-faint);
  opacity: 0; transform: translateY(12px);
  transition: opacity .4s var(--ease), transform .45s var(--ease);
}
.cx.open { opacity: 1; transform: none; }
/* display:flex above would beat [hidden]'s display:none — an invisible panel
   swallowing every click on the page */
.cx[hidden] { display: none; }
.cx:not(.open) { pointer-events: none; }

.cx-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; padding: 1.4rem 1.4rem 1rem; border-bottom: 1px solid var(--trav-faint); }
.cx-kicker { display: block; font-size: .52rem; letter-spacing: .38em; text-transform: uppercase; color: var(--trav-dim); }
.cx-title { font-family: var(--display); font-weight: 400; font-size: 1.5rem; line-height: 1.1; margin-top: .4rem; }
/* colour set explicitly: buttons use the UA's buttontext, not the page colour,
   and anything painted with currentColor inside would break */
.cx-close { background: none; border: 0; color: var(--trav); cursor: pointer; padding: .5rem; width: 30px; height: 30px; position: relative; flex: 0 0 auto; }
.cx-close span { position: absolute; left: 6px; right: 6px; top: 50%; height: 1px; background: currentColor; }
.cx-close span:first-child { transform: rotate(45deg); }
.cx-close span:last-child { transform: rotate(-45deg); }

.cx-log { flex: 1; overflow-y: auto; padding: 1.2rem 1.4rem; display: flex; flex-direction: column; gap: .9rem; }
.cx-msg { max-width: 88%; font-size: .86rem; line-height: 1.65; }
.cx-msg.bot { align-self: flex-start; color: var(--trav); border-left: 1px solid var(--trav-faint); padding-left: .85rem; }
.cx-msg.me { align-self: flex-end; color: var(--char); background: var(--trav); padding: .6rem .85rem; }
.cx-msg a { text-decoration: underline; text-underline-offset: 3px; }
.cx-typing { display: inline-flex; gap: .3rem; align-self: flex-start; padding-left: .85rem; border-left: 1px solid var(--trav-faint); }
.cx-typing i { width: 4px; height: 4px; border-radius: 50%; background: var(--trav-dim); animation: cxdot 1.2s infinite; }
.cx-typing i:nth-child(2) { animation-delay: .15s; }
.cx-typing i:nth-child(3) { animation-delay: .3s; }
@keyframes cxdot { 0%,60%,100% { opacity: .25 } 30% { opacity: 1 } }

.cx-chips { display: flex; flex-wrap: wrap; gap: .5rem; padding: 0 1.4rem 1rem; }
.cx-chips:empty { display: none; }
.cx-chip {
  background: none; color: var(--trav); cursor: pointer; font: inherit;
  font-size: .56rem; letter-spacing: .2em; text-transform: uppercase;
  padding: .55rem .8rem; border: 1px solid var(--trav-faint);
  transition: border-color .35s, background .35s;
}
.cx-chip:hover { border-color: var(--trav); background: var(--char-2); }

.cx-form { display: flex; align-items: center; gap: .6rem; padding: .9rem 1.4rem; border-top: 1px solid var(--trav-faint); }
.cx-form input {
  flex: 1; background: none; border: 0; color: var(--trav); font: inherit;
  font-size: 1rem;                    /* 16px floor, or iOS zooms on focus */
  padding: .5rem 0;
}
.cx-form input::placeholder { color: var(--trav-dim); font-size: .86rem; }
.cx-form input:focus { outline: none; }
.cx-form button { background: none; border: 0; color: var(--trav); cursor: pointer; padding: .5rem; display: grid; place-items: center; }
.cx-form button svg { width: 18px; height: 18px; fill: var(--trav-dim); transition: fill .35s; }
.cx-form button:hover svg { fill: var(--trav); }
.cx-fine { padding: 0 1.4rem 1rem; font-size: .56rem; letter-spacing: .16em; text-transform: uppercase; color: var(--trav-dim); }

@media (max-width: 560px) {
  .cx { left: 1.2rem; right: 1.2rem; width: auto; max-height: calc(100svh - 5rem); }
  .cx-open { padding: 1.1rem .6rem; font-size: .54rem; }
}
/* ═══ TOUCH — every finger target reaches 44px ═══
   Inline links grow with padding-block, which enlarges the hit area without
   touching the line box, so nothing on the page moves. */
@media (hover: none) {
  .cx-open, .cx-chip, .cx-close, .cx-form button { min-height: 44px; }
  .brand, .nav-cta, .form-send span, .signup button { display: inline-flex; align-items: center; min-height: 44px; }
  .contact a { padding-block: 13px; }
  .foot-social a { padding-block: 16px; }   /* smallest type down here, needs the most */
  .studio-line a { padding-block: 12px; }
  .idx-row { min-height: 44px; }
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  .rise { opacity: 1; transform: none; transition: none; }
  .idx-row, .peek, .faq-a, .cx, .cx-open { transition: none; }
  .marquee-track { animation: none; }
  .cue i::after, .cx-typing i { animation: none; }
  .bleed img { transform: none !important; }
}
