// Icon set — stroke-based, consistent 1.6 weight const Icon = ({ name, size = 18, color = 'currentColor', className = '', style = {} }) => { const paths = { logoA: <>, dashboard: <>, users: <>, wallet: <>, receipt: <>, briefcase: <>, megaphone: <>, folder: <>, file: <>, book: <>, calc: <>, doc: <>, message: <>, bell: <>, search: <>, plus: <>, check: <>, chevron: <>, chevronDown: <>, arrowRight: <>, arrowUp: <>, arrowDown: <>, close: <>, whatsapp: <>, zap: <>, shield: <>, star: <>, sparkle: <>, calendar: <>, clock: <>, pie: <>, trend: <>, menu: <>, settings: <>, phone: <>, mail: <>, dollar: <>, map: <>, filter: <>, grid: <>, lock: <>, upload: <>, download: <>, pix: <>, bar: <>, circleCheck: <>, circleAlert: <>, power: <>, logout: <>, target: <>, help: <>, external: <>, edit: <>, trash: <>, more: <>, sun: <>, moon: <>, barchart: <>, pin: <>, drag: <>, refresh: <>, cpu: <>, 'trending-up': <>, 'bar-chart': <>, alert: <>, kanban: <>, shopping: <>, wrench: <>, sync: <>, repeat: <>, 'minus-circle': <>, award: <>, palm: <>, tag: <>, ban: <>, heart: <>, heartbeat: <>, 'pause-circle': <>, 'map-pin': <>, list: <>, user: <>, x: <>, dots: <>, }; const p = paths[name]; if (!p) return null; return ( {p} ); }; // Avatar helper — deterministic colored initials const Avatar = ({ name, size = 32, src }) => { const initials = name.split(' ').map(w => w[0]).slice(0,2).join('').toUpperCase(); const hues = [12, 28, 160, 210, 260, 330, 45]; const h = hues[name.charCodeAt(0) % hues.length]; return (
{initials}
); }; // Brazilian Real formatter const BRL = (n) => 'R$ ' + n.toLocaleString('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); const BRLShort = (n) => { if (n >= 1000000) return 'R$ ' + (n/1000000).toFixed(1).replace('.', ',') + 'M'; if (n >= 1000) return 'R$ ' + (n/1000).toFixed(1).replace('.', ',') + 'k'; return 'R$ ' + n.toFixed(0); }; Object.assign(window, { Icon, Avatar, BRL, BRLShort });