diff --git a/ui/src/App.jsx b/ui/src/App.jsx index b2b46fb..ad35e53 100644 --- a/ui/src/App.jsx +++ b/ui/src/App.jsx @@ -144,7 +144,7 @@ export default function App() { {/* Main */}
{(staleSources.size > 0 || staleStacks.size > 0) && ( -
+
View out of sync: {[...staleSources].map(name => ( @@ -152,20 +152,20 @@ export default function App() { ))} - {staleSources.size > 0 && staleStacks.size > 0 && |} + {staleSources.size > 0 && staleStacks.size > 0 && |} {[...staleStacks].map(name => ( stack: {name} @@ -174,7 +174,7 @@ export default function App() {
)} {reprocessSources.size > 0 && ( -
+
Mappings updated: {[...reprocessSources].map(name => ( diff --git a/ui/src/components/SampleTable.jsx b/ui/src/components/SampleTable.jsx index 4992630..6d51e5d 100644 --- a/ui/src/components/SampleTable.jsx +++ b/ui/src/components/SampleTable.jsx @@ -4,19 +4,19 @@ export default function SampleTable({ rows }) { if (!rows || rows.length === 0) return null const cols = Object.keys(rows[0]) return ( -
+
- + {cols.map(c => )} {rows.map((row, i) => ( - + {cols.map(c => ( - ))} diff --git a/ui/src/components/Section.jsx b/ui/src/components/Section.jsx index b52762d..cf01532 100644 --- a/ui/src/components/Section.jsx +++ b/ui/src/components/Section.jsx @@ -2,10 +2,10 @@ // separate things rather than one flat form export default function Section({ title, description, children }) { return ( -
-

{title}

+
+

{title}

{description - ?

{description}

+ ?

{description}

:
} {children}
diff --git a/ui/src/components/Sidebar.jsx b/ui/src/components/Sidebar.jsx index d4abbd0..38a0879 100644 --- a/ui/src/components/Sidebar.jsx +++ b/ui/src/components/Sidebar.jsx @@ -76,14 +76,14 @@ export default function Sidebar({ expanded, setExpanded, loginUser, onLogout }) return (
{/* Header */} -
+
Dataflow @@ -110,8 +110,8 @@ export default function Sidebar({ expanded, setExpanded, loginUser, onLogout }) className={({ isActive }) => `flex items-center gap-3 px-2 py-2 rounded w-full transition-colors ${ isActive - ? 'bg-blue-50 text-blue-700' - : 'text-gray-500 hover:bg-gray-100 hover:text-gray-800' + ? 'bg-accent-soft text-accent' + : 'text-muted hover:bg-raised hover:text-ink' }` } > @@ -127,11 +127,11 @@ export default function Sidebar({ expanded, setExpanded, loginUser, onLogout }) {/* Theme */} -
+
{/* User / logout */} -
+
{loginUser ? loginUser[0].toUpperCase() : '?'} @@ -169,10 +169,10 @@ export default function Sidebar({ expanded, setExpanded, loginUser, onLogout }) className="flex-1 flex items-center justify-between min-w-0 transition-opacity duration-100" style={{ opacity: expanded ? 1 : 0, pointerEvents: expanded ? 'auto' : 'none', width: expanded ? 'auto' : 0, overflow: 'hidden' }} > - {loginUser} + {loginUser} diff --git a/ui/src/components/SourceTabs.jsx b/ui/src/components/SourceTabs.jsx index b1ce5d8..fd0bd30 100644 --- a/ui/src/components/SourceTabs.jsx +++ b/ui/src/components/SourceTabs.jsx @@ -20,17 +20,17 @@ export default function SourceTabs({ sources }) {
- Sources - / -

{name}

+ Sources + / +

{name}

{sourceObj?.config?.simplefin?.account_id && ( - + bank feed )}
-
{c}
- {row[c] == null ? : String(row[c])} + + {row[c] == null ? : String(row[c])}
- + @@ -76,34 +93,46 @@ export default function Bridge({ sources }) { - {accounts.map(a => { + {ordered.map(a => { const src = sourceFor(a.id) return ( - - - - - + + + + + ) })} - - - + {banking.length > 0 && ( + + + + + + )} + {retirement.length > 0 && ( + + + + + + )} + + +
Account Institution Balance
{a.name}{a.organization}{a.balance}{a.balance_date}
{a.name}{a.organization}{money(a.balance)}{a.balance_date} {src - ? {src.name} - : not linked} + ? {src.name} + : not linked}
Total - {total.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} -
Banking and cards{money(sum(banking))}
Retirement{money(sum(retirement))}
Total{money(sum(accounts))}
- {accounts.length === 0 &&

No accounts returned.

} + {accounts.length === 0 &&

No accounts returned.

} )}
diff --git a/ui/src/pages/Import.jsx b/ui/src/pages/Import.jsx index 651ff32..4722d52 100644 --- a/ui/src/pages/Import.jsx +++ b/ui/src/pages/Import.jsx @@ -6,7 +6,7 @@ function KeyList({ keys, label, color }) { return (
{label} ({keys.length})
-
+
{keys.map((k, i) => (
{typeof k === 'object' && k !== null @@ -28,19 +28,19 @@ function LogRow({ entry, selected, onToggle }) { return ( <> - + - {entry.id} - {new Date(entry.imported_at).toLocaleString()} - {entry.records_imported} - {entry.records_duplicate} + {entry.id} + {new Date(entry.imported_at).toLocaleString()} + {entry.records_imported} + {entry.records_duplicate} {hasKeys && ( @@ -48,10 +48,10 @@ function LogRow({ entry, selected, onToggle }) { {expanded && ( - + - - + + )} @@ -168,11 +168,11 @@ export default function Import({ source }) { } } - if (!source) return
Select a source first.
+ if (!source) return
Select a source first.
return (
-

Import — {source}

+

Import — {source}

{/* Stats */} {stats && ( @@ -182,9 +182,9 @@ export default function Import({ source }) { { label: 'Transformed', value: stats.transformed_records }, { label: 'Pending', value: stats.pending_records }, ].map(({ label, value }) => ( -
-
{value}
-
{label}
+
+
{value}
+
{label}
))}
@@ -192,15 +192,15 @@ export default function Import({ source }) { {/* SimpleFIN sync — only for sources with a bridge account in their config */} {simplefin?.account_id && ( -
+
-
SimpleFIN
-
{simplefin.account_id}
+
SimpleFIN
+
{simplefin.account_id}
setUser(e.target.value)} - className="w-full border border-gray-200 rounded px-3 py-2 text-sm focus:outline-none focus:border-blue-400" + className="w-full border border-line rounded px-3 py-2 text-sm focus:outline-none focus:border-accent" required />
- + setPass(e.target.value)} - className="w-full border border-gray-200 rounded px-3 py-2 text-sm focus:outline-none focus:border-blue-400" + className="w-full border border-line rounded px-3 py-2 text-sm focus:outline-none focus:border-accent" required />
- {error &&

{error}

} + {error &&

{error}

} @@ -393,15 +393,15 @@ export default function Mappings({ source, onNeedsReprocess }) { {selectedRule && (
setRowFilter(e.target.value)} /> {rowFilter && !rowFilterError && ( - + {filteredRows.length} )} @@ -435,12 +435,12 @@ export default function Mappings({ source, onNeedsReprocess }) { alert(err.message) } }} - className="text-sm px-3 py-1.5 border border-gray-200 rounded hover:bg-gray-50 text-gray-600" + className="text-sm px-3 py-1.5 border border-line rounded hover:bg-raised text-ink-soft" > Export TSV )} -