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