/* ============================================================
   listing.css — shared base stylesheet for every listing site
   ------------------------------------------------------------
   SHIP THIS FILE VERBATIM into <folder>/site/assets/. Do NOT
   hand-edit it per listing. A listing's look is set by:
     1. a small :root token override block in the page <head>
        (palette / fonts / spacing — see references/themes.md), and
     2. variant classes on <body> / the hero element
        (`t-upscale`, and `hero--gallery` on .hero).
   The class + token names below are the fixed contract shared by
   the markup (index.html), this CSS, and listing.js. Rename in one
   place only by renaming in all three.
   ============================================================ */

/* ---------- Design tokens (defaults = "minimal" theme) ---------- */
:root{
  /* color */
  --accent:#1f3a5f;            /* primary accent — price, CTAs, links, active nav */
  --accent-2:var(--accent);    /* secondary/metallic — eyebrow tick, rules, ticks (palettes/upscale override) */
  --ink:#1a1a1a;               /* primary text */
  --muted:#666;                /* secondary text / labels */
  --faint:#9a9a9a;             /* muted-est */
  --hair:#e7e7e7;              /* hairlines / borders */
  --bg:#ffffff;                /* page background */
  --bg-alt:#fafafa;            /* alternating section band */
  --on-accent:#fff;            /* text over the accent fill */
  /* type */
  --font-sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  --font-serif:"Iowan Old Style","Palatino Linotype",Palatino,Georgia,"Times New Roman",serif;
  --font-display:var(--font-sans);  /* headings/price — t-upscale switches this to serif */
  /* layout */
  --maxw:1180px;
  --gut:clamp(20px,5vw,40px);
  --sp:clamp(56px,8vw,96px);   /* section padding-block */
  --radius:4px;
  /* hero + depth + motion (variant classes retune these) */
  --hero-h:84vh;
  --hero-min:480px;
  --hero-addr-size:clamp(34px,6vw,56px);   /* hero address type size */
  --hero-addr-weight:300;                  /* hero address weight (raise it at small sizes) */
  --hero-price-size:clamp(26px,4vw,38px);  /* hero price type size */
  --hero-meta-size:15px;                   /* hero agent/contact line size */
  --hero-meta-font:var(--font-sans);        /* set to var(--font-display) to match the price */
  --hero-row-gap:14px 26px;                /* row/column gap between hero overlay items */
  --hero-vthumb-w:168px;                   /* width of the video rail card (photo thumbs are 104px) */
  --vcta-bg:#fff;                          /* "Watch Video Tour" pill fill */
  --vcta-fg:var(--accent);                 /* …and its text/glyph colour */
  --hero-scrim:linear-gradient(to top,rgba(0,0,0,.62) 0%,rgba(0,0,0,.20) 38%,rgba(0,0,0,.10) 60%,rgba(0,0,0,.28) 100%);
  --card-shadow:0 1px 2px rgba(0,0,0,.04);
  --reveal-dur:.6s;
  --reveal-ease:ease;
}

/* "upscale" structural base — everything else rides on tokens.
   The palette/serif can still be tuned by the per-page :root block. */
body.t-upscale{
  --font-display:var(--font-serif);
  --card-shadow:0 8px 30px rgba(0,0,0,.06);
  --hero-h:88vh;
  --sp:clamp(64px,9vw,112px);
  --reveal-dur:.4s;
}

/* ---------- Reset / base ---------- */
*,*::before,*::after{box-sizing:border-box}
html{scroll-behavior:smooth}
body{
  margin:0;font-family:var(--font-sans);color:var(--ink);background:var(--bg);
  font-size:17px;line-height:1.65;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
}
img{max-width:100%;display:block}
a{color:var(--accent);text-decoration:none}
a:hover{text-decoration:underline}
h1,h2,h3{font-family:var(--font-display);font-weight:400;line-height:1.15;margin:0}
.container{max-width:var(--maxw);margin-inline:auto;padding-inline:var(--gut)}
.tabnum{font-variant-numeric:tabular-nums}
/* Visually hidden but read by screen readers / indexed — use to keep a required
   heading (e.g. the address <h1>) in the document when the design omits it. */
.vh{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}
section{scroll-margin-top:76px}

.eyebrow{
  font-family:var(--font-sans);font-size:12px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  color:var(--muted);margin:0 0 14px;display:flex;align-items:center;gap:10px;
}
.eyebrow::before{content:"";width:22px;height:1px;background:var(--accent-2)}
.section{padding-block:var(--sp);border-top:1px solid var(--hair)}
.section--alt{background:var(--bg-alt)}
.section__title{font-size:clamp(24px,3.4vw,32px);letter-spacing:-.01em;margin:0 0 6px}
.section__lead{font-family:var(--font-sans);color:var(--muted);max-width:62ch;margin:0 0 38px}

/* ---------- Buttons ---------- */
.btn{
  display:inline-block;font-family:var(--font-sans);font-size:14px;font-weight:600;letter-spacing:.02em;cursor:pointer;
  padding:12px 24px;border-radius:var(--radius);border:1px solid var(--ink);background:none;color:var(--ink);
  transition:background .2s,color .2s,border-color .2s,opacity .2s;
}
.btn:hover{background:var(--ink);color:var(--on-accent);text-decoration:none}
.btn--accent{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
.btn--accent:hover{filter:brightness(1.08);background:var(--accent);color:var(--on-accent)}

/* ---------- Sticky header ---------- */
.hdr{
  position:fixed;inset:0 0 auto 0;z-index:40;display:flex;align-items:center;gap:20px;
  padding:16px var(--gut);color:#fff;
  transition:background .3s ease,color .3s ease,box-shadow .3s ease,padding .3s ease;
}
.hdr__brand{font-family:var(--font-display);font-size:15px;font-weight:600;letter-spacing:.01em;margin-right:auto;white-space:nowrap;text-shadow:0 1px 8px rgba(0,0,0,.35);transition:opacity .3s ease}
/* In gallery-hero mode the big address is already in the hero overlay AND the photo
   counter sits top-left — so hide the redundant header brand until scroll to avoid
   the collision. Reappears once the header goes solid. Standard heroes are unaffected. */
body:has(.hero--gallery) .hdr:not(.scrolled) .hdr__brand{opacity:0;pointer-events:none}
.hdr__nav{display:flex;gap:26px}
.hdr__nav a{color:inherit;font-size:14px;letter-spacing:.02em;opacity:.92;text-shadow:0 1px 8px rgba(0,0,0,.35)}
.hdr__nav a:hover{opacity:1;text-decoration:none}
.hdr__cta{
  font-size:13px;font-weight:600;letter-spacing:.03em;padding:9px 16px;
  border:1px solid currentColor;border-radius:var(--radius);color:#fff;white-space:nowrap;
  transition:background .2s,color .2s,border-color .2s;
}
.hdr__cta:hover{background:#fff;color:var(--ink);text-decoration:none;border-color:#fff}
.hdr.scrolled{
  background:rgba(255,255,255,.96);color:var(--ink);
  box-shadow:0 1px 0 var(--hair);backdrop-filter:saturate(160%) blur(8px);padding-block:12px;
}
.hdr.scrolled .hdr__brand,.hdr.scrolled .hdr__nav a{text-shadow:none}
.hdr.scrolled .hdr__cta{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
.hdr.scrolled .hdr__cta:hover{filter:brightness(1.08)}

/* ---------- Hero (standard) ---------- */
.hero{position:relative;min-height:var(--hero-min);height:var(--hero-h);display:flex;align-items:flex-end;color:#fff;overflow:hidden;background:#0c0c0e}
.hero__img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.hero:not(.hero--gallery)::after{content:"";position:absolute;inset:0;background:var(--hero-scrim)}
.hero__inner{position:relative;z-index:2;width:100%;max-width:var(--maxw);margin-inline:auto;padding:0 var(--gut) clamp(40px,6vw,72px)}
.pill{display:inline-block;font-size:12px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;background:#fff;color:var(--accent);padding:6px 13px;border-radius:999px;margin-bottom:18px}
.hero__addr{font-family:var(--font-display);font-size:var(--hero-addr-size);font-weight:var(--hero-addr-weight);letter-spacing:-.02em;line-height:1.04;text-shadow:0 1px 24px rgba(0,0,0,.25)}
.hero__sub{font-size:clamp(16px,2.4vw,20px);opacity:.95;margin-top:8px}
.hero__row{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--hero-row-gap);margin-top:22px}
/* Optional sub-group inside .hero__row: keeps price + contact together as one
   wrap unit, so a one-line overlay breaks address / price+contact, not mid-way. */
.hero__meta{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--hero-row-gap);min-width:0}
.hero__row:has(.hero__addr){margin-top:0}   /* address inside the row supplies its own spacing */
.hero__price{font-family:var(--font-display);font-size:var(--hero-price-size);font-weight:500}
.hero__price small{font-size:.5em;font-weight:400;opacity:.85;letter-spacing:.02em}
.hero__agent{font-family:var(--hero-meta-font);font-size:var(--hero-meta-size);opacity:.95}
.hero__agent a{color:#fff;text-decoration:underline;text-underline-offset:3px}
.scrollcue{position:absolute;left:50%;bottom:18px;transform:translateX(-50%);z-index:2;opacity:.85;font-size:12px;letter-spacing:.2em;text-transform:uppercase;color:#fff;animation:bob 2.4s ease-in-out infinite}
@keyframes bob{0%,100%{transform:translate(-50%,0)}50%{transform:translate(-50%,6px)}}
/* upscale: slow Ken Burns on the standard hero image */
body.t-upscale .hero:not(.hero--gallery) .hero__img{animation:kenburns 20s ease-out forwards}
@keyframes kenburns{from{transform:scale(1)}to{transform:scale(1.06)}}

/* ---------- Hero (gallery mode) ----------
   --hero-h is set LOCALLY here so it beats body.t-upscale's 88vh (a closer
   ancestor than :root): a gallery hero stays ~74vh in either style base. */
.hero--gallery{--hero-h:74vh;height:var(--hero-h);align-items:stretch}
.hero--gallery .hero__stage{position:absolute;inset:0}
.hero--gallery .hero__img{cursor:zoom-in;transition:opacity .28s ease;animation:none}
.hero__scrim{position:absolute;inset:0;pointer-events:none;background:linear-gradient(to top,rgba(0,0,0,.74) 0%,rgba(0,0,0,.28) 36%,rgba(0,0,0,.05) 62%,transparent 100%)}
.hero__nav{position:absolute;top:calc((100% - 96px)/2);transform:translateY(-50%);z-index:5;width:52px;height:52px;border-radius:50%;border:0;cursor:pointer;background:rgba(18,18,20,.42);color:#fff;display:flex;align-items:center;justify-content:center;backdrop-filter:blur(4px);transition:background .2s ease}
.hero__nav:hover{background:rgba(18,18,20,.72)}
.hero__nav svg{width:26px;height:26px}
.hero__nav--prev{left:18px}
.hero__nav--next{right:18px}
.hero__count{position:absolute;top:20px;left:24px;z-index:5;background:rgba(18,18,20,.5);color:#fff;font-size:12.5px;letter-spacing:.06em;padding:6px 13px;border-radius:999px;backdrop-filter:blur(4px)}
.hero--gallery .hero__inner{position:absolute;left:0;right:0;bottom:126px;z-index:3;padding-bottom:0;pointer-events:none}
.hero--gallery .hero__inner a{pointer-events:auto}
.hero__rail{position:absolute;left:0;right:0;bottom:0;z-index:5;display:flex;gap:8px;align-items:center;padding:13px 18px;overflow-x:auto;scroll-behavior:smooth;-webkit-overflow-scrolling:touch;background:linear-gradient(to top,rgba(0,0,0,.62),rgba(0,0,0,.12));scrollbar-width:none}
.hero__rail::-webkit-scrollbar{height:0}
.hero__thumb{flex:0 0 auto;width:104px;height:70px;padding:0;border:2px solid transparent;border-radius:5px;overflow:hidden;cursor:pointer;background:none;opacity:.62;transition:opacity .2s ease,border-color .2s ease}
.hero__thumb img{width:100%;height:100%;object-fit:cover}
.hero__thumb:hover{opacity:1}
.hero__thumb.is-active{opacity:1;border-color:#fff}
/* Video rail card — a .hero__thumb that opens the video slide instead of a photo.
   Deliberately the loudest card in the rail: wider than a photo thumb, brass
   border, always full opacity, lifted off the strip, with a play badge + label.
   A video tour is the fastest thing for a buyer to digest, so it gets to shout. */
.hero__thumb--video{position:relative;width:var(--hero-vthumb-w);opacity:1;border-color:var(--accent-2);box-shadow:0 0 0 1px rgba(0,0,0,.4),0 6px 20px rgba(0,0,0,.5)}
.hero__thumb--video img{opacity:.52}
.hero__thumb--video:hover img{opacity:.62}
.hero__thumb--video.is-active{border-color:#fff}
.hero__thumb__vicon{position:absolute;top:50%;left:50%;transform:translate(-50%,-62%);width:34px;height:34px;display:flex;align-items:center;justify-content:center;border-radius:50%;background:var(--accent-2);color:#fff;border:2px solid rgba(255,255,255,.92)}
.hero__thumb__vicon svg{width:16px;height:16px;fill:currentColor;margin-left:2px}
/* Soft outward pulse — a low-key "this one moves" signal, motion-safe only. */
.hero__thumb__vicon::after{content:"";position:absolute;inset:-2px;border-radius:50%;border:2px solid var(--accent-2);animation:vpulse 2.6s ease-out infinite}
@keyframes vpulse{0%{transform:scale(1);opacity:.7}70%{transform:scale(1.85);opacity:0}100%{transform:scale(1.85);opacity:0}}
.hero__thumb__vlabel{position:absolute;bottom:4px;left:0;right:0;text-align:center;font-size:10px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#fff;text-shadow:0 1px 3px rgba(0,0,0,.8)}
/* "Watch Video Tour" pill in the hero overlay — the loudest entry point, always
   visible regardless of which slide the rail is parked on. listing.js removes it
   when the page has no video slide, so it is safe to emit unconditionally. */
.hero__videocta{display:inline-flex;align-items:center;gap:9px;margin-top:14px;pointer-events:auto;cursor:pointer;border:0;border-radius:999px;padding:10px 20px 10px 15px;background:var(--vcta-bg);color:var(--vcta-fg);font-family:var(--font-sans);font-size:13px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;box-shadow:0 4px 18px rgba(0,0,0,.35);transition:transform .2s ease,box-shadow .2s ease}
.hero__videocta:hover{transform:translateY(-1px);box-shadow:0 7px 24px rgba(0,0,0,.45)}
.hero__videocta__ico{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background:var(--vcta-fg);color:var(--vcta-bg);flex:0 0 auto}
.hero__videocta__ico svg{width:12px;height:12px;fill:currentColor;margin-left:2px}
/* Big play cue shown over the hero stage when the active slide is a video. */
.hero__playcue{position:absolute;top:calc((100% - 96px)/2);left:50%;transform:translate(-50%,-50%);z-index:4;display:none;flex-direction:column;align-items:center;gap:12px;border:0;background:none;color:#fff;cursor:pointer}
.hero__stage--video .hero__playcue{display:flex}
.hero__stage--video .hero__img{cursor:pointer}
.hero__playcue__ring{width:84px;height:84px;border-radius:50%;background:rgba(18,18,20,.5);backdrop-filter:blur(4px);border:2px solid rgba(255,255,255,.85);display:flex;align-items:center;justify-content:center;transition:background .2s ease,transform .2s ease}
.hero__playcue:hover .hero__playcue__ring{background:rgba(18,18,20,.75);transform:scale(1.05)}
.hero__playcue__ring svg{width:34px;height:34px;fill:#fff;margin-left:4px}
.hero__playcue__txt{font-size:12px;letter-spacing:.16em;text-transform:uppercase;font-weight:600;text-shadow:0 1px 3px rgba(0,0,0,.6)}
/* Inline video playback — the <video> fills the stage and, while playing (.is-playing
   on the hero), the poster/overlays step aside. object-fit:contain letterboxes any ratio. */
.hero__video{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;background:#000;z-index:4;display:none}
.hero.is-playing .hero__video{display:block}
.hero.is-playing .hero__playcue,
.hero.is-playing .hero__scrim,
.hero.is-playing .hero__count,
.hero.is-playing .hero__rail{opacity:0;pointer-events:none}
.hero.is-playing .hero__inner{opacity:0;pointer-events:none}
@media(max-width:720px){
  .hero--gallery{--hero-h:70vh;min-height:500px}
  .hero--gallery .hero__inner{bottom:92px}
  .hero__nav{width:42px;height:42px;top:calc((100% - 70px)/2)}
  .hero__thumb{width:72px;height:50px}
  .hero__rail{padding:10px 12px;gap:6px}
  .hero__thumb--video{--hero-vthumb-w:118px}
  .hero__thumb__vicon{width:28px;height:28px;transform:translate(-50%,-66%)}
  .hero__thumb__vicon svg{width:13px;height:13px}
  .hero__thumb__vlabel{font-size:9px;bottom:2px;letter-spacing:.1em}
  .hero__playcue__ring{width:68px;height:68px}
  .hero__playcue__ring svg{width:28px;height:28px}
  .hero__videocta{margin-top:10px;padding:8px 15px 8px 11px;font-size:11px;gap:7px}
  .hero__videocta__ico{width:20px;height:20px}
}

/* ---------- Quick stats ---------- */
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));border:1px solid var(--hair);border-radius:var(--radius);overflow:hidden;background:#fff;box-shadow:var(--card-shadow)}
/* min-width:0 is load-bearing. Grid items default to min-width:auto, so one long
   value ("Townhouse") would force its track wider than 1fr, push the whole grid
   past .stats, and get clipped by the overflow:hidden the rounded corners need —
   silently truncating the LAST cell. Never remove it. */
.stat{padding:26px 20px;min-width:0;container-type:inline-size;border-right:1px solid var(--hair);border-bottom:1px solid var(--hair)}
.stat__num{font-family:var(--font-display);font-size:clamp(22px,2.6vw,28px);font-weight:500;letter-spacing:-.01em}
/* Scale the value to its OWN CELL rather than the viewport: a crowded 8-stat row
   shrinks the figures to fit, a roomy 4-stat row keeps the full display size —
   where a vw clamp is blind to how many stats share the strip. Browsers without
   container queries drop this declaration whole and keep the vw clamp above. */
.stat__num{font-size:clamp(17px,26cqi,28px)}
/* Word-valued stats (property type, stories). The figure size is tuned for 4-6
   digits; a real word needs a smaller step. 15cqi is set so the longest realistic
   single-word type ("Condominium", "Cooperative") still fits one line in an
   8-stat strip — multi-word values wrap at the space, and hyphens/break-word are
   the last resorts for anything longer still. */
.stat__num--text{font-size:clamp(12px,15cqi,19px);line-height:1.3;letter-spacing:0;hyphens:auto;overflow-wrap:break-word}
.stat__num .accent{color:var(--accent)}
.stat__lbl{font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin-top:4px}

/* ---------- Description ---------- */
.lede{font-family:var(--font-display);font-size:clamp(18px,2vw,21px);line-height:1.6;max-width:68ch;color:#2a2a2a}
.prose{columns:2;column-gap:48px;margin-top:18px}
.prose p{margin:0 0 18px;break-inside:avoid;color:#2a2a2a}
@media(max-width:880px){.prose{columns:1}}

/* ---------- Feature-highlight band ---------- */
.fhl{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));margin-top:38px;border-top:1px solid var(--hair);border-bottom:1px solid var(--hair)}
.fhl__item{padding:24px 28px;border-right:1px solid var(--hair)}
.fhl__item:first-child{padding-left:0}
.fhl__item:last-child{border-right:0;padding-right:0}
.fhl__rule{width:26px;height:2px;background:var(--accent-2);margin-bottom:14px}
.fhl__label{font-family:var(--font-display);font-size:17px;font-weight:600;letter-spacing:-.005em;color:var(--ink)}
.fhl__detail{font-size:14px;color:var(--muted);margin-top:4px;line-height:1.5}
@media(max-width:560px){.fhl__item,.fhl__item:first-child,.fhl__item:last-child{border-right:0;border-bottom:1px solid var(--hair);padding:18px 0}.fhl__item:last-child{border-bottom:0}}

.highlights{list-style:none;padding:0;margin:34px 0 0;display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:10px 34px}
.highlights li{position:relative;padding-left:28px;color:#333}
.highlights li::before{content:"";position:absolute;left:0;top:.62em;width:14px;height:7px;border-left:2px solid var(--accent-2);border-bottom:2px solid var(--accent-2);transform:rotate(-45deg)}

/* ---------- Gallery / tiles ---------- */
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,260px),1fr));gap:12px}
.tile{position:relative;margin:0;aspect-ratio:3/2;overflow:hidden;border-radius:var(--radius);background:var(--bg-alt);cursor:zoom-in}
.tile img{width:100%;height:100%;object-fit:cover;transition:transform .5s ease}
.tile:hover img{transform:scale(1.05)}
.tile.is-hidden{display:none}
.gallery__more{margin-top:26px;text-align:center}

/* ---------- Features & amenities ---------- */
.feat{columns:3 260px;column-gap:40px}
.feat__group{break-inside:avoid;margin-bottom:26px}
.feat__group h3{font-family:var(--font-sans);font-size:13px;letter-spacing:.1em;text-transform:uppercase;color:var(--accent);margin-bottom:10px}
.feat__group ul{list-style:none;margin:0;padding:0}
.feat__group li{position:relative;padding-left:20px;font-size:15.5px;color:#333;margin-bottom:6px}
.feat__group li::before{content:"";position:absolute;left:0;top:.66em;width:6px;height:6px;background:var(--accent-2);border-radius:50%}
.amenities{margin-top:14px;display:flex;flex-wrap:wrap;gap:9px}
.amenities span{font-size:13.5px;padding:7px 14px;border:1px solid var(--hair);border-radius:999px;background:#fff;color:#444}

/* ---------- Rooms + floor plans ---------- */
.split{display:grid;grid-template-columns:1fr 1fr;gap:clamp(32px,5vw,64px);align-items:start}
.rooms{width:100%;border-collapse:collapse}
.rooms th{text-align:left;font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);font-weight:600;padding:0 0 10px;border-bottom:1px solid var(--hair)}
.rooms td{padding:13px 0;border-bottom:1px solid var(--hair);font-size:16px}
.rooms td:last-child,.rooms th:last-child{text-align:right;color:var(--muted)}
.rooms td.dim{text-align:center;color:var(--ink);font-variant-numeric:tabular-nums}
.floorgrid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.floorgrid .tile{aspect-ratio:4/3}

/* ---------- Lease terms ---------- */
.terms{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:30px 40px}
.terms dt{font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin-bottom:6px}
.terms dd{margin:0;font-size:16px;color:#2a2a2a}
.terms dd ul{margin:0;padding-left:18px}
.terms dd li{margin-bottom:3px}

/* ---------- Sale facts (taxes / HOA / assessment) ---------- */
.facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1px;background:var(--hair);border:1px solid var(--hair);border-radius:var(--radius);overflow:hidden}
.fact{background:var(--bg);padding:22px}
.fact__l{font-size:11.5px;text-transform:uppercase;letter-spacing:.12em;color:var(--muted)}
.fact__v{font-family:var(--font-display);font-size:21px;margin-top:7px}
.fact--wide{grid-column:1/-1}
.fact--wide .fact__v{font-family:var(--font-sans);font-size:15px;line-height:1.5}

/* ---------- Schools & neighborhood ---------- */
.cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:24px}
.card-lite{border:1px solid var(--hair);border-radius:var(--radius);padding:24px;background:#fff;box-shadow:var(--card-shadow)}
.card-lite .k{font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}
.card-lite .v{font-family:var(--font-display);font-size:18px;margin-top:4px}

/* ---------- Map ---------- */
.map{position:relative;border:1px solid var(--hair);border-radius:var(--radius);overflow:hidden;background:var(--bg-alt)}
.map iframe{display:block;width:100%;height:440px;border:0;filter:grayscale(.1)}
.map__bar{display:flex;flex-wrap:wrap;gap:8px 18px;align-items:center;justify-content:space-between;margin-top:16px}
.map__cap{color:var(--muted);font-size:15px}

/* ---------- Agent / brokerage card ---------- */
.agent{display:grid;grid-template-columns:auto 1fr auto;gap:28px;align-items:center;border:1px solid var(--hair);border-radius:var(--radius);padding:clamp(24px,4vw,40px);background:#fff;box-shadow:var(--card-shadow)}
.agent__photo{width:112px;height:112px;border-radius:50%;object-fit:cover;flex:none;background:var(--accent);color:var(--on-accent);display:flex;align-items:center;justify-content:center;font-family:var(--font-display);font-size:38px;font-weight:300}
.agent__name{font-family:var(--font-display);font-size:24px}
.agent__title{color:var(--muted);font-size:14px;margin-top:2px}
.agent__actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:18px}
.agent__broker{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;color:var(--muted);font-size:14px;text-align:center}
.agent__brokerage-logo{max-height:104px;width:auto;flex:none;border-radius:6px;object-fit:contain}

/* ---------- Footer ---------- */
.foot{padding-block:48px;border-top:1px solid var(--hair);background:var(--bg-alt);color:var(--muted);font-size:13.5px}
.foot__eho{display:flex;align-items:center;gap:12px;margin-bottom:14px;color:#444}
.foot__eho svg{flex:none}
.foot__mark{height:30px;width:auto;flex:none}
.foot p{margin:6px 0;max-width:80ch}
.foot a{color:var(--muted);text-decoration:underline}
.foot__gen{color:var(--faint);margin-top:14px}

/* ---------- Lightbox ---------- */
.lb{position:fixed;inset:0;z-index:90;display:none;background:rgba(12,12,14,.95);align-items:center;justify-content:center}
.lb.open{display:flex}
.lb__stage{margin:0;position:relative;display:flex;flex-direction:column;align-items:center;gap:12px;max-width:92vw}
.lb__stage img{max-width:92vw;max-height:82vh;object-fit:contain;border-radius:2px}
/* Video slide inside the viewer — present only when the page ships #lbVideo.
   listing.js swaps which of the two is shown, so both are display-toggled here. */
.lb__stage video{max-width:92vw;max-height:82vh;width:min(92vw,1400px);object-fit:contain;background:#000;border-radius:2px;display:none}
.lb.is-video .lb__stage video{display:block}
.lb.is-video .lb__stage img{display:none}
.lb__cap{color:#d8d8d8;font-size:13.5px;letter-spacing:.01em;text-align:center;max-width:60ch}
.lb__btn{position:absolute;background:none;border:0;color:#fff;cursor:pointer;opacity:.8;transition:opacity .2s;padding:14px;line-height:0}
.lb__btn:hover{opacity:1}
.lb__close{top:14px;right:18px;font-size:30px}
.lb__prev{left:10px}
.lb__next{right:10px}
.lb__prev svg,.lb__next svg{width:34px;height:34px}
.lb__count{position:absolute;bottom:18px;left:50%;transform:translateX(-50%);color:#fff;opacity:.8;font-size:13px;letter-spacing:.1em}
@media(max-width:620px){.lb__prev{left:6px}.lb__next{right:6px}}

/* ---------- Mobile contact bar ---------- */
.ctabar{
  position:fixed;left:0;right:0;bottom:0;z-index:60;display:none;gap:10px;align-items:center;
  padding:10px 14px calc(10px + env(safe-area-inset-bottom));
  background:rgba(255,255,255,.97);border-top:1px solid var(--hair);
  backdrop-filter:saturate(160%) blur(8px);
  transform:translateY(110%);transition:transform .3s ease;
}
.ctabar.show{transform:none}
.ctabar__price{font-weight:600;margin-right:auto;white-space:nowrap;font-variant-numeric:tabular-nums}
.ctabar__price small{font-size:.6em;font-weight:400;color:var(--muted)}
.ctabar__btn{font-size:14px;font-weight:600;padding:11px 16px;border-radius:var(--radius);border:1px solid var(--ink);color:var(--ink);white-space:nowrap}
.ctabar__btn--accent{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
@media(max-width:720px){.ctabar{display:flex}body{padding-bottom:64px}}

/* ---------- Reveal animation ---------- */
.reveal{opacity:0;transform:translateY(16px);transition:opacity var(--reveal-dur) var(--reveal-ease),transform var(--reveal-dur) var(--reveal-ease)}
.reveal.in{opacity:1;transform:none}

/* ---------- Responsive ---------- */
@media(max-width:860px){
  .hdr__nav{display:none}
  .split{grid-template-columns:1fr}
  .feat{columns:2 220px}
}
@media(max-width:560px){
  body{font-size:16px}
  .floorgrid{grid-template-columns:1fr}
  .feat{columns:1}
  .agent{grid-template-columns:1fr;text-align:center;justify-items:center}
  .agent__broker{order:-1}
  .stat{padding:20px 14px}
}

/* ---------- Reduced motion ---------- */
@media(prefers-reduced-motion:reduce){
  *{scroll-behavior:auto !important}
  .reveal{opacity:1;transform:none;transition:none}
  .scrollcue{animation:none}
  .tile:hover img{transform:none}
  .ctabar{transition:none}
  .hero__img{animation:none !important;transition:none}
  .hero__rail{scroll-behavior:auto}
  .hero__thumb__vicon::after{animation:none;opacity:0}
  .hero__videocta:hover{transform:none}
}

/* ---------- Print ---------- */
@media print{
  .hdr,.scrollcue,.lb,.ctabar,.gallery__more,.hero__nav,.hero__rail,.hero__count,.map__bar .btn{display:none !important}
  .hero{height:auto;color:#000}
  .hero:not(.hero--gallery)::after,.hero__scrim{display:none}
  .hero__img{position:relative;height:auto;animation:none}
  .tile.is-hidden{display:block}
  .section{break-inside:avoid}
  body{padding-bottom:0}
}
