/* Main app shell: mobile + desktop split, tweaks panel, routing */ const { useState, useEffect, useMemo } = React; // ─── DEVICE FRAMES ──────────────────────────────────────────────── const PhoneFrame = ({ children, label }) => (
{/* Status bar */}
9:41 {[3,5,7,9].map((h,i)=>)}
{/* Content with status bar offset */}
{children}
{label}
); const DesktopFrame = ({ children, label }) => (
{/* Title bar */}
tickettape.io
{children}
{label}
); // ─── MOBILE APP CONTENT ────────────────────────────────────────── const MobileApp = ({ tweaks, route, navigate }) => { const [bottomNav, setBottomNav] = useState("home"); const screenMap = { home: HomeScreen, search: SearchScreen, map: MapScreen, calendar: CalendarScreen, detail: DetailScreen, booking: BookingScreen, tickets: TicketsScreen, profile: ProfileScreen, ai: AIScreen, notifications: NotificationsScreen, organiser: OrganiserScreen, create: CreateEventScreen, }; const Screen = screenMap[route.screen] || HomeScreen; // map bottom nav clicks to navigate useEffect(() => { if (["home","search","map","tickets","profile"].includes(route.screen)) setBottomNav(route.screen); }, [route.screen]); const showBottomNav = !["detail","booking","ai","create"].includes(route.screen); const showTopBar = ["home"].includes(route.screen); return (
{showTopBar && {}} onAI={()=>navigate("ai")} />}
{showBottomNav && navigate(id)} />}
); }; // ─── DESKTOP APP CONTENT ───────────────────────────────────────── const DesktopApp = ({ tweaks, route, navigate }) => { const screenMap = { home: HomeScreen, search: SearchScreen, map: MapScreen, calendar: CalendarScreen, detail: DetailScreen, booking: BookingScreen, tickets: TicketsScreen, profile: ProfileScreen, ai: AIScreen, notifications: NotificationsScreen, organiser: OrganiserScreen, create: CreateEventScreen, }; const Screen = screenMap[route.screen] || HomeScreen; const navMap = { detail:"home", booking:"home", create:"organiser", calendar:"home", notifications:"home", ai:"home" }; return (
navigate("ai")} />
); }; // ─── PROTOTYPE WRAPPER (mobile + desktop side-by-side) ─────────── const Prototype = ({ tweaks, mobileRoute, setMobileRoute, desktopRoute, setDesktopRoute }) => { const navMobile = (screen, id, params) => setMobileRoute({ screen, params: id ? { id, ...params } : params }); const navDesktop = (screen, id, params) => setDesktopRoute({ screen, params: id ? { id, ...params } : params }); return (
{/* Header bar */}
● Hi-fi prototype · Mobile + Desktop · Connected flow
See 3 variations →
{/* Side-by-side */}
{/* Quick screen jumps */}
Jump to screen — click to update both views
{[ {k:"home", l:"Home / Discover"}, {k:"search", l:"Browse"}, {k:"map", l:"Map"}, {k:"calendar", l:"Calendar"}, {k:"detail", l:"Event detail", id:"e1"}, {k:"booking", l:"Booking", id:"e1"}, {k:"tickets", l:"Tickets wallet"}, {k:"profile", l:"Profile"}, {k:"ai", l:"AI Concierge"}, {k:"notifications", l:"Notifications"}, {k:"organiser", l:"Organiser"}, {k:"create", l:"Create event"}, ].map(s => { const active = mobileRoute.screen === s.k; return ( ); })}
); }; window.Prototype = Prototype;