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