@burdenoff/microfe-brainyrich 2026.828.2 → 2026.830.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.
- package/dist/brainyrich/components/viz.d.ts.map +1 -1
- package/dist/brainyrich/components/viz.js +148 -147
- package/dist/brainyrich/components/viz.js.map +1 -1
- package/dist/brainyrich/hooks/useTr.d.ts +17 -0
- package/dist/brainyrich/hooks/useTr.d.ts.map +1 -0
- package/dist/brainyrich/hooks/useTr.js +14 -0
- package/dist/brainyrich/hooks/useTr.js.map +1 -0
- package/dist/brainyrich/pages/AnalyticsPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/AnalyticsPage.js +253 -252
- package/dist/brainyrich/pages/AnalyticsPage.js.map +1 -1
- package/dist/brainyrich/pages/PortfoliosPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/PortfoliosPage.js +482 -476
- package/dist/brainyrich/pages/PortfoliosPage.js.map +1 -1
- package/dist/brainyrich/pages/ReportsPage.js +36 -36
- package/dist/brainyrich/pages/ReportsPage.js.map +1 -1
- package/dist/brainyrich/pages/RiskPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/RiskPage.js +272 -271
- package/dist/brainyrich/pages/RiskPage.js.map +1 -1
- package/dist/brainyrich/pages/TaxPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/TaxPage.js +198 -197
- package/dist/brainyrich/pages/TaxPage.js.map +1 -1
- package/dist/brainyrich/pages/_shared.d.ts.map +1 -1
- package/dist/brainyrich/pages/_shared.js +84 -82
- package/dist/brainyrich/pages/_shared.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,28 +1,29 @@
|
|
|
1
1
|
import { useAcknowledgeInsight as e, useAllAccounts as t, useAllTransactions as n, useCreateInsight as r, useDismissInsight as i, useHoldings as a, usePagedInsights as o, usePortfolios as ee, useResolveInsight as te } from "../hooks/useBrainyRichApi.js";
|
|
2
2
|
import { LoadMore as ne } from "../components/LoadMore.js";
|
|
3
3
|
import { ConfirmDialog as s } from "../components/ConfirmDialog.js";
|
|
4
|
-
import {
|
|
4
|
+
import { useTr as c } from "../hooks/useTr.js";
|
|
5
|
+
import { DonutChart as re, FadeIn as ie, GlassCard as l, LifecycleStepper as u, MiniAreaChart as ae, StatTile as d } from "../components/viz.js";
|
|
5
6
|
import "../components/index.js";
|
|
6
|
-
import { AllocationBars as f, EmptyState as p, ErrorState as
|
|
7
|
+
import { AllocationBars as f, EmptyState as p, ErrorState as oe, LoadingState as m, SectionShell as se, deltaToneClass as ce, formatDate as h, formatMoney as g, statusBadgeVariant as le } from "./_shared.js";
|
|
7
8
|
import { useMemo as _, useState as v } from "react";
|
|
8
|
-
import { ArrowDownRight as
|
|
9
|
+
import { ArrowDownRight as ue, ArrowUpRight as de, Check as fe, Coins as pe, Landmark as me, MoreHorizontal as he, Receipt as ge, ReceiptText as _e, Scissors as y, ShieldCheck as b, Sparkles as ve, TrendingDown as ye, TrendingUp as x, X as be } from "lucide-react";
|
|
9
10
|
import { Fragment as S, jsx as C, jsxs as w } from "react/jsx-runtime";
|
|
10
|
-
import { Badge as T, Button as E, Card as D, CardContent as O, CardDescription as
|
|
11
|
+
import { Badge as T, Button as E, Card as D, CardContent as O, CardDescription as xe, CardHeader as Se, CardTitle as Ce, DropdownMenu as we, DropdownMenuContent as Te, DropdownMenuItem as k, DropdownMenuLabel as A, DropdownMenuSeparator as Ee, DropdownMenuTrigger as j, Input as De, Label as M, ResponsiveDialog as Oe, ResponsiveDialogClose as ke, ResponsiveDialogContent as Ae, ResponsiveDialogDescription as je, ResponsiveDialogFooter as Me, ResponsiveDialogHeader as Ne, ResponsiveDialogTitle as Pe, Select as Fe, SelectContent as Ie, SelectItem as N, SelectTrigger as Le, SelectValue as Re, Table as P, TableBody as F, TableCell as I, TableHead as L, TableHeader as R, TableRow as z, Tabs as ze, TabsContent as B, TabsList as Be, TabsTrigger as Ve, Textarea as He } from "@burdenoff/fe-libs/ui";
|
|
11
12
|
//#region src/brainyrich/pages/TaxPage.tsx
|
|
12
|
-
var
|
|
13
|
+
var Ue = [
|
|
13
14
|
"INFO",
|
|
14
15
|
"LOW",
|
|
15
16
|
"MEDIUM",
|
|
16
17
|
"HIGH",
|
|
17
18
|
"CRITICAL"
|
|
18
19
|
];
|
|
19
|
-
function
|
|
20
|
+
function V(e) {
|
|
20
21
|
return e.toLowerCase().split("_").map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ");
|
|
21
22
|
}
|
|
22
|
-
function
|
|
23
|
+
function H(e) {
|
|
23
24
|
return e.marketValue - e.costBasis;
|
|
24
25
|
}
|
|
25
|
-
function
|
|
26
|
+
function We(e) {
|
|
26
27
|
switch (e) {
|
|
27
28
|
case "CRITICAL": return "error";
|
|
28
29
|
case "HIGH": return "warning";
|
|
@@ -31,92 +32,92 @@ function He(e) {
|
|
|
31
32
|
default: return "neutral";
|
|
32
33
|
}
|
|
33
34
|
}
|
|
34
|
-
var
|
|
35
|
+
var Ge = {
|
|
35
36
|
title: "",
|
|
36
37
|
detail: "",
|
|
37
38
|
severity: "MEDIUM",
|
|
38
39
|
subject: ""
|
|
39
40
|
};
|
|
40
|
-
function
|
|
41
|
-
let { items:
|
|
41
|
+
function Ke() {
|
|
42
|
+
let a = c(), { items: f, hasMore: ce, loadMore: le, isLoading: ue, isFetchingNextPage: de, isError: fe, refetch: he } = o(), { data: b, isLoading: be, isError: we, refetch: Te } = n(), { data: k, isLoading: A } = t(), { data: Ee } = ee(), j = r(), Ke = e(), U = i(), Xe = te(), [Ze, W] = v(!1), [G, K] = v(Ge), [Qe, q] = v(null), [J, $e] = v(null), Y = _(() => f.filter((e) => e.type === "TAX_OPPORTUNITY"), [f]), X = _(() => Y.filter((e) => e.status === "OPEN"), [Y]), et = _(() => [
|
|
42
43
|
"CRITICAL",
|
|
43
44
|
"HIGH",
|
|
44
45
|
"MEDIUM",
|
|
45
46
|
"LOW",
|
|
46
47
|
"INFO"
|
|
47
48
|
].map((e) => ({
|
|
48
|
-
label:
|
|
49
|
-
value:
|
|
50
|
-
tone:
|
|
51
|
-
})).filter((e) => e.value > 0), [
|
|
49
|
+
label: V(e),
|
|
50
|
+
value: X.filter((t) => t.severity === e).length,
|
|
51
|
+
tone: We(e)
|
|
52
|
+
})).filter((e) => e.value > 0), [X]), Z = _(() => b.filter((e) => e.type === "SELL"), [b]), Q = _(() => b.filter((e) => e.type === "DIVIDEND" || e.type === "INTEREST"), [b]), tt = Z.reduce((e, t) => e + t.amount, 0), nt = Q.reduce((e, t) => e + t.amount, 0), rt = Z[0]?.currency ?? Q[0]?.currency ?? "USD", it = _(() => [...Z].sort((e, t) => new Date(e.tradeDate).getTime() - new Date(t.tradeDate).getTime()).reduce((e, t) => {
|
|
52
53
|
let n = e.length > 0 ? e[e.length - 1].y : 0;
|
|
53
54
|
return e.push({
|
|
54
55
|
x: h(t.tradeDate),
|
|
55
56
|
y: n + t.amount
|
|
56
57
|
}), e;
|
|
57
|
-
}, []), [
|
|
58
|
+
}, []), [Z]), at = it.map((e) => e.y), ot = _(() => k.reduce((e, t) => e + t.holdings.reduce((e, t) => e + H(t), 0), 0), [k]), st = k[0]?.currency ?? rt, ct = _(() => k.flatMap((e) => e.holdings.filter((e) => H(e) < 0).map((t) => ({
|
|
58
59
|
holding: t,
|
|
59
60
|
accountId: e.id,
|
|
60
61
|
accountName: e.name,
|
|
61
|
-
loss:
|
|
62
|
-
}))).sort((e, t) => e.loss - t.loss), [k]),
|
|
63
|
-
function
|
|
64
|
-
|
|
62
|
+
loss: H(t)
|
|
63
|
+
}))).sort((e, t) => e.loss - t.loss), [k]), lt = ct.reduce((e, t) => e + t.loss, 0), ut = ct[0]?.holding.currency ?? st, $ = k.length > 0 || Ee.length > 0;
|
|
64
|
+
function dt() {
|
|
65
|
+
K(Ge), q(null), W(!0);
|
|
65
66
|
}
|
|
66
|
-
function
|
|
67
|
-
|
|
67
|
+
function ft(e) {
|
|
68
|
+
K({
|
|
68
69
|
title: `Harvest ${e.holding.symbol} loss`,
|
|
69
70
|
detail: `Tax-loss-harvest candidate: ${e.holding.symbol} is sitting at an unrealized loss of ${g(e.loss, e.holding.currency)}. Create a rebalance proposal to realize the loss while holding the target allocation.`,
|
|
70
71
|
severity: "MEDIUM",
|
|
71
72
|
subject: `account:${e.accountId}`
|
|
72
|
-
}),
|
|
73
|
+
}), q(null), W(!0);
|
|
73
74
|
}
|
|
74
|
-
function
|
|
75
|
-
let e =
|
|
75
|
+
function pt() {
|
|
76
|
+
let e = G.title.trim();
|
|
76
77
|
if (!e) {
|
|
77
|
-
|
|
78
|
+
q("A title is required.");
|
|
78
79
|
return;
|
|
79
80
|
}
|
|
80
|
-
if (!
|
|
81
|
-
|
|
81
|
+
if (!G.subject) {
|
|
82
|
+
q("Select the account or portfolio this opportunity applies to.");
|
|
82
83
|
return;
|
|
83
84
|
}
|
|
84
|
-
let [t, n] =
|
|
85
|
+
let [t, n] = G.subject.split(":");
|
|
85
86
|
if (!t || !n) {
|
|
86
|
-
|
|
87
|
+
q("Select a valid subject.");
|
|
87
88
|
return;
|
|
88
89
|
}
|
|
89
90
|
j.mutate({
|
|
90
91
|
type: "TAX_OPPORTUNITY",
|
|
91
|
-
severity:
|
|
92
|
+
severity: G.severity,
|
|
92
93
|
title: e,
|
|
93
|
-
detail:
|
|
94
|
+
detail: G.detail.trim() || null,
|
|
94
95
|
subjectId: n,
|
|
95
96
|
subjectType: t
|
|
96
97
|
}, {
|
|
97
98
|
onSuccess: () => {
|
|
98
|
-
|
|
99
|
+
W(!1), K(Ge);
|
|
99
100
|
},
|
|
100
101
|
onError: (e) => {
|
|
101
|
-
|
|
102
|
+
q(e instanceof Error ? e.message : "Could not create the tax insight.");
|
|
102
103
|
}
|
|
103
104
|
});
|
|
104
105
|
}
|
|
105
|
-
let
|
|
106
|
-
return /* @__PURE__ */ w(
|
|
106
|
+
let mt = Ke.isPending || U.isPending || Xe.isPending;
|
|
107
|
+
return /* @__PURE__ */ w(se, {
|
|
107
108
|
title: "Tax Center",
|
|
108
109
|
description: "Act on tax-opportunity insights and review unrealized and realized gains — all from your live portfolio data.",
|
|
109
|
-
badges: [`${
|
|
110
|
+
badges: [`${X.length} open opportunit${X.length === 1 ? "y" : "ies"}`],
|
|
110
111
|
actionLabel: "New tax insight",
|
|
111
|
-
onAction:
|
|
112
|
+
onAction: dt,
|
|
112
113
|
children: [
|
|
113
|
-
/* @__PURE__ */ C(
|
|
114
|
+
/* @__PURE__ */ C(ie, { children: /* @__PURE__ */ w("div", {
|
|
114
115
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5",
|
|
115
116
|
children: [
|
|
116
117
|
/* @__PURE__ */ C(d, {
|
|
117
118
|
label: "Open opportunities",
|
|
118
|
-
value: String(
|
|
119
|
-
icon: /* @__PURE__ */ C(
|
|
119
|
+
value: String(X.length),
|
|
120
|
+
icon: /* @__PURE__ */ C(ve, {
|
|
120
121
|
className: "size-4",
|
|
121
122
|
"aria-hidden": "true"
|
|
122
123
|
}),
|
|
@@ -124,63 +125,63 @@ function W() {
|
|
|
124
125
|
}),
|
|
125
126
|
/* @__PURE__ */ C(d, {
|
|
126
127
|
label: "Realized proceeds",
|
|
127
|
-
value: g(
|
|
128
|
-
icon: /* @__PURE__ */ C(
|
|
128
|
+
value: g(tt, rt),
|
|
129
|
+
icon: /* @__PURE__ */ C(me, {
|
|
129
130
|
className: "size-4",
|
|
130
131
|
"aria-hidden": "true"
|
|
131
132
|
}),
|
|
132
|
-
spark:
|
|
133
|
+
spark: at.length > 1 ? at : void 0,
|
|
133
134
|
sparkTone: "brand"
|
|
134
135
|
}),
|
|
135
136
|
/* @__PURE__ */ C(d, {
|
|
136
137
|
label: "Investment income",
|
|
137
|
-
value: g(
|
|
138
|
-
icon: /* @__PURE__ */ C(
|
|
138
|
+
value: g(nt, rt),
|
|
139
|
+
icon: /* @__PURE__ */ C(pe, {
|
|
139
140
|
className: "size-4",
|
|
140
141
|
"aria-hidden": "true"
|
|
141
142
|
})
|
|
142
143
|
}),
|
|
143
144
|
/* @__PURE__ */ C(d, {
|
|
144
145
|
label: "Harvestable loss",
|
|
145
|
-
value: A ? "—" : g(
|
|
146
|
-
icon: /* @__PURE__ */ C(
|
|
146
|
+
value: A ? "—" : g(lt, ut),
|
|
147
|
+
icon: /* @__PURE__ */ C(y, {
|
|
147
148
|
className: "size-4",
|
|
148
149
|
"aria-hidden": "true"
|
|
149
150
|
})
|
|
150
151
|
}),
|
|
151
152
|
/* @__PURE__ */ C(d, {
|
|
152
153
|
label: "Unrealized P/L",
|
|
153
|
-
value: A ? "—" : g(
|
|
154
|
-
deltaTone:
|
|
155
|
-
icon: C(
|
|
154
|
+
value: A ? "—" : g(ot, st),
|
|
155
|
+
deltaTone: ot >= 0 ? "positive" : "negative",
|
|
156
|
+
icon: C(ot >= 0 ? x : ye, {
|
|
156
157
|
className: "size-4",
|
|
157
158
|
"aria-hidden": "true"
|
|
158
159
|
})
|
|
159
160
|
})
|
|
160
161
|
]
|
|
161
162
|
}) }),
|
|
162
|
-
/* @__PURE__ */ w(
|
|
163
|
+
/* @__PURE__ */ w(ze, {
|
|
163
164
|
defaultValue: "opportunities",
|
|
164
165
|
className: "space-y-4",
|
|
165
166
|
children: [
|
|
166
|
-
/* @__PURE__ */ w(
|
|
167
|
+
/* @__PURE__ */ w(Be, {
|
|
167
168
|
className: "grid w-full grid-cols-2 sm:grid-cols-4",
|
|
168
169
|
children: [
|
|
169
|
-
/* @__PURE__ */ C(
|
|
170
|
+
/* @__PURE__ */ C(Ve, {
|
|
170
171
|
value: "opportunities",
|
|
171
|
-
children: "Opportunities"
|
|
172
|
+
children: a("brainyrich.tax.tabs.opportunities", "Opportunities")
|
|
172
173
|
}),
|
|
173
|
-
/* @__PURE__ */ C(
|
|
174
|
+
/* @__PURE__ */ C(Ve, {
|
|
174
175
|
value: "harvest",
|
|
175
|
-
children: "Harvest"
|
|
176
|
+
children: a("brainyrich.tax.tabs.harvest", "Harvest")
|
|
176
177
|
}),
|
|
177
|
-
/* @__PURE__ */ C(
|
|
178
|
+
/* @__PURE__ */ C(Ve, {
|
|
178
179
|
value: "unrealized",
|
|
179
|
-
children: "Unrealized"
|
|
180
|
+
children: a("brainyrich.tax.tabs.unrealized", "Unrealized")
|
|
180
181
|
}),
|
|
181
|
-
/* @__PURE__ */ C(
|
|
182
|
+
/* @__PURE__ */ C(Ve, {
|
|
182
183
|
value: "realized",
|
|
183
|
-
children: "Realized"
|
|
184
|
+
children: a("brainyrich.tax.tabs.realized", "Realized")
|
|
184
185
|
})
|
|
185
186
|
]
|
|
186
187
|
}),
|
|
@@ -190,42 +191,42 @@ function W() {
|
|
|
190
191
|
className: "grid gap-4 lg:grid-cols-3",
|
|
191
192
|
children: [/* @__PURE__ */ w(D, {
|
|
192
193
|
className: "lg:col-span-2",
|
|
193
|
-
children: [/* @__PURE__ */ w(
|
|
194
|
+
children: [/* @__PURE__ */ w(Se, { children: [/* @__PURE__ */ w(Ce, {
|
|
194
195
|
className: "flex items-center gap-2",
|
|
195
|
-
children: [/* @__PURE__ */ C(
|
|
196
|
+
children: [/* @__PURE__ */ C(ve, {
|
|
196
197
|
className: "h-5 w-5",
|
|
197
198
|
"aria-hidden": "true"
|
|
198
|
-
}), "Tax-opportunity insights"]
|
|
199
|
-
}), /* @__PURE__ */ C(
|
|
200
|
-
icon: /* @__PURE__ */ C(
|
|
199
|
+
}), a("brainyrich.tax.opportunities.title", "Tax-opportunity insights")]
|
|
200
|
+
}), /* @__PURE__ */ C(xe, { children: a("brainyrich.tax.opportunities.description", "Tax-loss harvesting and other tax signals detected across your accounts and portfolios.") })] }), /* @__PURE__ */ C(O, { children: ue ? /* @__PURE__ */ C(m, {}) : fe ? /* @__PURE__ */ C(oe, { onRetry: () => he() }) : Y.length === 0 ? /* @__PURE__ */ C(p, {
|
|
201
|
+
icon: /* @__PURE__ */ C(ge, {
|
|
201
202
|
className: "size-6",
|
|
202
203
|
"aria-hidden": "true"
|
|
203
204
|
}),
|
|
204
205
|
title: "No tax opportunities yet",
|
|
205
206
|
description: "Tax-opportunity insights appear here as the backend generates them from your holdings. You can also flag one manually.",
|
|
206
|
-
action:
|
|
207
|
+
action: $ ? /* @__PURE__ */ w(E, {
|
|
207
208
|
size: "sm",
|
|
208
|
-
onClick:
|
|
209
|
-
children: [/* @__PURE__ */ C(
|
|
209
|
+
onClick: dt,
|
|
210
|
+
children: [/* @__PURE__ */ C(ve, {
|
|
210
211
|
className: "size-4",
|
|
211
212
|
"aria-hidden": "true"
|
|
212
213
|
}), "New tax insight"]
|
|
213
214
|
}) : void 0
|
|
214
215
|
}) : /* @__PURE__ */ w("div", {
|
|
215
216
|
className: "space-y-3",
|
|
216
|
-
children: [
|
|
217
|
+
children: [Y.map((e, t) => /* @__PURE__ */ C(ie, {
|
|
217
218
|
index: t,
|
|
218
|
-
children: /* @__PURE__ */ C(
|
|
219
|
+
children: /* @__PURE__ */ C(Ye, {
|
|
219
220
|
insight: e,
|
|
220
|
-
actionPending:
|
|
221
|
-
onAcknowledge: () =>
|
|
222
|
-
onResolve: () =>
|
|
223
|
-
onDismiss: () =>
|
|
221
|
+
actionPending: mt,
|
|
222
|
+
onAcknowledge: () => Ke.mutate(e.id),
|
|
223
|
+
onResolve: () => Xe.mutate(e.id),
|
|
224
|
+
onDismiss: () => $e(e)
|
|
224
225
|
})
|
|
225
226
|
}, e.id)), /* @__PURE__ */ C(ne, {
|
|
226
|
-
hasMore:
|
|
227
|
-
onClick:
|
|
228
|
-
loading:
|
|
227
|
+
hasMore: ce,
|
|
228
|
+
onClick: le,
|
|
229
|
+
loading: de,
|
|
229
230
|
label: "Load more insights"
|
|
230
231
|
})]
|
|
231
232
|
}) })]
|
|
@@ -244,12 +245,12 @@ function W() {
|
|
|
244
245
|
})]
|
|
245
246
|
}), /* @__PURE__ */ C("div", {
|
|
246
247
|
className: "mt-4",
|
|
247
|
-
children:
|
|
248
|
+
children: et.length === 0 ? /* @__PURE__ */ C("p", {
|
|
248
249
|
className: "py-6 text-center text-sm text-text-secondary",
|
|
249
250
|
children: "No open opportunities."
|
|
250
251
|
}) : /* @__PURE__ */ C(re, {
|
|
251
|
-
data:
|
|
252
|
-
centerValue: String(
|
|
252
|
+
data: et,
|
|
253
|
+
centerValue: String(X.length),
|
|
253
254
|
centerLabel: "open",
|
|
254
255
|
valueFormatter: (e) => `${e} signal${e === 1 ? "" : "s"}`
|
|
255
256
|
})
|
|
@@ -263,7 +264,7 @@ function W() {
|
|
|
263
264
|
className: "mb-4 mt-1 text-xs text-text-secondary",
|
|
264
265
|
children: "How a loss becomes a realized tax benefit."
|
|
265
266
|
}),
|
|
266
|
-
/* @__PURE__ */ C(
|
|
267
|
+
/* @__PURE__ */ C(u, {
|
|
267
268
|
steps: [
|
|
268
269
|
"Detect",
|
|
269
270
|
"Review",
|
|
@@ -278,38 +279,38 @@ function W() {
|
|
|
278
279
|
}),
|
|
279
280
|
/* @__PURE__ */ C(B, {
|
|
280
281
|
value: "harvest",
|
|
281
|
-
children: /* @__PURE__ */ C(
|
|
282
|
-
candidates:
|
|
283
|
-
harvestableLoss:
|
|
284
|
-
currency:
|
|
282
|
+
children: /* @__PURE__ */ C(qe, {
|
|
283
|
+
candidates: ct,
|
|
284
|
+
harvestableLoss: lt,
|
|
285
|
+
currency: ut,
|
|
285
286
|
loading: A,
|
|
286
|
-
canCreate:
|
|
287
|
-
onCreateProposal:
|
|
287
|
+
canCreate: $,
|
|
288
|
+
onCreateProposal: ft
|
|
288
289
|
})
|
|
289
290
|
}),
|
|
290
291
|
/* @__PURE__ */ C(B, {
|
|
291
292
|
value: "unrealized",
|
|
292
|
-
children: /* @__PURE__ */ C(
|
|
293
|
+
children: /* @__PURE__ */ C(Je, { accounts: k })
|
|
293
294
|
}),
|
|
294
295
|
/* @__PURE__ */ C(B, {
|
|
295
296
|
value: "realized",
|
|
296
|
-
children: /* @__PURE__ */ w(D, { children: [/* @__PURE__ */ w(
|
|
297
|
+
children: /* @__PURE__ */ w(D, { children: [/* @__PURE__ */ w(Se, { children: [/* @__PURE__ */ w(Ce, {
|
|
297
298
|
className: "flex items-center gap-2",
|
|
298
|
-
children: [/* @__PURE__ */ C(
|
|
299
|
+
children: [/* @__PURE__ */ C(_e, {
|
|
299
300
|
className: "h-5 w-5",
|
|
300
301
|
"aria-hidden": "true"
|
|
301
302
|
}), "Realized activity"]
|
|
302
|
-
}), /* @__PURE__ */ C(
|
|
303
|
+
}), /* @__PURE__ */ C(xe, { children: "Realized sales, dividends and interest — the taxable events recorded on your accounts." })] }), /* @__PURE__ */ C(O, {
|
|
303
304
|
className: "space-y-6",
|
|
304
|
-
children:
|
|
305
|
-
icon: /* @__PURE__ */ C(
|
|
305
|
+
children: be ? /* @__PURE__ */ C(m, {}) : we ? /* @__PURE__ */ C(oe, { onRetry: () => Te() }) : Z.length === 0 && Q.length === 0 ? /* @__PURE__ */ C(p, {
|
|
306
|
+
icon: /* @__PURE__ */ C(_e, {
|
|
306
307
|
className: "size-6",
|
|
307
308
|
"aria-hidden": "true"
|
|
308
309
|
}),
|
|
309
310
|
title: "No taxable activity recorded",
|
|
310
311
|
description: "Sales, dividends and interest show up here once transactions are recorded against your accounts."
|
|
311
312
|
}) : /* @__PURE__ */ w(S, { children: [
|
|
312
|
-
|
|
313
|
+
it.length > 1 ? /* @__PURE__ */ w("div", {
|
|
313
314
|
className: "rounded-xl border border-border-subtle bg-bg-surface p-4",
|
|
314
315
|
children: [
|
|
315
316
|
/* @__PURE__ */ C("p", {
|
|
@@ -320,10 +321,10 @@ function W() {
|
|
|
320
321
|
className: "mb-3 text-xs text-text-secondary",
|
|
321
322
|
children: "Running total of sale proceeds over trade dates."
|
|
322
323
|
}),
|
|
323
|
-
/* @__PURE__ */ C(
|
|
324
|
-
data:
|
|
324
|
+
/* @__PURE__ */ C(ae, {
|
|
325
|
+
data: it,
|
|
325
326
|
tone: "brand",
|
|
326
|
-
valueFormatter: (e) => g(e,
|
|
327
|
+
valueFormatter: (e) => g(e, rt)
|
|
327
328
|
})
|
|
328
329
|
]
|
|
329
330
|
}) : null,
|
|
@@ -332,7 +333,7 @@ function W() {
|
|
|
332
333
|
children: [/* @__PURE__ */ w("div", {
|
|
333
334
|
className: "flex items-center gap-2",
|
|
334
335
|
children: [
|
|
335
|
-
/* @__PURE__ */ C(
|
|
336
|
+
/* @__PURE__ */ C(me, {
|
|
336
337
|
className: "size-4 text-text-secondary",
|
|
337
338
|
"aria-hidden": "true"
|
|
338
339
|
}),
|
|
@@ -342,10 +343,10 @@ function W() {
|
|
|
342
343
|
}),
|
|
343
344
|
/* @__PURE__ */ C(T, {
|
|
344
345
|
variant: "secondary",
|
|
345
|
-
children:
|
|
346
|
+
children: Z.length
|
|
346
347
|
})
|
|
347
348
|
]
|
|
348
|
-
}),
|
|
349
|
+
}), Z.length === 0 ? /* @__PURE__ */ C("p", {
|
|
349
350
|
className: "text-sm text-text-secondary",
|
|
350
351
|
children: "No sales recorded."
|
|
351
352
|
}) : /* @__PURE__ */ C("div", {
|
|
@@ -365,7 +366,7 @@ function W() {
|
|
|
365
366
|
children: "Proceeds"
|
|
366
367
|
}),
|
|
367
368
|
/* @__PURE__ */ C(L, { children: "Trade date" })
|
|
368
|
-
] }) }), /* @__PURE__ */ C(F, { children:
|
|
369
|
+
] }) }), /* @__PURE__ */ C(F, { children: Z.map((e) => /* @__PURE__ */ w(z, { children: [
|
|
369
370
|
/* @__PURE__ */ C(I, {
|
|
370
371
|
className: "font-medium text-text-primary",
|
|
371
372
|
children: e.symbol ?? "—"
|
|
@@ -394,7 +395,7 @@ function W() {
|
|
|
394
395
|
children: [/* @__PURE__ */ w("div", {
|
|
395
396
|
className: "flex items-center gap-2",
|
|
396
397
|
children: [
|
|
397
|
-
/* @__PURE__ */ C(
|
|
398
|
+
/* @__PURE__ */ C(pe, {
|
|
398
399
|
className: "size-4 text-text-secondary",
|
|
399
400
|
"aria-hidden": "true"
|
|
400
401
|
}),
|
|
@@ -404,10 +405,10 @@ function W() {
|
|
|
404
405
|
}),
|
|
405
406
|
/* @__PURE__ */ C(T, {
|
|
406
407
|
variant: "secondary",
|
|
407
|
-
children:
|
|
408
|
+
children: Q.length
|
|
408
409
|
})
|
|
409
410
|
]
|
|
410
|
-
}),
|
|
411
|
+
}), Q.length === 0 ? /* @__PURE__ */ C("p", {
|
|
411
412
|
className: "text-sm text-text-secondary",
|
|
412
413
|
children: "No income recorded."
|
|
413
414
|
}) : /* @__PURE__ */ C("div", {
|
|
@@ -420,10 +421,10 @@ function W() {
|
|
|
420
421
|
children: "Amount"
|
|
421
422
|
}),
|
|
422
423
|
/* @__PURE__ */ C(L, { children: "Trade date" })
|
|
423
|
-
] }) }), /* @__PURE__ */ C(F, { children:
|
|
424
|
+
] }) }), /* @__PURE__ */ C(F, { children: Q.map((e) => /* @__PURE__ */ w(z, { children: [
|
|
424
425
|
/* @__PURE__ */ C(I, { children: /* @__PURE__ */ C(T, {
|
|
425
426
|
variant: "outline",
|
|
426
|
-
children:
|
|
427
|
+
children: V(e.type)
|
|
427
428
|
}) }),
|
|
428
429
|
/* @__PURE__ */ C(I, {
|
|
429
430
|
className: "text-text-secondary",
|
|
@@ -445,16 +446,16 @@ function W() {
|
|
|
445
446
|
})
|
|
446
447
|
]
|
|
447
448
|
}),
|
|
448
|
-
/* @__PURE__ */ C(
|
|
449
|
-
open:
|
|
449
|
+
/* @__PURE__ */ C(Oe, {
|
|
450
|
+
open: Ze,
|
|
450
451
|
onOpenChange: (e) => {
|
|
451
|
-
|
|
452
|
+
W(e), e || q(null);
|
|
452
453
|
},
|
|
453
|
-
children: /* @__PURE__ */ w(
|
|
454
|
+
children: /* @__PURE__ */ w(Ae, {
|
|
454
455
|
className: "max-h-[90vh] overflow-y-auto sm:max-w-lg",
|
|
455
456
|
children: [
|
|
456
|
-
/* @__PURE__ */ w(
|
|
457
|
-
|
|
457
|
+
/* @__PURE__ */ w(Ne, { children: [/* @__PURE__ */ C(Pe, { children: "New tax insight" }), /* @__PURE__ */ C(je, { children: "Flag a tax opportunity against one of your accounts or portfolios." })] }),
|
|
458
|
+
$ ? /* @__PURE__ */ w("div", {
|
|
458
459
|
className: "space-y-4 py-2",
|
|
459
460
|
children: [
|
|
460
461
|
/* @__PURE__ */ w("div", {
|
|
@@ -462,10 +463,10 @@ function W() {
|
|
|
462
463
|
children: [/* @__PURE__ */ C(M, {
|
|
463
464
|
htmlFor: "tax-title",
|
|
464
465
|
children: "Title"
|
|
465
|
-
}), /* @__PURE__ */ C(
|
|
466
|
+
}), /* @__PURE__ */ C(De, {
|
|
466
467
|
id: "tax-title",
|
|
467
|
-
value:
|
|
468
|
-
onChange: (e) =>
|
|
468
|
+
value: G.title,
|
|
469
|
+
onChange: (e) => K((t) => ({
|
|
469
470
|
...t,
|
|
470
471
|
title: e.target.value
|
|
471
472
|
})),
|
|
@@ -479,18 +480,18 @@ function W() {
|
|
|
479
480
|
children: [/* @__PURE__ */ C(M, {
|
|
480
481
|
htmlFor: "tax-severity",
|
|
481
482
|
children: "Severity"
|
|
482
|
-
}), /* @__PURE__ */ w(
|
|
483
|
-
value:
|
|
484
|
-
onValueChange: (e) =>
|
|
483
|
+
}), /* @__PURE__ */ w(Fe, {
|
|
484
|
+
value: G.severity,
|
|
485
|
+
onValueChange: (e) => K((t) => ({
|
|
485
486
|
...t,
|
|
486
487
|
severity: e
|
|
487
488
|
})),
|
|
488
|
-
children: [/* @__PURE__ */ C(
|
|
489
|
+
children: [/* @__PURE__ */ C(Le, {
|
|
489
490
|
id: "tax-severity",
|
|
490
|
-
children: /* @__PURE__ */ C(
|
|
491
|
-
}), /* @__PURE__ */ C(
|
|
491
|
+
children: /* @__PURE__ */ C(Re, {})
|
|
492
|
+
}), /* @__PURE__ */ C(Ie, { children: Ue.map((e) => /* @__PURE__ */ C(N, {
|
|
492
493
|
value: e,
|
|
493
|
-
children:
|
|
494
|
+
children: V(e)
|
|
494
495
|
}, e)) })]
|
|
495
496
|
})]
|
|
496
497
|
}), /* @__PURE__ */ w("div", {
|
|
@@ -498,16 +499,16 @@ function W() {
|
|
|
498
499
|
children: [/* @__PURE__ */ C(M, {
|
|
499
500
|
htmlFor: "tax-subject",
|
|
500
501
|
children: "Applies to"
|
|
501
|
-
}), /* @__PURE__ */ w(
|
|
502
|
-
value:
|
|
503
|
-
onValueChange: (e) =>
|
|
502
|
+
}), /* @__PURE__ */ w(Fe, {
|
|
503
|
+
value: G.subject,
|
|
504
|
+
onValueChange: (e) => K((t) => ({
|
|
504
505
|
...t,
|
|
505
506
|
subject: e
|
|
506
507
|
})),
|
|
507
|
-
children: [/* @__PURE__ */ C(
|
|
508
|
+
children: [/* @__PURE__ */ C(Le, {
|
|
508
509
|
id: "tax-subject",
|
|
509
|
-
children: /* @__PURE__ */ C(
|
|
510
|
-
}), /* @__PURE__ */ w(
|
|
510
|
+
children: /* @__PURE__ */ C(Re, { placeholder: "Select subject" })
|
|
511
|
+
}), /* @__PURE__ */ w(Ie, { children: [Ee.map((e) => /* @__PURE__ */ w(N, {
|
|
511
512
|
value: `portfolio:${e.id}`,
|
|
512
513
|
children: ["Portfolio · ", e.name]
|
|
513
514
|
}, `portfolio:${e.id}`)), k.map((e) => /* @__PURE__ */ w(N, {
|
|
@@ -522,10 +523,10 @@ function W() {
|
|
|
522
523
|
children: [/* @__PURE__ */ C(M, {
|
|
523
524
|
htmlFor: "tax-detail",
|
|
524
525
|
children: "Detail"
|
|
525
|
-
}), /* @__PURE__ */ C(
|
|
526
|
+
}), /* @__PURE__ */ C(He, {
|
|
526
527
|
id: "tax-detail",
|
|
527
|
-
value:
|
|
528
|
-
onChange: (e) =>
|
|
528
|
+
value: G.detail,
|
|
529
|
+
onChange: (e) => K((t) => ({
|
|
529
530
|
...t,
|
|
530
531
|
detail: e.target.value
|
|
531
532
|
})),
|
|
@@ -533,17 +534,17 @@ function W() {
|
|
|
533
534
|
placeholder: "What is the opportunity and how should it be actioned?"
|
|
534
535
|
})]
|
|
535
536
|
}),
|
|
536
|
-
|
|
537
|
+
Qe ? /* @__PURE__ */ C("p", {
|
|
537
538
|
className: "text-sm text-status-error-text",
|
|
538
539
|
role: "alert",
|
|
539
|
-
children:
|
|
540
|
+
children: Qe
|
|
540
541
|
}) : null
|
|
541
542
|
]
|
|
542
543
|
}) : /* @__PURE__ */ C(p, {
|
|
543
544
|
title: "No subject available",
|
|
544
545
|
description: "Create an account or portfolio first, then flag a tax opportunity against it."
|
|
545
546
|
}),
|
|
546
|
-
/* @__PURE__ */ w(
|
|
547
|
+
/* @__PURE__ */ w(Me, { children: [/* @__PURE__ */ C(ke, {
|
|
547
548
|
asChild: !0,
|
|
548
549
|
children: /* @__PURE__ */ C(E, {
|
|
549
550
|
variant: "outline",
|
|
@@ -551,36 +552,36 @@ function W() {
|
|
|
551
552
|
children: "Cancel"
|
|
552
553
|
})
|
|
553
554
|
}), /* @__PURE__ */ C(E, {
|
|
554
|
-
onClick:
|
|
555
|
-
disabled:
|
|
555
|
+
onClick: pt,
|
|
556
|
+
disabled: !$ || !G.title.trim() || !G.subject || j.isPending,
|
|
556
557
|
children: j.isPending ? "Creating…" : "Create insight"
|
|
557
558
|
})] })
|
|
558
559
|
]
|
|
559
560
|
})
|
|
560
561
|
}),
|
|
561
562
|
/* @__PURE__ */ C(s, {
|
|
562
|
-
open: !!
|
|
563
|
+
open: !!J,
|
|
563
564
|
onOpenChange: (e) => {
|
|
564
|
-
e ||
|
|
565
|
+
e || $e(null);
|
|
565
566
|
},
|
|
566
567
|
title: "Dismiss tax insight?",
|
|
567
|
-
description:
|
|
568
|
+
description: J ? /* @__PURE__ */ w(S, { children: [
|
|
568
569
|
"“",
|
|
569
|
-
|
|
570
|
+
J.title,
|
|
570
571
|
"” will be marked as dismissed and removed from your open opportunities. This does not delete the underlying holdings or transactions."
|
|
571
572
|
] }) : void 0,
|
|
572
573
|
confirmLabel: "Dismiss insight",
|
|
573
574
|
pendingLabel: "Dismissing…",
|
|
574
575
|
destructive: !0,
|
|
575
|
-
pending:
|
|
576
|
+
pending: U.isPending,
|
|
576
577
|
onConfirm: () => {
|
|
577
|
-
|
|
578
|
+
J && U.mutate(J.id, { onSuccess: () => $e(null) });
|
|
578
579
|
}
|
|
579
580
|
})
|
|
580
581
|
]
|
|
581
582
|
});
|
|
582
583
|
}
|
|
583
|
-
function
|
|
584
|
+
function qe({ candidates: e, harvestableLoss: t, currency: n, loading: r, canCreate: i, onCreateProposal: a }) {
|
|
584
585
|
let o = _(() => e.slice(0, 6).map((e) => ({
|
|
585
586
|
label: e.holding.symbol,
|
|
586
587
|
value: t === 0 ? 0 : e.loss / t * 100,
|
|
@@ -594,16 +595,16 @@ function We({ candidates: e, harvestableLoss: t, currency: n, loading: r, canCre
|
|
|
594
595
|
className: "grid gap-4 lg:grid-cols-3",
|
|
595
596
|
children: [/* @__PURE__ */ w(D, {
|
|
596
597
|
className: "lg:col-span-2",
|
|
597
|
-
children: [/* @__PURE__ */ w(
|
|
598
|
+
children: [/* @__PURE__ */ w(Se, { children: [/* @__PURE__ */ w(Ce, {
|
|
598
599
|
className: "flex items-center gap-2",
|
|
599
|
-
children: [/* @__PURE__ */ C(
|
|
600
|
+
children: [/* @__PURE__ */ C(y, {
|
|
600
601
|
className: "h-5 w-5",
|
|
601
602
|
"aria-hidden": "true"
|
|
602
603
|
}), "Harvest candidates"]
|
|
603
|
-
}), /* @__PURE__ */ C(
|
|
604
|
+
}), /* @__PURE__ */ C(xe, { children: "Holdings sitting at an unrealized loss — sell to realize the loss and offset gains." })] }), /* @__PURE__ */ C(O, {
|
|
604
605
|
className: "space-y-4",
|
|
605
606
|
children: e.length === 0 ? /* @__PURE__ */ C(p, {
|
|
606
|
-
icon: /* @__PURE__ */ C(
|
|
607
|
+
icon: /* @__PURE__ */ C(y, {
|
|
607
608
|
className: "size-6",
|
|
608
609
|
"aria-hidden": "true"
|
|
609
610
|
}),
|
|
@@ -658,7 +659,7 @@ function We({ candidates: e, harvestableLoss: t, currency: n, loading: r, canCre
|
|
|
658
659
|
}),
|
|
659
660
|
/* @__PURE__ */ C(I, {
|
|
660
661
|
className: "text-right",
|
|
661
|
-
children: /* @__PURE__ */ C(
|
|
662
|
+
children: /* @__PURE__ */ C(U, {
|
|
662
663
|
value: e.loss,
|
|
663
664
|
currency: e.holding.currency
|
|
664
665
|
})
|
|
@@ -707,7 +708,7 @@ function We({ candidates: e, harvestableLoss: t, currency: n, loading: r, canCre
|
|
|
707
708
|
onClick: () => {
|
|
708
709
|
e[0] && a(e[0]);
|
|
709
710
|
},
|
|
710
|
-
children: [/* @__PURE__ */ C(
|
|
711
|
+
children: [/* @__PURE__ */ C(y, {
|
|
711
712
|
className: "size-4",
|
|
712
713
|
"aria-hidden": "true"
|
|
713
714
|
}), "Create rebalance proposal"]
|
|
@@ -723,7 +724,7 @@ function We({ candidates: e, harvestableLoss: t, currency: n, loading: r, canCre
|
|
|
723
724
|
className: "mb-4 mt-1 text-xs text-text-secondary",
|
|
724
725
|
children: "Realize losses while holding your target allocation. Confirm wash-sale windows before executing."
|
|
725
726
|
}),
|
|
726
|
-
/* @__PURE__ */ C(
|
|
727
|
+
/* @__PURE__ */ C(u, {
|
|
727
728
|
steps: [
|
|
728
729
|
"Detect",
|
|
729
730
|
"Review",
|
|
@@ -736,18 +737,18 @@ function We({ candidates: e, harvestableLoss: t, currency: n, loading: r, canCre
|
|
|
736
737
|
})]
|
|
737
738
|
});
|
|
738
739
|
}
|
|
739
|
-
function
|
|
740
|
-
let [t, n] = v(""), r = t || e[0]?.id, i = e.find((e) => e.id === r), { data: o, isLoading: ee, isError: te, refetch: ne } = a({ accountId: r }), s = i?.currency ?? o[0]?.currency ?? "USD", c = o.reduce((e, t) => e +
|
|
740
|
+
function Je({ accounts: e }) {
|
|
741
|
+
let [t, n] = v(""), r = t || e[0]?.id, i = e.find((e) => e.id === r), { data: o, isLoading: ee, isError: te, refetch: ne } = a({ accountId: r }), s = i?.currency ?? o[0]?.currency ?? "USD", c = o.reduce((e, t) => e + H(t), 0), ie = o.filter((e) => H(e) > 0).length, l = o.filter((e) => H(e) < 0).length, u = _(() => {
|
|
741
742
|
let e = /* @__PURE__ */ new Map();
|
|
742
743
|
for (let t of o) {
|
|
743
744
|
let n = e.get(t.assetClass) ?? [];
|
|
744
745
|
n.push(t), e.set(t.assetClass, n);
|
|
745
746
|
}
|
|
746
747
|
return Array.from(e.entries());
|
|
747
|
-
}, [o]),
|
|
748
|
-
label:
|
|
748
|
+
}, [o]), ae = _(() => u.map(([e, t]) => ({
|
|
749
|
+
label: V(e),
|
|
749
750
|
value: t.reduce((e, t) => e + t.marketValue, 0)
|
|
750
|
-
})).filter((e) => e.value > 0), [u]),
|
|
751
|
+
})).filter((e) => e.value > 0), [u]), f = ae.reduce((e, t) => e + t.value, 0);
|
|
751
752
|
return e.length === 0 ? /* @__PURE__ */ C(D, { children: /* @__PURE__ */ C(O, {
|
|
752
753
|
className: "pt-6",
|
|
753
754
|
children: /* @__PURE__ */ C(p, {
|
|
@@ -758,27 +759,27 @@ function Ge({ accounts: e }) {
|
|
|
758
759
|
title: "No accounts yet",
|
|
759
760
|
description: "Add an account with holdings to see unrealized gains and losses."
|
|
760
761
|
})
|
|
761
|
-
}) }) : /* @__PURE__ */ w(D, { children: [/* @__PURE__ */ w(
|
|
762
|
+
}) }) : /* @__PURE__ */ w(D, { children: [/* @__PURE__ */ w(Se, {
|
|
762
763
|
className: "flex flex-col gap-4 md:flex-row md:items-start md:justify-between",
|
|
763
|
-
children: [/* @__PURE__ */ w("div", { children: [/* @__PURE__ */ w(
|
|
764
|
+
children: [/* @__PURE__ */ w("div", { children: [/* @__PURE__ */ w(Ce, {
|
|
764
765
|
className: "flex items-center gap-2",
|
|
765
766
|
children: [/* @__PURE__ */ C(x, {
|
|
766
767
|
className: "h-5 w-5",
|
|
767
768
|
"aria-hidden": "true"
|
|
768
769
|
}), "Unrealized gains & losses"]
|
|
769
|
-
}), /* @__PURE__ */ C(
|
|
770
|
+
}), /* @__PURE__ */ C(xe, { children: "Market value minus cost basis for each holding in the selected account." })] }), /* @__PURE__ */ w("div", {
|
|
770
771
|
className: "w-full md:w-64",
|
|
771
772
|
children: [/* @__PURE__ */ C(M, {
|
|
772
773
|
htmlFor: "unrealized-account",
|
|
773
774
|
className: "sr-only",
|
|
774
775
|
children: "Account"
|
|
775
|
-
}), /* @__PURE__ */ w(
|
|
776
|
+
}), /* @__PURE__ */ w(Fe, {
|
|
776
777
|
value: r ?? "",
|
|
777
778
|
onValueChange: n,
|
|
778
|
-
children: [/* @__PURE__ */ C(
|
|
779
|
+
children: [/* @__PURE__ */ C(Le, {
|
|
779
780
|
id: "unrealized-account",
|
|
780
|
-
children: /* @__PURE__ */ C(
|
|
781
|
-
}), /* @__PURE__ */ C(
|
|
781
|
+
children: /* @__PURE__ */ C(Re, { placeholder: "Select account" })
|
|
782
|
+
}), /* @__PURE__ */ C(Ie, { children: e.map((e) => /* @__PURE__ */ C(N, {
|
|
782
783
|
value: e.id,
|
|
783
784
|
children: e.name
|
|
784
785
|
}, e.id)) })]
|
|
@@ -786,7 +787,7 @@ function Ge({ accounts: e }) {
|
|
|
786
787
|
})]
|
|
787
788
|
}), /* @__PURE__ */ C(O, {
|
|
788
789
|
className: "space-y-4",
|
|
789
|
-
children: ee ? /* @__PURE__ */ C(m, {}) : te ? /* @__PURE__ */ C(
|
|
790
|
+
children: ee ? /* @__PURE__ */ C(m, {}) : te ? /* @__PURE__ */ C(oe, { onRetry: () => ne() }) : o.length === 0 ? /* @__PURE__ */ C(p, {
|
|
790
791
|
icon: /* @__PURE__ */ C(x, {
|
|
791
792
|
className: "size-6",
|
|
792
793
|
"aria-hidden": "true"
|
|
@@ -802,7 +803,7 @@ function Ge({ accounts: e }) {
|
|
|
802
803
|
label: "Unrealized P/L",
|
|
803
804
|
value: g(c, s),
|
|
804
805
|
deltaTone: c >= 0 ? "positive" : "negative",
|
|
805
|
-
icon: C(c >= 0 ? x :
|
|
806
|
+
icon: C(c >= 0 ? x : ye, {
|
|
806
807
|
className: "size-4",
|
|
807
808
|
"aria-hidden": "true"
|
|
808
809
|
})
|
|
@@ -813,16 +814,16 @@ function Ge({ accounts: e }) {
|
|
|
813
814
|
}),
|
|
814
815
|
/* @__PURE__ */ C(d, {
|
|
815
816
|
label: "Gainers",
|
|
816
|
-
value: String(
|
|
817
|
-
icon: /* @__PURE__ */ C(
|
|
817
|
+
value: String(ie),
|
|
818
|
+
icon: /* @__PURE__ */ C(de, {
|
|
818
819
|
className: "size-4",
|
|
819
820
|
"aria-hidden": "true"
|
|
820
821
|
})
|
|
821
822
|
}),
|
|
822
823
|
/* @__PURE__ */ C(d, {
|
|
823
824
|
label: "Losers",
|
|
824
|
-
value: String(
|
|
825
|
-
icon: /* @__PURE__ */ C(
|
|
825
|
+
value: String(l),
|
|
826
|
+
icon: /* @__PURE__ */ C(ue, {
|
|
826
827
|
className: "size-4",
|
|
827
828
|
"aria-hidden": "true"
|
|
828
829
|
})
|
|
@@ -834,10 +835,10 @@ function Ge({ accounts: e }) {
|
|
|
834
835
|
className: "mb-2 text-xs font-medium uppercase tracking-wide text-text-secondary",
|
|
835
836
|
children: "Allocation by asset class"
|
|
836
837
|
}), /* @__PURE__ */ C(re, {
|
|
837
|
-
data:
|
|
838
|
+
data: ae,
|
|
838
839
|
legend: !1,
|
|
839
840
|
height: 180,
|
|
840
|
-
centerValue: g(
|
|
841
|
+
centerValue: g(f, s),
|
|
841
842
|
centerLabel: "market value",
|
|
842
843
|
valueFormatter: (e) => g(e, s)
|
|
843
844
|
})]
|
|
@@ -845,7 +846,7 @@ function Ge({ accounts: e }) {
|
|
|
845
846
|
}), /* @__PURE__ */ C("div", {
|
|
846
847
|
className: "space-y-6",
|
|
847
848
|
children: u.map(([e, t]) => {
|
|
848
|
-
let n = t.reduce((e, t) => e +
|
|
849
|
+
let n = t.reduce((e, t) => e + H(t), 0);
|
|
849
850
|
return /* @__PURE__ */ w("div", {
|
|
850
851
|
className: "space-y-2",
|
|
851
852
|
children: [/* @__PURE__ */ w("div", {
|
|
@@ -854,12 +855,12 @@ function Ge({ accounts: e }) {
|
|
|
854
855
|
className: "flex items-center gap-2",
|
|
855
856
|
children: [/* @__PURE__ */ C("h3", {
|
|
856
857
|
className: "text-sm font-semibold text-text-primary",
|
|
857
|
-
children:
|
|
858
|
+
children: V(e)
|
|
858
859
|
}), /* @__PURE__ */ C(T, {
|
|
859
860
|
variant: "secondary",
|
|
860
861
|
children: t.length
|
|
861
862
|
})]
|
|
862
|
-
}), /* @__PURE__ */ C(
|
|
863
|
+
}), /* @__PURE__ */ C(U, {
|
|
863
864
|
value: n,
|
|
864
865
|
currency: s
|
|
865
866
|
})]
|
|
@@ -905,8 +906,8 @@ function Ge({ accounts: e }) {
|
|
|
905
906
|
}),
|
|
906
907
|
/* @__PURE__ */ C(I, {
|
|
907
908
|
className: "text-right",
|
|
908
|
-
children: /* @__PURE__ */ C(
|
|
909
|
-
value:
|
|
909
|
+
children: /* @__PURE__ */ C(U, {
|
|
910
|
+
value: H(e),
|
|
910
911
|
currency: e.currency
|
|
911
912
|
})
|
|
912
913
|
})
|
|
@@ -917,10 +918,10 @@ function Ge({ accounts: e }) {
|
|
|
917
918
|
})] })
|
|
918
919
|
})] });
|
|
919
920
|
}
|
|
920
|
-
function
|
|
921
|
-
let n = e > 0, r = n ?
|
|
921
|
+
function U({ value: e, currency: t }) {
|
|
922
|
+
let n = e > 0, r = n ? de : e < 0 ? ue : ye, i = n ? "+" : "";
|
|
922
923
|
return /* @__PURE__ */ w("span", {
|
|
923
|
-
className: `inline-flex items-center justify-end gap-1 font-semibold ${
|
|
924
|
+
className: `inline-flex items-center justify-end gap-1 font-semibold ${ce(e)}`,
|
|
924
925
|
children: [
|
|
925
926
|
e === 0 ? null : /* @__PURE__ */ C(r, {
|
|
926
927
|
className: "size-4",
|
|
@@ -931,7 +932,7 @@ function G({ value: e, currency: t }) {
|
|
|
931
932
|
]
|
|
932
933
|
});
|
|
933
934
|
}
|
|
934
|
-
function
|
|
935
|
+
function Ye({ insight: e, actionPending: t, onAcknowledge: n, onResolve: r, onDismiss: i }) {
|
|
935
936
|
let a = e.status === "RESOLVED" || e.status === "DISMISSED";
|
|
936
937
|
return /* @__PURE__ */ w("div", {
|
|
937
938
|
className: "flex items-start justify-between gap-4 rounded-lg border border-border-subtle bg-bg-surface p-4 transition-shadow motion-safe:hover:shadow-[var(--shadow-pop-hover,var(--shadow-elevation-2))]",
|
|
@@ -946,12 +947,12 @@ function Ke({ insight: e, actionPending: t, onAcknowledge: n, onResolve: r, onDi
|
|
|
946
947
|
children: e.title
|
|
947
948
|
}),
|
|
948
949
|
/* @__PURE__ */ C(T, {
|
|
949
|
-
variant:
|
|
950
|
-
children:
|
|
950
|
+
variant: le(e.severity),
|
|
951
|
+
children: V(e.severity)
|
|
951
952
|
}),
|
|
952
953
|
/* @__PURE__ */ C(T, {
|
|
953
|
-
variant:
|
|
954
|
-
children:
|
|
954
|
+
variant: le(e.status),
|
|
955
|
+
children: V(e.status)
|
|
955
956
|
})
|
|
956
957
|
]
|
|
957
958
|
}),
|
|
@@ -962,7 +963,7 @@ function Ke({ insight: e, actionPending: t, onAcknowledge: n, onResolve: r, onDi
|
|
|
962
963
|
/* @__PURE__ */ w("p", {
|
|
963
964
|
className: "text-xs text-text-muted",
|
|
964
965
|
children: [
|
|
965
|
-
|
|
966
|
+
V(e.subjectType),
|
|
966
967
|
" · Detected ",
|
|
967
968
|
h(e.createdAt)
|
|
968
969
|
]
|
|
@@ -971,41 +972,41 @@ function Ke({ insight: e, actionPending: t, onAcknowledge: n, onResolve: r, onDi
|
|
|
971
972
|
}), a ? /* @__PURE__ */ C("span", {
|
|
972
973
|
className: "mt-1 text-xs text-text-muted",
|
|
973
974
|
children: "Closed"
|
|
974
|
-
}) : /* @__PURE__ */ w(
|
|
975
|
+
}) : /* @__PURE__ */ w(we, { children: [/* @__PURE__ */ C(j, {
|
|
975
976
|
asChild: !0,
|
|
976
977
|
children: /* @__PURE__ */ C(E, {
|
|
977
978
|
variant: "ghost",
|
|
978
979
|
size: "sm",
|
|
979
980
|
"aria-label": `Actions for ${e.title}`,
|
|
980
981
|
disabled: t,
|
|
981
|
-
children: /* @__PURE__ */ C(
|
|
982
|
+
children: /* @__PURE__ */ C(he, {
|
|
982
983
|
className: "size-4",
|
|
983
984
|
"aria-hidden": "true"
|
|
984
985
|
})
|
|
985
986
|
})
|
|
986
|
-
}), /* @__PURE__ */ w(
|
|
987
|
+
}), /* @__PURE__ */ w(Te, {
|
|
987
988
|
align: "end",
|
|
988
989
|
children: [
|
|
989
|
-
/* @__PURE__ */ C(
|
|
990
|
-
/* @__PURE__ */ C(
|
|
991
|
-
e.status === "OPEN" ? /* @__PURE__ */ w(
|
|
990
|
+
/* @__PURE__ */ C(A, { children: "Actions" }),
|
|
991
|
+
/* @__PURE__ */ C(Ee, {}),
|
|
992
|
+
e.status === "OPEN" ? /* @__PURE__ */ w(k, {
|
|
992
993
|
onClick: n,
|
|
993
|
-
children: [/* @__PURE__ */ C(
|
|
994
|
+
children: [/* @__PURE__ */ C(fe, {
|
|
994
995
|
className: "size-4",
|
|
995
996
|
"aria-hidden": "true"
|
|
996
997
|
}), "Acknowledge"]
|
|
997
998
|
}) : null,
|
|
998
|
-
/* @__PURE__ */ w(
|
|
999
|
+
/* @__PURE__ */ w(k, {
|
|
999
1000
|
onClick: r,
|
|
1000
|
-
children: [/* @__PURE__ */ C(
|
|
1001
|
+
children: [/* @__PURE__ */ C(b, {
|
|
1001
1002
|
className: "size-4",
|
|
1002
1003
|
"aria-hidden": "true"
|
|
1003
1004
|
}), "Resolve"]
|
|
1004
1005
|
}),
|
|
1005
|
-
/* @__PURE__ */ w(
|
|
1006
|
+
/* @__PURE__ */ w(k, {
|
|
1006
1007
|
className: "text-status-error-text",
|
|
1007
1008
|
onClick: i,
|
|
1008
|
-
children: [/* @__PURE__ */ C(
|
|
1009
|
+
children: [/* @__PURE__ */ C(be, {
|
|
1009
1010
|
className: "size-4",
|
|
1010
1011
|
"aria-hidden": "true"
|
|
1011
1012
|
}), "Dismiss"]
|
|
@@ -1015,6 +1016,6 @@ function Ke({ insight: e, actionPending: t, onAcknowledge: n, onResolve: r, onDi
|
|
|
1015
1016
|
});
|
|
1016
1017
|
}
|
|
1017
1018
|
//#endregion
|
|
1018
|
-
export {
|
|
1019
|
+
export { Ke as TaxPage };
|
|
1019
1020
|
|
|
1020
1021
|
//# sourceMappingURL=TaxPage.js.map
|