@burdenoff/microfe-brainyrich 2026.705.1 → 2026.706.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/brainyrich/BrainyRichRoot.js +13 -13
  2. package/dist/brainyrich/components/ActorName.js +38 -0
  3. package/dist/brainyrich/components/ActorName.js.map +1 -0
  4. package/dist/brainyrich/components/ConfirmDialog.js +25 -0
  5. package/dist/brainyrich/components/ConfirmDialog.js.map +1 -0
  6. package/dist/brainyrich/components/LoadMore.js +24 -0
  7. package/dist/brainyrich/components/LoadMore.js.map +1 -0
  8. package/dist/brainyrich/components/index.js +5 -0
  9. package/dist/brainyrich/components/notify.js +38 -0
  10. package/dist/brainyrich/components/notify.js.map +1 -0
  11. package/dist/brainyrich/components/pickers.js +232 -0
  12. package/dist/brainyrich/components/pickers.js.map +1 -0
  13. package/dist/brainyrich/components/reuse/CommentThread.js +208 -0
  14. package/dist/brainyrich/components/reuse/CommentThread.js.map +1 -0
  15. package/dist/brainyrich/components/reuse/DocumentsPanel.js +237 -0
  16. package/dist/brainyrich/components/reuse/DocumentsPanel.js.map +1 -0
  17. package/dist/brainyrich/components/reuse/TagField.js +206 -0
  18. package/dist/brainyrich/components/reuse/TagField.js.map +1 -0
  19. package/dist/brainyrich/components/reuse/transport.js +24 -0
  20. package/dist/brainyrich/components/reuse/transport.js.map +1 -0
  21. package/dist/brainyrich/hooks/useBrainyRichApi.js +644 -372
  22. package/dist/brainyrich/hooks/useBrainyRichApi.js.map +1 -1
  23. package/dist/brainyrich/pages/AccountsPage.js +346 -293
  24. package/dist/brainyrich/pages/AccountsPage.js.map +1 -1
  25. package/dist/brainyrich/pages/AiAssistantPage.js +339 -320
  26. package/dist/brainyrich/pages/AiAssistantPage.js.map +1 -1
  27. package/dist/brainyrich/pages/AnalyticsPage.js +178 -164
  28. package/dist/brainyrich/pages/AnalyticsPage.js.map +1 -1
  29. package/dist/brainyrich/pages/DashboardPage.js +195 -169
  30. package/dist/brainyrich/pages/DashboardPage.js.map +1 -1
  31. package/dist/brainyrich/pages/FamilyPage.js +247 -198
  32. package/dist/brainyrich/pages/FamilyPage.js.map +1 -1
  33. package/dist/brainyrich/pages/GoalsPage.js +478 -442
  34. package/dist/brainyrich/pages/GoalsPage.js.map +1 -1
  35. package/dist/brainyrich/pages/InvestmentsPage.js.map +1 -1
  36. package/dist/brainyrich/pages/PortfoliosPage.js +438 -396
  37. package/dist/brainyrich/pages/PortfoliosPage.js.map +1 -1
  38. package/dist/brainyrich/pages/ReportsPage.js +246 -213
  39. package/dist/brainyrich/pages/ReportsPage.js.map +1 -1
  40. package/dist/brainyrich/pages/RiskPage.js +321 -173
  41. package/dist/brainyrich/pages/RiskPage.js.map +1 -1
  42. package/dist/brainyrich/pages/TaxPage.js +258 -225
  43. package/dist/brainyrich/pages/TaxPage.js.map +1 -1
  44. package/dist/brainyrich/pages/_shared.js.map +1 -1
  45. package/dist/node_modules/sonner/dist/index.js +163 -0
  46. package/dist/node_modules/sonner/dist/index.js.map +1 -0
  47. package/package.json +3 -2
@@ -1,20 +1,20 @@
1
- import { useAccounts as e, useHoldings as t, useNetWorthSummary as n, useRecordTransaction as r, useTransactions as i } from "../hooks/useBrainyRichApi.js";
1
+ import { useAccounts as e, useAllTransactions as t, useHoldings as n, useNetWorthSummary as r, useRecordTransaction as i } from "../hooks/useBrainyRichApi.js";
2
2
  import { AllocationBars as a, EmptyState as o, ErrorState as ee, KpiGrid as te, LoadingState as s, SectionShell as ne, formatDate as re, formatMoney as c, formatPct as ie } from "./_shared.js";
3
3
  import { useMemo as l, useState as ae } from "react";
4
- import { ArrowDownRight as oe, ArrowUpRight as se, BarChart3 as u, Minus as d, PieChart as ce, Plus as le, Wallet as ue } from "lucide-react";
5
- import { jsx as f, jsxs as p } from "react/jsx-runtime";
6
- import { Badge as de, Button as m, Card as h, CardContent as g, CardDescription as _, CardHeader as v, CardTitle as y, Dialog as fe, DialogContent as pe, DialogDescription as me, DialogFooter as he, DialogHeader as ge, DialogTitle as _e, DialogTrigger as ve, Input as b, Label as x, Select as S, SelectContent as C, SelectItem as w, SelectTrigger as T, SelectValue as E, Table as D, TableBody as O, TableCell as k, TableHead as A, TableHeader as j, TableRow as M, Tabs as ye, TabsContent as N, TabsList as be, TabsTrigger as P, Textarea as xe } from "@burdenoff/fe-libs/ui";
4
+ import { ArrowDownRight as oe, ArrowUpRight as se, BarChart3 as u, Minus as d, PieChart as ce, Plus as le, Wallet as f } from "lucide-react";
5
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
6
+ import { Badge as ue, Button as h, Card as g, CardContent as _, CardDescription as v, CardHeader as y, CardTitle as b, Dialog as de, DialogContent as fe, DialogDescription as pe, DialogFooter as me, DialogHeader as he, DialogTitle as ge, DialogTrigger as _e, Input as x, Label as S, Select as C, SelectContent as w, SelectItem as T, SelectTrigger as E, SelectValue as D, Table as O, TableBody as k, TableCell as A, TableHead as j, TableHeader as M, TableRow as N, Tabs as ve, TabsContent as P, TabsList as ye, TabsTrigger as F, Textarea as be } from "@burdenoff/fe-libs/ui";
7
7
  //#region src/brainyrich/pages/AnalyticsPage.tsx
8
- var F = (e) => e.toLowerCase().split("_").map((e) => e && e[0].toUpperCase() + e.slice(1)).join(" "), I = [
8
+ var I = (e) => e.toLowerCase().split("_").map((e) => e && e[0].toUpperCase() + e.slice(1)).join(" "), L = [
9
9
  "DEPOSIT",
10
10
  "DIVIDEND",
11
11
  "INTEREST",
12
12
  "SELL"
13
- ], L = [
13
+ ], R = [
14
14
  "WITHDRAWAL",
15
15
  "FEE",
16
16
  "BUY"
17
- ], R = (e) => I.includes(e) ? "in" : L.includes(e) ? "out" : "neutral", Se = (e) => {
17
+ ], z = (e) => L.includes(e) ? "in" : R.includes(e) ? "out" : "neutral", xe = (e) => {
18
18
  let t = new Date(e);
19
19
  return Number.isNaN(t.getTime()) ? null : {
20
20
  key: `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, "0")}`,
@@ -23,12 +23,12 @@ var F = (e) => e.toLowerCase().split("_").map((e) => e && e[0].toUpperCase() + e
23
23
  year: "numeric"
24
24
  }).format(t)
25
25
  };
26
- }, Ce = (e) => {
26
+ }, Se = (e) => {
27
27
  let t = /* @__PURE__ */ new Map();
28
28
  for (let n of e) {
29
- let e = Se(n.tradeDate);
29
+ let e = xe(n.tradeDate);
30
30
  if (!e) continue;
31
- let r = R(n.type);
31
+ let r = z(n.type);
32
32
  if (r === "neutral") continue;
33
33
  let i = Math.abs(n.amount), a = t.get(e.key) ?? {
34
34
  key: e.key,
@@ -39,21 +39,21 @@ var F = (e) => e.toLowerCase().split("_").map((e) => e && e[0].toUpperCase() + e
39
39
  r === "in" ? a.inflow += i : a.outflow += i, t.set(e.key, a);
40
40
  }
41
41
  return Array.from(t.values()).sort((e, t) => e.key.localeCompare(t.key));
42
- }, we = (e) => {
42
+ }, Ce = (e) => {
43
43
  let t = /* @__PURE__ */ new Map();
44
44
  for (let n of e) t.set(n.type, (t.get(n.type) ?? 0) + Math.abs(n.amount));
45
45
  return Array.from(t.entries()).map(([e, t]) => ({
46
46
  type: e,
47
47
  total: t,
48
- dir: R(e)
48
+ dir: z(e)
49
49
  })).sort((e, t) => t.total - e.total);
50
50
  };
51
- function Te({ value: e, currency: t }) {
51
+ function we({ value: e, currency: t }) {
52
52
  let n = e > 0, r = e < 0, i = n ? se : r ? oe : d, a = n ? "text-status-success-text" : r ? "text-status-error-text" : "text-text-secondary", o = n ? "+" : r ? "-" : "";
53
- return /* @__PURE__ */ p("span", {
53
+ return /* @__PURE__ */ m("span", {
54
54
  className: `inline-flex items-center justify-end gap-1 font-medium ${a}`,
55
55
  children: [
56
- /* @__PURE__ */ f(i, {
56
+ /* @__PURE__ */ p(i, {
57
57
  className: "size-3.5",
58
58
  "aria-hidden": "true"
59
59
  }),
@@ -62,7 +62,7 @@ function Te({ value: e, currency: t }) {
62
62
  ]
63
63
  });
64
64
  }
65
- var z = {
65
+ var Te = {
66
66
  accountId: "",
67
67
  type: "DEPOSIT",
68
68
  amount: "",
@@ -80,8 +80,8 @@ var z = {
80
80
  "TRANSFER"
81
81
  ];
82
82
  function B() {
83
- let d = n(), I = i(), L = e(), [R, Se] = ae(void 0), B = L.data, De = R ?? B[0]?.id, V = t({ accountId: De }), H = r(), [Oe, U] = ae(!1), [W, G] = ae(z), K = d.data, q = K?.currency ?? "USD", J = I.data, ke = l(() => !K || K.totalMarketValue <= 0 ? [] : K.byAssetClass.filter((e) => e.marketValue !== 0).map((e) => ({
84
- label: F(e.assetClass),
83
+ let d = r(), L = t(), R = e(), [z, xe] = ae(void 0), B = R.data, De = z ?? B[0]?.id, V = n({ accountId: De }), H = i(), [Oe, U] = ae(!1), [W, G] = ae(Te), K = d.data, q = K?.currency ?? "USD", J = L.data, ke = l(() => !K || K.totalMarketValue <= 0 ? [] : K.byAssetClass.filter((e) => e.marketValue !== 0).map((e) => ({
84
+ label: I(e.assetClass),
85
85
  value: e.marketValue / K.totalMarketValue * 100,
86
86
  caption: c(e.marketValue, q),
87
87
  tone: "accent"
@@ -99,7 +99,7 @@ function B() {
99
99
  caption: c(K.totalCash, q),
100
100
  tone: "warning"
101
101
  }];
102
- }, [K, q]), Y = l(() => Ce(J), [J]), je = l(() => we(J), [J]), X = l(() => {
102
+ }, [K, q]), Y = l(() => Se(J), [J]), je = l(() => Ce(J), [J]), X = l(() => {
103
103
  let e = 0, t = 0;
104
104
  for (let n of Y) e += n.inflow, t += n.outflow;
105
105
  return {
@@ -118,91 +118,97 @@ function B() {
118
118
  totalCost: Me.reduce((e, t) => e + t.costBasis, 0)
119
119
  };
120
120
  }, [Me]);
121
- if (d.isLoading) return /* @__PURE__ */ f(ne, {
121
+ if (d.isLoading) return /* @__PURE__ */ p(ne, {
122
122
  title: "Wealth Analytics",
123
123
  description: "Allocation, cash flow, and holdings performance derived from your real accounts.",
124
- children: /* @__PURE__ */ f(s, { rows: 5 })
124
+ children: /* @__PURE__ */ p(s, { rows: 5 })
125
125
  });
126
- if (d.isError || !K) return /* @__PURE__ */ f(ne, {
126
+ if (d.isError || !K) return /* @__PURE__ */ p(ne, {
127
127
  title: "Wealth Analytics",
128
128
  description: "Allocation, cash flow, and holdings performance derived from your real accounts.",
129
- children: /* @__PURE__ */ f(ee, {
129
+ children: /* @__PURE__ */ p(ee, {
130
130
  title: "Could not load analytics",
131
131
  description: "We couldn't reach the wealth service. Please retry.",
132
132
  onRetry: () => d.refetch()
133
133
  })
134
134
  });
135
- let $ = Number(W.amount), Ne = !!W.accountId && !!W.tradeDate && W.amount.trim() !== "" && Number.isFinite($) && $ > 0 && !H.isPending, Pe = /* @__PURE__ */ p(fe, {
135
+ let $ = Number(W.amount), Ne = !!W.accountId && !!W.tradeDate && W.amount.trim() !== "" && Number.isFinite($) && $ > 0 && !H.isPending, Pe = /* @__PURE__ */ m(de, {
136
136
  open: Oe,
137
137
  onOpenChange: (e) => {
138
- U(e), e || G(z);
138
+ U(e), e || G(Te);
139
139
  },
140
- children: [/* @__PURE__ */ f(ve, {
140
+ children: [/* @__PURE__ */ p(_e, {
141
141
  asChild: !0,
142
- children: /* @__PURE__ */ p(m, {
142
+ children: /* @__PURE__ */ m(h, {
143
143
  size: "sm",
144
- disabled: B.length === 0,
145
- children: [/* @__PURE__ */ f(le, {
144
+ children: [/* @__PURE__ */ p(le, {
146
145
  className: "mr-1 size-4",
147
146
  "aria-hidden": "true"
148
147
  }), "Record Transaction"]
149
148
  })
150
- }), /* @__PURE__ */ p(pe, { children: [
151
- /* @__PURE__ */ p(ge, { children: [/* @__PURE__ */ f(_e, { children: "Record Transaction" }), /* @__PURE__ */ f(me, { children: "Log a real cash flow or trade. It updates your cash-flow analytics immediately." })] }),
152
- /* @__PURE__ */ p("div", {
149
+ }), /* @__PURE__ */ m(fe, { children: [
150
+ /* @__PURE__ */ m(he, { children: [/* @__PURE__ */ p(ge, { children: "Record Transaction" }), /* @__PURE__ */ p(pe, { children: "Log a real cash flow or trade. It updates your cash-flow analytics immediately." })] }),
151
+ B.length === 0 ? /* @__PURE__ */ p(o, {
152
+ icon: /* @__PURE__ */ p(f, {
153
+ className: "size-6",
154
+ "aria-hidden": "true"
155
+ }),
156
+ title: "Create an account first",
157
+ description: "You need at least one account before you can record a transaction. Open the Accounts page to add one, then come back here."
158
+ }) : /* @__PURE__ */ m("div", {
153
159
  className: "space-y-4",
154
160
  children: [
155
- /* @__PURE__ */ p("div", {
161
+ /* @__PURE__ */ m("div", {
156
162
  className: "space-y-1.5",
157
- children: [/* @__PURE__ */ f(x, {
163
+ children: [/* @__PURE__ */ p(S, {
158
164
  htmlFor: "tx-account",
159
165
  children: "Account"
160
- }), /* @__PURE__ */ p(S, {
166
+ }), /* @__PURE__ */ m(C, {
161
167
  value: W.accountId,
162
168
  onValueChange: (e) => G((t) => ({
163
169
  ...t,
164
170
  accountId: e
165
171
  })),
166
- children: [/* @__PURE__ */ f(T, {
172
+ children: [/* @__PURE__ */ p(E, {
167
173
  id: "tx-account",
168
- children: /* @__PURE__ */ f(E, { placeholder: "Select an account" })
169
- }), /* @__PURE__ */ f(C, { children: B.map((e) => /* @__PURE__ */ f(w, {
174
+ children: /* @__PURE__ */ p(D, { placeholder: "Select an account" })
175
+ }), /* @__PURE__ */ p(w, { children: B.map((e) => /* @__PURE__ */ p(T, {
170
176
  value: e.id,
171
177
  children: e.name
172
178
  }, e.id)) })]
173
179
  })]
174
180
  }),
175
- /* @__PURE__ */ p("div", {
181
+ /* @__PURE__ */ m("div", {
176
182
  className: "grid grid-cols-2 gap-4",
177
- children: [/* @__PURE__ */ p("div", {
183
+ children: [/* @__PURE__ */ m("div", {
178
184
  className: "space-y-1.5",
179
- children: [/* @__PURE__ */ f(x, {
185
+ children: [/* @__PURE__ */ p(S, {
180
186
  htmlFor: "tx-type",
181
187
  children: "Type"
182
- }), /* @__PURE__ */ p(S, {
188
+ }), /* @__PURE__ */ m(C, {
183
189
  value: W.type,
184
190
  onValueChange: (e) => G((t) => ({
185
191
  ...t,
186
192
  type: e
187
193
  })),
188
- children: [/* @__PURE__ */ f(T, {
194
+ children: [/* @__PURE__ */ p(E, {
189
195
  id: "tx-type",
190
- children: /* @__PURE__ */ f(E, {})
191
- }), /* @__PURE__ */ f(C, { children: Ee.map((e) => /* @__PURE__ */ f(w, {
196
+ children: /* @__PURE__ */ p(D, {})
197
+ }), /* @__PURE__ */ p(w, { children: Ee.map((e) => /* @__PURE__ */ p(T, {
192
198
  value: e,
193
- children: F(e)
199
+ children: I(e)
194
200
  }, e)) })]
195
201
  })]
196
- }), /* @__PURE__ */ p("div", {
202
+ }), /* @__PURE__ */ m("div", {
197
203
  className: "space-y-1.5",
198
- children: [/* @__PURE__ */ p(x, {
204
+ children: [/* @__PURE__ */ m(S, {
199
205
  htmlFor: "tx-amount",
200
206
  children: [
201
207
  "Amount (",
202
208
  q,
203
209
  ")"
204
210
  ]
205
- }), /* @__PURE__ */ f(b, {
211
+ }), /* @__PURE__ */ p(x, {
206
212
  id: "tx-amount",
207
213
  type: "number",
208
214
  min: "0",
@@ -217,14 +223,14 @@ function B() {
217
223
  })]
218
224
  })]
219
225
  }),
220
- /* @__PURE__ */ p("div", {
226
+ /* @__PURE__ */ m("div", {
221
227
  className: "grid grid-cols-2 gap-4",
222
- children: [/* @__PURE__ */ p("div", {
228
+ children: [/* @__PURE__ */ m("div", {
223
229
  className: "space-y-1.5",
224
- children: [/* @__PURE__ */ f(x, {
230
+ children: [/* @__PURE__ */ p(S, {
225
231
  htmlFor: "tx-date",
226
232
  children: "Trade date"
227
- }), /* @__PURE__ */ f(b, {
233
+ }), /* @__PURE__ */ p(x, {
228
234
  id: "tx-date",
229
235
  type: "date",
230
236
  value: W.tradeDate,
@@ -233,12 +239,12 @@ function B() {
233
239
  tradeDate: e.target.value
234
240
  }))
235
241
  })]
236
- }), /* @__PURE__ */ p("div", {
242
+ }), /* @__PURE__ */ m("div", {
237
243
  className: "space-y-1.5",
238
- children: [/* @__PURE__ */ f(x, {
244
+ children: [/* @__PURE__ */ p(S, {
239
245
  htmlFor: "tx-symbol",
240
246
  children: "Symbol (optional)"
241
- }), /* @__PURE__ */ f(b, {
247
+ }), /* @__PURE__ */ p(x, {
242
248
  id: "tx-symbol",
243
249
  placeholder: "e.g. AAPL",
244
250
  value: W.symbol,
@@ -249,12 +255,12 @@ function B() {
249
255
  })]
250
256
  })]
251
257
  }),
252
- /* @__PURE__ */ p("div", {
258
+ /* @__PURE__ */ m("div", {
253
259
  className: "space-y-1.5",
254
- children: [/* @__PURE__ */ f(x, {
260
+ children: [/* @__PURE__ */ p(S, {
255
261
  htmlFor: "tx-notes",
256
262
  children: "Notes (optional)"
257
- }), /* @__PURE__ */ f(xe, {
263
+ }), /* @__PURE__ */ p(be, {
258
264
  id: "tx-notes",
259
265
  rows: 2,
260
266
  placeholder: "Context for this transaction",
@@ -265,17 +271,17 @@ function B() {
265
271
  }))
266
272
  })]
267
273
  }),
268
- H.isError ? /* @__PURE__ */ f("p", {
274
+ H.isError ? /* @__PURE__ */ p("p", {
269
275
  className: "text-sm text-status-error-text",
270
276
  children: H.error instanceof Error ? H.error.message : "Could not record transaction."
271
277
  }) : null
272
278
  ]
273
279
  }),
274
- /* @__PURE__ */ p(he, { children: [/* @__PURE__ */ f(m, {
280
+ /* @__PURE__ */ m(me, { children: [/* @__PURE__ */ p(h, {
275
281
  variant: "outline",
276
282
  onClick: () => U(!1),
277
- children: "Cancel"
278
- }), /* @__PURE__ */ f(m, {
283
+ children: B.length === 0 ? "Close" : "Cancel"
284
+ }), B.length > 0 ? /* @__PURE__ */ p(h, {
279
285
  onClick: () => {
280
286
  Ne && H.mutate({
281
287
  accountId: W.accountId,
@@ -285,20 +291,20 @@ function B() {
285
291
  tradeDate: new Date(W.tradeDate).toISOString(),
286
292
  notes: W.notes.trim() ? W.notes.trim() : void 0
287
293
  }, { onSuccess: () => {
288
- U(!1), G(z);
294
+ U(!1), G(Te);
289
295
  } });
290
296
  },
291
297
  disabled: !Ne,
292
298
  children: H.isPending ? "Recording…" : "Record"
293
- })] })
299
+ }) : null] })
294
300
  ] })]
295
301
  });
296
- return /* @__PURE__ */ p(ne, {
302
+ return /* @__PURE__ */ m(ne, {
297
303
  title: "Wealth Analytics",
298
304
  description: "Allocation, cash flow, and holdings performance derived from your real accounts.",
299
305
  badges: [`${K.accountCount} accounts`],
300
306
  actions: Pe,
301
- children: [/* @__PURE__ */ f(te, { items: [
307
+ children: [/* @__PURE__ */ p(te, { items: [
302
308
  {
303
309
  label: "Net Worth",
304
310
  value: c(K.totalNetWorth, q)
@@ -317,307 +323,315 @@ function B() {
317
323
  deltaTone: X.net > 0 ? "positive" : X.net < 0 ? "negative" : "neutral",
318
324
  trend: J.length > 0 ? `${c(X.inflow, q)} in · ${c(X.outflow, q)} out` : "No transactions yet"
319
325
  }
320
- ] }), /* @__PURE__ */ p(ye, {
326
+ ] }), /* @__PURE__ */ m(ve, {
321
327
  defaultValue: "allocation",
322
328
  className: "space-y-4",
323
329
  children: [
324
- /* @__PURE__ */ p(be, {
330
+ /* @__PURE__ */ m(ye, {
325
331
  className: "grid w-full grid-cols-3",
326
332
  children: [
327
- /* @__PURE__ */ f(P, {
333
+ /* @__PURE__ */ p(F, {
328
334
  value: "allocation",
329
335
  children: "Allocation"
330
336
  }),
331
- /* @__PURE__ */ f(P, {
337
+ /* @__PURE__ */ p(F, {
332
338
  value: "cashflow",
333
339
  children: "Cash Flow"
334
340
  }),
335
- /* @__PURE__ */ f(P, {
341
+ /* @__PURE__ */ p(F, {
336
342
  value: "performance",
337
343
  children: "Performance"
338
344
  })
339
345
  ]
340
346
  }),
341
- /* @__PURE__ */ p(N, {
347
+ /* @__PURE__ */ m(P, {
342
348
  value: "allocation",
343
349
  className: "space-y-4",
344
- children: [/* @__PURE__ */ p(h, { children: [/* @__PURE__ */ p(v, { children: [/* @__PURE__ */ p(y, {
350
+ children: [/* @__PURE__ */ m(g, { children: [/* @__PURE__ */ m(y, { children: [/* @__PURE__ */ m(b, {
345
351
  className: "flex items-center gap-2",
346
- children: [/* @__PURE__ */ f(ce, {
352
+ children: [/* @__PURE__ */ p(ce, {
347
353
  className: "size-5",
348
354
  "aria-hidden": "true"
349
355
  }), "Asset Allocation"]
350
- }), /* @__PURE__ */ f(_, { children: "Share of invested value by asset class, from your holdings." })] }), /* @__PURE__ */ f(g, { children: ke.length === 0 ? /* @__PURE__ */ f(o, {
351
- icon: /* @__PURE__ */ f(ce, {
356
+ }), /* @__PURE__ */ p(v, { children: "Share of invested value by asset class, from your holdings." })] }), /* @__PURE__ */ p(_, { children: ke.length === 0 ? /* @__PURE__ */ p(o, {
357
+ icon: /* @__PURE__ */ p(ce, {
352
358
  className: "size-6",
353
359
  "aria-hidden": "true"
354
360
  }),
355
361
  title: "No invested holdings yet",
356
362
  description: "Add holdings to your accounts to see an asset-class breakdown here."
357
- }) : /* @__PURE__ */ p("div", {
363
+ }) : /* @__PURE__ */ m("div", {
358
364
  className: "space-y-4",
359
- children: [/* @__PURE__ */ f(a, { data: ke }), /* @__PURE__ */ p(D, { children: [/* @__PURE__ */ f(j, { children: /* @__PURE__ */ p(M, { children: [
360
- /* @__PURE__ */ f(A, { children: "Asset class" }),
361
- /* @__PURE__ */ f(A, {
365
+ children: [/* @__PURE__ */ p(a, { data: ke }), /* @__PURE__ */ m(O, { children: [/* @__PURE__ */ p(M, { children: /* @__PURE__ */ m(N, { children: [
366
+ /* @__PURE__ */ p(j, { children: "Asset class" }),
367
+ /* @__PURE__ */ p(j, {
362
368
  className: "text-right",
363
369
  children: "Market value"
364
370
  }),
365
- /* @__PURE__ */ f(A, {
371
+ /* @__PURE__ */ p(j, {
366
372
  className: "text-right",
367
373
  children: "Weight"
368
374
  })
369
- ] }) }), /* @__PURE__ */ f(O, { children: ke.map((e) => /* @__PURE__ */ p(M, { children: [
370
- /* @__PURE__ */ f(k, {
375
+ ] }) }), /* @__PURE__ */ p(k, { children: ke.map((e) => /* @__PURE__ */ m(N, { children: [
376
+ /* @__PURE__ */ p(A, {
371
377
  className: "font-medium text-text-primary",
372
378
  children: e.label
373
379
  }),
374
- /* @__PURE__ */ f(k, {
380
+ /* @__PURE__ */ p(A, {
375
381
  className: "text-right",
376
382
  children: e.caption
377
383
  }),
378
- /* @__PURE__ */ f(k, {
384
+ /* @__PURE__ */ p(A, {
379
385
  className: "text-right text-text-secondary",
380
386
  children: ie(e.value)
381
387
  })
382
388
  ] }, e.label)) })] })]
383
- }) })] }), /* @__PURE__ */ p(h, { children: [/* @__PURE__ */ p(v, { children: [/* @__PURE__ */ p(y, {
389
+ }) })] }), /* @__PURE__ */ m(g, { children: [/* @__PURE__ */ m(y, { children: [/* @__PURE__ */ m(b, {
384
390
  className: "flex items-center gap-2",
385
- children: [/* @__PURE__ */ f(ue, {
391
+ children: [/* @__PURE__ */ p(f, {
386
392
  className: "size-5",
387
393
  "aria-hidden": "true"
388
394
  }), "Net Worth Composition"]
389
- }), /* @__PURE__ */ f(_, { children: "Invested value versus liquid cash." })] }), /* @__PURE__ */ f(g, { children: Ae.length === 0 ? /* @__PURE__ */ f(o, {
390
- icon: /* @__PURE__ */ f(ue, {
395
+ }), /* @__PURE__ */ p(v, { children: "Invested value versus liquid cash." })] }), /* @__PURE__ */ p(_, { children: Ae.length === 0 ? /* @__PURE__ */ p(o, {
396
+ icon: /* @__PURE__ */ p(f, {
391
397
  className: "size-6",
392
398
  "aria-hidden": "true"
393
399
  }),
394
400
  title: "No balances yet",
395
401
  description: "Add accounts with balances or holdings to see your composition."
396
- }) : /* @__PURE__ */ f(a, { data: Ae }) })] })]
402
+ }) : /* @__PURE__ */ p(a, { data: Ae }) })] })]
397
403
  }),
398
- /* @__PURE__ */ p(N, {
404
+ /* @__PURE__ */ m(P, {
399
405
  value: "cashflow",
400
406
  className: "space-y-4",
401
- children: [/* @__PURE__ */ p(h, { children: [/* @__PURE__ */ p(v, { children: [/* @__PURE__ */ p(y, {
407
+ children: [/* @__PURE__ */ m(g, { children: [/* @__PURE__ */ m(y, { children: [/* @__PURE__ */ m(b, {
402
408
  className: "flex items-center gap-2",
403
- children: [/* @__PURE__ */ f(u, {
409
+ children: [/* @__PURE__ */ p(u, {
404
410
  className: "size-5",
405
411
  "aria-hidden": "true"
406
412
  }), "Inflows vs Outflows"]
407
- }), /* @__PURE__ */ f(_, { children: "Monthly cash flow aggregated from your recorded transactions." })] }), /* @__PURE__ */ f(g, { children: I.isLoading ? /* @__PURE__ */ f(s, { rows: 4 }) : I.isError ? /* @__PURE__ */ f(ee, { onRetry: () => I.refetch() }) : Y.length === 0 ? /* @__PURE__ */ f(o, {
408
- icon: /* @__PURE__ */ f(u, {
413
+ }), /* @__PURE__ */ m(v, { children: ["Monthly cash flow aggregated from your recorded transactions.", J.length > 0 ? /* @__PURE__ */ m("span", {
414
+ className: "mt-0.5 block text-xs text-text-secondary",
415
+ children: [
416
+ "Based on ",
417
+ J.length.toLocaleString(),
418
+ " ",
419
+ J.length === 1 ? "transaction" : "transactions",
420
+ "."
421
+ ]
422
+ }) : null] })] }), /* @__PURE__ */ p(_, { children: L.isLoading ? /* @__PURE__ */ p(s, { rows: 4 }) : L.isError ? /* @__PURE__ */ p(ee, { onRetry: () => L.refetch() }) : Y.length === 0 ? /* @__PURE__ */ p(o, {
423
+ icon: /* @__PURE__ */ p(u, {
409
424
  className: "size-6",
410
425
  "aria-hidden": "true"
411
426
  }),
412
427
  title: "No cash flow to analyze yet",
413
428
  description: "Record deposits, withdrawals, or trades to build a cash-flow history.",
414
- action: /* @__PURE__ */ p(m, {
429
+ action: /* @__PURE__ */ m(h, {
415
430
  size: "sm",
416
431
  onClick: () => U(!0),
417
- disabled: B.length === 0,
418
- children: [/* @__PURE__ */ f(le, {
432
+ children: [/* @__PURE__ */ p(le, {
419
433
  className: "mr-1 size-4",
420
434
  "aria-hidden": "true"
421
435
  }), "Record Transaction"]
422
436
  })
423
- }) : /* @__PURE__ */ p("div", {
437
+ }) : /* @__PURE__ */ m("div", {
424
438
  className: "space-y-4",
425
- children: [Y.map((e) => /* @__PURE__ */ p("div", {
439
+ children: [Y.map((e) => /* @__PURE__ */ m("div", {
426
440
  className: "space-y-1.5",
427
441
  children: [
428
- /* @__PURE__ */ p("div", {
442
+ /* @__PURE__ */ m("div", {
429
443
  className: "flex items-center justify-between text-xs",
430
- children: [/* @__PURE__ */ f("span", {
444
+ children: [/* @__PURE__ */ p("span", {
431
445
  className: "font-medium text-text-primary",
432
446
  children: e.label
433
- }), /* @__PURE__ */ p("span", {
447
+ }), /* @__PURE__ */ m("span", {
434
448
  className: "flex gap-3",
435
- children: [/* @__PURE__ */ p("span", {
449
+ children: [/* @__PURE__ */ m("span", {
436
450
  className: "text-status-success-text",
437
- children: [/* @__PURE__ */ f(se, {
451
+ children: [/* @__PURE__ */ p(se, {
438
452
  className: "mr-0.5 inline size-3",
439
453
  "aria-hidden": "true"
440
454
  }), c(e.inflow, q)]
441
- }), /* @__PURE__ */ p("span", {
455
+ }), /* @__PURE__ */ m("span", {
442
456
  className: "text-status-error-text",
443
- children: [/* @__PURE__ */ f(oe, {
457
+ children: [/* @__PURE__ */ p(oe, {
444
458
  className: "mr-0.5 inline size-3",
445
459
  "aria-hidden": "true"
446
460
  }), c(e.outflow, q)]
447
461
  })]
448
462
  })]
449
463
  }),
450
- /* @__PURE__ */ f("div", {
464
+ /* @__PURE__ */ p("div", {
451
465
  className: "h-2 w-full overflow-hidden rounded-full bg-bg-sunken",
452
466
  role: "progressbar",
453
467
  "aria-label": `${e.label} inflow`,
454
468
  "aria-valuenow": Math.round(e.inflow / Z * 100),
455
469
  "aria-valuemin": 0,
456
470
  "aria-valuemax": 100,
457
- children: /* @__PURE__ */ f("div", {
471
+ children: /* @__PURE__ */ p("div", {
458
472
  className: "h-full rounded-full bg-status-success-bg motion-safe:transition-[width] motion-safe:duration-200",
459
473
  style: { width: `${e.inflow / Z * 100}%` }
460
474
  })
461
475
  }),
462
- /* @__PURE__ */ f("div", {
476
+ /* @__PURE__ */ p("div", {
463
477
  className: "h-2 w-full overflow-hidden rounded-full bg-bg-sunken",
464
478
  role: "progressbar",
465
479
  "aria-label": `${e.label} outflow`,
466
480
  "aria-valuenow": Math.round(e.outflow / Z * 100),
467
481
  "aria-valuemin": 0,
468
482
  "aria-valuemax": 100,
469
- children: /* @__PURE__ */ f("div", {
483
+ children: /* @__PURE__ */ p("div", {
470
484
  className: "h-full rounded-full bg-status-error-bg motion-safe:transition-[width] motion-safe:duration-200",
471
485
  style: { width: `${e.outflow / Z * 100}%` }
472
486
  })
473
487
  })
474
488
  ]
475
- }, e.key)), /* @__PURE__ */ p("div", {
489
+ }, e.key)), /* @__PURE__ */ m("div", {
476
490
  className: "flex flex-wrap gap-4 pt-1 text-xs text-text-secondary",
477
- children: [/* @__PURE__ */ p("span", {
491
+ children: [/* @__PURE__ */ m("span", {
478
492
  className: "inline-flex items-center gap-1.5",
479
- children: [/* @__PURE__ */ f("span", { className: "inline-block size-2.5 rounded-full bg-status-success-bg" }), "Inflow"]
480
- }), /* @__PURE__ */ p("span", {
493
+ children: [/* @__PURE__ */ p("span", { className: "inline-block size-2.5 rounded-full bg-status-success-bg" }), "Inflow"]
494
+ }), /* @__PURE__ */ m("span", {
481
495
  className: "inline-flex items-center gap-1.5",
482
- children: [/* @__PURE__ */ f("span", { className: "inline-block size-2.5 rounded-full bg-status-error-bg" }), "Outflow"]
496
+ children: [/* @__PURE__ */ p("span", { className: "inline-block size-2.5 rounded-full bg-status-error-bg" }), "Outflow"]
483
497
  })]
484
498
  })]
485
- }) })] }), je.length > 0 ? /* @__PURE__ */ p(h, { children: [/* @__PURE__ */ p(v, { children: [/* @__PURE__ */ f(y, { children: "By Transaction Type" }), /* @__PURE__ */ f(_, { children: "Total value moved per transaction type." })] }), /* @__PURE__ */ f(g, { children: /* @__PURE__ */ p(D, { children: [/* @__PURE__ */ f(j, { children: /* @__PURE__ */ p(M, { children: [
486
- /* @__PURE__ */ f(A, { children: "Type" }),
487
- /* @__PURE__ */ f(A, { children: "Direction" }),
488
- /* @__PURE__ */ f(A, {
499
+ }) })] }), je.length > 0 ? /* @__PURE__ */ m(g, { children: [/* @__PURE__ */ m(y, { children: [/* @__PURE__ */ p(b, { children: "By Transaction Type" }), /* @__PURE__ */ p(v, { children: "Total value moved per transaction type." })] }), /* @__PURE__ */ p(_, { children: /* @__PURE__ */ m(O, { children: [/* @__PURE__ */ p(M, { children: /* @__PURE__ */ m(N, { children: [
500
+ /* @__PURE__ */ p(j, { children: "Type" }),
501
+ /* @__PURE__ */ p(j, { children: "Direction" }),
502
+ /* @__PURE__ */ p(j, {
489
503
  className: "text-right",
490
504
  children: "Total"
491
505
  })
492
- ] }) }), /* @__PURE__ */ f(O, { children: je.map((e) => /* @__PURE__ */ p(M, { children: [
493
- /* @__PURE__ */ f(k, {
506
+ ] }) }), /* @__PURE__ */ p(k, { children: je.map((e) => /* @__PURE__ */ m(N, { children: [
507
+ /* @__PURE__ */ p(A, {
494
508
  className: "font-medium text-text-primary",
495
- children: F(e.type)
509
+ children: I(e.type)
496
510
  }),
497
- /* @__PURE__ */ f(k, { children: /* @__PURE__ */ f(de, {
511
+ /* @__PURE__ */ p(A, { children: /* @__PURE__ */ p(ue, {
498
512
  variant: e.dir === "in" ? "default" : e.dir === "out" ? "destructive" : "secondary",
499
513
  children: e.dir === "in" ? "Inflow" : e.dir === "out" ? "Outflow" : "Neutral"
500
514
  }) }),
501
- /* @__PURE__ */ f(k, {
515
+ /* @__PURE__ */ p(A, {
502
516
  className: "text-right font-medium",
503
517
  children: c(e.total, q)
504
518
  })
505
519
  ] }, e.type)) })] }) })] }) : null]
506
520
  }),
507
- /* @__PURE__ */ f(N, {
521
+ /* @__PURE__ */ p(P, {
508
522
  value: "performance",
509
523
  className: "space-y-4",
510
- children: /* @__PURE__ */ p(h, { children: [/* @__PURE__ */ p(v, {
524
+ children: /* @__PURE__ */ m(g, { children: [/* @__PURE__ */ m(y, {
511
525
  className: "flex flex-col gap-3 md:flex-row md:items-start md:justify-between",
512
- children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f(y, { children: "Holdings Performance" }), /* @__PURE__ */ f(_, { children: "Unrealized gain or loss — market value versus cost basis." })] }), B.length > 0 ? /* @__PURE__ */ p("div", {
526
+ children: [/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p(b, { children: "Holdings Performance" }), /* @__PURE__ */ p(v, { children: "Unrealized gain or loss — market value versus cost basis." })] }), B.length > 0 ? /* @__PURE__ */ m("div", {
513
527
  className: "w-full md:w-56",
514
- children: [/* @__PURE__ */ f(x, {
528
+ children: [/* @__PURE__ */ p(S, {
515
529
  htmlFor: "perf-account",
516
530
  className: "sr-only",
517
531
  children: "Account"
518
- }), /* @__PURE__ */ p(S, {
532
+ }), /* @__PURE__ */ m(C, {
519
533
  value: De ?? "",
520
- onValueChange: (e) => Se(e),
521
- children: [/* @__PURE__ */ f(T, {
534
+ onValueChange: (e) => xe(e),
535
+ children: [/* @__PURE__ */ p(E, {
522
536
  id: "perf-account",
523
- children: /* @__PURE__ */ f(E, { placeholder: "Select account" })
524
- }), /* @__PURE__ */ f(C, { children: B.map((e) => /* @__PURE__ */ f(w, {
537
+ children: /* @__PURE__ */ p(D, { placeholder: "Select account" })
538
+ }), /* @__PURE__ */ p(w, { children: B.map((e) => /* @__PURE__ */ p(T, {
525
539
  value: e.id,
526
540
  children: e.name
527
541
  }, e.id)) })]
528
542
  })]
529
543
  }) : null]
530
- }), /* @__PURE__ */ f(g, { children: L.isLoading ? /* @__PURE__ */ f(s, { rows: 3 }) : B.length === 0 ? /* @__PURE__ */ f(o, {
531
- icon: /* @__PURE__ */ f(ue, {
544
+ }), /* @__PURE__ */ p(_, { children: R.isLoading ? /* @__PURE__ */ p(s, { rows: 3 }) : B.length === 0 ? /* @__PURE__ */ p(o, {
545
+ icon: /* @__PURE__ */ p(f, {
532
546
  className: "size-6",
533
547
  "aria-hidden": "true"
534
548
  }),
535
549
  title: "No accounts yet",
536
550
  description: "Create an account and add holdings to analyze performance."
537
- }) : V.isLoading ? /* @__PURE__ */ f(s, { rows: 3 }) : V.isError ? /* @__PURE__ */ f(ee, { onRetry: () => V.refetch() }) : Q.rows.length === 0 ? /* @__PURE__ */ f(o, {
538
- icon: /* @__PURE__ */ f(u, {
551
+ }) : V.isLoading ? /* @__PURE__ */ p(s, { rows: 3 }) : V.isError ? /* @__PURE__ */ p(ee, { onRetry: () => V.refetch() }) : Q.rows.length === 0 ? /* @__PURE__ */ p(o, {
552
+ icon: /* @__PURE__ */ p(u, {
539
553
  className: "size-6",
540
554
  "aria-hidden": "true"
541
555
  }),
542
556
  title: "No holdings in this account",
543
557
  description: "Add holdings to this account to see unrealized gains and losses."
544
- }) : /* @__PURE__ */ p("div", {
558
+ }) : /* @__PURE__ */ m("div", {
545
559
  className: "space-y-4",
546
- children: [/* @__PURE__ */ p("div", {
560
+ children: [/* @__PURE__ */ m("div", {
547
561
  className: "grid gap-4 sm:grid-cols-3",
548
562
  children: [
549
- /* @__PURE__ */ p("div", {
563
+ /* @__PURE__ */ m("div", {
550
564
  className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
551
- children: [/* @__PURE__ */ f("p", {
565
+ children: [/* @__PURE__ */ p("p", {
552
566
  className: "text-xs text-text-secondary",
553
567
  children: "Total unrealized"
554
- }), /* @__PURE__ */ f("p", {
568
+ }), /* @__PURE__ */ p("p", {
555
569
  className: "mt-1 text-xl font-semibold",
556
- children: /* @__PURE__ */ f(Te, {
570
+ children: /* @__PURE__ */ p(we, {
557
571
  value: Q.totalUnrealized,
558
572
  currency: q
559
573
  })
560
574
  })]
561
575
  }),
562
- /* @__PURE__ */ p("div", {
576
+ /* @__PURE__ */ m("div", {
563
577
  className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
564
- children: [/* @__PURE__ */ f("p", {
578
+ children: [/* @__PURE__ */ p("p", {
565
579
  className: "text-xs text-text-secondary",
566
580
  children: "Cost basis"
567
- }), /* @__PURE__ */ f("p", {
581
+ }), /* @__PURE__ */ p("p", {
568
582
  className: "mt-1 text-xl font-semibold text-text-primary",
569
583
  children: c(Q.totalCost, q)
570
584
  })]
571
585
  }),
572
- /* @__PURE__ */ p("div", {
586
+ /* @__PURE__ */ m("div", {
573
587
  className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
574
- children: [/* @__PURE__ */ f("p", {
588
+ children: [/* @__PURE__ */ p("p", {
575
589
  className: "text-xs text-text-secondary",
576
590
  children: "Return on cost"
577
- }), /* @__PURE__ */ f("p", {
591
+ }), /* @__PURE__ */ p("p", {
578
592
  className: "mt-1 text-xl font-semibold text-text-primary",
579
593
  children: ie(Q.totalCost > 0 ? Q.totalUnrealized / Q.totalCost * 100 : null)
580
594
  })]
581
595
  })
582
596
  ]
583
- }), /* @__PURE__ */ p(D, { children: [/* @__PURE__ */ f(j, { children: /* @__PURE__ */ p(M, { children: [
584
- /* @__PURE__ */ f(A, { children: "Holding" }),
585
- /* @__PURE__ */ f(A, {
597
+ }), /* @__PURE__ */ m(O, { children: [/* @__PURE__ */ p(M, { children: /* @__PURE__ */ m(N, { children: [
598
+ /* @__PURE__ */ p(j, { children: "Holding" }),
599
+ /* @__PURE__ */ p(j, {
586
600
  className: "text-right",
587
601
  children: "Market value"
588
602
  }),
589
- /* @__PURE__ */ f(A, {
603
+ /* @__PURE__ */ p(j, {
590
604
  className: "text-right",
591
605
  children: "Cost basis"
592
606
  }),
593
- /* @__PURE__ */ f(A, {
607
+ /* @__PURE__ */ p(j, {
594
608
  className: "text-right",
595
609
  children: "Unrealized"
596
610
  })
597
- ] }) }), /* @__PURE__ */ f(O, { children: Q.rows.map(({ holding: e, unrealized: t }) => /* @__PURE__ */ p(M, { children: [
598
- /* @__PURE__ */ p(k, { children: [/* @__PURE__ */ f("div", {
611
+ ] }) }), /* @__PURE__ */ p(k, { children: Q.rows.map(({ holding: e, unrealized: t }) => /* @__PURE__ */ m(N, { children: [
612
+ /* @__PURE__ */ m(A, { children: [/* @__PURE__ */ p("div", {
599
613
  className: "font-medium text-text-primary",
600
614
  children: e.symbol
601
- }), /* @__PURE__ */ p("div", {
615
+ }), /* @__PURE__ */ m("div", {
602
616
  className: "text-xs text-text-secondary",
603
617
  children: [
604
- e.name ?? F(e.assetClass),
618
+ e.name ?? I(e.assetClass),
605
619
  " · as of",
606
620
  " ",
607
621
  re(e.asOf)
608
622
  ]
609
623
  })] }),
610
- /* @__PURE__ */ f(k, {
624
+ /* @__PURE__ */ p(A, {
611
625
  className: "text-right",
612
626
  children: c(e.marketValue, e.currency)
613
627
  }),
614
- /* @__PURE__ */ f(k, {
628
+ /* @__PURE__ */ p(A, {
615
629
  className: "text-right text-text-secondary",
616
630
  children: c(e.costBasis, e.currency)
617
631
  }),
618
- /* @__PURE__ */ f(k, {
632
+ /* @__PURE__ */ p(A, {
619
633
  className: "text-right",
620
- children: /* @__PURE__ */ f(Te, {
634
+ children: /* @__PURE__ */ p(we, {
621
635
  value: t,
622
636
  currency: e.currency
623
637
  })