/* Search, Map, Calendar screens */ const { useState, useMemo } = React; // ─── SEARCH / DISCOVER ──────────────────────────────────────────── const SearchScreen = ({ tweaks, isMobile, nav, initialFilters }) => { const cardVariant = tweaks.cardStyle || "rich"; const dense = tweaks.density || "comfortable"; const currency = tweaks.currency || "INR"; const friends = tweaks.showFriends !== false; const [q, setQ] = useState(""); const [filters, setFilters] = useState(initialFilters || { category:null, when:null, price:null }); const results = useMemo(() => { let r = DATA.events; if (q) r = r.filter(e => e.title.toLowerCase().includes(q.toLowerCase()) || e.tag.toLowerCase().includes(q.toLowerCase())); if (filters.category) r = r.filter(e => e.category === filters.category); if (filters.when === "tonight") r = r.filter(e => e.date === "13 Jun"); if (filters.when === "weekend") r = r.filter(e => ["14 Jun","15 Jun"].includes(e.date)); if (filters.price === "free") r = r.filter(e => e.price === 0); if (filters.price === "paid") r = r.filter(e => e.price > 0); return r; }, [q, filters]); return (
{/* Search bar */}
setQ(e.target.value)} placeholder="Search events, artists, venues…" style={{ width:"100%", padding:"12px 14px 12px 38px", background:"var(--surface)", border:"1px solid var(--line)", borderRadius:"var(--radius)", color:"var(--ink)", fontSize:14, outline:"none", fontFamily:"inherit" }} />
{/* Filter chips */}
{[ { key:"when", val:"tonight", label:"Tonight" }, { key:"when", val:"weekend", label:"This weekend" }, { key:"price", val:"free", label:"Free" }, { key:"price", val:"paid", label:"Paid" }, ...DATA.categories.slice(0,5).map(c => ({ key:"category", val:c.label, label:c.label })), ].map((c, i) => { const active = filters[c.key] === c.val; return ( ); })}

{results.length} events

Sorted by relevance
{results.length === 0 ? (
No events match your filters.
) : (
{results.map(ev => ( nav("detail", ev.id)} /> ))}
)}
); }; // ─── MAP / NEARBY ───────────────────────────────────────────────── const MapScreen = ({ tweaks, isMobile, nav }) => { const currency = tweaks.currency || "INR"; const [selected, setSelected] = useState(DATA.events[0].id); const ev = DATA.events.find(e => e.id === selected); return (
{/* Map background — stylized SVG grid */}
{/* Stylized streets */} {/* Water/park areas */} {/* Neighborhood labels */} {[ { x:150, y:280, name:"BANDRA" }, { x:480, y:340, name:"COLABA" }, { x:340, y:560, name:"WORLI" }, { x:620, y:200, name:"ANDHERI" }, ].map(n => ( {n.name} ))} {/* Pins */} {DATA.events.slice(0, 14).map((e, i) => { const positions = [ [25,40],[55,30],[40,55],[70,25],[20,65],[50,70],[80,50],[35,35], [60,60],[15,30],[75,75],[45,15],[30,80],[65,45], ]; const [x,y] = positions[i % positions.length]; const isSel = selected === e.id; return ( ); })}
{/* Top filter overlay */}
Bandra, Mumbai · 5 km radius
{/* Bottom event card */}
{ev.tag}
{ev.title}
{ev.date} · {ev.time}
{ev.venue} · 1.2 km
{/* Side list (desktop only) */} {!isMobile && (

14 events nearby

Sorted by distance
{DATA.events.slice(0,14).map(e => (
setSelected(e.id)} style={{ cursor:"pointer", padding:"10px 0", borderBottom:"1px solid var(--line)", display:"flex", gap:10, background: selected===e.id?"color-mix(in oklab, var(--primary) 8%, transparent)":"transparent", margin:"0 -14px", paddingLeft:14, paddingRight:14 }}>
{e.title}
{e.date} · {fmtPrice(e.price, currency)}
))}
)}
); }; // ─── CALENDAR ───────────────────────────────────────────────────── const CalendarScreen = ({ tweaks, isMobile, nav }) => { const currency = tweaks.currency || "INR"; const days = [ { date:"14", dow:"Sat", label:"Tomorrow", count: 5 }, { date:"15", dow:"Sun", label:"This Sunday", count: 4 }, { date:"19", dow:"Thu", label:"Next Thu", count: 1 }, { date:"20", dow:"Fri", label:"Next Fri", count: 1 }, { date:"21", dow:"Sat", label:"Next Sat", count: 2 }, { date:"22", dow:"Sun", label:"Next Sun", count: 1 }, ]; const [selectedDay, setSelectedDay] = useState("14"); const dayEvents = DATA.events.filter(e => e.date.includes(` ${selectedDay} Jun`) || e.date.includes(`${selectedDay} Jun`)); const Hour = ({ hour, evs }) => (
{hour}
{evs.length === 0 ? (
) : evs.map(e => (
nav("detail", e.id)} style={{ cursor:"pointer", padding:"10px 14px", background:`oklch(0.92 0.05 ${(e.id.charCodeAt(0)*23)%360})`, color:"#000", borderRadius:"var(--radius-sm)", borderLeft:"3px solid var(--primary)", display:"flex", justifyContent:"space-between", alignItems:"center" }}>
{e.title}
{e.time} · {e.venue}
{fmtPrice(e.price, currency)}
))}
); // bucket events by hour const hours = ["6 PM","7 PM","8 PM","9 PM","10 PM","11 PM"]; const bucketed = hours.map(h => ({ h, evs: dayEvents.filter(e=>{ const evHour = parseInt(e.time); const hHour = parseInt(h); return evHour === hHour || (Math.abs(evHour-hHour)===0); }).slice(0, 2) })); return (
Your week

June 2026

{/* Day strip */}
{days.map(d => { const active = selectedDay === d.date; return ( ); })}
{/* Day timeline */}
{selectedDay} June · {dayEvents.length} events
{bucketed.map(b => )}
); }; window.SearchScreen = SearchScreen; window.MapScreen = MapScreen; window.CalendarScreen = CalendarScreen;