/* app.css build: 2026-08-03-cards  (search for this string to confirm the upload) */
/* ============================================================================
   AVILLA — application stylesheet
   Extracted verbatim from the approved Phase 2 landing page, so the Blade
   views render the design that was signed off rather than an approximation.

   NO BUILD STEP. This is plain CSS served straight from public/css/app.css.
   That is deliberate: the deploy target is cPanel with no terminal, and
   requiring `npm run build` would put a Node toolchain between you and every
   copy change. Tailwind can come back the day this moves to a VPS; until
   then the token layer below is the single source of truth.
   ========================================================================= */

/* ══════════ TOKENS — from avilla-tokens.css ══════════ */
:root{
  --ink-900:#101A19;--ink-700:#2C3937;--ink-500:#55625F;--ink-300:#8B9793;--ink-100:#C6CCC8;
  --teal-900:#0F3238;--teal-700:#1C4E56;--teal-500:#2F717A;--teal-300:#78A6AB;--teal-100:#CBDEDF;--teal-050:#EAF2F2;
  --sage-500:#A7BCA1;--sage-300:#C6D4C1;--sage-100:#E3EADF;--sage-050:#F1F5EF;
  /* Amber ramp derived from the logo (#FFC52F, hue 43deg).
     brass-500 is the logo colour and is a FILL ONLY — white text on it is
     1.58:1, so anything sitting on it uses ink-900 (11.2:1).
     brass-700 is darkened until it passes 4.5:1 on the canvas background,
     because that is where every eyebrow sits. */
  --brass-700:#8D6600;--brass-500:#FFC52F;--brass-300:#FFD66C;--brass-100:#FCEECB;--brass-050:#FDF7E8;
  --canvas:#F1F0EA;--surface:#FFF;--surface-2:#FAF9F5;--line:#E1DED5;--line-soft:#EDEBE4;
  --success-600:#3F7D5C;--success-050:#EDF5F0;--danger-600:#A0453B;--danger-050:#FAEDEB;

  --font-display:'Marcellus','Iowan Old Style',Georgia,serif;
  --font-body:'Jost',ui-sans-serif,system-ui,sans-serif;
  --font-mono:'DM Mono',ui-monospace,Menlo,monospace;

  --fs-display-xl:clamp(2.75rem,6vw,4.5rem);--fs-display-lg:clamp(2.25rem,4.4vw,3.25rem);
  --fs-h1:clamp(1.75rem,3vw,2.25rem);--fs-h2:clamp(1.375rem,2.2vw,1.625rem);--fs-h3:1.125rem;
  --fs-body-lg:1.0625rem;--fs-body:.9375rem;--fs-sm:.8125rem;--fs-xs:.75rem;--fs-eyebrow:.6875rem;
  --ls-eyebrow:.18em;--ls-tight:-.01em;

  --r-xs:2px;--r-sm:6px;--r-md:8px;--r-lg:14px;--r-xl:20px;--r-pill:999px;

  --shadow-xs:0 1px 2px rgba(16,26,25,.05);
  --shadow-sm:0 2px 4px rgba(16,26,25,.05),0 1px 2px rgba(16,26,25,.04);
  --shadow-md:0 8px 20px -6px rgba(16,26,25,.10),0 2px 6px -2px rgba(16,26,25,.06);
  --shadow-lg:0 24px 48px -12px rgba(16,26,25,.16),0 8px 16px -8px rgba(16,26,25,.07);
  --shadow-xl:0 40px 90px -24px rgba(16,26,25,.28),0 12px 28px -12px rgba(16,26,25,.10);
  --ring-focus:0 0 0 3px rgba(255,197,47,.55);--ring-danger:0 0 0 3px rgba(160,69,59,.22);

  --dur-fast:160ms;--dur-base:240ms;--dur-slow:400ms;--dur-slower:700ms;
  --ease-out:cubic-bezier(.22,1,.36,1);--ease-entrance:cubic-bezier(.16,1,.3,1);
  --ease-in-out:cubic-bezier(.65,0,.35,1);--ease-spring:cubic-bezier(.34,1.56,.64,1);

  --container:1280px;--gutter:1.25rem;--section-y:clamp(4rem,9vw,8rem);
  --motif:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='56' height='56' viewBox='0 0 56 56'%3E%3Cpath d='M28 4 52 28 28 52 4 28Z' fill='none' stroke='%23fff' stroke-opacity='.055' stroke-width='1'/%3E%3Cpath d='M28 17 39 28 28 39 17 28Z' fill='none' stroke='%23fff' stroke-opacity='.045' stroke-width='1'/%3E%3C/svg%3E");
  --nav-h:74px;
}
*,*::before,*::after{box-sizing:border-box}
[x-cloak]{display:none!important}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}
body{margin:0;font-family:var(--font-body);font-size:var(--fs-body);line-height:1.6;color:var(--ink-500);background:var(--canvas);-webkit-font-smoothing:antialiased;overflow-x:hidden}
h1,h2,h3,h4{font-family:var(--font-display);font-weight:400;color:var(--ink-900);letter-spacing:var(--ls-tight);line-height:1.2;margin:0}
p{margin:0}
a{color:inherit}
button{font:inherit;color:inherit;cursor:pointer}
:focus-visible{outline:none;box-shadow:var(--ring-focus);border-radius:var(--r-sm)}
.script{font-family:Georgia,serif;font-style:italic;color:var(--sage-500)}
.eyebrow{font-family:var(--font-mono);font-size:var(--fs-eyebrow);letter-spacing:var(--ls-eyebrow);text-transform:uppercase;line-height:1;color:var(--brass-700)}
.wrap{max-width:var(--container);margin:0 auto;padding:0 var(--gutter)}
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}

/* ── Buttons ── */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;min-height:44px;padding:0 1.5rem;
  border:1px solid transparent;border-radius:var(--r-md);font-size:var(--fs-body);font-weight:500;text-decoration:none;white-space:nowrap;
  transition:background var(--dur-fast) var(--ease-out),color var(--dur-fast) var(--ease-out),
             border-color var(--dur-fast) var(--ease-out),box-shadow var(--dur-base) var(--ease-out),
             transform var(--dur-fast) var(--ease-spring)}
.btn:active{transform:scale(.975)}
.btn:disabled{opacity:.45;cursor:not-allowed;transform:none}
.btn-primary{background:var(--teal-700);color:#fff;box-shadow:var(--shadow-sm)}
.btn-primary:hover:not(:disabled){background:var(--teal-900);box-shadow:var(--shadow-md);transform:translateY(-1px)}
/* ink-900 on amber is 11.22:1; white on amber is 1.58:1 and unreadable.
   Hover DARKENS the fill, so the label flips to white to keep contrast. */
.btn-accent{background:var(--brass-500);color:var(--ink-900);box-shadow:var(--shadow-sm)}
.btn-accent:hover:not(:disabled){background:var(--brass-700);color:#fff;box-shadow:var(--shadow-md);transform:translateY(-1px)}
.btn-secondary{background:transparent;color:var(--ink-900);border-color:var(--ink-100)}
.btn-secondary:hover{border-color:var(--teal-700);color:var(--teal-700);background:var(--teal-050)}
.btn-ghost{background:transparent;color:var(--ink-500);padding:0 .875rem}
.btn-ghost:hover{color:var(--ink-900);background:var(--surface-2)}
.btn-light{background:rgba(255,255,255,.08);color:#fff;border-color:rgba(255,255,255,.32);backdrop-filter:blur(8px)}
.btn-light:hover{background:rgba(255,255,255,.16);border-color:rgba(255,255,255,.6)}
.btn-lg{min-height:52px;padding:0 2rem}
.btn-sm{min-height:36px;padding:0 1rem;font-size:var(--fs-sm)}
.spin{width:15px;height:15px;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;border-radius:50%;animation:spin .7s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}


/* ── Property cards ──────────────────────────────────────────────
   Used by /floor-plans. Defined in the Phase 1 design system but never
   carried into this stylesheet, so the cards rendered as bare divs. */
.card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(268px,1fr));gap:1.5rem}

.pcard{display:flex;flex-direction:column;background:var(--surface);
  border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;
  transition:transform var(--dur-base) var(--ease-out),
             box-shadow var(--dur-base) var(--ease-out),
             border-color var(--dur-base)}
/* Lift, never scale — scaling a card with a photo in it resamples the
   image and looks cheap at any size. */
.pcard:hover{transform:translateY(-4px);box-shadow:var(--shadow-lg);border-color:var(--teal-100)}

.pcard-img{position:relative;height:150px;flex:none;overflow:hidden;
  background:linear-gradient(140deg,var(--teal-700),var(--teal-900))}
.pcard-img::before{content:'';position:absolute;inset:0;background-image:var(--motif)}
.pcard-img img{width:100%;height:100%;object-fit:cover;display:block;position:relative}
.pcard-img .badge{position:absolute;top:.75rem;left:.75rem;z-index:1;
  background:rgba(255,255,255,.94);border-color:transparent;color:var(--teal-900)}

.pcard-body{display:flex;flex-direction:column;flex:1;padding:1.125rem 1.25rem 1.25rem}
.pcard-body h4{font-size:var(--fs-h3);margin-bottom:.1875rem}
.pcard-sub{font-size:var(--fs-sm);color:var(--ink-300);font-weight:300}

.pcard .facts{display:flex;gap:.875rem;margin:.75rem 0 .875rem;
  font-family:var(--font-mono);font-size:var(--fs-xs);color:var(--ink-500)}
.pcard .facts span{white-space:nowrap}

.pcard .price{font-family:var(--font-display);font-size:1.25rem;color:var(--ink-900);line-height:1}
.pcard .price span{font-family:var(--font-body);font-size:var(--fs-xs);color:var(--ink-300)}

/* margin-top:auto pins the actions to the bottom, so cards with different
   copy lengths still line their buttons up across the row. */
.pcard-actions{display:flex;gap:.5rem;margin-top:auto;padding-top:1rem}
.pcard-actions .btn{flex:1;min-height:38px;padding:0 .75rem;font-size:var(--fs-sm)}

/* Page heads where there is no hero. The sticky nav sits in normal flow,
   so adding nav-h as padding double-counts it — that is the large empty
   band under the bar on /floor-plans. */
.sec--top{padding-top:clamp(2rem,4vw,3.25rem)}
.page-head{max-width:52ch;margin-bottom:2.5rem}
.page-head h1{font-size:var(--fs-display-lg);line-height:1.08;margin:1.25rem 0 1rem}

@media (max-width:560px){
  .card-grid{grid-template-columns:1fr;gap:1rem}
  .pcard-img{height:132px}
}

/* ── Reveal on scroll ── */
/* Scroll reveal — progressive enhancement.
   The hidden state applies ONLY under .js-reveal, which app.js puts on
   <html> before first paint. If the script is missing, blocked, or errors,
   content is simply visible. A homepage must never depend on JavaScript to
   show its own text. */
.rv{opacity:1;transform:none}
.js-reveal .rv{opacity:0;transform:translateY(22px);
  transition:opacity var(--dur-slower) var(--ease-entrance),transform var(--dur-slower) var(--ease-entrance);
  transition-delay:calc(var(--d,0) * 80ms)}
.js-reveal .rv.in{opacity:1;transform:none}

/* ══════════ ANNOUNCEMENT BAR ══════════ */
.announce{background:var(--sage-500);color:var(--teal-900);position:relative;z-index:210;
  transition:height var(--dur-slow) var(--ease-out),opacity var(--dur-base)}
.announce-in{max-width:var(--container);margin:0 auto;padding:.625rem var(--gutter);display:flex;align-items:center;justify-content:center;gap:1rem;font-size:var(--fs-sm)}
.announce a{font-weight:500;text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px}
.announce a:hover{color:var(--teal-700)}
.announce-x{position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:28px;height:28px;border:none;background:transparent;
  display:grid;place-items:center;border-radius:var(--r-pill);color:var(--teal-900);opacity:.55;transition:all var(--dur-fast)}
.announce-x:hover{opacity:1;background:rgba(15,50,56,.08)}

/* ══════════ NAV ══════════ */
.nav{position:sticky;top:0;z-index:200;height:var(--nav-h);display:flex;align-items:center;
  background:transparent;border-bottom:1px solid transparent;
  transition:background var(--dur-slow) var(--ease-out),border-color var(--dur-slow),box-shadow var(--dur-slow),backdrop-filter var(--dur-slow)}
.nav.solid{background:rgba(255,255,255,.92);backdrop-filter:blur(14px) saturate(1.2);border-bottom-color:var(--line);box-shadow:var(--shadow-sm)}

/* The nav starts transparent with white text and only turns solid past
   40px of scroll. That is right over a dark hero and wrong everywhere
   else — on /floor-plans it is white text on a cream page, i.e. invisible.

   :has() lets the nav detect a hero-less page and start solid, with no
   per-page markup and no flash while Alpine boots. ~93% support; the
   fallback is the old behaviour, which is what you have now anyway. */
body:not(:has(.hero)) .nav{background:rgba(255,255,255,.92);
  backdrop-filter:blur(14px) saturate(1.2);border-bottom-color:var(--line);
  box-shadow:var(--shadow-sm)}
body:not(:has(.hero)) .nav-links a{color:var(--ink-500)}
body:not(:has(.hero)) .nav-links a:hover{color:var(--teal-900)}
body:not(:has(.hero)) .nav-phone{color:var(--ink-500)}
body:not(:has(.hero)) .nav-burger{color:var(--teal-900)}
body:not(:has(.hero)) .brand-logo--light{opacity:0}
body:not(:has(.hero)) .brand-logo--dark{opacity:1}
body:not(:has(.hero)) .nav-links a::after{background:var(--brass-700)}
.nav-in{max-width:var(--container);margin:0 auto;padding:0 var(--gutter);width:100%;display:flex;align-items:center;gap:2rem}
/* ── Brand / logo ─────────────────────────────────────────────────
   The supplied file is 4000x1044 but only 27% of that is ink — the rest
   is white margin. Used raw at height:38px the logo would render about
   24px tall and waste 130px of nav width, so the shipped assets are
   trimmed to the ink box (5.57:1) and resized for the web.

   Two artworks: the wordmark is BLACK, which vanishes on the dark hero.
   `logo-light` is the same file with the black turned white and the
   background made transparent. Both are in the DOM so neither pops in
   on first scroll; CSS cross-fades between them.

   --brand-h is the only knob. Width follows from the aspect ratio. */
:root{ --brand-h:38px; }

.brand{position:relative;display:flex;align-items:center;text-decoration:none;
  flex:none;min-width:0}
.brand-plate{position:relative;display:block;line-height:0}

.brand-logo{display:block;height:var(--brand-h);width:auto;
  transition:opacity var(--dur-slow) var(--ease-out)}

/* Stack the two artworks so swapping one for the other cannot reflow
   the nav — the second is absolutely positioned over the first. */
.brand-logo--dark{position:absolute;inset:0;opacity:0}
.brand-logo--light{opacity:1}
.nav.solid .brand-logo--light{opacity:0}
.nav.solid .brand-logo--dark{opacity:1}

.brand--menu{margin-bottom:1.75rem}
.brand--menu .brand-logo{height:34px}

/* Legacy text lockup — the admin and portal rails still use it. */
.brand-mark{transition:stroke var(--dur-slow)}
.brand-name{font-family:var(--font-display);font-size:1rem;letter-spacing:.24em;text-transform:uppercase;color:#fff;transition:color var(--dur-slow)}
.brand-sub{display:block;font-family:var(--font-mono);font-size:.5625rem;letter-spacing:.28em;color:rgba(255,255,255,.5);transition:color var(--dur-slow)}
.nav.solid .brand-name{color:var(--teal-900)}
.nav.solid .brand-sub{color:var(--ink-300)}
.nav.solid .brand-mark{stroke:var(--brass-500)}

/* A 5.57:1 logo is far wider than the old wordmark, so the links give
   back some padding rather than wrapping. */
.nav-in{gap:1.5rem}
.nav-links{gap:0}
.nav-links a{padding:.5rem .5625rem}
.nav-links{display:flex;gap:.25rem;list-style:none;margin:0;padding:0;flex:1;justify-content:center}
.nav-links a{text-decoration:none;font-size:var(--fs-sm);padding:.5rem .75rem;border-radius:var(--r-sm);color:rgba(255,255,255,.82);
  position:relative;transition:color var(--dur-fast)}
.nav.solid .nav-links a{color:var(--ink-500)}
.nav-links a::after{content:'';position:absolute;left:.75rem;right:.75rem;bottom:.25rem;height:1px;background:var(--brass-300);
  transform:scaleX(0);transform-origin:left;transition:transform var(--dur-base) var(--ease-out)}
.nav-links a:hover{color:#fff}
.nav.solid .nav-links a:hover{color:var(--teal-900)}
.nav-links a:hover::after{transform:scaleX(1)}
.nav.solid .nav-links a::after{background:var(--brass-700)}
.nav-actions{display:flex;align-items:center;gap:.75rem;flex:none}
.nav-phone{font-family:var(--font-mono);font-size:var(--fs-sm);text-decoration:none;color:rgba(255,255,255,.82);transition:color var(--dur-slow)}
.nav.solid .nav-phone{color:var(--ink-500)}
.nav-burger{display:none;width:44px;height:44px;border:none;background:transparent;color:#fff;place-items:center;border-radius:var(--r-sm)}
.nav.solid .nav-burger{color:var(--teal-900)}
.mobile-menu{position:fixed;inset:0;z-index:220;background:var(--teal-900);padding:5rem 1.5rem 2rem;display:flex;flex-direction:column;gap:.25rem}
.mobile-menu::before{content:'';position:absolute;inset:0;background-image:var(--motif)}
.mobile-menu .brand{position:relative;margin-bottom:1.5rem;max-width:200px}
.mobile-menu .brand-plate{box-shadow:none}
.mobile-menu a{position:relative;text-decoration:none;font-family:var(--font-display);font-size:1.5rem;color:#fff;padding:.75rem 0;border-bottom:1px solid rgba(255,255,255,.1)}
.mobile-menu .btn{position:relative;margin-top:1.5rem}
.mobile-x{position:absolute;top:1.25rem;right:1.25rem;z-index:1;width:44px;height:44px;border:none;background:transparent;color:#fff;display:grid;place-items:center}

/* ══════════ HERO ══════════ */
.hero{position:relative;height:calc(100vh - var(--nav-h));min-height:600px;max-height:900px;margin-top:calc(var(--nav-h) * -1);
  overflow:hidden;background:var(--teal-900)}
.slide{position:absolute;inset:0;opacity:0;transition:opacity 1200ms var(--ease-in-out)}
.slide.on{opacity:1}
.slide-art{position:absolute;inset:0;display:grid;place-items:center;overflow:hidden}
.slide-art svg{width:118%;height:118%;transform:scale(1.06);transition:transform 9000ms linear}
.slide.on .slide-art svg{transform:scale(1.14)}
.slide-1{background:linear-gradient(165deg,#1C4E56 0%,#0F3238 62%,#0B2429 100%)}
.slide-2{background:linear-gradient(165deg,#245A5C 0%,#12383C 60%,#0B2429 100%)}
.slide-3{background:linear-gradient(165deg,#2A5A50 0%,#123536 60%,#0B2429 100%)}
.hero::after{content:'';position:absolute;inset:0;background-image:var(--motif);pointer-events:none}
.hero-scrim{position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(180deg,rgba(11,36,41,.62) 0%,rgba(11,36,41,.12) 34%,rgba(11,36,41,.45) 72%,rgba(11,36,41,.88) 100%)}
.hero-in{position:relative;z-index:2;height:100%;max-width:var(--container);margin:0 auto;padding:var(--nav-h) var(--gutter) 8rem;
  display:flex;flex-direction:column;justify-content:center;align-items:flex-start}
.hero .eyebrow{color:var(--brass-300);margin-bottom:1.5rem}
.hero h1{color:#fff;font-size:var(--fs-display-xl);line-height:1.02;max-width:15ch;margin-bottom:1.25rem}
.hero p{color:rgba(255,255,255,.72);font-weight:300;font-size:var(--fs-body-lg);max-width:44ch;margin-bottom:2rem}
.hero-cta{display:flex;gap:.75rem;flex-wrap:wrap}
.hero-anim > *{animation:heroUp 900ms var(--ease-entrance) both}
.hero-anim > *:nth-child(1){animation-delay:120ms}
.hero-anim > *:nth-child(2){animation-delay:220ms}
.hero-anim > *:nth-child(3){animation-delay:320ms}
.hero-anim > *:nth-child(4){animation-delay:440ms}
@keyframes heroUp{from{opacity:0;transform:translateY(26px)}to{opacity:1;transform:none}}

.hero-rail{position:absolute;left:0;right:0;bottom:2.25rem;z-index:3}
.hero-rail-in{max-width:var(--container);margin:0 auto;padding:0 var(--gutter);display:flex;align-items:center;gap:1.25rem}
.slide-count{font-family:var(--font-mono);font-size:var(--fs-xs);letter-spacing:.14em;color:rgba(255,255,255,.55)}
.slide-count b{color:#fff;font-weight:400}
.slide-bars{display:flex;gap:.5rem;flex:1;max-width:14rem}
.slide-bar{flex:1;height:2px;background:rgba(255,255,255,.22);border-radius:1px;border:none;padding:0;position:relative;overflow:hidden;cursor:pointer}
.slide-bar::after{content:'';position:absolute;inset:0;background:var(--brass-500);transform:scaleX(0);transform-origin:left}
.slide-bar.on::after{animation:barFill 7000ms linear forwards}
.slide-bar.done::after{transform:scaleX(1)}
@keyframes barFill{to{transform:scaleX(1)}}
.slide-caption{font-family:var(--font-mono);font-size:var(--fs-xs);color:rgba(255,255,255,.55);margin-left:auto}

/* ══════════ SEARCH BAR (grid-breaking) ══════════ */
.search-band{position:relative;z-index:5;margin-top:-2.75rem}
.search{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--shadow-lg);
  display:grid;grid-template-columns:repeat(4,1fr) auto;align-items:stretch;overflow:hidden}
.sf{padding:.875rem 1.25rem;display:flex;flex-direction:column;justify-content:center;border-right:1px solid var(--line-soft);min-width:0}
.sf label{font-family:var(--font-mono);font-size:.625rem;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-300);margin-bottom:.25rem}
.sf input,.sf select{border:none;background:transparent;font-family:var(--font-body);font-size:var(--fs-body);color:var(--ink-900);padding:0;width:100%}
.sf select{appearance:none;cursor:pointer}
.sf input:focus,.sf select:focus{outline:none}
.sf:focus-within{background:var(--teal-050)}
.search-go{border:none;background:var(--teal-700);color:#fff;padding:0 1.75rem;display:flex;align-items:center;gap:.5rem;
  font-size:var(--fs-body);font-weight:500;transition:background var(--dur-fast)}
.search-go:hover{background:var(--teal-900)}
.search-meta{display:flex;justify-content:space-between;gap:1rem;margin-top:.875rem;font-size:var(--fs-xs);color:var(--ink-300);flex-wrap:wrap}
.search-meta b{font-family:var(--font-mono);color:var(--teal-700);font-weight:500}

/* ══════════ SECTIONS ══════════ */
.sec{padding:var(--section-y) 0}
.sec-alt{background:var(--surface-2);border-block:1px solid var(--line)}
.sec-dark{background:var(--teal-900);color:rgba(255,255,255,.68);position:relative;overflow:hidden}
.sec-dark::before{content:'';position:absolute;inset:0;background-image:var(--motif)}
.sec-dark .wrap{position:relative}
.sec-dark h2,.sec-dark h3{color:#fff}
.sec-dark .eyebrow{color:var(--brass-300)}
.lede{font-size:var(--fs-body-lg);font-weight:300;max-width:52ch}

/* Editorial intro 5/7 */
.intro{display:grid;grid-template-columns:5fr 7fr;gap:clamp(2rem,5vw,4.5rem);align-items:center}
.intro h2{font-size:var(--fs-display-lg);line-height:1.08;margin:1.25rem 0 1.25rem}
.stats{display:flex;gap:2.5rem;margin-top:2.25rem;padding-top:1.5rem;border-top:1px solid var(--line);flex-wrap:wrap}
.stat .n{font-family:var(--font-display);font-size:1.75rem;color:var(--ink-900);line-height:1}
.stat .l{font-family:var(--font-mono);font-size:var(--fs-xs);letter-spacing:.1em;text-transform:uppercase;color:var(--ink-300);margin-top:.375rem}

/* Photo plates — placeholders for real photography */
.plate{position:relative;border-radius:var(--r-lg);overflow:hidden;background:linear-gradient(150deg,var(--teal-700),var(--teal-900));
  display:grid;place-items:center}
.plate::before{content:'';position:absolute;inset:0;background-image:var(--motif)}
.plate::after{content:attr(data-plate);position:absolute;left:.875rem;bottom:.75rem;font-family:var(--font-mono);font-size:.625rem;
  letter-spacing:.14em;text-transform:uppercase;color:rgba(255,255,255,.42)}
.plate svg{position:relative;width:78%;height:78%;opacity:.5}
.plate-sage{background:linear-gradient(150deg,#8FA98C,#5F7C63)}
.plate-brass{background:linear-gradient(150deg,#FFD66C,#8D6600)}
.plate-stack{position:relative;height:clamp(320px,42vw,470px)}
.plate-stack .plate{position:absolute;box-shadow:var(--shadow-lg)}
.plate-a{width:64%;height:78%;top:0;right:0}
.plate-b{width:52%;height:56%;bottom:0;left:0;border:6px solid var(--canvas)}
.plate-note{position:absolute;left:0;bottom:-2.25rem;font-family:var(--font-mono);font-size:var(--fs-xs);color:var(--ink-300)}

/* Homes / floor plans */
.plan-tabs{display:inline-flex;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-md);padding:3px;gap:2px;margin-bottom:2.5rem}
.plan-tabs button{border:none;background:transparent;border-radius:var(--r-sm);padding:.5rem 1.125rem;font-size:var(--fs-sm);color:var(--ink-500);
  transition:all var(--dur-base) var(--ease-out)}
.plan-tabs button[aria-selected="true"]{background:var(--teal-700);color:#fff;font-weight:500}
.plan{display:grid;grid-template-columns:7fr 5fr;gap:clamp(2rem,4vw,3.5rem);align-items:center}
.plan-canvas{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);padding:1.75rem;box-shadow:var(--shadow-sm);
  animation:planIn 500ms var(--ease-entrance) both}
@keyframes planIn{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
.plan-canvas svg{width:100%;height:auto;display:block}
.plan-info h3{font-family:var(--font-display);font-size:var(--fs-h1);margin-bottom:.5rem}
.spec-rows{list-style:none;margin:1.75rem 0;padding:0;border-top:1px solid var(--line)}
.spec-rows li{display:flex;justify-content:space-between;gap:1rem;padding:.75rem 0;border-bottom:1px solid var(--line-soft);font-size:var(--fs-sm)}
.spec-rows dt,.spec-rows .k{font-family:var(--font-mono);font-size:var(--fs-xs);letter-spacing:.08em;text-transform:uppercase;color:var(--ink-300)}
.spec-rows .v{color:var(--ink-900);font-weight:500}
.price-line{display:flex;align-items:baseline;gap:.625rem;margin-bottom:1.5rem}
.price-line .p{font-family:var(--font-display);font-size:2rem;color:var(--ink-900);line-height:1}
.price-line .u{font-size:var(--fs-sm);color:var(--ink-300)}
.badge{display:inline-flex;align-items:center;gap:.375rem;font-family:var(--font-mono);font-size:var(--fs-xs);padding:.1875rem .5rem;
  border-radius:var(--r-sm);border:1px solid;letter-spacing:.04em}
.badge i{width:5px;height:5px;border-radius:50%;background:currentColor}
.badge-success{background:var(--success-050);color:var(--success-600);border-color:var(--sage-100)}
.badge-neutral{background:var(--surface-2);color:var(--ink-500);border-color:var(--line)}

/* Amenities — asymmetric */
.amen{display:grid;grid-template-columns:7fr 5fr;gap:clamp(2rem,4vw,3.5rem);align-items:stretch}
.amen-plate{min-height:380px}
.amen-list{list-style:none;margin:1.75rem 0 0;padding:0}
.amen-list li{display:flex;gap:1rem;padding:1.125rem 0;border-bottom:1px solid rgba(255,255,255,.1)}
.amen-list li:first-child{border-top:1px solid rgba(255,255,255,.1)}
.amen-ic{flex:none;width:38px;height:38px;border-radius:var(--r-md);display:grid;place-items:center;background:rgba(255,255,255,.06);color:var(--sage-500)}
.amen-list b{display:block;color:#fff;font-weight:500;font-size:var(--fs-body);margin-bottom:.125rem}
.amen-list span{font-size:var(--fs-sm);font-weight:300}

/* Neighborhood */
.hood{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:1.25rem}
.hood-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;
  transition:transform var(--dur-base) var(--ease-out),box-shadow var(--dur-base) var(--ease-out),border-color var(--dur-base)}
.hood-card:hover{transform:translateY(-4px);box-shadow:var(--shadow-lg);border-color:var(--teal-100)}
.hood-card .plate{height:132px;border-radius:0}
.hood-body{padding:1.125rem 1.25rem 1.25rem}
.hood-body h4{font-size:var(--fs-h3);margin-bottom:.25rem}
.hood-body p{font-size:var(--fs-sm);font-weight:300;margin-bottom:.75rem}
.hood-dist{font-family:var(--font-mono);font-size:var(--fs-xs);color:var(--brass-700);letter-spacing:.06em}

/* Testimonials */
.quote{max-width:60ch;margin:0 auto;text-align:center}
.quote blockquote{margin:0;font-family:var(--font-display);font-size:clamp(1.375rem,2.6vw,1.875rem);line-height:1.42;color:#fff;
  animation:planIn 520ms var(--ease-entrance) both}
.quote-attr{margin-top:1.75rem;font-family:var(--font-mono);font-size:var(--fs-xs);letter-spacing:.12em;text-transform:uppercase;color:var(--brass-300)}
.quote-nav{display:flex;justify-content:center;gap:.5rem;margin-top:2.25rem}
.quote-nav button{width:38px;height:38px;border-radius:var(--r-pill);border:1px solid rgba(255,255,255,.2);background:transparent;color:#fff;
  display:grid;place-items:center;transition:all var(--dur-fast)}
.quote-nav button:hover{background:rgba(255,255,255,.1);border-color:rgba(255,255,255,.45)}

/* FAQ */
.faq{max-width:var(--container);display:grid;grid-template-columns:5fr 7fr;gap:clamp(2rem,5vw,4rem);align-items:start}
.faq-list{border-top:1px solid var(--line)}
.faq-item{border-bottom:1px solid var(--line)}
.faq-q{width:100%;display:flex;align-items:center;justify-content:space-between;gap:1.5rem;text-align:left;background:none;border:none;
  padding:1.25rem 0;font-family:var(--font-display);font-size:var(--fs-h3);color:var(--ink-900);transition:color var(--dur-fast)}
.faq-q:hover{color:var(--teal-700)}
.faq-sign{flex:none;width:26px;height:26px;position:relative;color:var(--brass-500)}
.faq-sign::before,.faq-sign::after{content:'';position:absolute;background:currentColor;border-radius:1px;
  transition:transform var(--dur-base) var(--ease-spring),opacity var(--dur-base)}
.faq-sign::before{left:4px;right:4px;top:12px;height:1.5px}
.faq-sign::after{top:4px;bottom:4px;left:12px;width:1.5px}
.faq-item.open .faq-sign::after{transform:scaleY(0);opacity:0}
.faq-a{overflow:hidden;max-height:0;transition:max-height var(--dur-slow) var(--ease-out)}
.faq-item.open .faq-a{max-height:16rem}
.faq-a p{padding:0 3rem 1.375rem 0;font-size:var(--fs-sm);font-weight:300}

/* Contact */
.contact{display:grid;grid-template-columns:7fr 5fr;gap:clamp(2rem,5vw,4rem);align-items:start}
.field{display:flex;flex-direction:column;margin-bottom:1rem}
.field label{font-size:var(--fs-xs);letter-spacing:.05em;text-transform:uppercase;color:var(--ink-500);margin-bottom:.4375rem;font-weight:500}
.input,.select,.textarea{width:100%;min-height:46px;padding:.625rem .875rem;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r-md);font-family:var(--font-body);font-size:var(--fs-body);color:var(--ink-900);
  transition:border-color var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out)}
.textarea{min-height:110px;resize:vertical;line-height:1.6}
.input::placeholder,.textarea::placeholder{color:var(--ink-300);font-weight:300}
.input:hover,.select:hover,.textarea:hover{border-color:var(--ink-100)}
.input:focus,.select:focus,.textarea:focus{outline:none;border-color:var(--brass-500);box-shadow:var(--ring-focus)}
.field.has-error .input{border-color:var(--danger-600);background:var(--danger-050)}
.err{font-size:var(--fs-xs);color:var(--danger-600);margin-top:.375rem}
.select{appearance:none;cursor:pointer;padding-right:2.5rem;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%2355625F' stroke-width='1.6' stroke-linecap='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .875rem center}
.f2{display:grid;grid-template-columns:1fr 1fr;gap:0 1rem}
.check{display:flex;gap:.625rem;align-items:flex-start;cursor:pointer;position:relative;margin-bottom:1.25rem}
.check input{position:absolute;opacity:0;width:0;height:0}
.check-box{flex:none;width:20px;height:20px;border:1.5px solid var(--ink-100);border-radius:var(--r-xs);background:var(--surface);
  display:grid;place-items:center;margin-top:1px;color:#fff;transition:all var(--dur-base) var(--ease-spring)}
.check-box svg{opacity:0;transform:scale(.5);transition:all var(--dur-base) var(--ease-spring)}
.check input:checked ~ .check-box{background:var(--teal-700);border-color:var(--teal-700)}
.check input:checked ~ .check-box svg{opacity:1;transform:scale(1)}
.check input:focus-visible ~ .check-box{box-shadow:var(--ring-focus)}
.check-text{font-size:var(--fs-sm);font-weight:300}
.drop{border:1px dashed var(--line);border-radius:var(--r-md);padding:1.125rem;text-align:center;background:var(--surface-2);
  font-size:var(--fs-sm);color:var(--ink-300);font-weight:300;transition:all var(--dur-fast);cursor:pointer;margin-bottom:1.25rem}
.drop:hover{border-color:var(--teal-300);background:var(--teal-050);color:var(--teal-700)}
.info-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden}
.info-card .plate{height:180px;border-radius:0}
.info-body{padding:1.5rem}
.info-rows{list-style:none;margin:1.25rem 0 0;padding:0}
.info-rows li{display:flex;gap:.875rem;padding:.75rem 0;border-top:1px solid var(--line-soft);font-size:var(--fs-sm)}
.info-rows svg{flex:none;color:var(--teal-500);margin-top:2px}
.info-rows b{display:block;color:var(--ink-900);font-weight:500}

/* Newsletter */
.news{display:flex;gap:.75rem;flex-wrap:wrap;margin-top:1.5rem;max-width:30rem}
.news .input{flex:1;min-width:12rem;background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.18);color:#fff}
.news .input::placeholder{color:rgba(255,255,255,.4)}
.news .input:focus{border-color:var(--brass-500);background:rgba(255,255,255,.1)}

/* Footer */
.foot{background:var(--teal-900);color:rgba(255,255,255,.55);position:relative;overflow:hidden;padding-top:var(--section-y)}
.foot::before{content:'';position:absolute;inset:0;background-image:var(--motif)}
.foot .wrap{position:relative}
.foot-grid{display:grid;grid-template-columns:1.6fr 1fr 1fr 1fr;gap:2.5rem;padding-bottom:3rem}
.foot h4{color:#fff;font-family:var(--font-mono);font-size:var(--fs-eyebrow);letter-spacing:var(--ls-eyebrow);text-transform:uppercase;
  font-weight:400;margin-bottom:1.125rem;color:var(--brass-300)}
.foot ul{list-style:none;margin:0;padding:0;display:grid;gap:.625rem}
.foot a{text-decoration:none;font-size:var(--fs-sm);transition:color var(--dur-fast)}
.foot a:hover{color:#fff}
.foot-bar{border-top:1px solid rgba(255,255,255,.1);padding:1.5rem 0;display:flex;justify-content:space-between;gap:1rem;flex-wrap:wrap;
  font-size:var(--fs-xs)}
.foot-social{display:flex;gap:.5rem}
.foot-social a{width:36px;height:36px;border:1px solid rgba(255,255,255,.18);border-radius:var(--r-pill);display:grid;place-items:center;
  transition:all var(--dur-fast)}
.foot-social a:hover{background:rgba(255,255,255,.1);border-color:rgba(255,255,255,.4)}

/* ══════════ CHAT WIDGET ══════════ */
.chat-fab{position:fixed;right:1.25rem;bottom:1.25rem;z-index:410;display:flex;align-items:center;gap:.625rem;
  min-height:52px;padding:0 1.375rem;border:none;border-radius:var(--r-pill);background:var(--teal-700);color:#fff;
  box-shadow:var(--shadow-lg);font-size:var(--fs-sm);font-weight:500;
  transition:background var(--dur-fast),transform var(--dur-base) var(--ease-spring),box-shadow var(--dur-base)}
.chat-fab:hover{background:var(--teal-900);transform:translateY(-2px);box-shadow:var(--shadow-xl)}
.chat-fab .dot{width:7px;height:7px;border-radius:50%;background:var(--sage-500);animation:pulse 2.4s var(--ease-in-out) infinite}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.35}}
.chat-panel{position:fixed;right:1.25rem;bottom:1.25rem;z-index:420;width:min(360px,calc(100vw - 2.5rem));
  background:var(--surface);border-radius:var(--r-xl);box-shadow:var(--shadow-xl);overflow:hidden;display:flex;flex-direction:column;
  max-height:min(560px,calc(100vh - 3rem));animation:chatIn var(--dur-slow) var(--ease-entrance) both}
@keyframes chatIn{from{opacity:0;transform:translateY(20px) scale(.97)}to{opacity:1;transform:none}}
.chat-head{background:var(--teal-900);color:#fff;padding:1.25rem;position:relative;overflow:hidden;flex:none}
.chat-head::before{content:'';position:absolute;inset:0;background-image:var(--motif)}
.chat-head > *{position:relative}
.chat-head h4{color:#fff;font-size:var(--fs-h3)}
.chat-head p{font-size:var(--fs-xs);color:rgba(255,255,255,.55);margin-top:.125rem}
.chat-x{position:absolute;top:.875rem;right:.875rem;z-index:2;width:32px;height:32px;border:none;background:transparent;color:rgba(255,255,255,.7);
  display:grid;place-items:center;border-radius:var(--r-pill);transition:all var(--dur-fast)}
.chat-x:hover{background:rgba(255,255,255,.12);color:#fff}
.chat-body{padding:1.25rem;overflow-y:auto;flex:1}
.chat-msg{background:var(--surface-2);border:1px solid var(--line-soft);border-radius:var(--r-lg);border-bottom-left-radius:var(--r-xs);
  padding:.875rem 1rem;font-size:var(--fs-sm);font-weight:300;margin-bottom:1rem}
.faq-chip{display:block;width:100%;text-align:left;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-md);
  padding:.625rem .875rem;font-size:var(--fs-sm);color:var(--ink-700);margin-bottom:.5rem;
  transition:all var(--dur-fast) var(--ease-out)}
.faq-chip:hover{border-color:var(--teal-500);background:var(--teal-050);color:var(--teal-900);transform:translateX(2px)}
.chat-foot{border-top:1px solid var(--line-soft);padding:.875rem 1rem;flex:none;display:flex;gap:.5rem}
.chat-foot .input{min-height:40px;font-size:var(--fs-sm)}

/* ══════════ BOOK TOUR MODAL ══════════ */
/* display:flex + margin:auto, not place-items:center. Alignment-centring
   makes the overflowing top edge unreachable when scrolling; auto margins
   centre without that failure mode. overflow-y:auto is the last-resort
   guarantee that the Continue button is always reachable. */
.overlay{position:fixed;inset:0;z-index:500;display:flex;justify-content:center;overflow-y:auto;padding:1.5rem;
  background:rgba(11,32,36,.55);backdrop-filter:blur(10px) saturate(1.1);animation:fadeIn var(--dur-base) var(--ease-out) both}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
/* grid-template-rows: minmax(0,1fr) is the fix for the clipped footer.
   With only columns declared, the implicit row is `auto` — it sizes to
   max-content and grows past max-height. .panel then STRETCHES to that
   oversized row, so min-height:0 on the panel does nothing: the panel is
   not being squeezed by a small parent, it is being stretched by a big
   row. minmax(0,1fr) ties the row to the container instead. */
.sheet{width:min(1060px,100%);max-height:min(92vh,860px);display:grid;grid-template-columns:336px 1fr;grid-template-rows:minmax(0,1fr);position:relative;
  background:var(--surface);border-radius:var(--r-xl);overflow:hidden;box-shadow:var(--shadow-xl);
  animation:sheetIn var(--dur-slow) var(--ease-entrance) both}
@keyframes sheetIn{from{opacity:0;transform:translateY(28px) scale(.975)}to{opacity:1;transform:none}}
.overlay > .sheet{margin:auto}
.stub{position:relative;background:var(--teal-900);color:#fff;padding:2.25rem 2rem 1.75rem;display:flex;flex-direction:column;min-height:0;overflow:hidden auto}
.stub::before{content:'';position:absolute;inset:0;background-image:var(--motif);pointer-events:none}
.stub::after{content:'';position:absolute;top:0;bottom:0;right:-6px;width:12px;z-index:2;
  background-image:radial-gradient(circle at 50% 50%,var(--surface) 3.2px,transparent 3.6px);background-size:12px 18px}
.stub > *{position:relative;z-index:1}
.stub-brand{display:flex;align-items:center;gap:.625rem;margin-bottom:2rem}
.stub-brand span{font-family:var(--font-display);font-size:.9375rem;letter-spacing:.22em;text-transform:uppercase}
.stub-title{font-size:1.75rem;color:#fff;line-height:1.12;margin-bottom:.5rem}
.stub-lede{font-size:var(--fs-sm);color:rgba(255,255,255,.55);font-weight:300;margin-bottom:2rem;max-width:26ch}
.stub-rows{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:1.125rem;flex:1}
.stub-row{position:relative;padding-left:.875rem;min-height:2.375rem}
.stub-row::before{content:'';position:absolute;left:0;top:.125rem;bottom:.125rem;width:2px;background:var(--brass-500);border-radius:1px;
  transform:scaleY(0);transform-origin:top;transition:transform var(--dur-base) var(--ease-out)}
.stub-row.is-set::before{transform:scaleY(1)}
.stub-row .eyebrow{color:var(--teal-300);display:block;margin-bottom:.375rem;transition:color var(--dur-base)}
.stub-row.is-set .eyebrow{color:var(--brass-300)}
.stub-value{display:block;font-size:.9375rem;color:#fff}
.stub-value small{display:block;font-family:var(--font-mono);font-size:var(--fs-xs);color:rgba(255,255,255,.45);margin-top:.125rem}
.stub-blank{display:block;width:5.5rem;height:1px;margin-top:.75rem;
  background:repeating-linear-gradient(90deg,rgba(255,255,255,.28) 0 6px,transparent 6px 11px)}
.writeIn{animation:writeIn 380ms var(--ease-out) both}
@keyframes writeIn{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}
.stub-foot{margin-top:1.75rem;padding-top:1.25rem;border-top:1px solid rgba(255,255,255,.11);font-size:var(--fs-xs);color:rgba(255,255,255,.45)}
.stamp{position:absolute;right:1.75rem;bottom:5.5rem;z-index:3;font-family:var(--font-mono);font-size:.6875rem;letter-spacing:.2em;
  text-transform:uppercase;color:var(--brass-300);border:1.5px solid var(--brass-500);border-radius:var(--r-xs);padding:.375rem .625rem;
  transform:rotate(-8deg) scale(1.6);opacity:0;animation:stampIn 460ms var(--ease-spring) 420ms both}
@keyframes stampIn{to{opacity:.95;transform:rotate(-8deg) scale(1)}}

/* min-height:0 is load-bearing. A flex item defaults to min-height:auto,
   which refuses to shrink below its content — so .panel-body never scrolls,
   the panel grows past the sheet's max-height, and .sheet's overflow:hidden
   clips the footer with the Continue button. */
.panel{display:flex;flex-direction:column;min-width:0;min-height:0;background:var(--surface)}
.panel-head{padding:1.75rem 2.25rem 0;flex:none}
.steps{display:flex;align-items:center;list-style:none;margin:0 0 1.5rem;padding:0}
.step-item{display:flex;align-items:center;gap:.5rem;flex:1;min-width:0}
.step-item + .step-item{padding-left:.75rem}
.step-dot{flex:none;width:24px;height:24px;border-radius:var(--r-pill);display:grid;place-items:center;font-family:var(--font-mono);
  font-size:.625rem;border:1px solid var(--line);color:var(--ink-300);background:var(--surface);transition:all var(--dur-base) var(--ease-spring)}
.step-item.is-active .step-dot{border-color:var(--teal-700);background:var(--teal-700);color:#fff;box-shadow:0 0 0 4px var(--teal-050)}
.step-item.is-done .step-dot{border-color:var(--brass-500);background:var(--brass-500);color:var(--ink-900)}
.step-label{font-size:var(--fs-xs);color:var(--ink-300);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color var(--dur-base)}
.step-item.is-active .step-label{color:var(--ink-900);font-weight:500}
.step-rule{flex:1;height:1px;background:var(--line);margin:0 .5rem;min-width:.75rem;position:relative;overflow:hidden}
.step-rule::after{content:'';position:absolute;inset:0;background:var(--brass-500);transform:scaleX(0);transform-origin:left;
  transition:transform var(--dur-slow) var(--ease-out)}
.step-item.is-done .step-rule::after{transform:scaleX(1)}
.panel-close{position:absolute;top:1rem;right:1rem;z-index:4;width:38px;height:38px;border:none;border-radius:var(--r-pill);
  background:transparent;color:var(--ink-300);display:grid;place-items:center;transition:all var(--dur-fast) var(--ease-spring)}
.panel-close:hover{background:var(--surface-2);color:var(--ink-900);transform:rotate(90deg)}
.panel-body{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:.25rem 2.25rem 1.75rem}
.step-panel{animation:stepIn 420ms var(--ease-entrance) both}
@keyframes stepIn{from{opacity:0;transform:translateX(var(--from-x,24px))}to{opacity:1;transform:none}}
.stagger{animation:riseIn 400ms var(--ease-entrance) both;animation-delay:calc(var(--i,0) * 60ms + 90ms)}
@keyframes riseIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}
.panel-title{font-size:var(--fs-h2);margin-bottom:.375rem}
.panel-sub{font-size:var(--fs-sm);color:var(--ink-300);margin-bottom:1.5rem;font-weight:300}
.type-grid{display:grid;gap:.875rem}
.type-card{position:relative;display:flex;gap:1rem;width:100%;text-align:left;padding:1.25rem;background:var(--surface);
  border:1px solid var(--line);border-radius:var(--r-lg);
  transition:border-color var(--dur-base) var(--ease-out),box-shadow var(--dur-base) var(--ease-out),
             transform var(--dur-base) var(--ease-spring),background var(--dur-base)}
.type-card:hover{border-color:var(--teal-300);box-shadow:var(--shadow-md);transform:translateY(-2px)}
.type-card.is-selected{border-color:var(--teal-700);background:var(--teal-050);box-shadow:var(--shadow-sm)}
.type-icon{flex:none;width:44px;height:44px;border-radius:var(--r-md);display:grid;place-items:center;background:var(--sage-050);
  color:var(--teal-700);transition:all var(--dur-base)}
.type-card.is-selected .type-icon{background:var(--teal-700);color:#fff}
.type-name{font-family:var(--font-display);font-size:var(--fs-h3);color:var(--ink-900);display:block;margin-bottom:.1875rem}
.type-desc{font-size:var(--fs-sm);color:var(--ink-500);font-weight:300;display:block;margin-bottom:.625rem}
.type-meta{display:flex;flex-wrap:wrap;gap:.375rem}
.tag{display:inline-flex;align-items:center;gap:.3125rem;font-family:var(--font-mono);font-size:var(--fs-xs);padding:.1875rem .5rem;
  border-radius:var(--r-sm);background:var(--surface-2);color:var(--ink-500);border:1px solid var(--line-soft)}
.tag-live{background:var(--sage-050);color:var(--success-600);border-color:var(--sage-100)}
.tag-live i{width:5px;height:5px;border-radius:50%;background:currentColor;animation:pulse 2s var(--ease-in-out) infinite}
.type-check{position:absolute;top:1.25rem;right:1.25rem;width:20px;height:20px;color:var(--teal-700);opacity:0;transform:scale(.6);
  transition:opacity var(--dur-fast),transform var(--dur-base) var(--ease-spring)}
.type-card.is-selected .type-check{opacity:1;transform:scale(1)}
.type-check path{stroke-dasharray:24;stroke-dashoffset:24}
.type-card.is-selected .type-check path{animation:draw 420ms var(--ease-out) 100ms forwards}
@keyframes draw{to{stroke-dashoffset:0}}
.sched{display:grid;grid-template-columns:1fr 1fr;gap:1.75rem;align-items:start}
.cal-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:.875rem}
.cal-month{font-family:var(--font-display);font-size:1.0625rem;color:var(--ink-900)}
.cal-nav{display:flex;gap:.25rem}
.cal-nav button{width:32px;height:32px;border:1px solid var(--line);background:var(--surface);border-radius:var(--r-sm);display:grid;
  place-items:center;color:var(--ink-500);transition:all var(--dur-fast) var(--ease-out)}
.cal-nav button:hover:not(:disabled){border-color:var(--teal-500);color:var(--teal-700);background:var(--teal-050)}
.cal-nav button:disabled{opacity:.35;cursor:not-allowed}
.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.cal-dow{font-family:var(--font-mono);font-size:.625rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-300);
  text-align:center;padding-bottom:.5rem}
.cal-day{position:relative;aspect-ratio:1;min-height:38px;display:grid;place-items:center;border:none;background:transparent;
  border-radius:var(--r-sm);font-size:var(--fs-sm);color:var(--ink-700);
  transition:background var(--dur-fast) var(--ease-out),color var(--dur-fast),transform var(--dur-base) var(--ease-spring)}
.cal-day:hover:not(:disabled):not(.is-selected){background:var(--sage-050);color:var(--teal-900)}
.cal-day:disabled{color:var(--ink-100);cursor:not-allowed}
.cal-day.is-outside{visibility:hidden}
.cal-day.is-selected{background:var(--teal-700);color:#fff;font-weight:500;transform:scale(1.04);box-shadow:var(--shadow-sm)}
.cal-day.is-today::after{content:'';position:absolute;bottom:5px;left:50%;transform:translateX(-50%);width:3px;height:3px;
  border-radius:50%;background:var(--brass-500)}
.cal-day.is-selected.is-today::after{background:#fff}
.slots-empty{border:1px dashed var(--line);border-radius:var(--r-lg);padding:2rem 1.25rem;text-align:center;background:var(--surface-2);
  color:var(--ink-300);font-size:var(--fs-sm);font-weight:300}
.slot-group + .slot-group{margin-top:1.125rem}
.slot-group-label{display:flex;align-items:center;gap:.625rem;margin-bottom:.625rem}
.slot-group-label .eyebrow{color:var(--ink-300)}
.slot-group-label hr{flex:1;border:none;border-top:1px solid var(--line-soft);margin:0}
.slot-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(92px,1fr));gap:.5rem}
.slot{min-height:42px;padding:0 .5rem;border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface);
  font-family:var(--font-mono);font-size:var(--fs-sm);color:var(--ink-700);
  animation:riseIn 340ms var(--ease-entrance) both;animation-delay:calc(var(--i,0) * 35ms);
  transition:border-color var(--dur-fast),background var(--dur-fast),color var(--dur-fast),transform var(--dur-base) var(--ease-spring)}
.slot:hover:not(:disabled):not(.is-selected){border-color:var(--teal-500);color:var(--teal-900);background:var(--teal-050)}
.slot.is-selected{background:var(--teal-700);border-color:var(--teal-700);color:#fff;box-shadow:var(--shadow-sm);transform:translateY(-1px)}
.slot:disabled{color:var(--ink-100);border-color:var(--line-soft);cursor:not-allowed;text-decoration:line-through}
.tz-note{margin-top:1rem;font-size:var(--fs-xs);color:var(--ink-300);font-weight:300}
.done{text-align:center;padding:1.5rem 0 .5rem;animation:stepIn 480ms var(--ease-entrance) both}
.done-mark{width:66px;height:66px;margin:0 auto 1.5rem;border-radius:var(--r-pill);display:grid;place-items:center;
  background:var(--sage-050);border:1px solid var(--sage-100);color:var(--success-600)}
.done-mark svg path{stroke-dasharray:30;stroke-dashoffset:30;animation:draw 520ms var(--ease-out) 240ms forwards}
.done h2{font-size:var(--fs-h2);margin-bottom:.5rem}
.done > p{font-size:var(--fs-sm);font-weight:300;max-width:38ch;margin:0 auto 1.75rem}
.receipt{text-align:left;border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;background:var(--surface-2)}
.receipt-row{display:flex;justify-content:space-between;gap:1rem;padding:.875rem 1.25rem;font-size:var(--fs-sm)}
.receipt-row + .receipt-row{border-top:1px solid var(--line-soft)}
.receipt-row dt{color:var(--ink-300);font-family:var(--font-mono);font-size:var(--fs-xs);letter-spacing:.08em;text-transform:uppercase;margin:0}
.receipt-row dd{margin:0;color:var(--ink-900);text-align:right;font-weight:500}
.receipt-code{background:var(--teal-900)}
.receipt-code dt{color:var(--teal-300)}
.receipt-code dd{color:var(--brass-300);font-family:var(--font-mono);letter-spacing:.1em}
.done-actions{display:flex;gap:.75rem;justify-content:center;margin-top:1.5rem;flex-wrap:wrap}
.panel-foot{flex:none;padding:1.125rem 2.25rem;border-top:1px solid var(--line-soft);display:flex;align-items:center;
  justify-content:space-between;gap:1rem}
.foot-note{font-size:var(--fs-xs);color:var(--ink-300);font-weight:300;max-width:34ch}
.foot-actions{display:flex;align-items:center;gap:.5rem;flex:none}

/* ══════════ RESPONSIVE ══════════ */
@media (max-width:1024px){
  .intro,.plan,.amen,.faq,.contact{grid-template-columns:1fr}
  .plate-stack{height:340px}
  .foot-grid{grid-template-columns:1fr 1fr}
}
@media (max-width:1180px){
  :root{ --brand-h:32px; }
  .nav-in{gap:1rem}
  .nav-links a{padding:.5rem .4375rem;font-size:var(--fs-xs)}
}
@media (max-width:980px){
  .nav-links,.nav-phone{display:none}
  .nav-burger{display:grid}
  :root{ --brand-h:34px; }
}
@media (max-width:420px){
  /* "Book a tour" is the reason this bar exists — the logo yields first. */
  :root{ --brand-h:26px; }
  .nav-actions{gap:.5rem}
  .nav-actions .btn-sm{padding:0 .75rem}
}
  .search{grid-template-columns:1fr 1fr}
  .sf{border-bottom:1px solid var(--line-soft)}
  .search-go{grid-column:1/-1;justify-content:center;padding:1rem}
  .overlay{padding:0;align-items:flex-end}
  .sheet{grid-template-columns:1fr;grid-template-rows:auto minmax(0,1fr);width:100%;max-height:94vh;border-radius:var(--r-xl) var(--r-xl) 0 0;
    animation:sheetUp var(--dur-slow) var(--ease-entrance) both}
  @keyframes sheetUp{from{transform:translateY(100%)}to{transform:none}}
  .stub{padding:1.5rem}
  .stub::after{top:auto;bottom:-6px;right:0;left:0;width:auto;height:12px;background-size:18px 12px}
  .stub-lede,.stub-foot,.stamp{display:none}
  .stub-title{font-size:1.375rem;margin-bottom:1.25rem}
  .stub-rows{flex-direction:row;flex-wrap:wrap;gap:.75rem 1.5rem}
  .stub-row{min-height:0}
  .sched{grid-template-columns:1fr}
  .panel-head{padding:1.25rem 1.25rem 0}
  .panel-body{padding:.25rem 1.25rem 1.5rem}
  .panel-foot{padding:1rem 1.25rem;flex-direction:column-reverse;align-items:stretch}
  .foot-actions{justify-content:space-between}
  .foot-actions .btn-primary{flex:1}
  .foot-note{text-align:center;max-width:none}
  .step-label{display:none}
}
@media (max-width:640px){
  .hero h1{font-size:2.5rem}
  .stats{gap:1.5rem}
  .f2{grid-template-columns:1fr}
  .foot-grid{grid-template-columns:1fr;gap:2rem}
  .plate-b{display:none}
  .plate-a{width:100%;height:100%}
}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}
  .rv,.js-reveal .rv{opacity:1!important;transform:none!important}
}