// components.jsx — shared UI primitives + icon set const { useState, useEffect, useRef, useCallback, useMemo, createContext, useContext } = React; // ============================================================ // Icons (compact SVG set, currentColor) // ============================================================ const Icon = {}; const _icon = (name, body, viewBox) => Icon[name] = ({size=18, ...rest}) => ( {body} ); _icon('home', <>); _icon('create', <>); _icon('fortune', <>); _icon('credits', <>); _icon('history', <>); _icon('star', <>); _icon('sparkles', <>); _icon('photo', <>); _icon('video', <>); _icon('face', <>); _icon('multiface', <>); _icon('wand', <>); _icon('lock', <>); _icon('upload', <>); _icon('download', <>); _icon('check', <>); _icon('checkCircle', <>); _icon('x', <>); _icon('chevronRight', <>); _icon('chevronLeft', <>); _icon('chevronUp', <>); _icon('chevronDown', <>); _icon('arrowRight', <>); _icon('plus', <>); _icon('minus', <>); _icon('refresh', <>); _icon('settings', <>); _icon('share', <>); _icon('copy', <>); _icon('heart', <>); _icon('heartBroken', <>); _icon('user', <>); _icon('users', <>); _icon('crown', <>); _icon('coins', <>); _icon('clock', <>); _icon('info', <>); _icon('warning', <>); _icon('mail', <>); _icon('paypal', <>); _icon('telegramStar', <>); _icon('gift', <>); _icon('flame', <>); _icon('zap', <>); _icon('filter', <>); _icon('search', <>); _icon('trash', <>); _icon('externalLink', <>); _icon('eye', <>); _icon('grid', <>); _icon('language', <>); _icon('helpCircle', <>); _icon('shield', <>); _icon('moon', <>); _icon('book', <>); _icon('palette', <>); _icon('image', <>); _icon('film', <>); _icon('wallet', <>); _icon('trophy', <>); window.Icon = Icon; // ============================================================ // Visual helpers // ============================================================ function StarField({count=40}){ const stars = useMemo(()=>{ const arr = []; for (let i=0; i