// CredNX dashboard — Phase 1 enhancements. // Adds: Home, Sessions (filtered), Insights, Settings, Command Palette, Notifications. // All visual; no new API endpoints required. Mock data is marked NEEDS BACKEND. // ============================================================ // Time-aware greeting // ============================================================ function greeting(name) { const h = new Date().getHours(); const w = h < 5 ? 'Working late' : h < 12 ? 'Good morning' : h < 17 ? 'Good afternoon' : h < 22 ? 'Good evening' : 'Working late'; return `${w}, ${(name || '').split(' ')[0] || 'there'}`; } function todayLabel() { const d = new Date(); return d.toLocaleDateString('en-GB', { weekday:'long', day:'numeric', month:'long' }); } // ============================================================ // Sparkline (small line for KPI tiles) // ============================================================ const Sparkline = ({ data, w = 100, h = 28, color = 'hsl(var(--primary))', fill = 'hsl(var(--accent-soft))' }) => { if (!data || data.length < 2) return
; const max = Math.max(...data), min = Math.min(...data); const span = max - min || 1; const pts = data.map((d, i) => [ (i / (data.length - 1)) * w, h - 2 - ((d - min) / span) * (h - 4), ]); const dstr = 'M' + pts.map(p => p.join(',')).join(' L'); const area = dstr + ` L${w},${h} L0,${h} Z`; return ( ); }; // ============================================================ // Stat tile (richer KPI used on Home) // ============================================================ function StatTile({ label, value, delta, deltaTone = 'success', icon, accent = 'brand', spark }) { const accentMap = { brand: { bg:'hsl(var(--accent-soft))', fg:'hsl(var(--primary))', line:'hsl(var(--primary))', fill:'hsl(var(--accent-soft))' }, success: { bg:'hsl(var(--success-bg))', fg:'hsl(var(--success-fg))', line:'hsl(var(--success))', fill:'hsl(var(--success-bg))' }, warning: { bg:'hsl(var(--warning-bg))', fg:'hsl(var(--warning-fg))', line:'hsl(var(--warning))', fill:'hsl(var(--warning-bg))' }, info: { bg:'hsl(var(--accent-soft))', fg:'hsl(var(--accent))', line:'hsl(var(--accent))', fill:'hsl(var(--accent-soft))' }, }; const a = accentMap[accent] || accentMap.brand; const deltaColor = deltaTone === 'danger' ? 'hsl(var(--danger))' : deltaTone === 'warning' ? 'hsl(var(--warning-fg))' : 'hsl(var(--success-fg))'; return (| setSort(k)}>{l}{sortGlyph(k)} | ))}|||||
|---|---|---|---|---|---|
|
{s.borrower}
{s.id}
|
{s.type} | {s.docs} | {s.created} |
{s.status === 'processing' && |
{keyVisible ? apiKey : masked}
{w.url}