/* Lisa Ng — "Modern Clean" light theme
   Design language: near-black on white, oversized bold sans-serif,
   generous whitespace, one accent, alternating text/image rhythm.
   Legibility first — a large share of visitors are 45-65 on phones. */

*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

:root {
    --ink:        #10131a;   /* headlines */
    --ink-soft:   #4a5261;   /* body */
    --ink-faint:  #6d7585;   /* meta — darkened from #8b93a3, which measured only
                                3.09:1 on white and failed WCAG AA for body text.
                                This file's own note says many visitors are 45-65
                                on phones, and this is the smallest text we set. */
    --paper:      #ffffff;
    --paper-alt:  #f5f6f8;   /* section banding */
    --line:       #e4e7ec;
    --accent:     #111318;   /* near-black: monochrome, modern, timeless */
    --accent-dk:  #000000;
    --accent-tint:#f0f1f4;
    --font: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
    --radius: 10px;
    --shadow: 0 1px 2px rgba(16,19,26,.04), 0 8px 28px rgba(16,19,26,.07);
    --shadow-lg: 0 2px 4px rgba(16,19,26,.04), 0 20px 50px rgba(16,19,26,.12);
    --band-dark-bg: #10131a;      /* the near-black stat/CTA bands */
    --on-dark: #ffffff;
}

/* ---------- Dark theme ----------
   Every colour here is derived from the light palette rather than inverted.
   A straight inversion turns the near-black accent into pure white, which
   glares on a dark page and loses the calm the monochrome look depends on.

   theme.js sets data-theme on <html> before first paint, so there is no flash.
   It defaults to the device preference and remembers a manual choice. */
:root[data-theme="dark"] {
    /* Graphite, not black. A near-black page makes the photography look like it
       is floating in a void and the whole thing feels heavy; a lighter cool grey
       keeps the calm of the light theme and lets the images sit IN the page.
       Every value keeps the same slight blue bias as the light palette so the
       two themes read as one design rather than two. */
    --ink:        #f2f4f8;
    --ink-soft:   #c3c9d6;
    --ink-faint:  #959cac;
    --paper:      #23272f;   /* cards and surfaces */
    --paper-alt:  #2b303a;   /* section banding */
    --line:       #3a404c;
    --accent:     #f2f4f8;   /* buttons invert: light pill on a grey page */
    --accent-dk:  #ffffff;
    --accent-tint:#313745;
    --shadow:     0 1px 2px rgba(0,0,0,.3), 0 8px 28px rgba(0,0,0,.34);
    --shadow-lg:  0 2px 4px rgba(0,0,0,.3), 0 20px 50px rgba(0,0,0,.45);
    --band-dark-bg: #171a21;  /* deeper than the page, so bands still read */
    --on-dark:    #f2f4f8;
}
:root[data-theme="dark"] body { background: #1c2027; }

/* Buttons: the accent flips to light, so their text has to flip to dark. */
:root[data-theme="dark"] .btn-accent { color: #10131a; }
:root[data-theme="dark"] .btn-accent:hover { color: #000; }

/* The logo is a black monogram on transparent. Inverting is cleaner than
   swapping the file on fourteen pages, and it is monochrome so it inverts
   exactly to white. */
:root[data-theme="dark"] .brand-mark,
:root[data-theme="dark"] .foot-in .brand-mark { filter: invert(1); }

/* Photographs shouldn't be dimmed — they're the product. Only the decorative
   tint blocks get toned down. */
:root[data-theme="dark"] .hero-shot::after { opacity: .5; }

/* ---------- Dark mode: fix everything that assumed a light page ----------
   The real hazard, and the one Bill called out: several rules set
   `background: var(--ink)` with a hardcoded `color: #fff`. In dark mode --ink
   becomes near-WHITE, so those would render white text on a white pill and
   vanish. Every one of them is corrected here rather than left to chance.

   Rule of thumb applied throughout: anything filled with --ink or --accent gets
   DARK text in dark mode; anything hardcoded #fff as a surface becomes --paper. */
:root[data-theme="dark"] {
    /* filled pills, badges and buttons - text must go dark */
    --on-fill: #10131a;
}
:root[data-theme="dark"] .btn-dark,
:root[data-theme="dark"] .st b,
:root[data-theme="dark"] .sv b,
:root[data-theme="dark"] .done .tick,
:root[data-theme="dark"] .nav-sub a[aria-current="page"],
:root[data-theme="dark"] .lang-pick a[aria-current="true"],
/* .feature-tag and .feature-cta are handled at their own definitions with
   literal colours — they sit on a photo, so they don't follow the theme. The
   only leftover here is .sound-toggle, which belongs to the removed background
   music and now exists solely for the archived navy.html. */
:root[data-theme="dark"] .sound-toggle { background: var(--paper); color: var(--ink); }

/* .sold-badge has TWO forms needing opposite treatment. On a photo-less card it
   is transparent text sitting directly on the dark card, so it must be LIGHT.
   On a photo card it is a white pill, so it must be DARK. Lumping them together
   is what made "REPRESENTED BUYER" unreadable. General rule first, specific
   override second. */
:root[data-theme="dark"] .sold-badge { color: var(--ink-soft); }
:root[data-theme="dark"] .sold-card.has-photo .sold-badge { color: var(--on-fill); }
:root[data-theme="dark"] .btn-dark:hover { background: #fff; color: #000; }

/* surfaces that were hardcoded white */
:root[data-theme="dark"] .nav-links,
:root[data-theme="dark"] .sub-form input[type="email"],
:root[data-theme="dark"] .sub-form input[type="text"],
:root[data-theme="dark"] .sub-form select,
:root[data-theme="dark"] .sub-ok {
    background: var(--paper);
    color: var(--ink);
}
:root[data-theme="dark"] input[type="range"]::-webkit-slider-thumb { border-color: var(--paper); }
:root[data-theme="dark"] input[type="range"]::-moz-range-thumb     { border-color: var(--paper); }
:root[data-theme="dark"] .sold-card:hover { border-color: var(--ink-faint); }

/* the amber "key point" notice was cream with dark text */
:root[data-theme="dark"] .notice-key { background: #2a2317; }
:root[data-theme="dark"] .notice { color: var(--ink-soft); }

/* form fields */
:root[data-theme="dark"] .fg input,
:root[data-theme="dark"] .fg select,
:root[data-theme="dark"] .fg textarea,
:root[data-theme="dark"] .money input {
    background: var(--paper-alt); color: var(--ink); border-color: var(--line);
}
:root[data-theme="dark"] .fg input::placeholder,
:root[data-theme="dark"] .money input::placeholder { color: var(--ink-faint); }

/* the near-black bands stay dark in both themes, so their white text is fine —
   but they need to stay distinguishable from a dark page */
:root[data-theme="dark"] .band-dark { background: var(--band-dark-bg); }

/* THE NAV BAR. It was rgba(255,255,255,.92) — a hardcoded translucent WHITE —
   so in dark mode the page went dark and the bar stayed light. That is what made
   the logo "disappear": I had inverted it to white, and white on a white bar is
   nothing. The brand name and phone number were invisible for the same reason.
   Fix the bar and all three come back. */
:root[data-theme="dark"] .nav { background: rgba(28,32,39,.9); }
:root[data-theme="dark"] .lang-pick { background: var(--paper-alt); }
:root[data-theme="dark"] .lang-pick a:hover { background: var(--line); }

/* Turnstile renders its own widget; tell it to match */
:root[data-theme="dark"] .cf-turnstile { color-scheme: dark; }

/* ---------- Photos fade in and blend into the page ----------
   Two separate things Bill asked for:

   1. Fade IN. Pure CSS animation rather than a JS load handler, so it always
      ends at opacity 1 — if anything fails, the image is simply visible. A JS
      approach that starts at 0 can leave a photo hidden forever.
   2. Blend. The big Covina photo previously met the section above it with a hard
      horizontal edge, which is what the red line in Bill's screenshot points at.
      A mask feathers the top and bottom into the page colour so it melts rather
      than butts up against it. */
@keyframes photoIn { from { opacity: 0; } to { opacity: 1; } }

@media (prefers-reduced-motion: no-preference) {
    .hero-shot img,
    .row-media img,
    .sold-photo img,
    .strip img,
    .feature-sale-media img {
        animation: photoIn .9s ease-out both;
    }
    /* the feature photo already runs a slow Ken Burns zoom, so it needs both */
    .feature-sale-media img {
        animation: photoIn 1.1s ease-out both,
                   featureZoom 30s ease-in-out 1.1s infinite alternate;
    }
}

/* Feather the top and bottom edges of the feature photo into the page. */
.feature-sale-media {
    -webkit-mask-image: linear-gradient(180deg,
        transparent 0, #000 9%, #000 88%, transparent 100%);
    mask-image: linear-gradient(180deg,
        transparent 0, #000 9%, #000 88%, transparent 100%);
}
/* The dark scrim on top of the photo has to feather with it, or the scrim edge
   becomes the hard line instead. */
.feature-sale::before {
    -webkit-mask-image: linear-gradient(180deg,
        transparent 0, #000 9%, #000 88%, transparent 100%);
    mask-image: linear-gradient(180deg,
        transparent 0, #000 9%, #000 88%, transparent 100%);
}
/* Lisa's portrait gets a soft edge too, so it sits in the page rather than on it. */
.hero-shot img { transition: filter .4s; }

/* the motto sheen was tuned for light grey text on white */
:root[data-theme="dark"] .reveal.in-view .motto-em {
    background-image: linear-gradient(100deg,
        var(--ink-faint) 38%, #9aa3b4 47%, #ffffff 50%, #9aa3b4 53%, var(--ink-faint) 62%);
}

/* ---------- Local temperature + city in the nav ----------
   Typographic, not a coloured weather icon. A blue raincloud or a yellow sun
   would be the only chroma anywhere in a deliberately monochrome design, and it
   would read as a widget bolted on rather than part of the page.

   Hidden until the data actually arrives (the .on class), and hidden entirely
   below 900px — this nav has overflowed before and pushed the language switcher
   off-screen, and a nice-to-have must not be what breaks it again. */
.nav-wx { display: none; align-items: center; gap: 7px; white-space: nowrap;
          font-size: .8rem; color: var(--ink-faint); flex: none; }
.nav-wx b { color: var(--ink); font-weight: 700; font-size: .88rem;
            font-variant-numeric: tabular-nums; letter-spacing: -.01em; }
.nav-wx span::before { content: "·"; margin-right: 7px; opacity: .55; }
/* Shown as soon as the data arrives, at every width. It was gated at 900px to
   protect the nav from overflowing, but that made "I can't see it" impossible to
   tell apart from a genuine failure. The city name is dropped on narrow screens
   instead, which saves the space without hiding the whole thing. */
.nav-wx.on { display: flex; }
@media (max-width: 700px) {
    .nav-wx span { display: none; }          /* keep the temperature, drop the city */
}
@media (max-width: 420px) { .nav-wx.on { display: none; } }

/* ---------- Theme toggle button ---------- */
.theme-toggle {
    display: grid; place-items: center; flex: none;
    width: 38px; height: 38px; padding: 0;
    background: none; border: 1px solid var(--line); border-radius: 10px;
    color: var(--ink-soft); cursor: pointer;
    transition: border-color .18s, color .18s, background .18s;
}
.theme-toggle:hover { border-color: var(--ink); color: var(--ink); }
.theme-toggle:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
.theme-toggle svg { width: 17px; height: 17px; }
/* One button, two icons: show the moon in light mode (what you'd switch TO),
   the sun in dark mode. */
.theme-toggle .i-moon { display: block; }
.theme-toggle .i-sun  { display: none; }
:root[data-theme="dark"] .theme-toggle .i-moon { display: none; }
:root[data-theme="dark"] .theme-toggle .i-sun  { display: block; }
@media (max-width: 380px) { .theme-toggle { width: 34px; height: 34px; } }

html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; }
body {
    font-family: var(--font); font-size: 17px; line-height: 1.6;
    color: var(--ink-soft); background: var(--paper);
    overflow-x: hidden; -webkit-font-smoothing: antialiased;
}
img { max-width: 100%; height: auto; display: block; }
.hidden { display: none !important; }
.container { max-width: 1180px; margin: 0 auto; padding: 0 24px; }
.narrow { max-width: 780px; }

/* ---------- Type scale: big, tight, confident ---------- */
h1, h2, h3 { color: var(--ink); letter-spacing: -.025em; line-height: 1.08; font-weight: 700; }
h1 { font-size: clamp(2.4rem, 6.2vw, 4.6rem); }
h2 { font-size: clamp(1.9rem, 4.2vw, 3rem); letter-spacing: -.028em; }
h3 { font-size: 1.18rem; letter-spacing: -.015em; line-height: 1.3; }
.lede { font-size: clamp(1.06rem, 1.7vw, 1.32rem); color: var(--ink-soft); }
.eyebrow {
    display: inline-block; font-size: .76rem; font-weight: 600;
    letter-spacing: .14em; text-transform: uppercase; color: var(--ink-faint);
    margin-bottom: 18px;
}

/* ---------- Reveal ---------- */
.reveal { opacity: 0; transform: translateY(18px); transition: opacity .7s ease, transform .7s cubic-bezier(.2,.75,.25,1); }
.reveal.in-view { opacity: 1; transform: none; }
.reveal-stagger > * { opacity: 0; transform: translateY(18px); }
.reveal-stagger.in-view > * { animation: up .7s cubic-bezier(.2,.75,.25,1) both; animation-delay: calc(var(--i,0) * 90ms); }
@keyframes up { from { opacity: 0; transform: translateY(18px); } to { opacity: 1; transform: none; } }

/* ---------- Buttons ---------- */
.btn {
    display: inline-flex; align-items: center; gap: 9px;
    padding: 15px 28px; border-radius: 100px; border: 0; cursor: pointer;
    font-family: var(--font); font-size: 1rem; font-weight: 600; text-decoration: none;
    transition: background .2s, transform .14s, box-shadow .2s, color .2s;
}
.btn-dark { background: var(--ink); color: #fff; }
.btn-dark:hover { background: #000; transform: translateY(-2px); box-shadow: 0 10px 26px rgba(16,19,26,.22); }
.btn-accent { background: var(--accent); color: #fff; }
.btn-accent:hover { background: var(--accent-dk); transform: translateY(-2px); box-shadow: 0 10px 26px rgba(17,19,24,.26); }
.btn-line { background: transparent; color: var(--ink); border: 1.5px solid var(--line); }
.btn-line:hover { border-color: var(--ink); }
.btn svg { width: 17px; height: 17px; }
.btn-full { width: 100%; justify-content: center; }

/* ---------- Nav ---------- */
.nav { position: sticky; top: 0; z-index: 60; background: rgba(255,255,255,.92); backdrop-filter: blur(12px); border-bottom: 1px solid var(--line); }
.nav-in { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 15px 0; }
.brand { display: flex; align-items: center; gap: 11px; text-decoration: none; }
.brand svg { width: 30px; height: 30px; color: var(--accent); flex: none; }
.brand b { display: block; color: var(--ink); font-size: 1.1rem; font-weight: 700; letter-spacing: -.02em; line-height: 1.15; }
.brand span { display: block; color: var(--ink-faint); font-size: .68rem; letter-spacing: .1em; text-transform: uppercase; }
.nav-right { display: flex; align-items: center; gap: 10px; }
.nav-phone { color: var(--ink); text-decoration: none; font-weight: 600; font-size: .95rem; white-space: nowrap; }
@media (max-width: 620px) { .nav-phone { display: none; } }

/* ---------- Hero ---------- */
.hero { padding: clamp(48px, 8vw, 96px) 0 0; }
.hero-grid { display: grid; grid-template-columns: 1.05fr .95fr; gap: clamp(32px, 5vw, 72px); align-items: center; }
.hero h1 { margin-bottom: 20px; }
.hero h1 .rot { color: var(--accent); display: inline-block; }
.hero .lede { margin-bottom: 30px; max-width: 40ch; }
.hero-btns { display: flex; flex-wrap: wrap; gap: 12px; margin-bottom: 32px; }
.hero-meta { display: flex; flex-wrap: wrap; gap: 10px 26px; padding-top: 24px; border-top: 1px solid var(--line); }
.hero-meta div { font-size: .9rem; color: var(--ink-soft); }
.hero-meta b { color: var(--ink); font-weight: 700; }
.hero-shot { position: relative; }
.hero-shot img { width: 100%; border-radius: 18px; box-shadow: var(--shadow-lg); }
.hero-shot::after {
    content: ""; position: absolute; inset: auto -18px -18px auto; width: 62%; height: 62%;
    background: var(--accent-tint); border-radius: 18px; z-index: -1;
}
@media (max-width: 900px) {
    .hero-grid { grid-template-columns: 1fr; }
    .hero .lede { max-width: none; }
    .hero-shot { order: -1; max-width: 460px; margin: 0 auto; }
}

/* ---------- Section rhythm ---------- */
section { padding: clamp(56px, 9vw, 116px) 0; }
.band { background: var(--paper-alt); }
.band-dark { background: var(--ink); color: rgba(255,255,255,.72); }
.band-dark h2, .band-dark h3 { color: #fff; }
.band-dark .eyebrow { color: rgba(255,255,255,.55); }

/* These bands are near-black in BOTH themes, so a button filled with --accent
   disappears into them: in light mode --accent is #111318 and the band is
   #10131a, which made the primary call to action an invisible rectangle with a
   white label floating on it. On every page with a CTA band. Buttons inside a
   dark band are always light with dark text, in both themes. */
.band-dark .btn-accent,
.band-dark .btn-dark {
    background: #fff; color: #10131a; border-color: #fff;
}
.band-dark .btn-accent:hover,
.band-dark .btn-dark:hover {
    background: #e8eaef; color: #000;
    box-shadow: 0 10px 30px rgba(0,0,0,.35);
}
/* the secondary outline button needs a visible edge on a dark band too */
.band-dark .btn-line {
    background: transparent; color: #fff; border-color: rgba(255,255,255,.45);
}
.band-dark .btn-line:hover { border-color: #fff; background: rgba(255,255,255,.08); }
.head { max-width: 720px; margin-bottom: clamp(34px, 5vw, 60px); }
.head.center { margin-left: auto; margin-right: auto; text-align: center; }
.head h2 { margin-bottom: 14px; }

/* ---------- Alternating feature rows ---------- */
.row { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(30px, 5vw, 76px); align-items: center; }
.row + .row { margin-top: clamp(52px, 8vw, 104px); }
.row.flip .row-media { order: -1; }
.row-media img { border-radius: 18px; box-shadow: var(--shadow); }
.row-text h2 { margin-bottom: 16px; }
.row-text p { margin-bottom: 14px; }
.checks { list-style: none; margin-top: 20px; }
.checks li { display: flex; gap: 12px; align-items: flex-start; padding: 10px 0; border-bottom: 1px solid var(--line); font-size: .98rem; }
.checks li:last-child { border-bottom: 0; }
.checks svg { width: 20px; height: 20px; flex: none; color: var(--accent); margin-top: 2px; }
@media (max-width: 860px) { .row { grid-template-columns: 1fr; } .row.flip .row-media { order: 0; } }

/* ---------- Cards ---------- */
.cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(16px, 2.4vw, 26px); }
.card {
    background: var(--paper); border: 1px solid var(--line); border-radius: 16px;
    padding: 32px 28px; transition: transform .25s, box-shadow .25s, border-color .25s;
}
.card:hover { transform: translateY(-5px); box-shadow: var(--shadow); border-color: transparent; }
.card .ico {
    width: 46px; height: 46px; border-radius: 12px; margin-bottom: 18px;
    display: flex; align-items: center; justify-content: center;
    background: var(--accent-tint); color: var(--accent);
}
.card .ico svg { width: 22px; height: 22px; }
.card h3 { margin-bottom: 9px; }
.card p { font-size: .96rem; }
@media (max-width: 860px) { .cards { grid-template-columns: 1fr; max-width: 460px; margin: 0 auto; } }

/* ---------- Steps ---------- */
.steps { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(20px, 3.4vw, 44px); counter-reset: st; }
.st { position: relative; }
.st b {
    counter-increment: st; display: flex; align-items: center; justify-content: center;
    width: 40px; height: 40px; border-radius: 50%; margin-bottom: 16px;
    background: var(--ink); color: #fff; font-size: .95rem; font-weight: 700;
}
.st b::before { content: counter(st); }
.st h3 { margin-bottom: 8px; }
.st p { font-size: .96rem; }
@media (max-width: 860px) { .steps { grid-template-columns: 1fr; max-width: 460px; margin: 0 auto; } }

/* ---------- Form ---------- */
.formcard { background: var(--paper); border: 1px solid var(--line); border-radius: 20px; padding: clamp(24px, 3.4vw, 40px); box-shadow: var(--shadow-lg); }
.formcard h2 { font-size: 1.6rem; margin-bottom: 6px; }
.formcard .kick { color: var(--ink-faint); font-size: .9rem; margin-bottom: 24px; }
.hp { position: absolute; left: -9999px; }
.fg { margin-bottom: 16px; }
.fg label { display: block; font-size: .88rem; font-weight: 600; color: var(--ink); margin-bottom: 7px; }
.fg input, .fg select {
    width: 100%; padding: 13px 15px; min-height: 50px;
    font-family: var(--font); font-size: 1rem; color: var(--ink);
    background: var(--paper); border: 1.5px solid var(--line); border-radius: var(--radius);
    transition: border-color .18s, box-shadow .18s;
}
.fg input:focus, .fg select:focus { outline: 0; border-color: var(--accent); box-shadow: 0 0 0 4px var(--accent-tint); }
.fg input::placeholder { color: #aeb5c1; }
.fr { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.consent { display: flex; gap: 11px; align-items: flex-start; font-size: .8rem; color: var(--ink-faint); margin: 6px 0 18px; cursor: pointer; line-height: 1.5; }
.consent input { width: 19px; height: 19px; min-height: 0; flex: none; margin-top: 2px; accent-color: var(--accent); }
.fine { font-size: .74rem; color: var(--ink-faint); text-align: center; margin-top: 15px; line-height: 1.55; }
.fine a { color: var(--accent); }
.err { margin-top: 12px; color: #c0392b; font-size: .9rem; text-align: center; }
.done { text-align: center; padding: 44px 16px; }
.done .tick { width: 60px; height: 60px; margin: 0 auto 20px; border-radius: 50%; background: var(--accent); color: #fff; display: flex; align-items: center; justify-content: center; font-size: 1.8rem; }
.done h3 { font-size: 1.55rem; margin-bottom: 12px; }
.done .sig { color: var(--ink-faint); margin-top: 14px; }
@media (max-width: 380px) { .fr { grid-template-columns: 1fr; } }

/* ---------- Stats ---------- */
.stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 28px 20px; text-align: center; }
.stats .n { font-size: clamp(2rem, 4.4vw, 3.2rem); font-weight: 700; color: #fff; letter-spacing: -.03em; line-height: 1; margin-bottom: 8px; }
.stats .l { font-size: .8rem; letter-spacing: .1em; text-transform: uppercase; color: rgba(255,255,255,.6); }
@media (max-width: 620px) { .stats { grid-template-columns: 1fr 1fr; } }

/* ---------- Reviews ---------- */
.revs { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: clamp(16px, 2.2vw, 24px); }
.rev { background: var(--paper); border: 1px solid var(--line); border-radius: 16px; padding: 28px 26px; display: flex; flex-direction: column; transition: transform .25s, box-shadow .25s; }
.rev:hover { transform: translateY(-4px); box-shadow: var(--shadow); }
.rev .stars { color: #e8a33d; font-size: .95rem; letter-spacing: 2px; margin-bottom: 14px; }
.rev p { font-size: .97rem; color: var(--ink-soft); flex: 1; margin-bottom: 18px; }
.rev .who { font-size: .82rem; color: var(--ink-faint); font-weight: 600; padding-top: 14px; border-top: 1px solid var(--line); }

/* ---------- Photo strip ---------- */
.strip { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; gap: 0; padding: 0; }
.strip figure { position: relative; aspect-ratio: 1/1; overflow: hidden; }
.strip img { width: 100%; height: 100%; object-fit: cover; transition: transform .7s cubic-bezier(.2,.7,.3,1); }
.strip figure:hover img { transform: scale(1.06); }
@media (max-width: 700px) { .strip { grid-auto-flow: row; grid-template-columns: 1fr 1fr; } .strip figure:nth-child(5) { display: none; } }

/* ---------- CTA ---------- */
.cta { text-align: center; }
.cta .face { width: 84px; height: 84px; border-radius: 50%; object-fit: cover; object-position: top center; margin: 0 auto 22px; border: 3px solid rgba(255,255,255,.16); }
.cta h2 { margin-bottom: 14px; }
.cta p { margin-bottom: 28px; }
.cta .alt { display: block; margin-top: 20px; font-size: .92rem; color: rgba(255,255,255,.6); }
.cta .alt a { color: #fff; font-weight: 600; text-decoration: underline; text-underline-offset: 3px; }

/* ---------- Footer ---------- */
.foot { background: var(--paper-alt); padding: 52px 0 40px; border-top: 1px solid var(--line); }
.foot-in { text-align: center; }
.foot svg { width: 30px; height: 30px; color: var(--accent); margin: 0 auto 18px; }
.foot p { font-size: .88rem; color: var(--ink-soft); margin-bottom: 5px; }
.foot p strong { color: var(--ink); }
.foot a { color: var(--ink-soft); }
.foot-links { margin: 20px 0; display: flex; flex-wrap: wrap; justify-content: center; gap: 8px 20px; }
.foot-links a { font-size: .88rem; text-decoration: none; font-weight: 500; }
.foot-links a:hover { color: var(--accent); }
.foot-legal { font-size: .76rem; color: var(--ink-faint); line-height: 1.7; margin-top: 16px; }
.eho { border: 1px solid currentColor; border-radius: 2px; padding: 0 3px; font-size: .82em; }

/* ---------- Sound toggle ---------- */
.sound-toggle {
    position: fixed; right: 18px; bottom: 18px; z-index: 200;
    display: inline-flex; align-items: center; gap: 9px;
    padding: 10px 16px 10px 13px; border-radius: 100px; cursor: pointer;
    background: rgba(255,255,255,.94); border: 1px solid var(--line);
    color: var(--ink); font-family: var(--font);
    font-size: .72rem; letter-spacing: .1em; text-transform: uppercase; font-weight: 700;
    backdrop-filter: blur(10px); box-shadow: var(--shadow);
    transition: border-color .2s, transform .16s;
}
.sound-toggle:hover { border-color: var(--accent); transform: translateY(-2px); }
.sound-bars { display: flex; align-items: flex-end; gap: 2.5px; height: 13px; }
.sound-bars i { display: block; width: 2.5px; height: 3px; border-radius: 2px; background: var(--accent); transition: height .3s; }
.sound-toggle.playing .sound-bars i { animation: eq 1.15s ease-in-out infinite; }
.sound-toggle.playing .sound-bars i:nth-child(2) { animation-delay: .18s; }
.sound-toggle.playing .sound-bars i:nth-child(3) { animation-delay: .36s; }
.sound-toggle.playing .sound-bars i:nth-child(4) { animation-delay: .54s; }
@keyframes eq { 0%,100% { height: 3px; } 50% { height: 13px; } }
@media (max-width: 600px) { .sound-toggle { right: 12px; bottom: 12px; } .sound-label { display: none; } }

/* ---------- Scroll progress ---------- */
.scroll-progress { position: fixed; top: 0; left: 0; height: 2px; width: 0; background: var(--accent); z-index: 999; transition: width .1s linear; }

/* ---------- A11y / motion ---------- */
:focus-visible { outline: 3px solid var(--accent); outline-offset: 2px; }
@media (prefers-reduced-motion: reduce) {
    html { scroll-behavior: auto; }
    *, *::before, *::after { transition: none !important; animation: none !important; }
    .reveal, .reveal-stagger > * { opacity: 1 !important; transform: none !important; }
}

/* ============================================================
   Headline: three fixed lines so the rotating city can never
   reflow the sentence, change the headline height, or shift the
   photo. The city sits OUT of layout flow inside a fixed-height
   line — its width is invisible to the layout.
   ============================================================ */
.hero h1 .hl { display: block; }
.rot-line { position: relative; height: 1.06em; overflow: visible; }
.rot-slot { position: absolute; left: 0; right: 0; top: 0; text-align: inherit; line-height: 1.06; }
.rot {
    display: inline-block; white-space: nowrap;
    color: var(--accent); letter-spacing: -.025em;
    transition: opacity .32s cubic-bezier(.3,.7,.3,1), transform .32s cubic-bezier(.3,.7,.3,1);
}
.rot.swap-out { opacity: 0; transform: translateY(-34%); }
.rot.swap-in  { opacity: 0; transform: translateY(34%); }

/* Photo can never move: the hero column reserves its own height */
@media (min-width: 901px) {
    .hero-shot img { aspect-ratio: 10 / 11; object-fit: cover; object-position: 50% 12%; }
}
@media (prefers-reduced-motion: reduce) { .rot { transition: none !important; } }
/* ---------- Motto band ---------- */
.motto-band { padding: clamp(52px, 8vw, 96px) 0; background: var(--paper); text-align: center; position: relative; }
.motto-band::before, .motto-band::after {
    content: ""; position: absolute; left: 50%; transform: translateX(-50%);
    width: min(420px, 60%); height: 1px; background: var(--line);
}
.motto-band::before { top: 0; }
.motto-band::after  { bottom: 0; }
.motto-quote {
    font-size: clamp(1.65rem, 4.2vw, 3rem); font-weight: 700; color: var(--ink);
    letter-spacing: -.03em; line-height: 1.14; margin: 8px 0 18px; text-wrap: balance;
}
.motto-em { color: var(--ink-faint); }
.motto-cite { font-style: normal; font-size: .92rem; color: var(--ink-faint); letter-spacing: .02em; }

/* ---------- Motto reveal ----------
   Each line rises from behind a hard edge, staggered, then a single slow sheen
   crosses the second line. Deliberately NOT a flash: rapidly flashing content
   is a photosensitivity risk and WCAG limits it, so this is one slow pass of
   light instead — same "expensive" feel, no strobing.

   Everything below is additive on top of the static design. If the animation
   never runs — reduced motion, old browser, JS blocked — the motto simply
   reads as it does now. */
.motto-line { display: block; overflow: hidden; padding-bottom: .08em; }
.motto-line > span { display: inline-block; will-change: transform; }

@media (prefers-reduced-motion: no-preference) {
    /* hidden only once we know the reveal can run */
    .reveal:not(.in-view) .motto-line > span { transform: translateY(115%); }
    .reveal:not(.in-view) .motto-cite { opacity: 0; }

    .reveal.in-view .motto-line > span {
        animation: motto-rise 1s cubic-bezier(.16, 1, .3, 1) both;
    }
    .reveal.in-view .motto-line:nth-child(2) > span { animation-delay: .13s; }

    .reveal.in-view .motto-cite {
        animation: motto-fade .7s ease-out .55s both;
    }

    /* the sheen: one pass across the grey line, after it has landed */
    .reveal.in-view .motto-em {
        background-image: linear-gradient(100deg,
            var(--ink-faint) 38%, #cfd3da 47%, #eef0f3 50%, #cfd3da 53%, var(--ink-faint) 62%);
        background-size: 300% 100%;
        background-position: 100% 0;
        -webkit-background-clip: text;
        background-clip: text;
        -webkit-text-fill-color: transparent;
        animation: motto-rise 1s cubic-bezier(.16, 1, .3, 1) .13s both,
                   motto-sheen 1.9s ease-out 1s both;
    }

    /* the hairlines draw outward from the centre as the band arrives */
    .motto-band:has(.in-view)::before,
    .motto-band:has(.in-view)::after {
        animation: motto-rule 1.1s ease-out both;
    }
    .motto-band:has(.reveal:not(.in-view))::before,
    .motto-band:has(.reveal:not(.in-view))::after { width: 0; }
}

@keyframes motto-rise { from { transform: translateY(115%); } to { transform: translateY(0); } }
@keyframes motto-fade { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
@keyframes motto-sheen { from { background-position: 100% 0; } to { background-position: 0 0; } }
@keyframes motto-rule { from { width: 0; } to { width: min(420px, 60%); } }

/* ---------- Calculators dropdown ----------
   Five calculators would never fit as nav tabs, and the nav has already
   overflowed once and pushed the language switcher off-screen. Opens on hover
   for mouse users and on tap for touch; the button is a real <button> so it
   works from the keyboard too. */
.has-sub { position: relative; }
.nav-sub-btn {
    display: flex; align-items: center; gap: 5px;
    background: none; border: 0; cursor: pointer; font: inherit;
    padding: 9px 13px; border-radius: 8px; color: var(--ink-soft);
    font-size: .92rem; font-weight: 500;
    transition: background .18s, color .18s;
}
.nav-sub-btn svg { width: 14px; height: 14px; transition: transform .2s; }
.nav-sub-btn:hover, .nav-sub-btn.is-here { background: var(--paper-alt); color: var(--ink); }
.nav-sub-btn[aria-expanded="true"] svg { transform: rotate(180deg); }

.nav-sub {
    position: absolute; top: calc(100% + 6px); left: 0; z-index: 60;
    min-width: 232px; margin: 0; padding: 6px; list-style: none;
    background: var(--paper); border: 1px solid var(--line); border-radius: 14px;
    box-shadow: var(--shadow-lg);
    opacity: 0; visibility: hidden; transform: translateY(-5px);
    transition: opacity .16s, transform .16s, visibility .16s;
}
.nav-sub li { margin: 0; }
.nav-sub a {
    display: block; padding: 10px 12px; border-radius: 9px;
    font-size: .9rem; font-weight: 500; color: var(--ink-soft); text-decoration: none;
    white-space: nowrap;
}
.nav-sub a:hover { background: var(--paper-alt); color: var(--ink); }
.nav-sub a[aria-current="page"] { background: var(--ink); color: #fff; }

.has-sub:hover .nav-sub,
.has-sub:focus-within .nav-sub,
.nav-sub-btn[aria-expanded="true"] + .nav-sub {
    opacity: 1; visibility: visible; transform: none;
}

/* In the mobile drawer the nav is a stacked list, so the submenu becomes an
   indented block rather than a floating panel — a popover positioned off a
   full-width row would fall outside the viewport. */
@media (max-width: 1120px) {
    .nav-sub {
        position: static; opacity: 1; visibility: visible; transform: none;
        box-shadow: none; border: 0; border-left: 2px solid var(--line);
        border-radius: 0; min-width: 0; margin: 2px 0 6px 12px; padding: 0 0 0 10px;
        display: none;
    }
    .nav-sub-btn { width: 100%; justify-content: space-between; padding: 13px 12px; font-size: 1rem; }
    .nav-sub-btn[aria-expanded="true"] + .nav-sub { display: block; }
    .has-sub:hover .nav-sub { display: none; }
    .nav-sub-btn[aria-expanded="true"] + .nav-sub { display: block; }
    .nav-sub a { padding: 11px 10px; }
}

/* ---------- Affordability calculator additions ---------- */
.calc-switch { font-size: .92rem; color: var(--ink-faint); margin-top: 14px; }
.calc-switch a { color: var(--ink); text-underline-offset: 3px; }
.calc-sub { margin-top: 34px; padding-top: 26px; border-top: 1px solid var(--line); }
.unit { font-weight: 400; color: var(--ink-faint); font-size: .86em; }
.ledger li i { font-style: normal; font-size: .78rem; color: var(--ink-faint); }

/* The four numbers an investor actually compares between properties. They sit
   in a grid rather than the ledger because they aren't a running total —
   they're the summary you'd read across two listings side by side. */
.metrics {
    display: grid; grid-template-columns: 1fr 1fr; gap: 1px;
    margin: 18px 0 16px; background: var(--line);
    border: 1px solid var(--line); border-radius: 14px; overflow: hidden;
}
.metrics > div { background: var(--paper); padding: 13px 15px; }
.metrics span { display: block; font-size: .74rem; font-weight: 600;
                letter-spacing: .04em; text-transform: uppercase; color: var(--ink-faint); }
.metrics b { display: block; margin-top: 4px; font-size: 1.25rem; font-weight: 700;
             letter-spacing: -.02em; font-variant-numeric: tabular-nums; }

/* Cash-at-closing is the number that surprises first-time buyers, so it gets
   its own block rather than being one more line in the list. */
.cash-box {
    margin: 18px 0 16px; padding: 15px 17px; border-radius: 14px;
    background: var(--paper-alt); border: 1px solid var(--line);
}
.cash-box > span { display: block; font-size: .82rem; font-weight: 600; color: var(--ink-soft); }
.cash-box > b {
    display: block; font-size: 1.7rem; font-weight: 700; letter-spacing: -.03em;
    margin: 3px 0 6px; font-variant-numeric: tabular-nums;
}
.cash-box small { display: block; font-size: .76rem; color: var(--ink-faint); line-height: 1.45; }

/* ---------- Brand mark sizing (LN-in-house monogram) ---------- */
.brand svg { width: 34px; height: 34px; }
.foot svg  { width: 36px; height: 36px; }

/* ---------- Interior page head ---------- */
.page-head { padding: clamp(44px, 7vw, 84px) 0 clamp(28px, 4vw, 44px); }
.page-head h1 { margin-bottom: 16px; }
.page-head .lede { max-width: 56ch; }

/* ---------- Calculator ---------- */
.calc-wrap { padding-top: 0; }
.calc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(28px, 4vw, 56px); align-items: start; }
.calc-inputs h2 { font-size: 1.4rem; margin-bottom: 22px; }
.calc-inputs .fg { margin-bottom: 22px; }
.calc-inputs label { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; }
.calc-inputs output { font-variant-numeric: tabular-nums; font-weight: 700; color: var(--ink); }
.hint { font-size: .78rem; color: var(--ink-faint); margin-top: 7px; line-height: 1.5; }

.money { display: flex; align-items: stretch; border: 1.5px solid var(--line); border-radius: var(--radius); overflow: hidden; transition: border-color .18s, box-shadow .18s; }
.money:focus-within { border-color: var(--accent); box-shadow: 0 0 0 4px var(--accent-tint); }
.money span { display: flex; align-items: center; padding: 0 4px 0 15px; color: var(--ink-faint); font-weight: 600; }
.money input { flex: 1; border: 0; padding: 13px 15px 13px 4px; min-height: 50px; font-family: var(--font); font-size: 1.05rem; font-weight: 600; color: var(--ink); background: transparent; font-variant-numeric: tabular-nums; }
.money input:focus { outline: 0; }

input[type="range"] { -webkit-appearance: none; appearance: none; width: 100%; height: 4px; border-radius: 3px; background: var(--line); margin-top: 12px; cursor: pointer; }
input[type="range"]::-webkit-slider-thumb { -webkit-appearance: none; width: 22px; height: 22px; border-radius: 50%; background: var(--accent); border: 3px solid #fff; box-shadow: 0 1px 5px rgba(16,19,26,.3); cursor: pointer; }
input[type="range"]::-moz-range-thumb { width: 22px; height: 22px; border-radius: 50%; background: var(--accent); border: 3px solid #fff; box-shadow: 0 1px 5px rgba(16,19,26,.3); cursor: pointer; }
input[type="range"]:focus-visible { outline: 3px solid var(--accent); outline-offset: 4px; }

.calc-result { position: sticky; top: 96px; }
.result-card { background: var(--paper); border: 1px solid var(--line); border-radius: 20px; padding: clamp(22px, 3vw, 32px); box-shadow: var(--shadow-lg); }
.result-head { text-align: center; padding-bottom: 22px; border-bottom: 1px solid var(--line); margin-bottom: 20px; }
.result-head > span { font-size: .76rem; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: var(--ink-faint); }
.result-big { font-size: clamp(2.1rem, 5.2vw, 3.1rem); font-weight: 700; color: var(--ink); letter-spacing: -.035em; line-height: 1.05; margin: 10px 0 6px; font-variant-numeric: tabular-nums; }
.result-big.negative { color: #c0392b; }
.result-sub { font-size: .88rem; color: var(--ink-faint); }

.ledger { list-style: none; margin-bottom: 24px; }
.ledger li { display: flex; justify-content: space-between; align-items: baseline; gap: 14px; padding: 9px 0; font-size: .93rem; border-bottom: 1px solid var(--line); }
.ledger li:last-child { border-bottom: 0; }
.ledger li b { font-variant-numeric: tabular-nums; font-weight: 600; color: var(--ink); white-space: nowrap; }
.ledger li i { font-style: normal; color: var(--ink-faint); font-size: .84em; }
.ledger li.neg b { color: var(--ink-soft); }
.ledger li.rule { border-top: 1px solid var(--line); margin-top: 4px; font-weight: 600; }
.ledger li.rule span, .ledger li.rule b { color: var(--ink); }
.ledger li.total { border-top: 2px solid var(--ink); margin-top: 8px; padding-top: 14px; font-size: 1.06rem; font-weight: 700; }
.ledger li.total span, .ledger li.total b { color: var(--ink); }

@media (max-width: 900px) {
    .calc-grid { grid-template-columns: 1fr; }
    .calc-result { position: static; }
}

/* ---------- Market report subscribe ---------- */
.sub-band { background: var(--paper-alt); }
.sub-grid { display: grid; grid-template-columns: 1.1fr .9fr; gap: clamp(28px, 4vw, 60px); align-items: center; }
.sub-form { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px; }
/* Email, ZIP and the dropdown all share one pill treatment. They were three
   different shapes before, because only input[type=email] had ever been styled. */
.sub-form input[type="email"],
.sub-form input[type="text"],
.sub-form select {
    padding: 14px 16px; min-height: 52px; font-family: var(--font); font-size: 1rem;
    border: 1.5px solid var(--line); border-radius: 100px;
    background: #fff; color: var(--ink); appearance: none;
}
.sub-form input[type="email"] { flex: 1 1 210px; }
.sub-form input[type="text"]  { flex: 0 1 120px; }   /* ZIP is five characters */
.sub-form select {
    flex: 1 1 210px; cursor: pointer; padding-right: 42px;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236d7585' stroke-width='2.4'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
    background-repeat: no-repeat; background-position: right 16px center; background-size: 18px;
}
.sub-form input:focus, .sub-form select:focus {
    outline: 0; border-color: var(--accent); box-shadow: 0 0 0 4px var(--accent-tint);
}
/* A field the visitor still has to fill gets a visible edge, not a silent reject. */
.sub-form .needs { border-color: var(--hot, #c0392b); background: #fff7f6; }
:root[data-theme="dark"] .sub-form .needs { background: #2e1e1c; }
.sub-err {
    flex: 1 1 100%; margin: 2px 0 0; font-size: .88rem; font-weight: 600;
    color: #ffb4a8;
}
.sub-form .btn { flex: 0 0 auto; }
.sub-note { font-size: .78rem; color: var(--ink-faint); margin-top: 12px; }
.sub-ok { margin-top: 16px; padding: 14px 16px; border-radius: var(--radius); background: #fff; border: 1px solid var(--line); font-size: .93rem; color: var(--ink); }
.sub-list { list-style: none; }
.sub-list li { display: flex; gap: 12px; align-items: flex-start; padding: 11px 0; border-bottom: 1px solid var(--line); font-size: .96rem; }
.sub-list li:last-child { border-bottom: 0; }
.sub-list svg { width: 20px; height: 20px; flex: none; color: var(--accent); margin-top: 2px; }
@media (max-width: 860px) { .sub-grid { grid-template-columns: 1fr; } }

/* ---------- Nav links ---------- */
.nav-links { display: flex; align-items: center; gap: 2px; list-style: none; }
.nav-links a { display: block; padding: 9px 13px; border-radius: 8px; color: var(--ink-soft); text-decoration: none; font-size: .92rem; font-weight: 500; transition: background .18s, color .18s; }
.nav-links a:hover, .nav-links a[aria-current="page"] { background: var(--paper-alt); color: var(--ink); }
.nav-toggle { display: none; background: none; border: 1.5px solid var(--line); border-radius: 8px; padding: 9px 11px; cursor: pointer; color: var(--ink); }
.nav-toggle svg { width: 20px; height: 20px; display: block; }
@media (max-width: 940px) {
    .nav-toggle { display: block; }
    .nav-links {
        position: absolute; top: 100%; left: 0; right: 0; flex-direction: column; align-items: stretch;
        background: #fff; border-bottom: 1px solid var(--line); padding: 8px 20px 16px; gap: 2px; display: none;
        box-shadow: var(--shadow);
    }
    .nav-links.open { display: flex; }
    .nav-links a { padding: 13px 12px; font-size: 1rem; }
}

.visually-hidden { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }

/* Turnstile widget spacing */
.cf-turnstile { margin: 4px 0 16px; min-height: 65px; }
.sub-form .cf-turnstile { flex: 1 1 100%; margin: 4px 0 0; }

/* Lisa's LN house logo (her approved artwork, watermark removed) */
.brand-mark { width: 40px; height: auto; flex: none; }
.foot .brand-mark { width: 46px; margin: 0 auto 18px; }
@media (max-width: 600px) { .brand-mark { width: 34px; } }

/* ---------- Recent closings marquee ---------- */
.sold-section { padding: clamp(56px, 8vw, 100px) 0; overflow: hidden; }
.sold-marquee { position: relative; overflow: hidden; padding: 4px 0 8px; }
.sold-marquee::before, .sold-marquee::after {
    content: ""; position: absolute; top: 0; bottom: 0; width: 90px; z-index: 3; pointer-events: none;
}
.sold-marquee::before { left: 0;  background: linear-gradient(90deg,  var(--paper), transparent); }
.sold-marquee::after  { right: 0; background: linear-gradient(270deg, var(--paper), transparent); }

/* The row is a REAL scroll container now, drifting via JS rather than a CSS
   transform. A transform animation cannot be scrolled - a visitor who missed a
   card had to wait 46 seconds for it to come back round. Native scrolling gives
   trackpad, wheel, touch swipe and keyboard for free, and the drift steps aside
   when the visitor takes over. */
.sold-scroller {
    overflow-x: auto; overflow-y: hidden;
    scrollbar-width: none; -ms-overflow-style: none;
    cursor: grab;
    touch-action: pan-x;      /* horizontal swipe belongs to this row */
}
/* Browsers natively drag links and images. Grabbing a card photo therefore
   started a ghost-image drag instead of scrolling the row - which is exactly
   what Bill hit. Turn native dragging off for the cards and their images. */
.sold-card, .sold-card img, .sold-card * {
    -webkit-user-drag: none;
    user-select: none; -webkit-user-select: none;
}
.sold-card img { pointer-events: none; }   /* the card handles the click, not the img */
.sold-scroller::-webkit-scrollbar { height: 0; display: none; }
.sold-scroller.dragging { cursor: grabbing; }
.sold-scroller:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; }

/* Arrows sit above the edge fades (which are z-index 3). Hidden on touch, where
   swiping is the obvious gesture and a button is just clutter. */
.sold-nav {
    position: absolute; top: 50%; transform: translateY(-50%); z-index: 4;
    width: 42px; height: 42px; border-radius: 50%; cursor: pointer;
    display: none; place-items: center;
    background: var(--paper); color: var(--ink);
    border: 1px solid var(--line); box-shadow: var(--shadow);
    transition: transform .15s, border-color .15s;
}
.sold-nav svg { width: 19px; height: 19px; }
.sold-nav:hover { border-color: var(--ink); transform: translateY(-50%) scale(1.08); }
.sold-nav:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.sold-prev { left: 6px; }
.sold-next { right: 6px; }
@media (hover: hover) and (pointer: fine) {
    .sold-nav { display: grid; }
}

.sold-track {
    display: flex; gap: 22px; width: max-content;
}
/* Pausing is handled in JS now, because the drift is scrollLeft rather than an
   animation. The old hover rule and @keyframes soldScroll are gone. */

.sold-card {
    flex: 0 0 auto; width: clamp(250px, 30vw, 320px);
    background: var(--paper); border: 1px solid var(--line); border-radius: 16px; overflow: hidden;
    box-shadow: var(--shadow-sm); transition: transform .25s, box-shadow .25s;
}
.sold-card:hover { transform: translateY(-5px); box-shadow: var(--shadow); }

.sold-photo { position: relative; aspect-ratio: 4/3; overflow: hidden; background: var(--paper-alt); }
.sold-photo img { width: 100%; height: 100%; object-fit: cover; transition: transform .7s cubic-bezier(.2,.7,.3,1); }
.sold-card:hover .sold-photo img { transform: scale(1.06); }

/* Until Bill's own exterior photos land: a clean architectural placeholder,
   deliberately abstract so it never implies a specific property. */
.sold-photo.no-photo {
    background:
        linear-gradient(160deg, #1d2129 0%, #2c313c 55%, #3a4150 100%);
}
.sold-photo.no-photo::before {
    content: ""; position: absolute; inset: 0; opacity: .5;
    background-image:
        linear-gradient(rgba(255,255,255,.06) 1px, transparent 1px),
        linear-gradient(90deg, rgba(255,255,255,.06) 1px, transparent 1px);
    background-size: 26px 26px;
}
.sold-photo.no-photo::after {
    content: "SOLD"; position: absolute; inset: 0;
    display: flex; align-items: center; justify-content: center;
    color: rgba(255,255,255,.34); font-size: 1.15rem; font-weight: 700; letter-spacing: .3em;
}

.sold-badge {
    position: absolute; left: 12px; top: 12px; z-index: 2;
    background: rgba(255,255,255,.94); color: var(--ink);
    font-size: .64rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
    padding: 6px 10px; border-radius: 100px; backdrop-filter: blur(6px);
}
.sold-body { padding: 18px 20px 20px; }
.sold-price { font-size: 1.45rem; font-weight: 700; color: var(--ink); letter-spacing: -.03em; line-height: 1; margin-bottom: 7px; }
.sold-city { font-size: .96rem; font-weight: 600; color: var(--ink-soft); margin-bottom: 3px; }
.sold-specs { font-size: .85rem; color: var(--ink-faint); }
.sold-note { text-align: center; font-size: .8rem; color: var(--ink-faint); margin-top: 26px; max-width: 64ch; margin-left: auto; margin-right: auto; line-height: 1.6; }

@media (prefers-reduced-motion: reduce) {
    /* No auto-drift, but still fully scrollable by hand — reduced motion means
       "don't move things at me", not "take my controls away". */
    .sold-scroller { padding-bottom: 10px; }
    .sold-marquee::before, .sold-marquee::after { display: none; }
}

/* Legal / prose pages */
.legal-body { padding-top: 0; }
.legal-body h2 { font-size: 1.2rem; margin: 30px 0 10px; }
.legal-body p, .legal-body li { font-size: .97rem; margin-bottom: 11px; }
.legal-body ul { padding-left: 22px; margin-bottom: 8px; }
.legal-body strong { color: var(--ink); }
.back-link { margin-top: 34px; }
.back-link a { color: var(--accent); font-weight: 600; text-decoration: none; }
.back-link a:hover { text-decoration: underline; }

/* lease card variant */
.sold-price .per { font-size: .62em; font-weight: 600; color: var(--ink-faint); letter-spacing: 0; }
.sold-photo.no-photo.is-lease::after { content: 'LEASED'; }
.sold-photo.no-photo.is-lease { background: linear-gradient(160deg, #23282f 0%, #333a45 55%, #444c5a 100%); }

/* ============================================================
   Closings cards, v2 — typographic instead of a fake photo box.
   A dark empty rectangle reads as a broken image; a card that was
   never meant to hold a photo reads as design. Cards with a real
   photo get .has-photo and show it.
   ============================================================ */

.sold-card {
    flex: 0 0 auto; width: clamp(240px, 28vw, 300px);
    background: var(--paper); border: 1px solid var(--line); border-radius: 16px;
    overflow: hidden; box-shadow: var(--shadow-sm);
    transition: transform .25s, box-shadow .25s, border-color .25s;
    display: flex; flex-direction: column;
    /* These became <a> elements when the Zillow links went on, which pulled in
       the browser's default link styling - underlined prices and tinted specs.
       Cards must look like cards. */
    text-decoration: none; color: inherit;
}
.sold-card:hover, .sold-card:focus-visible { text-decoration: none; }
.sold-card:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
.sold-card:hover { transform: translateY(-5px); box-shadow: var(--shadow); border-color: #d3d8e0; }

/* --- no-photo: a clean typographic panel --- */
.sold-photo.no-photo {
    position: relative; aspect-ratio: auto; min-height: 0;
    background: var(--paper-alt);
    border-bottom: 1px solid var(--line);
    padding: 18px 20px 16px;
    display: flex; align-items: flex-start;
}
.sold-photo.no-photo::before,
.sold-photo.no-photo::after { content: none; }     /* kill the grid + SOLD/LEASED ghost text */

/* thin status rule along the top of every card */
.sold-photo.no-photo { border-top: 3px solid var(--ink); }
.sold-photo.no-photo.is-lease { border-top-color: var(--ink-faint); background: var(--paper-alt); }

.sold-badge {
    position: static; background: transparent; backdrop-filter: none;
    padding: 0; border-radius: 0;
    color: var(--ink-faint); font-size: .64rem; font-weight: 700;
    letter-spacing: .12em; text-transform: uppercase;
}

.sold-body { padding: 18px 20px 22px; flex: 1; display: flex; flex-direction: column; justify-content: flex-end; }
.sold-price { font-size: 1.72rem; font-weight: 700; color: var(--ink); letter-spacing: -.035em; line-height: 1; margin-bottom: 9px; }
.sold-city { font-size: 1rem; font-weight: 600; color: var(--ink); margin-bottom: 4px; }
.sold-specs { font-size: .85rem; color: var(--ink-faint); }

/* --- has-photo: real, owned photography --- */
.sold-card.has-photo .sold-photo {
    aspect-ratio: 4/3; padding: 0; border-top: 0; display: block; overflow: hidden;
}
.sold-card.has-photo .sold-photo img {
    width: 100%; height: 100%; object-fit: cover; display: block;
    transition: transform .7s cubic-bezier(.2,.7,.3,1);
}
.sold-card.has-photo:hover .sold-photo img { transform: scale(1.06); }
.sold-card.has-photo .sold-badge {
    position: absolute; left: 12px; top: 12px; z-index: 2;
    background: rgba(255,255,255,.94); color: var(--ink);
    padding: 6px 10px; border-radius: 100px; backdrop-filter: blur(6px);
}
.sold-card.has-photo .sold-body { justify-content: flex-start; }

.sold-marquee::before, .sold-marquee::after { width: 70px; }
.sold-note strong { color: var(--ink); }
.photo-credit { text-align: center; font-size: .74rem; color: var(--ink-faint); margin-top: 8px; }

/* ============================================================
   Featured sale — full-bleed, her listing-side Covina sale.
   Real photography of a real closing: the strongest proof on
   the page, so it gets the most visual weight after the hero.
   ============================================================ */
.feature-sale {
    position: relative; overflow: hidden;
    min-height: min(82vh, 720px);
    display: flex; align-items: flex-end;
    padding: 0 0 clamp(36px, 6vw, 72px);
    background: var(--ink);
}
.feature-sale-media { position: absolute; inset: 0; z-index: 0; }
.feature-sale-media img {
    width: 100%; height: 100%; object-fit: cover; object-position: 50% 52%;
    animation: featureZoom 30s ease-in-out infinite alternate;
    will-change: transform;
}
@keyframes featureZoom {
    0%   { transform: scale(1.02); }
    100% { transform: scale(1.11); }
}
/* readability wash — dark at the bottom where the text sits, clear over the sky */
/* The scrim now weights toward the BOTTOM-LEFT corner instead of dimming the
   photo's full width. The copy stays legible where it sits, and the middle and
   right of the house - the part worth looking at - stays clear. */
.feature-sale::before {
    content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
    background:
        /* a whisper along the top so the nav has something to sit against */
        linear-gradient(180deg, rgba(10,12,16,.30) 0%, rgba(10,12,16,0) 26%),
        /* the working scrim: dense bottom-left, gone by two-thirds across */
        linear-gradient(72deg,
            rgba(10,12,16,.90) 0%,
            rgba(10,12,16,.72) 24%,
            rgba(10,12,16,.34) 46%,
            rgba(10,12,16,0)   66%),
        /* a low band so the base of the photo still grounds into the page */
        linear-gradient(180deg, rgba(10,12,16,0) 64%, rgba(10,12,16,.52) 100%);
}
@media (max-width: 700px) {
    /* A diagonal on a phone leaves the right-hand words sitting on bright sky,
       so narrow screens keep the full-width treatment. */
    .feature-sale::before {
        background: linear-gradient(180deg,
            rgba(10,12,16,.34) 0%, rgba(10,12,16,0) 32%,
            rgba(10,12,16,.66) 70%, rgba(10,12,16,.90) 100%);
    }
}
/* Text block sits in the BOTTOM-LEFT corner, not across the middle. The house is
   the thing worth looking at and the copy was sitting on top of the front door.
   Capped width so it never creeps back toward the centre on a wide screen. */
.feature-sale-inner {
    position: relative; z-index: 2; color: #fff;
    max-width: 34rem; text-align: left;
    /* This element is ALSO a .container, which sets `margin: 0 auto`. Overriding
       only margin-right left margin-left:auto in place, so it stayed centred.
       Both sides have to be stated. */
    margin-left: 0;
    margin-right: auto;
}
@media (min-width: 1400px) { .feature-sale-inner { max-width: 38rem; } }
/* On a phone the photo is narrow enough that a corner block would be cramped,
   so it goes back to full width there. */
@media (max-width: 700px) { .feature-sale-inner { max-width: none; } }

/* This tag and the CTA below it sit ON THE PHOTO, which is dark in both themes.
   So their text is a LITERAL dark value, not var(--ink) — that variable flips to
   near-white in dark mode and made "JUST SOLD - REPRESENTED THE SELLER"
   invisible on a white pill. Theme-independent is the correct answer here, not
   a dark-mode override. */
.feature-tag {
    display: inline-block; margin-bottom: 16px;
    background: #fff; color: #10131a;
    font-size: .68rem; font-weight: 700; letter-spacing: .14em; text-transform: uppercase;
    padding: 8px 15px; border-radius: 100px;
}
.feature-price {
    color: #fff; font-size: clamp(2.6rem, 8vw, 5.6rem); font-weight: 700;
    letter-spacing: -.04em; line-height: .95; margin-bottom: 12px;
    text-shadow: 0 2px 24px rgba(0,0,0,.45);
}
.feature-place {
    font-size: clamp(1rem, 2vw, 1.28rem); font-weight: 600;
    color: rgba(255,255,255,.94); margin-bottom: 14px;
    text-shadow: 0 1px 12px rgba(0,0,0,.5);
}
.feature-line {
    font-size: clamp(.95rem, 1.6vw, 1.08rem); color: rgba(255,255,255,.82);
    max-width: 48ch; margin-bottom: 26px;
    text-shadow: 0 1px 12px rgba(0,0,0,.5);
}
.feature-cta { background: #fff; color: #10131a; }
.feature-cta:hover { background: #f0f1f4; color: #000; box-shadow: 0 10px 30px rgba(0,0,0,.35); }

@media (max-width: 700px) {
    .feature-sale { min-height: min(74vh, 560px); padding-bottom: 30px; }
    .feature-sale-media img { object-position: 52% 48%; }
    .feature-line { max-width: none; }
}
@media (prefers-reduced-motion: reduce) {
    .feature-sale-media img { animation: none; transform: scale(1.04); }
}

/* ============================================================
   CJK typography — Chinese pages
   Negative letter-spacing and tight leading look wrong on Han
   characters, and the right font differs by script.
   ============================================================ */
body.cjk {
    line-height: 1.78;
    letter-spacing: 0;
    font-size: 17px;
}
body.cjk-tc {
    font-family: 'Inter', 'PingFang TC', 'Hiragino Sans CNS', 'Microsoft JhengHei',
                 'Noto Sans TC', -apple-system, sans-serif;
}
body.cjk-sc {
    font-family: 'Inter', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei',
                 'Noto Sans SC', -apple-system, sans-serif;
}
body.cjk h1, body.cjk h2, body.cjk h3,
body.cjk .motto-quote, body.cjk .feature-price, body.cjk .sold-price, body.cjk .n {
    letter-spacing: 0;
    line-height: 1.28;
}
body.cjk h1 { line-height: 1.22; }
body.cjk .feature-price, body.cjk .n { line-height: 1.05; }
body.cjk .eyebrow { letter-spacing: .1em; }
body.cjk .lede, body.cjk p, body.cjk li { line-height: 1.85; }
/* Han characters read better slightly smaller than Latin at the same optical size */
body.cjk h1 { font-size: clamp(2.1rem, 5.4vw, 4rem); }
body.cjk .rot { font-size: min(0.94em, 6.4vw, 3rem) !important; }
body.cjk .btn { letter-spacing: .02em; }

/* Language picker */
.lang-pick { display: inline-flex; border: 1px solid var(--line); border-radius: 100px; overflow: hidden; margin-right: 4px; }
.lang-pick a {
    padding: 7px 11px; font-size: .78rem; font-weight: 600; color: var(--ink-faint);
    text-decoration: none; transition: background .18s, color .18s;
}
.lang-pick a:hover { background: var(--paper-alt); color: var(--ink); }
.lang-pick a[aria-current="true"] { background: var(--ink); color: #fff; }
@media (max-width: 620px) { .lang-pick { margin-right: 0; } .lang-pick a { padding: 7px 9px; font-size: .74rem; } }

.lang-note { margin-top: 18px; padding: 14px 16px; background: var(--paper-alt); border-radius: var(--radius); font-size: .9rem; }
.lang-note strong { color: var(--ink); }
.reviews-more { text-align: center; margin-top: 30px; }
.reviews-more a { color: var(--accent); font-weight: 600; text-decoration: none; }
.reviews-more a:hover { text-decoration: underline; }

/* Notices on reference pages */
.notice { background: var(--paper-alt); border-left: 3px solid var(--ink-faint); padding: 16px 18px; border-radius: 0 var(--radius) var(--radius) 0; margin: 26px 0; font-size: .95rem; }
.notice strong { color: var(--ink); }
.notice-key { border-left-color: var(--accent); background: #fdf6e7; }
.legal-body table th:first-child, .legal-body table td:first-child { width: 34%; }
.legal-body table td em { color: var(--ink-faint); font-size: .9em; }
.legal-body .btn { margin: 6px 0 4px; }
/* Vertical numbered steps (buyer process) */
.steps-vert { display: flex; flex-direction: column; gap: 4px; }
.sv { display: flex; gap: 16px; align-items: flex-start; padding: 14px 0; border-bottom: 1px solid var(--line); }
.sv:last-child { border-bottom: 0; }
.sv b {
    flex: none; width: 34px; height: 34px; border-radius: 50%;
    display: flex; align-items: center; justify-content: center;
    background: var(--ink); color: #fff; font-size: .9rem; font-weight: 700;
}
.sv h3 { font-size: 1.02rem; margin-bottom: 4px; }
.sv p { font-size: .93rem; color: var(--ink-soft); margin: 0; }
.city-en { font-size: .78rem; color: var(--ink-faint); font-weight: 500; }

/* ============================================================
   Nav layout v3
   The previous version set nav-in to nowrap while the page clips
   horizontal overflow, so at ~1000px the language switcher and phone
   were pushed past the edge and vanished. Now: the horizontal tab row
   only appears when there is genuinely room for everything; below that
   the tabs collapse into the hamburger and the switcher + phone stay
   visible. nav-right can never be pushed off-screen.
   ============================================================ */
.nav-in { display: flex; align-items: center; gap: 14px; flex-wrap: nowrap; }
.brand { flex: 0 0 auto; min-width: 0; }
.nav-links { margin: 0 auto; gap: 2px; }
.nav-links a { white-space: nowrap; }
.nav-right { flex: 0 0 auto; margin-left: auto; display: flex; align-items: center; gap: 10px; }
.nav-toggle { display: none; }

/* Below 1120px there isn't room for brand + 5 tabs + switcher + phone,
   so the tabs move into the menu rather than shoving anything off-screen. */
@media (max-width: 1120px) {
    .nav-toggle { display: block; order: -1; }
    .nav-links {
        position: absolute; top: 100%; left: 0; right: 0; margin: 0;
        flex-direction: column; align-items: stretch;
        background: #fff; border-bottom: 1px solid var(--line);
        padding: 8px 20px 16px; gap: 2px; display: none;
        box-shadow: var(--shadow); z-index: 60;
    }
    .nav-links.open { display: flex; }
    .nav-links a { white-space: normal; padding: 13px 12px; font-size: 1rem; }
}
@media (max-width: 860px) { .brand-text span { display: none; } }
@media (max-width: 560px) { .nav-phone { display: none; } }   /* switcher always stays */

/* ── Wire-fraud warning ──────────────────────────────────────────────────
   SPF and DMARC stop someone forging this domain. They do nothing about a
   lookalike domain the criminal legitimately owns, which is the commoner
   attack and the one that empties a buyer's account days before closing.
   The only thing that defeats that is the client having been told, in
   advance, that Lisa never sends wire instructions by email — so it is said
   plainly rather than buried in fine print. */
.wire-note { padding: 8px 0 56px; }
.wire-card {
    display: flex; gap: 20px; align-items: flex-start;
    border: 1px solid var(--line); border-left: 4px solid var(--bad);
    border-radius: var(--r-lg, 18px); background: var(--paper);
    padding: 26px 28px; box-shadow: var(--shadow-sm);
}
.wire-icon { flex: none; color: var(--bad); }
.wire-icon svg { width: 34px; height: 34px; display: block; }
.wire-card h2 { font-size: 1.32rem; margin: 0 0 10px; letter-spacing: -.02em; }
.wire-card p { margin: 0 0 10px; color: var(--ink-soft); line-height: 1.62; }
.wire-card p:last-child { margin-bottom: 0; }
.wire-card .wire-do {
    background: var(--paper-alt); border-radius: 10px;
    padding: 12px 14px; margin-top: 14px; color: var(--ink);
}
.wire-card a { color: inherit; font-weight: 600; text-underline-offset: 3px; }

/* Footer line — quieter, but on every page */
.foot-wire {
    max-width: 62ch; margin: 14px auto 0; font-size: .82rem; line-height: 1.55;
    color: var(--ink-faint);
}
.foot-wire strong { color: var(--bad); }
.foot-wire a { color: inherit; font-weight: 600; }

@media (max-width: 620px) {
    .wire-card { flex-direction: column; gap: 12px; padding: 20px; }
    .wire-icon svg { width: 28px; height: 28px; }
    .wire-card h2 { font-size: 1.15rem; }
}
