// Halifax Now v3 — shared primitives + Shell nav const { useState, useEffect, useRef } = React; const D = window.V3_DATA; const T = { paper:'#f4efe6', ink:'#0f0f0f', red:'#c23a1e', acid:'#e8ff00', soft:'#e8d8cc', muted:'#6b6459' }; function photoUrl(seed, w=800, h=600) { return `https://picsum.photos/seed/${encodeURIComponent(seed)}/${w}/${h}`; } function V3Img({ seed, hue=220, style, variant='halftone' }) { const url = photoUrl(seed); if (variant === 'duotone') return (
); return (
); } function SecHd({ title, italic, count, link='See all', onLink }) { return (
{count && {count}}

{title}{italic && {italic}}

); } function Chip({ label, on, onClick }) { return ; } function BackBtn({ onClick, label='← Back' }) { return ; } function InfoBox({ label, value, accent }) { return (
{label}
{value}
); } function Shell({ page, setPage, flagOn }) { const mainNav = [ { id:'home', label:'Home' }, { id:'tonight', label:'Tonight' }, { id:'browse', label:'Browse' }, { id:'map', label:'Map' }, { id:'venues', label:'Venues' }, ]; const newNav = [ { id:'runclubs', label:'Run Clubs' }, { id:'happyhours', label:'Happy Hour' }, { id:'patios', label:'Patios' }, ]; return (
{/* masthead */}
THU APR 23 · 2026
v3 · in development
setPage('home')} style={{ textAlign:'center', fontFamily:"'Playfair Display',serif", fontWeight:900, fontSize:48, lineHeight:0.9, letterSpacing:'-0.02em', fontStyle:'italic', whiteSpace:'nowrap', cursor:'pointer' }}> Halifax&Now
What's on
Halifax, NS
{/* nav bar */}
{mainNav.map(n => ( setPage(n.id)} style={{ fontFamily:"'Space Grotesk',sans-serif", fontSize:12, fontWeight:700, letterSpacing:'0.14em', textTransform:'uppercase', color:page===n.id?T.ink:T.paper, background:page===n.id?T.paper:'transparent', padding:'12px 18px', borderRight:`1px solid rgba(255,255,255,0.12)`, cursor:'pointer' }}>{n.label} ))} {/* new sections — lit up when flag is on, ghosted when off */}
{newNav.map(n => ( setPage(n.id)} style={{ fontFamily:"'Space Grotesk',sans-serif", fontSize:12, fontWeight:700, letterSpacing:'0.14em', textTransform:'uppercase', color:page===n.id?T.ink:T.acid, background:page===n.id?T.acid:'transparent', padding:'12px 18px', borderRight:`1px solid rgba(255,255,255,0.12)`, cursor:'pointer' }}>{n.label} ))}
setPage('submit')} style={{ fontFamily:"'Space Grotesk',sans-serif", fontSize:12, fontWeight:700, letterSpacing:'0.14em', textTransform:'uppercase', background:T.acid, color:T.ink, padding:'12px 18px', cursor:'pointer', marginLeft:'auto' }}>+ Submit
{/* flag-off hint */} {!flagOn && (
🚧 Run Clubs · Happy Hours · Patios hidden — enable via Tweaks panel
)}
); } Object.assign(window, { T, D, photoUrl, V3Img, SecHd, Chip, BackBtn, InfoBox, Shell, useState, useEffect, useRef });