// 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 (
{/* 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 });