/* ============================================================
   CULMENA — shared styles  (rev. Jul 2026, post-RK review)
   ------------------------------------------------------------
   LAYOUT SHELL
   Every top-level band (nav, sections, register, footer) uses
   .wrap so that logo, body copy, form fields and footer links
   share one vertical alignment line at every breakpoint.
   Change --shell in one place to retune the whole site.
   ============================================================ */
:root{
  --forest:#1F4348;
  --forest-2:#2E5E63;
  --ink:#202A29;
  --cream:#FAF7F1;
  --sand:#F1EBE0;
  --line:#E3DCCE;
  --terra:#E76F51;
  --amber:#D9A44A;
  --muted:#6E7370;

  /* layout shell — RK: cap the nav so it doesn't stretch on 4K */
  --shell:1600px;
  --gutter:clamp(20px, 3.4vw, 56px);
  --nav-h:84px;

  /* vertical rhythm */
  --band:clamp(64px, 8vw, 130px);
  --gap:clamp(20px, 2.2vw, 30px);
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{font-family:'Inter',system-ui,sans-serif;background:var(--cream);color:var(--ink);
  -webkit-font-smoothing:antialiased;overflow-x:hidden}
img{max-width:100%;display:block}
/* The visible page background lives here, not on <body>: body now carries the
   Safari toolbar tint. Must stay in normal flow, not fixed. A fixed overlay
   the size of the viewport gets sampled instead of the body and the tint is
   lost (measured on an iPhone: a 1px fixed strip is ignored, a full-screen
   one is not). */
.page{background:var(--cream);position:relative;z-index:0}
/* Safari 26 takes the toolbar colour from a fixed layer the size of the
   viewport, and only from one that size: measured on an iPhone, a 1px fixed
   strip is ignored and the body is used instead, which then went white at
   scroll 0. This layer sits behind the opaque .page, so it is never seen,
   and it holds the colour steady wherever the page is scrolled. */
.tint{position:fixed;inset:0;background-color:var(--tint);z-index:-1;pointer-events:none}

a{color:inherit}
.display{font-family:'Fraunces',Georgia,serif;font-weight:400;letter-spacing:-.02em}
.display i{font-style:italic;color:var(--terra)}
::selection{background:var(--terra);color:#fff}

/* page fade-in */
body{animation:pagein .7s ease both}
@keyframes pagein{from{opacity:0}to{opacity:1}}

/* the one true container */
.wrap{width:100%;max-width:var(--shell);margin-inline:auto;padding-inline:var(--gutter)}

/* ---------- NAV ---------- */
/* body > nav, not nav: the footer has its own <nav> for the link columns and
   the unscoped rule was pinning it to the top of the viewport, where it sat
   invisible behind the real header. */
/* viewport-fit:cover lets the page run under the notch, so the fixed header has
   to add the inset back or it sits beneath the status bar. */
body > nav{position:fixed;top:0;left:0;right:0;z-index:90;color:#fff;
  padding-top:env(safe-area-inset-top);
  transition:background .4s ease,box-shadow .4s ease}
nav .nav-in{max-width:var(--shell);margin-inline:auto;padding:22px var(--gutter);
  display:flex;align-items:center;justify-content:space-between;gap:24px;
  transition:padding .4s ease}
nav.solid{background:rgba(250,247,241,.92);backdrop-filter:blur(14px);color:var(--ink);
  box-shadow:0 1px 0 rgba(0,0,0,.06)}
nav.solid .nav-in{padding-block:14px}

/* Scrim behind the header only. Measured on the hero video, the brightest sky
   under the wordmark read 3.35:1 against white, below the 4.5:1 minimum. The
   hero's own shade is too soft at the top, and darkening the whole thing would
   dull the image, so this is a short gradient that dies inside the header band
   and lifts away the moment the nav goes solid. */
body > nav::before{content:"";position:absolute;left:0;right:0;top:0;height:190%;
  z-index:-1;pointer-events:none;transition:opacity .45s ease;
  background:linear-gradient(to bottom,rgba(12,14,16,.5) 0%,rgba(12,14,16,.28) 45%,rgba(12,14,16,0) 100%)}
body > nav.solid::before{opacity:0}

nav.dark-page{color:var(--ink)}
.logo{font-family:'Fraunces',serif;font-size:clamp(18px,1.5vw,22px);font-weight:600;
  letter-spacing:.34em;text-decoration:none;white-space:nowrap;flex-shrink:0}
nav ul{display:flex;gap:clamp(18px,2.2vw,34px);list-style:none;align-items:center}
nav a.nl{text-decoration:none;font-size:12.5px;font-weight:600;letter-spacing:.14em;
  text-transform:uppercase;position:relative;padding:4px 0;white-space:nowrap}
nav a.nl::after{content:"";position:absolute;left:0;bottom:0;width:0;height:1.5px;
  background:currentColor;transition:width .35s cubic-bezier(.7,0,.3,1)}
nav a.nl:hover::after,nav a.nl.active::after{width:100%}
nav a.reg{text-decoration:none;font-size:12.5px;font-weight:700;letter-spacing:.1em;
  text-transform:uppercase;border:1.5px solid currentColor;padding:10px 22px;border-radius:99px;
  transition:background .3s ease,border-color .3s ease,color .3s ease;white-space:nowrap}
nav a.reg:hover{background:var(--terra);border-color:var(--terra);color:#fff}

/* burger */
.burger{display:none;width:44px;height:44px;border:0;background:transparent;cursor:pointer;
  padding:0;position:relative;color:inherit;flex-shrink:0;margin-right:-10px}
.burger i{position:absolute;left:11px;width:22px;height:1.6px;background:currentColor;border-radius:2px;
  transition:transform .38s cubic-bezier(.2,.7,.2,1),opacity .2s ease}
.burger i:nth-child(1){top:16px}
.burger i:nth-child(2){top:22px}
.burger i:nth-child(3){top:28px}
body.menu-open .burger i:nth-child(1){transform:translateY(6px) rotate(45deg)}
body.menu-open .burger i:nth-child(2){opacity:0}
body.menu-open .burger i:nth-child(3){transform:translateY(-6px) rotate(-45deg)}

/* mobile drawer */
.drawer{position:fixed;inset:0;z-index:85;background:var(--forest);color:#fff;
  display:flex;flex-direction:column;justify-content:center;
  padding:env(safe-area-inset-top) var(--gutter) env(safe-area-inset-bottom);
  opacity:0;visibility:hidden;transform:translateY(-12px);
  transition:opacity .38s ease,transform .38s cubic-bezier(.2,.7,.2,1),visibility .38s}
body.menu-open .drawer{opacity:1;visibility:visible;transform:none}
body.menu-open{overflow:hidden}
.drawer a{display:block;text-decoration:none;font-family:'Fraunces',serif;font-weight:400;
  font-size:clamp(30px,8vw,44px);padding:14px 0;border-bottom:1px solid rgba(255,255,255,.13);
  opacity:0;transform:translateY(18px);transition:opacity .4s ease,transform .4s ease,color .25s ease}
body.menu-open .drawer a{opacity:1;transform:none}
body.menu-open .drawer a:nth-child(1){transition-delay:.10s}
body.menu-open .drawer a:nth-child(2){transition-delay:.16s}
body.menu-open .drawer a:nth-child(3){transition-delay:.22s}
body.menu-open .drawer a:nth-child(4){transition-delay:.28s}
body.menu-open .drawer a:nth-child(5){transition-delay:.34s}
.drawer a:hover{color:var(--amber)}
.drawer .d-meta{margin-top:38px;font-size:13.5px;line-height:1.8;color:#9FB8B5;opacity:0;
  transition:opacity .4s .4s ease}
body.menu-open .drawer .d-meta{opacity:1}

@media(max-width:980px){
  nav ul{display:none}
  .burger{display:block}
  nav .nav-in{padding-block:16px}
  nav.solid .nav-in{padding-block:12px}
}
/* burger sits above the drawer so it can close it */
body > nav{z-index:95}
body.menu-open nav{background:transparent;box-shadow:none;color:#fff}

/* ---------- HERO ---------- */
/* RK: taller headers on desktop. Video-ready: <video> fades in over the
   poster image once it actually starts playing, so a missing file
   degrades silently to the still. */
.hero{position:relative;height:clamp(560px,100svh,1000px);overflow:hidden;
  display:flex;align-items:flex-end;color:#fff}
.hero.sub{height:clamp(500px,86svh,860px)}
.hero .media{position:absolute;inset:0;overflow:hidden;background:var(--forest)}
/* extra headroom (top:-12% / height:124%) so the parallax shift never
   exposes a gap at the top of the hero */
.hero .media img,
.hero .media video{position:absolute;top:-12%;left:0;width:100%;height:124%;object-fit:cover;
  transform-origin:center;will-change:transform}
.hero .media img{animation:heroZoom 2.4s cubic-bezier(.2,.6,.2,1) both}
.hero .media video{opacity:0;transition:opacity 1.1s ease}
.hero .media video.playing{opacity:1}
video.fading{opacity:0 !important;transition:opacity .7s ease}
@keyframes heroZoom{from{transform:scale(1.1)}to{transform:scale(1.02)}}

/* The still under a video hero has to be that video's own first frame, or the
   fade-in is a dissolve between two different photographs: measured at 83% of
   pixels changing on the homes header. For the same reason the still cannot
   keep its zoom while the video sits static underneath, so the animation is
   dropped wherever a video is present. */
.hero .media:has(video) img{animation:none;transform:scale(1.02)}
.hero .shade{position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(to top,rgba(10,22,22,.74) 0%,rgba(10,22,22,.12) 50%,rgba(10,22,22,.30) 100%)}
.hero-inner{position:relative;width:100%;max-width:var(--shell);margin-inline:auto;
  padding:0 var(--gutter) clamp(56px,7vh,96px)}
.hero h1{font-size:clamp(42px,7.2vw,112px);line-height:.98}
/* The .ln mask that drives the line-by-line reveal was clipping descenders:
   a line-height under 1 makes the line box shorter than the glyphs, so the
   tails of g, y, q and the comma fell outside overflow:hidden. The padding
   gives them room and the matching negative margin gives the space back, so
   the line spacing is unchanged. */
.hero h1 .ln{display:block;overflow:hidden;padding-bottom:.2em;margin-bottom:-.16em}
.hero h1 .ln span{display:block;transform:translateY(110%);
  animation:lineUp 1s cubic-bezier(.2,.7,.2,1) forwards}
.hero h1 .ln:nth-child(2) span{animation-delay:.15s}
.hero h1 .ln:nth-child(3) span{animation-delay:.3s}
@keyframes lineUp{to{transform:translateY(0)}}
.hero .sub-copy{margin-top:22px;font-size:clamp(15.5px,1.15vw,18px);max-width:500px;line-height:1.65;
  opacity:0;animation:fadeUp 1s .55s ease forwards}
.hero .scrollcue{position:absolute;right:var(--gutter);bottom:clamp(56px,7vh,96px);font-size:11px;
  letter-spacing:.22em;text-transform:uppercase;writing-mode:vertical-rl;opacity:0;
  animation:fadeUp 1s .8s ease forwards}
.hero .scrollcue::after{content:"";display:block;width:1px;height:54px;background:#fff;
  margin:14px auto 0;animation:cue 1.8s ease infinite}
@keyframes cue{0%{transform:scaleY(0);transform-origin:top}45%{transform:scaleY(1);transform-origin:top}
  55%{transform:scaleY(1);transform-origin:bottom}100%{transform:scaleY(0);transform-origin:bottom}}
@keyframes fadeUp{from{opacity:0;transform:translateY(24px)}to{opacity:1;transform:translateY(0)}}
.hero .tag{position:absolute;top:calc(var(--nav-h) + 18px);right:var(--gutter);
  background:rgba(0,0,0,.35);font-size:10px;letter-spacing:.1em;text-transform:uppercase;
  padding:5px 12px;border-radius:99px;backdrop-filter:blur(4px)}

/* dark page head (floorplans / gallery) */
.page-head{background:var(--forest);color:#fff;position:relative;overflow:hidden;
  padding:calc(var(--nav-h) + clamp(70px,9vw,130px)) 0 clamp(64px,7vw,104px)}
.page-head .glow{position:absolute;width:700px;height:700px;border-radius:50%;pointer-events:none;
  background:radial-gradient(circle,rgba(217,164,74,.16),transparent 65%);top:-260px;right:-180px}
.page-head h1{font-size:clamp(40px,6.4vw,96px);line-height:1}
/* The .ln mask that drives the line-by-line reveal was clipping descenders:
   a line-height under 1 makes the line box shorter than the glyphs, so the
   tails of g, y, q and the comma fell outside overflow:hidden. The padding
   gives them room and the matching negative margin gives the space back, so
   the line spacing is unchanged. */
.page-head h1 .ln{display:block;overflow:hidden;padding-bottom:.2em;margin-bottom:-.16em}
.page-head h1 .ln span{display:block;transform:translateY(110%);
  animation:lineUp 1s cubic-bezier(.2,.7,.2,1) forwards}
.page-head h1 .ln:nth-child(2) span{animation-delay:.15s}
.page-head p{margin-top:20px;color:#BFD3D0;font-size:clamp(15.5px,1.15vw,17.5px);
  max-width:600px;line-height:1.7}

/* ---------- SECTIONS ---------- */
section{padding-block:var(--band)}
/* a dark page-head already carries its own bottom padding — don't stack two */
.page-head + section{padding-top:clamp(38px,4.4vw,72px)}
.kicker{display:flex;align-items:center;gap:14px;color:var(--terra);font-size:12px;font-weight:700;
  letter-spacing:.24em;text-transform:uppercase;margin-bottom:22px}
.kicker::before{content:"";width:44px;height:1.5px;background:var(--terra);flex-shrink:0}
h2.title{font-size:clamp(32px,4.4vw,66px);line-height:1.05;max-width:15ch}
.lead{margin-top:24px;font-size:clamp(16px,1.2vw,18px);line-height:1.75;color:var(--muted);max-width:60ch}

/* reveal on scroll */
.reveal{opacity:0;transform:translateY(36px);
  transition:opacity .9s cubic-bezier(.2,.7,.2,1),transform .9s cubic-bezier(.2,.7,.2,1)}
.reveal.in{opacity:1;transform:none}
.reveal.d1{transition-delay:.12s}.reveal.d2{transition-delay:.24s}.reveal.d3{transition-delay:.36s}
@media(prefers-reduced-motion:reduce){
  .reveal{opacity:1;transform:none;transition:none}
  *{animation-duration:.01ms !important;animation-iteration-count:1 !important}
}

/* full-bleed image blocks */
.bleed{position:relative;overflow:hidden}
.bleed img{width:100%;height:100%;object-fit:cover}
/* A video inside a full-bleed block sits over its own still. No z-index: the
   caption and any scrim are later in the source and must stay on top. */
.bleed .fig-vid{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  opacity:0;transition:opacity 1.1s ease}
.bleed .fig-vid.playing{opacity:1}
.bleed .fig-vid.fading{opacity:0 !important}
.frame{overflow:hidden;border-radius:20px;position:relative}
.frame > img{width:100%;height:100%;object-fit:cover}
.frame img{transition:transform 1.1s cubic-bezier(.2,.7,.2,1);will-change:transform}
.frame:hover img{transform:scale(1.055)}
.cap{position:absolute;left:18px;bottom:16px;background:rgba(10,20,20,.5);color:#fff;font-size:12px;
  padding:6px 14px;border-radius:99px;backdrop-filter:blur(6px)}

/* statement band — replaces the old scrolling marquee (RK: dated) */
.statement{position:relative;overflow:hidden;background:var(--forest);color:var(--cream);
  min-height:clamp(320px,46vh,540px);display:grid;place-items:center;text-align:center}
.statement .media{position:absolute;inset:0}
.statement .media img,.statement .media video{width:100%;height:100%;object-fit:cover;opacity:.40}
.statement .media video{position:absolute;inset:0;opacity:0;transition:opacity 1.1s ease}
.statement .media video.playing{opacity:.40}
.statement .media video.fading{opacity:0 !important}
/* scrim — keeps the type legible whatever lands behind it */
.statement::before{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
  background:radial-gradient(ellipse at center,rgba(14,36,38,.52) 0%,rgba(14,36,38,.30) 60%,rgba(14,36,38,.55) 100%)}
.statement .st-in{position:relative;z-index:2;padding:clamp(56px,7vw,90px) var(--gutter);
  max-width:min(92vw,1000px)}
/* NB: max-width in ch must live on <q>, not .st-in — on the parent it would
   resolve against the 16px body size and crush the line to a narrow column. */
.statement q{quotes:none;display:block;margin-inline:auto;max-width:17ch;
  font-family:'Fraunces',serif;font-weight:300;
  font-size:clamp(28px,3.6vw,54px);line-height:1.18;letter-spacing:-.02em}
.statement q i{font-style:italic;color:var(--amber)}
.statement small{display:block;margin-top:22px;font-size:11.5px;letter-spacing:.24em;
  text-transform:uppercase;color:#9FB8B5}

/* stats */
.stats-row{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--gap);
  margin-top:clamp(44px,5vw,70px)}
.stat-big{border-top:1.5px solid var(--line);padding-top:26px}
.stat-big b{font-family:'Fraunces',serif;font-size:clamp(40px,4.6vw,72px);font-weight:500;
  display:block;line-height:1}
.stat-big small{display:block;margin-top:10px;font-size:12.5px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--muted)}

/* buttons */
.btn{display:inline-flex;align-items:center;gap:12px;text-decoration:none;font-weight:700;
  font-size:13.5px;letter-spacing:.08em;text-transform:uppercase;padding:16px 30px;border-radius:99px;
  transition:background .35s ease,color .35s ease,transform .35s ease;border:0;cursor:pointer;
  font-family:'Inter',sans-serif}
.btn .arr{transition:transform .35s ease}
.btn:hover .arr{transform:translateX(6px)}
.btn-dark{background:var(--forest);color:#fff}
.btn-dark:hover{background:var(--terra)}
.btn-light{background:#fff;color:var(--forest);border:1.5px solid var(--forest)}
.btn-light:hover{background:var(--forest);color:#fff}

/* teaser cards (home) */
.teasers{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--gap);
  margin-top:clamp(44px,5vw,70px)}
.tease{position:relative;border-radius:22px;overflow:hidden;aspect-ratio:3/4;display:block;
  text-decoration:none;color:#fff}
.tease img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  transition:transform 1.2s cubic-bezier(.2,.7,.2,1)}
.tease:hover img{transform:scale(1.07)}
.tease::after{content:"";position:absolute;inset:0;
  background:linear-gradient(to top,rgba(8,18,18,.74),rgba(8,18,18,.04) 58%)}
.tease .tx{position:absolute;left:24px;right:24px;bottom:22px;z-index:2}
.tease .tx small{font-size:11px;letter-spacing:.22em;text-transform:uppercase;opacity:.85}
.tease .tx h3{font-family:'Fraunces',serif;font-weight:500;font-size:clamp(22px,1.8vw,30px);margin-top:8px}
.tease .go{position:absolute;top:20px;right:20px;z-index:2;width:46px;height:46px;border-radius:50%;
  background:rgba(255,255,255,.16);backdrop-filter:blur(6px);display:grid;place-items:center;
  font-size:18px;transition:background .35s ease,transform .35s ease}
.tease:hover .go{background:var(--terra);transform:rotate(45deg)}
@media(max-width:1180px){.teasers{grid-template-columns:repeat(2,1fr)}}

/* ---------- REGISTER ---------- */
/* RK: pad the breakpoints so nothing touches the edge, and keep the form
   on the same alignment line as the nav + footer. */
/* ============================================================
   REGISTER — four questions, one screen at a time
   Every step is a real field inside a single <form>. Without JavaScript the
   .steps-ready class is never added, all four sections stay stacked and the
   form still submits, so nothing depends on the script to be usable.
   ============================================================ */
/* scroll-margin keeps the section header clear of the fixed nav when someone
   arrives from the Register link, which otherwise lands with the heading
   tucked underneath it. */
.register{background:var(--forest);color:#fff;position:relative;overflow:hidden;
  padding-block:clamp(56px,6.5vw,104px);scroll-margin-top:clamp(74px,8vw,104px)}
.register .glow{position:absolute;width:min(760px,110vw);height:min(760px,110vw);border-radius:50%;
  right:-14%;top:-34%;background:radial-gradient(circle,rgba(217,164,74,.22),transparent 64%);
  pointer-events:none}
.register .wrap{position:relative;z-index:2}
.steps{max-width:900px;margin-inline:auto;text-align:center}

/* Section header. Deliberately quiet: the question underneath is the loud thing,
   this only has to name the section and set the expectation of how long it takes. */
.reg-head{display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;
  margin-bottom:clamp(18px,2.2vw,30px)}
.reg-eyebrow{font-family:'Fraunces',Georgia,serif;font-size:clamp(20px,2vw,26px);
  letter-spacing:.16em;text-transform:uppercase;color:#fff}
.reg-time{font-size:12px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  color:var(--amber);border:1px solid rgba(217,164,74,.4);border-radius:99px;padding:7px 16px}
@media(max-width:560px){.reg-head{gap:10px}}


.rail{display:flex;gap:9px;justify-content:center;margin-bottom:clamp(20px,2.4vw,32px)}
.rail span{width:clamp(30px,5vw,54px);height:3px;background:rgba(255,255,255,.2);
  transition:background .5s ease}
.rail span.on{background:var(--amber)}

/* Each step is a <section>, so it was inheriting the global section padding:
   130px top and bottom of dead space inside the form. */
.steps .step{padding-block:0}
.stepno{font-size:11.5px;font-weight:700;letter-spacing:.24em;text-transform:uppercase;color:#93A5A1}
.q{font-size:clamp(30px,4.4vw,62px);line-height:1.06;margin-top:14px}
.q i{color:var(--amber)}
.hint{color:#A9B8B4;margin-top:14px;font-size:15.5px;max-width:52ch;margin-inline:auto}

/* Sin JS todos los pasos se ven; con JS solo el activo */
/* inset:0 would stretch every step to the stage height and make it impossible
   to read a step's own height, which is what the height animation needs. */
.steps-ready .stage{position:relative;min-height:clamp(240px,26vw,290px);
  transition:min-height .5s cubic-bezier(.2,.7,.2,1)}
.steps-ready .step{position:absolute;top:0;left:0;right:0;opacity:0;transform:translateY(20px);
  pointer-events:none;transition:opacity .45s ease,transform .5s cubic-bezier(.2,.7,.2,1)}
.steps-ready .step.on{position:relative;opacity:1;transform:none;pointer-events:auto}
.step + .step{margin-top:clamp(40px,6vw,80px)}
.steps-ready .step + .step{margin-top:0}

.row{display:flex;gap:14px;justify-content:center;flex-wrap:wrap;max-width:640px;
  margin:clamp(22px,3vw,34px) auto 0}
.row.narrow{max-width:340px;margin-top:14px}
.big{flex:1;min-width:220px;background:transparent;border:0;
  border-bottom:2px solid rgba(255,255,255,.28);color:#fff;font-family:'Fraunces',Georgia,serif;
  font-size:clamp(20px,2.4vw,32px);padding:12px 4px;text-align:center;outline:0;
  transition:border-color .35s ease}
.big::placeholder{color:rgba(255,255,255,.3)}
.big:focus{border-color:var(--amber)}
.small{width:100%;background:transparent;border:0;border-bottom:1px solid rgba(255,255,255,.2);
  color:#fff;font-family:inherit;font-size:15px;padding:10px 4px;text-align:center;outline:0;
  transition:border-color .35s ease}
.small::placeholder{color:rgba(255,255,255,.34)}
.small:focus{border-color:var(--amber)}

.opts{display:flex;gap:12px;justify-content:center;flex-wrap:wrap;margin-top:clamp(22px,3vw,34px)}
.opt{background:transparent;color:#fff;border:1px solid rgba(255,255,255,.28);font-family:inherit;
  font-size:14px;font-weight:600;padding:15px 26px;cursor:pointer;border-radius:12px;
  transition:background .3s,border-color .3s,color .3s,transform .3s}
.opt:hover{transform:translateY(-3px);border-color:var(--amber)}
.opt[aria-checked="true"]{background:var(--amber);border-color:var(--amber);color:#33260B}

.nav{display:flex;gap:12px;justify-content:center;align-items:center;flex-wrap:wrap;
  margin-top:clamp(24px,3vw,34px)}
.go{background:var(--amber);color:#33260B;border:0;font-family:inherit;font-size:13px;
  font-weight:700;letter-spacing:.12em;text-transform:uppercase;padding:18px 32px;border-radius:12px;
  cursor:pointer;transition:transform .35s cubic-bezier(.2,.7,.2,1),box-shadow .35s,background .3s}
.go:hover{background:#fff;transform:translateY(-2px);box-shadow:0 14px 30px rgba(217,164,74,.3)}
.back{background:transparent;color:#A9B8B4;border:0;font-family:inherit;font-size:13px;
  font-weight:600;letter-spacing:.06em;padding:18px 14px;cursor:pointer;transition:color .3s}
.back:hover{color:#fff}
.err{min-height:20px;margin-top:12px;font-size:13.5px;color:#F0A58C}
.consent{margin-top:20px;font-size:11.5px;line-height:1.6;color:#8FA9A6}

.thanks{max-width:640px;margin-inline:auto;text-align:center;
  animation:thanksIn .6s cubic-bezier(.2,.7,.2,1) both}
@keyframes thanksIn{from{opacity:0;transform:scale(.95)}to{opacity:1;transform:none}}
.tick{width:66px;height:66px;border-radius:50%;border:2px solid var(--amber);color:var(--amber);
  display:grid;place-items:center;font-size:30px;margin:0 auto 22px}
.thanks .back{margin-top:26px;border:1px solid rgba(255,255,255,.28);border-radius:12px;padding:15px 26px}

/* RK: this read as three run-together lines. Each item now leads with its own
   value, the address links to a map, the phone and email are tappable, and the
   dot is computed from the hours so it says whether the centre is open now. */
.regfoot{margin-top:clamp(40px,4.5vw,68px);padding-top:clamp(24px,2.6vw,32px);
  border-top:1px solid rgba(255,255,255,.14);
  display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(22px,3vw,48px);text-align:left}
.rf{display:flex;flex-direction:column;gap:4px;position:relative;padding-left:22px}
.rf::before{content:"";position:absolute;left:0;top:6px;bottom:6px;width:2px;
  background:rgba(255,255,255,.16)}
.rf-lab{font-size:10.5px;font-weight:700;letter-spacing:.2em;text-transform:uppercase;
  color:#7A928F;margin-bottom:4px}
.rf-val{font-size:16px;color:#fff;text-decoration:none;line-height:1.45;font-weight:500}
a.rf-val:hover{color:var(--amber)}
.rf-val em{display:block;font-style:normal;font-size:13px;font-weight:400;color:#8FA9A6;margin-top:3px}
.rf-go{display:block;font-size:11.5px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;
  color:var(--amber);margin-top:7px;opacity:.85;transition:opacity .3s,transform .3s}
a.rf-val:hover .rf-go{opacity:1;transform:translateX(3px)}
.rf-mail{font-size:14px;color:#8FA9A6;text-decoration:none;margin-top:2px}
.rf-mail:hover{color:#fff}
.rf-now{display:inline-flex;align-items:center;gap:7px;margin-top:8px;font-size:11.5px;
  font-weight:700;letter-spacing:.12em;text-transform:uppercase}
.rf-now i{width:7px;height:7px;border-radius:50%;background:currentColor;
  box-shadow:0 0 0 0 currentColor;animation:pulseDot 2.4s ease-out infinite}
.rf-now.open{color:#9CC48B}
.rf-now.shut{color:#B98A72;}
.rf-now.shut i{animation:none}
@keyframes pulseDot{0%{box-shadow:0 0 0 0 rgba(156,196,139,.5)}
  70%{box-shadow:0 0 0 8px rgba(156,196,139,0)}100%{box-shadow:0 0 0 0 rgba(156,196,139,0)}}
@media(max-width:820px){.regfoot{grid-template-columns:1fr;gap:24px}}
@media(max-width:760px){.regfoot{grid-template-columns:1fr;text-align:center}
  .nav{flex-direction:column-reverse}.nav .go,.nav .back{width:100%}}
@media(max-width:900px){
  .register .inner{grid-template-columns:1fr;gap:36px}
  .register form{grid-template-columns:1fr}
}

/* ---------- FOOTER ---------- */
/* aligned to the same shell as nav + register */
/* ============================================================
   FOOTER
   RK: the old one read as a WordPress strip. Three bands now: brand and
   navigation, the credits with both studio marks, then the legal line.
   ============================================================ */
footer{background:#0F2427;color:#7FA09D;font-size:14px;line-height:1.7;
  padding-block:clamp(56px,7vw,96px) clamp(26px,3vw,40px)}
footer a{color:#C4D6D3;text-decoration:none;transition:color .3s}
footer a:hover{color:#fff}

.f-top{display:grid;grid-template-columns:1.15fr 1.6fr;gap:clamp(36px,5vw,90px)}
.f-brand .f-mark{font-size:clamp(26px,2.6vw,36px);letter-spacing:.14em;color:#fff;line-height:1}
.f-brand p{margin-top:18px;max-width:44ch;color:#7FA09D}

.f-cols{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(22px,3vw,44px)}
.f-cols h4{font-size:10.5px;font-weight:700;letter-spacing:.22em;text-transform:uppercase;
  color:#5E7C79;margin-bottom:16px}
.f-cols a,.f-cols span{display:block;padding:5px 0;font-size:14px}
.f-cols span{color:#7FA09D}
.f-cta{margin-top:10px;font-weight:600;color:var(--amber) !important}
.f-cta:hover{color:#fff !important}

/* Both marks are sized off their wordmark, not their bounding box. Twinlines
   carries STUDIO underneath, so equal box heights would leave its name a third
   smaller than Dreamlife's. Measured on the artwork: box = 1.619x wordmark. */
.f-credits{--mark:22px;
  margin-top:clamp(44px,5vw,72px);padding-top:clamp(26px,3vw,38px);
  border-top:1px solid rgba(255,255,255,.1);
  display:flex;align-items:center;gap:clamp(28px,5vw,72px);flex-wrap:wrap}
.credit{display:flex;align-items:center;gap:14px}
.credit small{font-size:10.5px;font-weight:600;letter-spacing:.18em;text-transform:uppercase;
  color:#5E7C79;white-space:nowrap}
.credit .mk{display:block;width:auto;opacity:.92;transition:opacity .3s}
.credit a:hover .mk{opacity:1}
/* Matching wordmark heights on paper still leaves Dreamlife looking light beside
   a bold serif; matching x-heights overshoots the other way at 1.87. Compared
   side by side at 1.0, 1.2, 1.35, 1.5 and 1.7, the pair balances at 1.35. */
.credit .mk.dl{height:calc(var(--mark) * 1.35)}
.credit .mk.tl{height:calc(var(--mark) * 1.619)}
.f-demo{margin-left:auto}

/* One line. The 92ch cap was resolving to about 590px and folding the
   disclaimer in two while the copyright sat alone on the right. */
.f-legal{margin-top:clamp(26px,3vw,38px);padding-top:22px;
  border-top:1px solid rgba(255,255,255,.1);
  display:flex;justify-content:space-between;align-items:baseline;gap:14px 40px;
  flex-wrap:wrap;font-size:11.5px;line-height:1.7;color:#5E7C79}
.f-legal p{max-width:none;flex:1 1 auto}
.f-copy{white-space:nowrap}

@media(max-width:900px){
  .f-top{grid-template-columns:1fr;gap:34px}
  .f-cols{grid-template-columns:1fr 1fr}
}
@media(max-width:560px){
  .f-cols{grid-template-columns:1fr}
  .f-credits{--mark:19px;gap:22px}
  .f-demo{margin-left:0}
}
@media(max-width:640px){
  footer .f-in{flex-direction:column;align-items:flex-start;gap:18px}
}

/* ---------- LIGHTBOX (gallery + floorplan zoom) ---------- */
.lb{position:fixed;inset:0;z-index:200;background:rgba(8,18,18,.94);backdrop-filter:blur(6px);
  display:none;align-items:center;justify-content:center;opacity:0;transition:opacity .3s ease}
.lb.open{display:flex}
.lb.show{opacity:1}
/* flex, not grid: a grid row sized `auto` leaves the item's max-height:100%
   with nothing definite to resolve against, so the image overflowed the
   stage at 1x and the bottom of the sheet was already off screen. */
.lb-stage{position:relative;width:100%;height:100%;display:flex;
  align-items:center;justify-content:center;
  padding:clamp(56px,8vh,90px) clamp(16px,6vw,96px);overflow:hidden}
.lb-stage img{max-width:100%;max-height:100%;width:auto;height:auto;
  object-fit:contain;border-radius:6px;
  box-shadow:0 30px 90px rgba(0,0,0,.5);cursor:zoom-in;
  transition:transform .34s cubic-bezier(.2,.7,.2,1),opacity .28s ease;
  transform-origin:center;user-select:none;-webkit-user-drag:none}
.lb-stage video{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain;
  display:block;background:#000}
/* The hint belongs to stills. A clip arrives with its own controls, and telling
   someone to click it to zoom would be a lie. */
.lb.is-video .lb-zoomhint{display:none}
.lb-stage img.zoomed{cursor:grab;transition:transform .18s ease-out}
.lb-stage img.zoomed.grabbing{cursor:grabbing;transition:none}
.lb-close,.lb-prev,.lb-next{position:absolute;z-index:3;border:0;cursor:pointer;color:#fff;
  background:rgba(255,255,255,.12);backdrop-filter:blur(8px);border-radius:50%;
  display:grid;place-items:center;transition:background .3s ease,transform .3s ease}
.lb-close{top:clamp(14px,2.4vh,26px);right:clamp(14px,2.4vw,30px);width:48px;height:48px;font-size:19px}
.lb-close:hover{background:var(--terra);transform:rotate(90deg)}
.lb-prev,.lb-next{top:50%;margin-top:-28px;width:56px;height:56px;font-size:22px}
.lb-prev{left:clamp(10px,1.8vw,26px)}
.lb-next{right:clamp(10px,1.8vw,26px)}
.lb-prev:hover,.lb-next:hover{background:var(--terra)}
/* Floor plans are white to the edge, so a gradient scrim isn't enough —
   the caption carries its own opaque plate instead. */
.lb-bar{position:absolute;left:0;right:0;bottom:0;z-index:3;padding:0 clamp(14px,3vw,30px) clamp(14px,2.4vh,26px);
  display:flex;justify-content:space-between;align-items:flex-end;gap:16px;color:#fff;
  pointer-events:none}
.lb-cap{font-size:13.5px;line-height:1.5;max-width:58ch;pointer-events:auto;
  background:rgba(10,22,22,.86);backdrop-filter:blur(10px);padding:14px 20px;border-radius:16px}
.lb-cap b{display:block;font-family:'Fraunces',serif;font-weight:500;font-size:18px;margin-bottom:4px}
.lb-count{font-size:11.5px;letter-spacing:.16em;color:#CFE0DD;white-space:nowrap;pointer-events:auto;
  background:rgba(10,22,22,.86);backdrop-filter:blur(10px);padding:11px 17px;border-radius:99px}
.lb-zoomhint{position:absolute;top:clamp(14px,2.4vh,26px);left:clamp(14px,2.4vw,30px);z-index:3;
  font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:#9FB8B5;
  background:rgba(255,255,255,.08);padding:8px 15px;border-radius:99px;backdrop-filter:blur(8px);
  transition:opacity .25s ease}

/* While zoomed, get the chrome out of the way — the caption plate otherwise
   sits over the bottom-left of the drawing, which is exactly where the lower
   level of a floor plan lives. */
.lb.is-zoomed .lb-bar,
.lb.is-zoomed .lb-zoomhint,
.lb.is-zoomed .lb-prev,
.lb.is-zoomed .lb-next{opacity:0;pointer-events:none}
.lb-prev,.lb-next,.lb-bar{transition:opacity .25s ease}
/* NB: never change .lb-stage padding on zoom — it would resize the image's
   own layout box mid-transform and throw the pan maths out. */
@media(max-width:700px){
  .lb-prev,.lb-next{width:44px;height:44px;margin-top:-22px;font-size:18px}
  .lb-zoomhint{display:none}
  .lb-cap b{font-size:16px}
  .lb-cap{font-size:12.5px}
}

/* ---------- SMALL-SCREEN CORRECTIONS ---------- */
@media(max-width:900px){
  /* the vertical "Scroll" cue collides with the hero sub-copy on phones */
  .hero .scrollcue{display:none}
  .hero .sub-copy{max-width:none}
}
@media(max-width:640px){
  h2.title{max-width:none}
  .stats-row{grid-template-columns:1fr;gap:0}
  .stat-big{padding-block:22px 0}
}

/* ---------- the interactive neighbourhood map ----------
   The frame carries the card's own radius and the wait layer sits on top of it
   until the map reports back, so the section never opens on a white rectangle
   of unknown height. */
.mapframe{position:relative;margin-top:clamp(30px,4vw,52px);background:#fff;
  border:1px solid var(--line);border-radius:24px;overflow:hidden;
  box-shadow:0 24px 60px rgba(31,67,72,.10)}
.mapframe iframe{display:block;width:100%;height:1300px;border:0;background:#fff}
.map-wait{position:absolute;inset:0;display:grid;place-items:center;pointer-events:none;
  background:#fff;color:var(--muted);font-size:12px;letter-spacing:.18em;
  text-transform:uppercase;transition:opacity .6s ease}
@media(max-width:900px){.mapframe iframe{height:1900px}}

/* ---------- page headers carry a picture, not a flat panel ----------
   A solid colour block with a line of type in it is the thing that reads as a
   template. The photograph sits well under the surface here: low opacity, under
   a gradient of the same base colour, so the type keeps its contrast and the
   header stops being an empty rectangle. It drifts on scroll with everything
   else, and it is oversized past the drift so no edge can appear. */
.page-head .ph-media{position:absolute;top:-12%;left:0;right:0;bottom:-12%;
  overflow:hidden;pointer-events:none;will-change:transform}
.page-head .ph-media img{width:100%;height:100%;object-fit:cover;opacity:.34;
  animation:phZoom 16s cubic-bezier(.2,.6,.2,1) both}
.page-head .ph-media::after{content:"";position:absolute;inset:0;
  background:linear-gradient(to bottom,rgba(31,67,72,.40) 0%,rgba(31,67,72,.70) 55%,rgba(31,67,72,.93) 100%)}
@keyframes phZoom{from{transform:scale(1.09)}to{transform:scale(1)}}
.page-head .wrap{position:relative;z-index:1}

/* The full-bleed block moves as one piece, so the still and the video that
   replaces it stay in exactly the same frame through the handover. */
.bleed-media{position:absolute;top:-12%;left:0;right:0;bottom:-12%;will-change:transform}
.bleed-media img,.bleed-media .fig-vid{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}

/* ---------- demo sales assistant ----------
   Sits above everything except the menu drawer. It inherits the project palette
   through the variables rather than carrying colours of its own, so dropping it
   into another project is a copy of two files. */
.cb{position:fixed;right:clamp(14px,2vw,28px);bottom:clamp(14px,2vw,28px);z-index:120;
  font-family:var(--cb-sans);display:flex;flex-direction:column;align-items:flex-end;gap:12px}
.cb-launch{display:flex;align-items:center;gap:11px;border:0;cursor:pointer;
  background:var(--cb-accent);color:var(--cb-on-accent);
  padding:14px 22px 14px 18px;border-radius:var(--cb-radius);
  font-family:inherit;font-size:12px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  box-shadow:0 14px 34px rgba(0,0,0,.20);
  transition:transform .4s cubic-bezier(.2,.7,.2,1),box-shadow .4s,padding .4s,gap .4s}
.cb-launch:hover{transform:translateY(-2px);box-shadow:0 20px 44px rgba(0,0,0,.26)}
.cb-ico{display:grid;place-items:center;flex-shrink:0}
.cb-label{white-space:nowrap;max-width:260px;overflow:hidden;
  transition:max-width .45s cubic-bezier(.2,.7,.2,1),opacity .3s}
.cb.cb-tight .cb-label,.cb.open .cb-label{max-width:0;opacity:0}
.cb.cb-tight .cb-launch,.cb.open .cb-launch{padding:16px;gap:0;border-radius:50%}

/* The panel is a plain div and its padding is zeroed on purpose. It used to
   be a <section>, which picked up section{padding-block:var(--band)} from
   this stylesheet and opened with a band of dead space above the header and
   below the note. The widget is meant to drop into any client site, so it
   cannot inherit the host's element defaults. */
.cb-panel{padding:0;position:absolute;right:0;bottom:0;width:min(384px,calc(100vw - 28px));
  background:var(--cb-paper);color:var(--cb-ink);border:1px solid var(--cb-line);
  border-radius:var(--cb-radius);box-shadow:0 30px 80px rgba(0,0,0,.24);
  display:flex;flex-direction:column;overflow:hidden;
  opacity:0;visibility:hidden;transform:translateY(14px) scale(.98);transform-origin:100% 100%;
  transition:opacity .38s,transform .42s cubic-bezier(.2,.75,.2,1),visibility .38s}
.cb.open .cb-panel{opacity:1;visibility:visible;transform:none;
  bottom:calc(100% + 12px)}
.cb-head{display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:16px 18px;background:var(--cb-accent);color:var(--cb-on-accent)}
.cb-head b{display:block;font-family:var(--cb-display);font-weight:400;font-size:17px;letter-spacing:.01em}
.cb-head span{font-size:10px;letter-spacing:.18em;text-transform:uppercase;opacity:.72}
.cb-x{background:transparent;border:0;color:inherit;font-size:15px;cursor:pointer;
  width:30px;height:30px;border-radius:50%;transition:background .3s}
.cb-x:hover{background:rgba(255,255,255,.16)}

.cb-log{padding:18px;display:flex;flex-direction:column;gap:11px;
  max-height:min(46vh,380px);overflow-y:auto;overscroll-behavior:contain}
.cb-msg{font-size:14.5px;line-height:1.6;padding:11px 14px;max-width:88%;
  animation:cbIn .38s cubic-bezier(.2,.7,.2,1) both}
@keyframes cbIn{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}
.cb-bot{background:var(--cb-sand);align-self:flex-start;border-radius:var(--cb-bubble) var(--cb-bubble) var(--cb-bubble) 2px}
.cb-me{background:var(--cb-accent);color:var(--cb-on-accent);align-self:flex-end;
  border-radius:var(--cb-bubble) var(--cb-bubble) 2px var(--cb-bubble)}
.cb-msg a{color:inherit;text-underline-offset:3px}
.cb-cta{display:inline-block;margin-top:7px;font-weight:600;font-size:12px;
  letter-spacing:.1em;text-transform:uppercase;text-decoration:none;color:var(--cb-accent)}
.cb-typing{display:inline-flex;gap:4px;align-items:center;height:14px}
.cb-typing i{width:5px;height:5px;border-radius:50%;background:currentColor;opacity:.35;
  animation:cbDot 1.1s infinite}
.cb-typing i:nth-child(2){animation-delay:.16s}
.cb-typing i:nth-child(3){animation-delay:.32s}
@keyframes cbDot{0%,60%,100%{opacity:.22;transform:translateY(0)}30%{opacity:.85;transform:translateY(-3px)}}

.cb-chips{display:flex;gap:7px;flex-wrap:wrap;padding:0 18px 14px}
.cb-chip{background:transparent;border:1px solid var(--cb-line);color:var(--cb-muted);
  font-family:inherit;font-size:11.5px;padding:7px 12px;border-radius:var(--cb-bubble);
  cursor:pointer;transition:border-color .3s,color .3s}
.cb-chip:hover{border-color:var(--cb-accent);color:var(--cb-accent)}

.cb-form{display:flex;gap:0;border-top:1px solid var(--cb-line)}
.cb-in{flex:1;border:0;background:transparent;padding:15px 18px;font-family:inherit;
  font-size:14.5px;color:inherit;outline:0}
.cb-in::placeholder{color:var(--cb-muted)}
.cb-send{border:0;background:transparent;color:var(--cb-accent);font-size:19px;
  width:52px;cursor:pointer;transition:transform .3s}
.cb-send:hover{transform:translateX(2px)}
.cb-note{margin:0;padding:0 18px 14px;font-size:10.5px;line-height:1.55;color:var(--cb-muted)}

/* The drawer owns the screen when it is open; the assistant steps aside. */
body.menu-open .cb,body.locked .cb{opacity:0;pointer-events:none}
@media(max-width:520px){
  .cb-label{display:none}
  .cb-launch{padding:16px;border-radius:50%}
  .cb.open .cb-panel{bottom:calc(100% + 10px)}
}
@media(prefers-reduced-motion:reduce){
  .cb-msg,.cb-typing i{animation:none}
}

.cb{--cb-sans:'Inter',system-ui,sans-serif;--cb-display:'Fraunces',serif;
  --cb-accent:#1F4348;--cb-on-accent:#FAF7F1;--cb-paper:#FAF7F1;--cb-ink:#202A29;
  --cb-sand:#F1EBE0;--cb-line:#E3DCCE;--cb-muted:#6E7370;--cb-radius:18px;--cb-bubble:14px}

/* ---------- THE MARK ----------
   The monogram from the brand board, traced from the artwork so it scales
   clean. It rides inline with the wordmark and takes its color from the text,
   so one asset serves the light nav, the dark footer and everything between. */
.logo,.f-brand .f-mark{display:inline-flex;align-items:center;gap:.55em}
.lmk{height:1.55em;width:auto;flex:none}
.f-brand .f-mark .lmk{height:1.45em}
