// FRAZIER Finance OS — shared UI kit (ported pattern from the ops app's // ops-ui.jsx/ops-kit.jsx: inline-SVG icon set + a few generic presentational // components). Pure skin, no finance-data coupling, global scope (no build // framework — see build/build.js). function finCls(...xs) { return xs.filter(Boolean).join(' '); } function finEscapeXml(v) { return String(v === null || v === undefined ? '' : v) .replace(/&/g, '&').replace(//g, '>') .replace(/"/g, '"').replace(/'/g, '''); } // Trimmed icon set — only what Phase 1's shell/Home/Jarvis/login need. // Same line style as the ops app's OPS_ICON_PATHS (viewBox 24, stroke 1.75). const FIN_ICON_PATHS = { home: '', invoice: '', payroll: '', forecast: '', jarvis: '', files: '', warn: '', check: '', chevr: '', chevl: '', x: '', logout: '', clock: '', calendar: '', send: '', search: '', }; function FinIcon({ name, size = 16, className = '', title }) { const d = FIN_ICON_PATHS[name]; if (!d) return null; return ( ' + finEscapeXml(title) + '' : '') + d }} /> ); } function FinPageHead({ eyebrow, title, sub, actions }) { return (
{eyebrow ?
{eyebrow}
: null}

{title}

{sub ?

{sub}

: null}
{actions ?
{actions}
: null} ); } function FinPanel({ title, sub, icon, action, children, className, tone }) { const adaKepala = title || sub || action || icon; return (
{adaKepala ? (
{icon ? : null}
{title ?

{title}

: null} {sub ?

{sub}

: null}
{action ?
{action}
: null}
) : null} {children}
); } // tone: 'ok' | 'warn' | 'crit' | 'info' | 'neutral' function FinStatusPill({ tone = 'neutral', dot, children, className, title }) { return ( {dot ?