// ============================================================ // Listing.html — the detail page. // Hero, gallery, editorial description, sticky info panel, map, // "Featured in" guides (same GuideCard system), related nearby. // The structured layer beneath the guide experience. // ============================================================ const { LISTINGS } = window.QC; function ListingDetail() { const [dataVersion, setDataVersion] = React.useState(0); React.useEffect(() => { const handler = () => setDataVersion((v) => v + 1); window.addEventListener("qc:data-loaded", handler); return () => window.removeEventListener("qc:data-loaded", handler); }, []); const id = param("id") || LISTINGS[0].id; const l = window.QC.getListing(id) || LISTINGS[0]; const guides = window.QC.guidesForListing(l.id); const related = window.QC.relatedListings(l.id, 3); const gallery = (l.gallery && l.gallery.length ? l.gallery : []); return ( <> {/* HERO */}
{l.photo ?
:
{l.name[0]}
}
Directory / {l.category} / {l.city}
{l.kicker}

{l.name}

{l.descriptor}

{/* MAIN */}
{/* gallery */} {gallery.length > 0 && (
{l.name}
{gallery.length > 3 && ( +{gallery.length - 3} photos )}
)} {/* meta row */}
{l.neighborhood} · {l.city} {l.price && {l.price}} {l.tags.map((t) => {t})}
{/* editorial */}

{l.descriptor}

{l.editorial}

{l.name} sits in {l.neighborhood}, one of the QC’s most characterful pockets — a short walk or drive from the riverfront and easy to fold into a longer evening. It’s the kind of place that shows up again and again on our curated guides, and once you’ve been, you’ll see why.

{/* map */}
/ On the map
{l.lat && l.lng ?