// Home page — hero, search, featured listings, about strip, stats, services, // testimonials, recent sold, insights teaser, CTA panel. const HOME_HEROES = { skyline: "https://images.unsplash.com/photo-1609825488888-3a766db05542?w=2200&q=80&auto=format&fit=crop", interior: "https://images.unsplash.com/photo-1600596542815-ffad4c1539a9?w=2200&q=80&auto=format&fit=crop", exterior: "https://images.unsplash.com/photo-1600585154340-be6161a56a0c?w=2200&q=80&auto=format&fit=crop", }; const HomePage = ({ setRoute, openListing, faves, toggleFav, showToast, tweaks, t }) => { const tr = t || ((k) => k); useLucide(); const featured = SITE_DATA.listings.filter(l => l.featured); const recentSold = SITE_DATA.sold.slice(0, 6); const [activeTesti, setActiveTesti] = React.useState(0); const heroVariant = (tweaks && tweaks.heroVariant) || 'skyline'; return (
{/* HERO */}
Vancouver
{tr('hero.eyebrow')}

{tr('hero.title1')}
{tr('hero.title2')}

{SITE_DATA.stats.map(s => (
{s.value} {s.label}
))}
{/* FEATURED */}
{tr('featured.eyebrow')}

{tr('featured.title')}

{tr('featured.lead')}

{/* ABOUT STRIP */}
Steffanie Ting
About Steffanie

I love working with people. I love working in real estate.

{SITE_DATA.agent.bio}

Whether you're a first-time buyer, a homeowner ready to sell, or a developer bringing a new project to market, my promise is the same: tell you what you need to hear, not what you want to hear — and make the process easy and enjoyable along the way.

— Steffanie
{/* SERVICES */}
What I do

Full-service, end to end.

Six ways I help clients. Each one is supported by twenty years of relationships — inspectors, mortgage brokers, stagers, contractors, lawyers — who do good work and pick up the phone.

{SITE_DATA.services.map(s => ( ))}
{/* STATS BAND */}
By the numbers

Twenty years.
One market, known inside out.

These numbers matter because they translate. Experience means I've seen this market in every weather — and I know where the offers actually need to land.

{SITE_DATA.stats.map(s => (
{s.value} {s.label}
))}
{/* RECENT SOLD */}
Recently sold

Closed deals, on the record.

A selection of recent closings across Metro Vancouver.

{recentSold.map(s => ( showToast(s.daysOnMarket != null ? `Sold for ${formatFullPrice(s.soldPrice)} in ${s.daysOnMarket} days` : `Sold for ${formatFullPrice(s.soldPrice)}`)} /> ))}
{/* TESTIMONIALS */}
In their words

What clients say.

"

{SITE_DATA.testimonials[activeTesti].quote}

{SITE_DATA.testimonials[activeTesti].author} {SITE_DATA.testimonials[activeTesti].role}
{activeTesti + 1} / {SITE_DATA.testimonials.length}
{/* INSIGHTS TEASER */}
Market insights

What I'm watching this quarter.

No fluff. Just clear-eyed market commentary, neighbourhood deep-dives, and the things I'd tell a friend over coffee.

{SITE_DATA.insights.slice(0, 2).map(i => (
setRoute('insights')}>
{i.title}
{i.category} · {new Date(i.date).toLocaleDateString('en-CA', { month: 'long', day: 'numeric', year: 'numeric' })} · {i.readTime} min read

{i.title}

{i.excerpt}

))}
{/* CTA PANEL */}
); }; const FeaturedListings = ({ listings, openListing, faves, toggleFav }) => { if (listings.length === 0) return null; return (
{listings.map(l => ( ))}
); }; window.FeaturedListings = FeaturedListings; const ValuationCta = ({ showToast, setRoute }) => { const [form, setForm] = React.useState({ address: '', name: '', email: '' }); const [err, setErr] = React.useState({}); const [sending, setSending] = React.useState(false); const submit = async (e) => { e.preventDefault(); const next = {}; if (!form.address) next.address = 'Property address required'; if (!form.name) next.name = 'Your name please'; if (!form.email || !form.email.includes('@')) next.email = 'Valid email please'; setErr(next); if (Object.keys(next).length !== 0) return; setSending(true); const ok = await window.sendLead({ subject: `Home valuation request — ${form.name}`, replyTo: form.email, fields: { Request: 'Home valuation (CMA)', Name: form.name, Email: form.email, Property_address: form.address, }, }); setSending(false); if (ok) { showToast("Got it — Steffanie will be in touch within 24 hours."); setForm({ address: '', name: '', email: '' }); } else { showToast(`Couldn't send just now — please email ${SITE_DATA.agent.email} or call ${SITE_DATA.agent.phone}.`); } }; return (
Free · No obligation

What's your home worth in today's market?

A real CMA, not an automated estimate. I'll pull recent comps in your building or block, factor in your home's specific features, and send you a candid range within 24 hours.

setForm({ ...form, address: e.target.value })} /> {err.address &&
{err.address}
}
setForm({ ...form, name: e.target.value })} /> {err.name &&
{err.name}
}
setForm({ ...form, email: e.target.value })} /> {err.email &&
{err.email}
}
); }; window.ValuationCta = ValuationCta; window.HomePage = HomePage;