// Design tokens + global helpers const T = { blue: '#4F9ED6', blueDeep: '#2B7AB8', blueSky: '#7BB8E2', blueIce: '#E8F2FA', green: '#34B87C', greenDeep: '#2CA26E', mint: '#D4F0E3', violet: '#8B5CF6', violetIce: '#F1ECFE', amber: '#E5A318', amberBg: '#FEF5E0', danger: '#D94F4F', dangerBg: '#FDE8E8', charcoal: '#1A2332', slate: '#4A5568', gray: '#8896A6', grayLight: '#B3BDC9', warmWhite: '#FAFBFD', cloud: '#F2F5F8', mist: '#DFE4EA', border: '#DFE4EA', // Source stripe palette (the MOAT visual vocabulary) src: { consumer: { bar: '#34B87C', bg: '#D4F0E3', fg: '#1F7A4E', label: 'Consumer app' }, employer: { bar: '#4F9ED6', bg: '#E8F2FA', fg: '#1E5C8F', label: 'Employer Dashboard' }, dso: { bar: '#8B5CF6', bg: '#F1ECFE', fg: '#5B2FB8', label: 'DSO Portal' }, attorney: { bar: '#1A2332', bg: '#ECEEF2', fg: '#1A2332', label: 'Attorney' }, uscis: { bar: '#E5A318', bg: '#FEF5E0', fg: '#8A6200', label: 'USCIS' }, }, shadow: { xs: '0 1px 2px rgba(26,35,50,0.04)', sm: '0 2px 8px rgba(26,35,50,0.06), 0 1px 2px rgba(26,35,50,0.04)', md: '0 8px 24px rgba(26,35,50,0.08), 0 2px 6px rgba(26,35,50,0.05)', lg: '0 24px 48px rgba(26,35,50,0.10), 0 6px 12px rgba(26,35,50,0.06)', xl: '0 40px 80px rgba(26,35,50,0.14)', }, }; // Accent swap helper — tweak changes which hue carries "primary" moments function accentColor(accent) { if (accent === 'green') return { primary: T.green, primaryDeep: T.greenDeep, primaryIce: T.mint }; if (accent === 'violet') return { primary: T.violet, primaryDeep: '#6D3AD1', primaryIce: T.violetIce }; return { primary: T.blue, primaryDeep: T.blueDeep, primaryIce: T.blueIce }; } // Source stripe — THE repeating moat motif function SourceStripe({ src, children, pad = true, style }) { const s = T.src[src]; return (
{children}
); } function SourceChip({ src, small, style }) { const s = T.src[src]; return ( {s.label} ); } function Pill({ tone = 'gray', children, small, style }) { const palette = { blue: { bg: T.blueIce, fg: T.blueDeep }, green: { bg: T.mint, fg: '#1F7A4E' }, amber: { bg: T.amberBg, fg: '#8A6200' }, red: { bg: T.dangerBg, fg: '#A02A2A' }, violet: { bg: T.violetIce, fg: '#5B2FB8' }, gray: { bg: T.cloud, fg: T.slate }, }[tone] || { bg: T.cloud, fg: T.slate }; return ( {children} ); } function Avatar({ name, color, size = 28 }) { const initials = name.split(' ').map(n => n[0]).slice(0,2).join('').toUpperCase(); return ( {initials} ); } // Little icon set (outline, 1.5 stroke) — we do NOT load lucide const Ico = { inbox: , file: , shield: , check: , x: , arrow: , clock: , users: , cap: , build: , phone: , dash: , kanban: , scale: , lock: , bolt: , list: , }; function Icon({ name, size = 20, color = 'currentColor', style }) { return ( {Ico[name]} ); } Object.assign(window, { T, accentColor, SourceStripe, SourceChip, Pill, Avatar, Icon, Ico });