// Wander — shared UI primitives & icons const Icon = { pin: (p={}) => , play: (p={}) => , pause: (p={}) => , search: (p={}) => , download:(p={}) => , heart: (p={}) => , user: (p={}) => , compass:(p={}) => , star: (p={}) => , arrow: (p={}) => , back: (p={}) => , close: (p={}) => , filter: (p={}) => , check: (p={}) => , audio: (p={}) => , video: (p={}) => , ar: (p={}) => , quiz: (p={}) => , text: (p={}) => , sparkle:(p={}) => , skip: (p={}) => , back15: (p={}) => 15, fwd15: (p={}) => 15, trophy: (p={}) => , loc: (p={}) => , globe: (p={}) => , }; const formatIcon = (f, size=14, color) => ({ audio: , video: , ar: , text: , quiz: , }[f]); function TourArt({ tour, h=180, rounded=22, hideChip=false, chipTop=14 }) { const [c1,c2] = Array.isArray(tour.hero) ? tour.hero : ['#FFC93C','#F5A623']; return (
{tour.emoji}
{!hideChip && (
{tour.tier==='free' ? FREE : PRO · ${tour.price}}
)}
); } function TabBar({ active, onChange }) { const tabs = [ { id:'map', label:'Map', I:Icon.pin }, { id:'browse', label:'Browse', I:Icon.compass }, { id:'saved', label:'Saved', I:Icon.heart }, { id:'profile', label:'You', I:Icon.user }, ]; return (
{tabs.map(t => { const on = active===t.id; return ( ); })}
); } function Rating({ value, reviews, size=12, color='var(--w-yellow-deep)' }) { return ( {value} {reviews!==undefined && · {reviews.toLocaleString()}} ); } Object.assign(window, { Icon, formatIcon, TourArt, TabBar, Rating });