// ui.jsx — shared gs.town components. Exported to window. // ---------- Icon set (24x24, 2px stroke, rounded — gs.town outline family) ---------- const ICONS = { home: '', map: '', plus: '', grid: '', user: '', bell: '', search: '', filter: '', mic: '', locate: '', camera: '', x: '', check: '', arrow: '', chevR: '', chevL: '', chevU: '', heart: '', phone: '', globe: '', clock: '', shield: '', cone: '', traffic: '', leaf: '', bulb: '', mega: '', food: '', coffee: '', pill: '', dumbbell:'', scissors:'', school: '', wrench: '', pin: '', sponsor: '', send: '', }; function Icon({ name, size = 22, color = 'currentColor', sw = 2, fill = 'none', style = {} }) { const filled = name === 'star' || name === 'sponsor'; return ( ' : (ICONS[name] || '') }} /> ); } // ---------- gs.town logo (wordmark with coral pin as the dot) ---------- function Logo({ size = 22, light = false }) { const ink = light ? '#FFFFFF' : 'var(--text-1)'; return ( gs town ); } // ---------- Circular category seal (INDIE badge sensibility) ---------- function CatSeal({ cat, size = 38, ring = false }) { const c = CATS[cat] || CATS.lainnya; return ( ); } // ---------- Status chip ---------- function StatusChip({ status, size = 'md' }) { const s = STATUS[status] || STATUS.open; const sm = size === 'sm'; return ( {s.label} ); } // ---------- Upvote chip ---------- function Upvote({ count, active, onClick }) { return ( ); } // ---------- Pill button ---------- function Pill({ active, onClick, children, color, style = {} }) { return ( ); } Object.assign(window, { Icon, Logo, CatSeal, StatusChip, Upvote, Pill, ICONS });