// ============================================================ // Guide.html — single guide template. // Hero, atmospheric intro, quick-nav, the reusable FeatureBlock // system (kicker / name / image / location / description / View // Listing), then Related Guides + Related Listings + Explore Nearby. // ============================================================ function GuidePage() { 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 GUIDES = window.QC.GUIDES; const id = param("id") || GUIDES[0].id; const g = window.QC.getGuide(id) || GUIDES[0]; const entries = window.QC.listingsInGuide(g.id); const relatedGuides = window.QC.relatedGuides(g.id, 3); // "explore more nearby": listings NOT already in this guide const inGuide = new Set(g.listings); const nearby = window.QC.LISTINGS.filter((l) => !inGuide.has(l.id)).slice(0, 3); return ( <> {/* HERO */}
{g.photo ?
:
{g.title.replace("Best ","")[0]}
}
Guides / {g.title}
Guide · {g.count} spots · updated this week

{g.title} in the QC

{g.descriptor}

We Are Quad Cities · Guides
{/* ATMOSPHERIC INTRO + QUICK NAV */}
/ The brief

{g.intro}

In this guide — {g.count} places {entries.map((l) => ( {l.name} ))}
{/* FEATURE BLOCKS — the reusable guide entry system */}
{entries.map((l, i) => )}
{/* RELATED GUIDES */}
{relatedGuides.map((rg) => )}
{/* EXPLORE MORE NEARBY — listings */}
{nearby.map((l) => )}
); } ReactDOM.createRoot(document.getElementById("root")).render();