@burdenoff/microfe-brainyrich 2026.825.1 → 2026.828.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/reuse/DocumentsPanel.d.ts +4 -0
- package/dist/brainyrich/components/reuse/DocumentsPanel.d.ts.map +1 -1
- package/dist/brainyrich/components/reuse/DocumentsPanel.js +150 -99
- package/dist/brainyrich/components/reuse/DocumentsPanel.js.map +1 -1
- package/dist/brainyrich/hooks/useBrainyRichApi.d.ts +179 -1
- package/dist/brainyrich/hooks/useBrainyRichApi.d.ts.map +1 -1
- package/dist/brainyrich/hooks/useBrainyRichApi.js +101 -83
- package/dist/brainyrich/hooks/useBrainyRichApi.js.map +1 -1
- package/dist/brainyrich/pages/AccountsPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/AccountsPage.js +159 -148
- package/dist/brainyrich/pages/AccountsPage.js.map +1 -1
- package/dist/brainyrich/pages/AdminFirmPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/AdminFirmPage.js +115 -83
- package/dist/brainyrich/pages/AdminFirmPage.js.map +1 -1
- package/dist/brainyrich/pages/AiAssistantPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/AiAssistantPage.js +251 -230
- package/dist/brainyrich/pages/AiAssistantPage.js.map +1 -1
- package/dist/brainyrich/pages/FirmPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/FirmPage.js +148 -116
- package/dist/brainyrich/pages/FirmPage.js.map +1 -1
- package/dist/brainyrich/pages/PortfoliosPage.d.ts +14 -0
- package/dist/brainyrich/pages/PortfoliosPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/PortfoliosPage.js +530 -353
- package/dist/brainyrich/pages/PortfoliosPage.js.map +1 -1
- package/dist/brainyrich/pages/RiskPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/RiskPage.js +381 -396
- package/dist/brainyrich/pages/RiskPage.js.map +1 -1
- package/dist/brainyrich/pages/_shared.d.ts +21 -0
- package/dist/brainyrich/pages/_shared.d.ts.map +1 -1
- package/dist/brainyrich/pages/_shared.js +66 -31
- package/dist/brainyrich/pages/_shared.js.map +1 -1
- package/dist/generated/global-operations.d.ts +31 -1
- package/dist/generated/global-operations.d.ts.map +1 -1
- package/dist/generated/wspace-operations.d.ts +31 -1
- package/dist/generated/wspace-operations.d.ts.map +1 -1
- package/dist/test/setup.d.ts +1 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/package.json +11 -2
|
@@ -4,14 +4,14 @@ import { ConfirmDialog as ue } from "../components/ConfirmDialog.js";
|
|
|
4
4
|
import { ActorName as c } from "../components/ActorName.js";
|
|
5
5
|
import { DonutChart as de, FadeIn as l, GlassCard as fe, LifecycleStepper as pe, StatTile as u } from "../components/viz.js";
|
|
6
6
|
import "../components/index.js";
|
|
7
|
-
import { EmptyState as d, ErrorState as f, LoadingState as p,
|
|
8
|
-
import { CommentThread as
|
|
9
|
-
import { useMemo as
|
|
10
|
-
import { Activity as
|
|
11
|
-
import { Fragment as
|
|
12
|
-
import { Badge as
|
|
7
|
+
import { EmptyState as d, ErrorState as f, LoadingState as p, MetricGrid as me, SectionShell as he, formatDate as m, formatMoney as h, formatPct as g, readEngineMetrics as ge, statusBadgeVariant as _ } from "./_shared.js";
|
|
8
|
+
import { CommentThread as v } from "../components/reuse/CommentThread.js";
|
|
9
|
+
import { useMemo as y, useState as b } from "react";
|
|
10
|
+
import { Activity as _e, AlertTriangle as ve, ArrowRight as ye, Check as be, Eye as xe, Gauge as x, Layers as Se, LineChart as Ce, MoreHorizontal as we, Plus as Te, RefreshCw as Ee, Scale as De, Scissors as Oe, Search as ke, ShieldAlert as S, ShieldCheck as C, Sparkles as Ae, TrendingUp as je, X as w } from "lucide-react";
|
|
11
|
+
import { Fragment as Me, jsx as T, jsxs as E } from "react/jsx-runtime";
|
|
12
|
+
import { Badge as D, Button as O, Card as k, CardContent as A, CardDescription as j, CardHeader as M, CardTitle as N, Dialog as Ne, DialogClose as Pe, DialogContent as Fe, DialogDescription as Ie, DialogFooter as Le, DialogHeader as Re, DialogTitle as ze, DropdownMenu as Be, DropdownMenuContent as Ve, DropdownMenuItem as P, DropdownMenuLabel as He, DropdownMenuSeparator as Ue, DropdownMenuTrigger as We, Input as F, Label as I, Select as Ge, SelectContent as Ke, SelectItem as qe, SelectTrigger as Je, SelectValue as Ye, Table as Xe, TableBody as Ze, TableCell as L, TableHead as R, TableHeader as Qe, TableRow as z, Textarea as $e } from "@burdenoff/fe-libs/ui";
|
|
13
13
|
//#region src/brainyrich/pages/RiskPage.tsx
|
|
14
|
-
var
|
|
14
|
+
var et = {
|
|
15
15
|
DRAFT: ["PROPOSED", "CANCELLED"],
|
|
16
16
|
PROPOSED: [
|
|
17
17
|
"APPROVED",
|
|
@@ -22,49 +22,49 @@ var $e = {
|
|
|
22
22
|
REJECTED: [],
|
|
23
23
|
EXECUTED: [],
|
|
24
24
|
CANCELLED: []
|
|
25
|
-
},
|
|
25
|
+
}, tt = new Set([
|
|
26
26
|
"DRIFT",
|
|
27
27
|
"CONCENTRATION_RISK",
|
|
28
28
|
"REBALANCE_DUE",
|
|
29
29
|
"CASH_DRAG",
|
|
30
30
|
"FEE_ANOMALY"
|
|
31
31
|
]);
|
|
32
|
-
function
|
|
32
|
+
function B(e) {
|
|
33
33
|
return e.toLowerCase().split("_").map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ");
|
|
34
34
|
}
|
|
35
|
-
var
|
|
35
|
+
var nt = [
|
|
36
36
|
"Draft",
|
|
37
37
|
"Proposed",
|
|
38
38
|
"Approved",
|
|
39
39
|
"Executed"
|
|
40
|
-
],
|
|
40
|
+
], rt = {
|
|
41
41
|
DRAFT: "neutral",
|
|
42
42
|
PROPOSED: "warning",
|
|
43
43
|
APPROVED: "blue",
|
|
44
44
|
EXECUTED: "success",
|
|
45
45
|
REJECTED: "error",
|
|
46
46
|
CANCELLED: "neutral"
|
|
47
|
-
},
|
|
47
|
+
}, it = [
|
|
48
48
|
"PROPOSED",
|
|
49
49
|
"DRAFT",
|
|
50
50
|
"APPROVED",
|
|
51
51
|
"EXECUTED",
|
|
52
52
|
"REJECTED",
|
|
53
53
|
"CANCELLED"
|
|
54
|
-
],
|
|
54
|
+
], at = {
|
|
55
55
|
CRITICAL: "error",
|
|
56
56
|
HIGH: "warning",
|
|
57
57
|
MEDIUM: "info",
|
|
58
58
|
LOW: "teal",
|
|
59
59
|
INFO: "neutral"
|
|
60
|
-
},
|
|
60
|
+
}, ot = [
|
|
61
61
|
"CRITICAL",
|
|
62
62
|
"HIGH",
|
|
63
63
|
"MEDIUM",
|
|
64
64
|
"LOW",
|
|
65
65
|
"INFO"
|
|
66
66
|
];
|
|
67
|
-
function
|
|
67
|
+
function st(e) {
|
|
68
68
|
if (!Array.isArray(e) || e.length === 0) return null;
|
|
69
69
|
let t = [];
|
|
70
70
|
for (let n of e) {
|
|
@@ -101,10 +101,7 @@ function B(e) {
|
|
|
101
101
|
}
|
|
102
102
|
return t;
|
|
103
103
|
}
|
|
104
|
-
function
|
|
105
|
-
return e == null ? "—" : typeof e == "number" ? Number.isInteger(e) ? e.toLocaleString() : e.toLocaleString(void 0, { maximumFractionDigits: 2 }) : typeof e == "boolean" ? e ? "Yes" : "No" : typeof e == "string" ? e : JSON.stringify(e);
|
|
106
|
-
}
|
|
107
|
-
function st(e) {
|
|
104
|
+
function V(e) {
|
|
108
105
|
let t = (e ?? "").toUpperCase();
|
|
109
106
|
return t.includes("BUY") || t.includes("ADD") ? "text-status-success-text" : t.includes("SELL") || t.includes("TRIM") || t.includes("REDUCE") ? "text-status-error-text" : "text-text-secondary";
|
|
110
107
|
}
|
|
@@ -128,31 +125,31 @@ function ut(e) {
|
|
|
128
125
|
let t = Number(e);
|
|
129
126
|
return Number.isFinite(t) ? t : void 0;
|
|
130
127
|
}
|
|
131
|
-
function
|
|
132
|
-
let { data: c, isLoading: pe, isError:
|
|
128
|
+
function H() {
|
|
129
|
+
let { data: c, isLoading: pe, isError: me, refetch: ge } = re(), { data: v } = ne(), [nt, st] = b(void 0), V = nt ?? v[0]?.id ?? "", { data: H, isLoading: ht, isError: gt, refetch: _t } = ee(V || void 0), vt = i(), { data: U, isFetching: yt, refetch: bt } = te(V || void 0), { data: W, isLoading: xt, isError: St, refetch: Ct } = oe(V || void 0), wt = a(), G = se(V || void 0), Tt = n(), K = ae(), [Et, Dt] = b(""), q = o(Et || void 0), [Ot, kt] = b(""), [At, jt] = b("BUY"), [Mt, Nt] = b(""), [Pt, Ft] = b(""), { items: It, hasMore: Lt, loadMore: Rt, isLoading: zt, isFetchingNextPage: Bt, isError: Vt, refetch: Ht } = s(), Ut = t(), J = ce(), Wt = e(), Gt = r(), Kt = ie(), [qt, Jt] = b(!1), [Y, X] = b(lt), [Yt, Xt] = b(null), [Zt, Qt] = b(null), [Z, $t] = b(null), Q = y(() => {
|
|
133
130
|
let e = /* @__PURE__ */ new Map();
|
|
134
|
-
for (let t of
|
|
131
|
+
for (let t of v) e.set(t.id, t);
|
|
135
132
|
return e;
|
|
136
|
-
}, [
|
|
133
|
+
}, [v]), en = y(() => It.filter((e) => tt.has(e.type)), [It]), tn = c.filter((e) => e.status === "DRAFT" || e.status === "PROPOSED" || e.status === "APPROVED"), $ = en.filter((e) => e.status === "OPEN"), nn = c.length > 0 ? c.reduce((e, t) => e + (t.driftPct ?? 0), 0) / c.length : null, rn = y(() => c.filter((e) => {
|
|
137
134
|
let t = Q.get(e.portfolioId)?.driftThresholdPct;
|
|
138
135
|
return t != null && Number.isFinite(t) && e.driftPct >= t;
|
|
139
|
-
}).length, [c, Q]), an =
|
|
136
|
+
}).length, [c, Q]), an = y(() => [...c].sort((e, t) => new Date(e.createdAt).getTime() - new Date(t.createdAt).getTime()).map((e) => e.driftPct).filter((e) => Number.isFinite(e)), [c]), on = y(() => {
|
|
140
137
|
let e = /* @__PURE__ */ new Map();
|
|
141
138
|
for (let t of c) e.set(t.status, (e.get(t.status) ?? 0) + 1);
|
|
142
|
-
return
|
|
143
|
-
label:
|
|
139
|
+
return it.filter((t) => (e.get(t) ?? 0) > 0).map((t) => ({
|
|
140
|
+
label: B(t),
|
|
144
141
|
value: e.get(t) ?? 0,
|
|
145
|
-
tone:
|
|
142
|
+
tone: rt[t]
|
|
146
143
|
}));
|
|
147
|
-
}, [c]), sn =
|
|
144
|
+
}, [c]), sn = y(() => {
|
|
148
145
|
let e = /* @__PURE__ */ new Map();
|
|
149
146
|
for (let t of $) e.set(t.severity, (e.get(t.severity) ?? 0) + 1);
|
|
150
|
-
return
|
|
151
|
-
label:
|
|
147
|
+
return ot.filter((t) => (e.get(t) ?? 0) > 0).map((t) => ({
|
|
148
|
+
label: B(t),
|
|
152
149
|
value: e.get(t) ?? 0,
|
|
153
|
-
tone:
|
|
150
|
+
tone: at[t]
|
|
154
151
|
}));
|
|
155
|
-
}, [$]), cn =
|
|
152
|
+
}, [$]), cn = v.length > 0;
|
|
156
153
|
function ln() {
|
|
157
154
|
X(lt), Xt(null), Jt(!0);
|
|
158
155
|
}
|
|
@@ -191,59 +188,59 @@ function V() {
|
|
|
191
188
|
let t = Q.get(e.portfolioId)?.driftThresholdPct;
|
|
192
189
|
return t != null && Number.isFinite(t) && e.driftPct >= t;
|
|
193
190
|
}
|
|
194
|
-
return /* @__PURE__ */
|
|
191
|
+
return /* @__PURE__ */ E(he, {
|
|
195
192
|
title: "Risk & Rebalancing",
|
|
196
193
|
description: "Review drift-driven rebalance proposals and act on portfolio risk insights.",
|
|
197
194
|
badges: [`${tn.length} active`, `${$.length} open insight${$.length === 1 ? "" : "s"}`],
|
|
198
195
|
actionLabel: "New proposal",
|
|
199
196
|
onAction: ln,
|
|
200
197
|
children: [
|
|
201
|
-
/* @__PURE__ */
|
|
198
|
+
/* @__PURE__ */ E("div", {
|
|
202
199
|
className: "grid gap-4 sm:grid-cols-2 xl:grid-cols-4",
|
|
203
200
|
children: [
|
|
204
|
-
/* @__PURE__ */
|
|
201
|
+
/* @__PURE__ */ T(l, {
|
|
205
202
|
index: 0,
|
|
206
|
-
children: /* @__PURE__ */
|
|
203
|
+
children: /* @__PURE__ */ T(u, {
|
|
207
204
|
label: "Average drift",
|
|
208
205
|
value: nn === null ? "—" : g(nn),
|
|
209
206
|
spark: an.length > 1 ? an : void 0,
|
|
210
207
|
sparkTone: rn > 0 ? "error" : "brand",
|
|
211
208
|
glow: !0,
|
|
212
|
-
icon: /* @__PURE__ */
|
|
209
|
+
icon: /* @__PURE__ */ T(x, {
|
|
213
210
|
className: "size-4",
|
|
214
211
|
"aria-hidden": "true"
|
|
215
212
|
})
|
|
216
213
|
})
|
|
217
214
|
}),
|
|
218
|
-
/* @__PURE__ */
|
|
215
|
+
/* @__PURE__ */ T(l, {
|
|
219
216
|
index: 1,
|
|
220
|
-
children: /* @__PURE__ */
|
|
217
|
+
children: /* @__PURE__ */ T(u, {
|
|
221
218
|
label: "Active proposals",
|
|
222
219
|
value: String(tn.length),
|
|
223
|
-
icon: /* @__PURE__ */
|
|
220
|
+
icon: /* @__PURE__ */ T(_e, {
|
|
224
221
|
className: "size-4",
|
|
225
222
|
"aria-hidden": "true"
|
|
226
223
|
})
|
|
227
224
|
})
|
|
228
225
|
}),
|
|
229
|
-
/* @__PURE__ */
|
|
226
|
+
/* @__PURE__ */ T(l, {
|
|
230
227
|
index: 2,
|
|
231
|
-
children: /* @__PURE__ */
|
|
228
|
+
children: /* @__PURE__ */ T(u, {
|
|
232
229
|
label: "Total proposals",
|
|
233
230
|
value: String(c.length),
|
|
234
|
-
icon: /* @__PURE__ */
|
|
231
|
+
icon: /* @__PURE__ */ T(Se, {
|
|
235
232
|
className: "size-4",
|
|
236
233
|
"aria-hidden": "true"
|
|
237
234
|
})
|
|
238
235
|
})
|
|
239
236
|
}),
|
|
240
|
-
/* @__PURE__ */
|
|
237
|
+
/* @__PURE__ */ T(l, {
|
|
241
238
|
index: 3,
|
|
242
|
-
children: /* @__PURE__ */
|
|
239
|
+
children: /* @__PURE__ */ T(u, {
|
|
243
240
|
label: "Open risk insights",
|
|
244
241
|
value: String($.length),
|
|
245
242
|
deltaTone: $.length > 0 ? "negative" : "neutral",
|
|
246
|
-
icon: /* @__PURE__ */
|
|
243
|
+
icon: /* @__PURE__ */ T(S, {
|
|
247
244
|
className: "size-4",
|
|
248
245
|
"aria-hidden": "true"
|
|
249
246
|
})
|
|
@@ -251,53 +248,53 @@ function V() {
|
|
|
251
248
|
})
|
|
252
249
|
]
|
|
253
250
|
}),
|
|
254
|
-
(on.length > 0 || sn.length > 0) && !pe ? /* @__PURE__ */
|
|
251
|
+
(on.length > 0 || sn.length > 0) && !pe ? /* @__PURE__ */ E("div", {
|
|
255
252
|
className: "grid gap-4 lg:grid-cols-2",
|
|
256
|
-
children: [/* @__PURE__ */
|
|
253
|
+
children: [/* @__PURE__ */ T(l, {
|
|
257
254
|
index: 0,
|
|
258
|
-
children: /* @__PURE__ */
|
|
255
|
+
children: /* @__PURE__ */ E(fe, {
|
|
259
256
|
glow: !0,
|
|
260
257
|
className: "h-full",
|
|
261
|
-
children: [/* @__PURE__ */
|
|
258
|
+
children: [/* @__PURE__ */ E("div", {
|
|
262
259
|
className: "mb-3 flex items-center gap-2",
|
|
263
|
-
children: [/* @__PURE__ */
|
|
260
|
+
children: [/* @__PURE__ */ T(je, {
|
|
264
261
|
className: "size-4 text-text-secondary",
|
|
265
262
|
"aria-hidden": "true"
|
|
266
|
-
}), /* @__PURE__ */
|
|
263
|
+
}), /* @__PURE__ */ T("h2", {
|
|
267
264
|
className: "text-sm font-semibold text-text-primary",
|
|
268
265
|
children: "Proposal pipeline"
|
|
269
266
|
})]
|
|
270
|
-
}), /* @__PURE__ */
|
|
267
|
+
}), /* @__PURE__ */ T(de, {
|
|
271
268
|
data: on,
|
|
272
269
|
centerValue: String(c.length),
|
|
273
270
|
centerLabel: "proposals",
|
|
274
271
|
height: 200
|
|
275
272
|
})]
|
|
276
273
|
})
|
|
277
|
-
}), /* @__PURE__ */
|
|
274
|
+
}), /* @__PURE__ */ T(l, {
|
|
278
275
|
index: 1,
|
|
279
|
-
children: /* @__PURE__ */
|
|
276
|
+
children: /* @__PURE__ */ E(fe, {
|
|
280
277
|
className: "h-full",
|
|
281
|
-
children: [/* @__PURE__ */
|
|
278
|
+
children: [/* @__PURE__ */ E("div", {
|
|
282
279
|
className: "mb-3 flex items-center gap-2",
|
|
283
|
-
children: [/* @__PURE__ */
|
|
280
|
+
children: [/* @__PURE__ */ T(S, {
|
|
284
281
|
className: "size-4 text-text-secondary",
|
|
285
282
|
"aria-hidden": "true"
|
|
286
|
-
}), /* @__PURE__ */
|
|
283
|
+
}), /* @__PURE__ */ T("h2", {
|
|
287
284
|
className: "text-sm font-semibold text-text-primary",
|
|
288
285
|
children: "Open risk signals"
|
|
289
286
|
})]
|
|
290
|
-
}), sn.length > 0 ? /* @__PURE__ */
|
|
287
|
+
}), sn.length > 0 ? /* @__PURE__ */ T(de, {
|
|
291
288
|
data: sn,
|
|
292
289
|
centerValue: String($.length),
|
|
293
290
|
centerLabel: "open",
|
|
294
291
|
height: 200
|
|
295
|
-
}) : /* @__PURE__ */
|
|
292
|
+
}) : /* @__PURE__ */ E("div", {
|
|
296
293
|
className: "flex h-[200px] flex-col items-center justify-center gap-2 text-center",
|
|
297
|
-
children: [/* @__PURE__ */
|
|
294
|
+
children: [/* @__PURE__ */ T(C, {
|
|
298
295
|
className: "size-8 text-status-success-text",
|
|
299
296
|
"aria-hidden": "true"
|
|
300
|
-
}), /* @__PURE__ */
|
|
297
|
+
}), /* @__PURE__ */ T("p", {
|
|
301
298
|
className: "text-sm text-text-secondary",
|
|
302
299
|
children: "No open risk signals."
|
|
303
300
|
})]
|
|
@@ -305,147 +302,147 @@ function V() {
|
|
|
305
302
|
})
|
|
306
303
|
})]
|
|
307
304
|
}) : null,
|
|
308
|
-
/* @__PURE__ */
|
|
305
|
+
/* @__PURE__ */ E(k, { children: [/* @__PURE__ */ E(M, { children: [/* @__PURE__ */ E(N, {
|
|
309
306
|
className: "flex items-center gap-2",
|
|
310
|
-
children: [/* @__PURE__ */
|
|
307
|
+
children: [/* @__PURE__ */ T(x, {
|
|
311
308
|
className: "h-5 w-5",
|
|
312
309
|
"aria-hidden": "true"
|
|
313
310
|
}), "Portfolio risk signals"]
|
|
314
|
-
}), /* @__PURE__ */
|
|
311
|
+
}), /* @__PURE__ */ T(j, { children: "Real, explainable signals computed live from this portfolio's own holdings and target allocation — every signal below shows the real inputs and formula/threshold behind it. Informational only, never a buy/sell recommendation." })] }), /* @__PURE__ */ E(A, {
|
|
315
312
|
className: "space-y-4",
|
|
316
|
-
children: [/* @__PURE__ */
|
|
313
|
+
children: [/* @__PURE__ */ E("div", {
|
|
317
314
|
className: "flex flex-wrap items-center gap-3",
|
|
318
315
|
children: [
|
|
319
|
-
/* @__PURE__ */
|
|
316
|
+
/* @__PURE__ */ E("div", {
|
|
320
317
|
className: "min-w-[220px] space-y-1.5",
|
|
321
|
-
children: [/* @__PURE__ */
|
|
318
|
+
children: [/* @__PURE__ */ T(I, {
|
|
322
319
|
htmlFor: "risk-portfolio",
|
|
323
320
|
children: "Portfolio"
|
|
324
|
-
}), /* @__PURE__ */
|
|
321
|
+
}), /* @__PURE__ */ E(Ge, {
|
|
325
322
|
value: V,
|
|
326
323
|
onValueChange: st,
|
|
327
|
-
children: [/* @__PURE__ */
|
|
324
|
+
children: [/* @__PURE__ */ T(Je, {
|
|
328
325
|
id: "risk-portfolio",
|
|
329
|
-
children: /* @__PURE__ */
|
|
330
|
-
}), /* @__PURE__ */
|
|
326
|
+
children: /* @__PURE__ */ T(Ye, { placeholder: "Select a portfolio" })
|
|
327
|
+
}), /* @__PURE__ */ T(Ke, { children: v.map((e) => /* @__PURE__ */ T(qe, {
|
|
331
328
|
value: e.id,
|
|
332
329
|
children: e.name
|
|
333
330
|
}, e.id)) })]
|
|
334
331
|
})]
|
|
335
332
|
}),
|
|
336
|
-
/* @__PURE__ */
|
|
333
|
+
/* @__PURE__ */ E(O, {
|
|
337
334
|
variant: "outline",
|
|
338
335
|
size: "sm",
|
|
339
336
|
className: "mt-auto",
|
|
340
337
|
disabled: !V || ht,
|
|
341
338
|
onClick: () => _t(),
|
|
342
|
-
children: [/* @__PURE__ */
|
|
339
|
+
children: [/* @__PURE__ */ T(Ee, {
|
|
343
340
|
className: "size-4",
|
|
344
341
|
"aria-hidden": "true"
|
|
345
342
|
}), "Recompute"]
|
|
346
343
|
}),
|
|
347
|
-
/* @__PURE__ */
|
|
344
|
+
/* @__PURE__ */ E(O, {
|
|
348
345
|
variant: "outline",
|
|
349
346
|
size: "sm",
|
|
350
347
|
className: "mt-auto",
|
|
351
348
|
disabled: !V || (H?.signals.length ?? 0) === 0 || vt.isPending,
|
|
352
349
|
onClick: () => vt.mutate(V),
|
|
353
|
-
children: [/* @__PURE__ */
|
|
350
|
+
children: [/* @__PURE__ */ T(S, {
|
|
354
351
|
className: "size-4",
|
|
355
352
|
"aria-hidden": "true"
|
|
356
353
|
}), vt.isPending ? "Saving…" : "Save as insights"]
|
|
357
354
|
})
|
|
358
355
|
]
|
|
359
|
-
}),
|
|
360
|
-
icon: /* @__PURE__ */
|
|
356
|
+
}), v.length === 0 ? /* @__PURE__ */ T(d, {
|
|
357
|
+
icon: /* @__PURE__ */ T(x, {
|
|
361
358
|
className: "size-6",
|
|
362
359
|
"aria-hidden": "true"
|
|
363
360
|
}),
|
|
364
361
|
title: "No portfolios yet",
|
|
365
362
|
description: "Create a portfolio to compute real risk signals from its holdings."
|
|
366
|
-
}) : ht ? /* @__PURE__ */
|
|
363
|
+
}) : ht ? /* @__PURE__ */ T(p, {}) : gt ? /* @__PURE__ */ T(f, { onRetry: () => _t() }) : H ? /* @__PURE__ */ E("div", {
|
|
367
364
|
className: "space-y-4",
|
|
368
365
|
children: [
|
|
369
|
-
/* @__PURE__ */
|
|
366
|
+
/* @__PURE__ */ E("div", {
|
|
370
367
|
className: "grid gap-3 sm:grid-cols-3",
|
|
371
368
|
children: [
|
|
372
|
-
/* @__PURE__ */
|
|
369
|
+
/* @__PURE__ */ T(u, {
|
|
373
370
|
label: "Portfolio value",
|
|
374
371
|
value: h(H.totalValue),
|
|
375
|
-
icon: /* @__PURE__ */
|
|
372
|
+
icon: /* @__PURE__ */ T(Se, {
|
|
376
373
|
className: "size-4",
|
|
377
374
|
"aria-hidden": "true"
|
|
378
375
|
})
|
|
379
376
|
}),
|
|
380
|
-
/* @__PURE__ */
|
|
377
|
+
/* @__PURE__ */ T(u, {
|
|
381
378
|
label: "Holdings considered",
|
|
382
379
|
value: String(H.holdingsConsidered),
|
|
383
|
-
icon: /* @__PURE__ */
|
|
380
|
+
icon: /* @__PURE__ */ T(_e, {
|
|
384
381
|
className: "size-4",
|
|
385
382
|
"aria-hidden": "true"
|
|
386
383
|
})
|
|
387
384
|
}),
|
|
388
|
-
/* @__PURE__ */
|
|
385
|
+
/* @__PURE__ */ T(u, {
|
|
389
386
|
label: "Signals breached",
|
|
390
387
|
value: String(H.signals.length),
|
|
391
388
|
deltaTone: H.signals.length > 0 ? "negative" : "neutral",
|
|
392
|
-
icon: /* @__PURE__ */
|
|
389
|
+
icon: /* @__PURE__ */ T(S, {
|
|
393
390
|
className: "size-4",
|
|
394
391
|
"aria-hidden": "true"
|
|
395
392
|
})
|
|
396
393
|
})
|
|
397
394
|
]
|
|
398
395
|
}),
|
|
399
|
-
H.signals.length === 0 ? /* @__PURE__ */
|
|
400
|
-
icon: /* @__PURE__ */
|
|
396
|
+
H.signals.length === 0 ? /* @__PURE__ */ T(d, {
|
|
397
|
+
icon: /* @__PURE__ */ T(C, {
|
|
401
398
|
className: "size-6",
|
|
402
399
|
"aria-hidden": "true"
|
|
403
400
|
}),
|
|
404
401
|
title: "No configured threshold was breached",
|
|
405
402
|
description: "This portfolio's concentration, cash, drift and unrealized-loss metrics are all within their configured thresholds."
|
|
406
|
-
}) : /* @__PURE__ */
|
|
403
|
+
}) : /* @__PURE__ */ T("ul", {
|
|
407
404
|
className: "space-y-3",
|
|
408
|
-
children: H.signals.map((e, t) => /* @__PURE__ */
|
|
405
|
+
children: H.signals.map((e, t) => /* @__PURE__ */ T(ft, { signal: e }, `${e.kind}-${t}`))
|
|
409
406
|
}),
|
|
410
|
-
/* @__PURE__ */
|
|
407
|
+
/* @__PURE__ */ E("div", {
|
|
411
408
|
className: "rounded-xl border border-border-subtle bg-bg-surface p-4",
|
|
412
|
-
children: [/* @__PURE__ */
|
|
409
|
+
children: [/* @__PURE__ */ E("div", {
|
|
413
410
|
className: "flex flex-wrap items-center justify-between gap-2",
|
|
414
|
-
children: [/* @__PURE__ */
|
|
411
|
+
children: [/* @__PURE__ */ E("div", {
|
|
415
412
|
className: "flex items-center gap-2",
|
|
416
413
|
children: [
|
|
417
|
-
/* @__PURE__ */
|
|
414
|
+
/* @__PURE__ */ T(Ae, {
|
|
418
415
|
className: "size-4 text-text-secondary",
|
|
419
416
|
"aria-hidden": "true"
|
|
420
417
|
}),
|
|
421
|
-
/* @__PURE__ */
|
|
418
|
+
/* @__PURE__ */ T("h3", {
|
|
422
419
|
className: "text-sm font-semibold text-text-primary",
|
|
423
420
|
children: "AI summary"
|
|
424
421
|
}),
|
|
425
|
-
/* @__PURE__ */
|
|
422
|
+
/* @__PURE__ */ T("span", {
|
|
426
423
|
className: "text-xs text-text-muted",
|
|
427
424
|
children: "(optional — plain-language restatement of the signals above; never a source of numbers)"
|
|
428
425
|
})
|
|
429
426
|
]
|
|
430
|
-
}), /* @__PURE__ */
|
|
427
|
+
}), /* @__PURE__ */ E(O, {
|
|
431
428
|
variant: "outline",
|
|
432
429
|
size: "sm",
|
|
433
430
|
disabled: !V || yt,
|
|
434
431
|
onClick: () => bt(),
|
|
435
|
-
children: [/* @__PURE__ */
|
|
432
|
+
children: [/* @__PURE__ */ T(Ae, {
|
|
436
433
|
className: "size-4",
|
|
437
434
|
"aria-hidden": "true"
|
|
438
435
|
}), yt ? "Generating…" : "Generate AI summary"]
|
|
439
436
|
})]
|
|
440
|
-
}), yt ? /* @__PURE__ */
|
|
437
|
+
}), yt ? /* @__PURE__ */ T("p", {
|
|
441
438
|
className: "mt-2 text-sm text-text-secondary",
|
|
442
439
|
children: "Asking the AI provider…"
|
|
443
|
-
}) : U?.generated ? /* @__PURE__ */
|
|
440
|
+
}) : U?.generated ? /* @__PURE__ */ E("div", {
|
|
444
441
|
className: "mt-2 space-y-1",
|
|
445
|
-
children: [/* @__PURE__ */
|
|
442
|
+
children: [/* @__PURE__ */ T("p", {
|
|
446
443
|
className: "text-sm text-text-primary",
|
|
447
444
|
children: U.summary
|
|
448
|
-
}), /* @__PURE__ */
|
|
445
|
+
}), /* @__PURE__ */ E("p", {
|
|
449
446
|
className: "text-xs text-text-muted",
|
|
450
447
|
children: [
|
|
451
448
|
"AI-generated commentary",
|
|
@@ -458,21 +455,21 @@ function V() {
|
|
|
458
455
|
" above"
|
|
459
456
|
]
|
|
460
457
|
})]
|
|
461
|
-
}) : U && !U.generated ? /* @__PURE__ */
|
|
458
|
+
}) : U && !U.generated ? /* @__PURE__ */ E("p", {
|
|
462
459
|
className: "mt-2 text-sm text-text-secondary",
|
|
463
460
|
children: [
|
|
464
461
|
"AI summary unavailable — ",
|
|
465
462
|
U.reason ?? "no provider configured",
|
|
466
463
|
". The deterministic signals above are unaffected."
|
|
467
464
|
]
|
|
468
|
-
}) : /* @__PURE__ */
|
|
465
|
+
}) : /* @__PURE__ */ T("p", {
|
|
469
466
|
className: "mt-2 text-sm text-text-muted",
|
|
470
467
|
children: "Not generated yet. The deterministic signals above always work without this."
|
|
471
468
|
})]
|
|
472
469
|
})
|
|
473
470
|
]
|
|
474
|
-
}) : /* @__PURE__ */
|
|
475
|
-
icon: /* @__PURE__ */
|
|
471
|
+
}) : /* @__PURE__ */ T(d, {
|
|
472
|
+
icon: /* @__PURE__ */ T(x, {
|
|
476
473
|
className: "size-6",
|
|
477
474
|
"aria-hidden": "true"
|
|
478
475
|
}),
|
|
@@ -480,38 +477,38 @@ function V() {
|
|
|
480
477
|
description: "Choose a portfolio above to compute its real risk signals."
|
|
481
478
|
})]
|
|
482
479
|
})] }),
|
|
483
|
-
/* @__PURE__ */
|
|
480
|
+
/* @__PURE__ */ E(k, { children: [/* @__PURE__ */ E(M, { children: [/* @__PURE__ */ E(N, {
|
|
484
481
|
className: "flex items-center gap-2",
|
|
485
|
-
children: [/* @__PURE__ */
|
|
482
|
+
children: [/* @__PURE__ */ T(Oe, {
|
|
486
483
|
className: "h-5 w-5",
|
|
487
484
|
"aria-hidden": "true"
|
|
488
485
|
}), "Tax-loss-harvesting opportunities"]
|
|
489
|
-
}), /* @__PURE__ */
|
|
486
|
+
}), /* @__PURE__ */ T(j, { children: "Real unrealized-loss detection for the selected portfolio, using configurable dollar/percent thresholds and a wash-sale caution flag from your recorded transactions. Detection only — this never places a trade, and it is not tax advice." })] }), /* @__PURE__ */ E(A, {
|
|
490
487
|
className: "space-y-4",
|
|
491
|
-
children: [/* @__PURE__ */
|
|
488
|
+
children: [/* @__PURE__ */ E("div", {
|
|
492
489
|
className: "flex flex-wrap items-center gap-3",
|
|
493
490
|
children: [
|
|
494
|
-
/* @__PURE__ */
|
|
491
|
+
/* @__PURE__ */ E(O, {
|
|
495
492
|
variant: "outline",
|
|
496
493
|
size: "sm",
|
|
497
494
|
disabled: !V || xt,
|
|
498
495
|
onClick: () => Ct(),
|
|
499
|
-
children: [/* @__PURE__ */
|
|
496
|
+
children: [/* @__PURE__ */ T(Ee, {
|
|
500
497
|
className: "size-4",
|
|
501
498
|
"aria-hidden": "true"
|
|
502
499
|
}), "Recompute"]
|
|
503
500
|
}),
|
|
504
|
-
/* @__PURE__ */
|
|
501
|
+
/* @__PURE__ */ E(O, {
|
|
505
502
|
variant: "outline",
|
|
506
503
|
size: "sm",
|
|
507
504
|
disabled: !V || (W?.opportunities.length ?? 0) === 0 || wt.isPending,
|
|
508
505
|
onClick: () => wt.mutate({ portfolioId: V }),
|
|
509
|
-
children: [/* @__PURE__ */
|
|
506
|
+
children: [/* @__PURE__ */ T(S, {
|
|
510
507
|
className: "size-4",
|
|
511
508
|
"aria-hidden": "true"
|
|
512
509
|
}), wt.isPending ? "Saving…" : "Save as insights"]
|
|
513
510
|
}),
|
|
514
|
-
W ? /* @__PURE__ */
|
|
511
|
+
W ? /* @__PURE__ */ E("span", {
|
|
515
512
|
className: "text-xs text-text-muted",
|
|
516
513
|
children: [
|
|
517
514
|
"Thresholds: ≥",
|
|
@@ -522,25 +519,25 @@ function V() {
|
|
|
522
519
|
]
|
|
523
520
|
}) : null
|
|
524
521
|
]
|
|
525
|
-
}),
|
|
526
|
-
icon: /* @__PURE__ */
|
|
522
|
+
}), v.length === 0 ? /* @__PURE__ */ T(d, {
|
|
523
|
+
icon: /* @__PURE__ */ T(Oe, {
|
|
527
524
|
className: "size-6",
|
|
528
525
|
"aria-hidden": "true"
|
|
529
526
|
}),
|
|
530
527
|
title: "No portfolios yet",
|
|
531
528
|
description: "Create a portfolio to detect real tax-loss-harvesting opportunities from its holdings."
|
|
532
|
-
}) : xt ? /* @__PURE__ */
|
|
529
|
+
}) : xt ? /* @__PURE__ */ T(p, {}) : St ? /* @__PURE__ */ T(f, { onRetry: () => Ct() }) : W && W.opportunities.length > 0 ? /* @__PURE__ */ T("ul", {
|
|
533
530
|
className: "space-y-3",
|
|
534
|
-
children: W.opportunities.map((e) => /* @__PURE__ */
|
|
535
|
-
}) : W ? /* @__PURE__ */
|
|
536
|
-
icon: /* @__PURE__ */
|
|
531
|
+
children: W.opportunities.map((e) => /* @__PURE__ */ T(pt, { opportunity: e }, e.symbol))
|
|
532
|
+
}) : W ? /* @__PURE__ */ T(d, {
|
|
533
|
+
icon: /* @__PURE__ */ T(C, {
|
|
537
534
|
className: "size-6",
|
|
538
535
|
"aria-hidden": "true"
|
|
539
536
|
}),
|
|
540
537
|
title: "No opportunities at the current thresholds",
|
|
541
538
|
description: "No symbol's unrealized loss clears the configured dollar/percent thresholds."
|
|
542
|
-
}) : /* @__PURE__ */
|
|
543
|
-
icon: /* @__PURE__ */
|
|
539
|
+
}) : /* @__PURE__ */ T(d, {
|
|
540
|
+
icon: /* @__PURE__ */ T(Oe, {
|
|
544
541
|
className: "size-6",
|
|
545
542
|
"aria-hidden": "true"
|
|
546
543
|
}),
|
|
@@ -548,97 +545,97 @@ function V() {
|
|
|
548
545
|
description: "Choose a portfolio above to detect real tax-loss opportunities."
|
|
549
546
|
})]
|
|
550
547
|
})] }),
|
|
551
|
-
/* @__PURE__ */
|
|
548
|
+
/* @__PURE__ */ E(k, { children: [/* @__PURE__ */ E(M, { children: [/* @__PURE__ */ E(N, {
|
|
552
549
|
className: "flex items-center gap-2",
|
|
553
|
-
children: [/* @__PURE__ */
|
|
550
|
+
children: [/* @__PURE__ */ T(Ce, {
|
|
554
551
|
className: "h-5 w-5",
|
|
555
552
|
"aria-hidden": "true"
|
|
556
553
|
}), "Trade instructions"]
|
|
557
|
-
}), /* @__PURE__ */
|
|
554
|
+
}), /* @__PURE__ */ T(j, { children: "Real BUY/SELL recommendations for a human advisor to review and manually execute elsewhere — this never submits an order anywhere. Reference prices come from a real live market-data feed." })] }), /* @__PURE__ */ E(A, {
|
|
558
555
|
className: "space-y-4",
|
|
559
556
|
children: [
|
|
560
|
-
/* @__PURE__ */
|
|
557
|
+
/* @__PURE__ */ E("div", {
|
|
561
558
|
className: "flex flex-wrap items-end gap-3 rounded-lg border border-border-subtle bg-bg-sunken p-3",
|
|
562
|
-
children: [/* @__PURE__ */
|
|
559
|
+
children: [/* @__PURE__ */ E("div", {
|
|
563
560
|
className: "space-y-1.5",
|
|
564
|
-
children: [/* @__PURE__ */
|
|
561
|
+
children: [/* @__PURE__ */ T(I, {
|
|
565
562
|
htmlFor: "quote-symbol",
|
|
566
563
|
children: "Live quote lookup"
|
|
567
|
-
}), /* @__PURE__ */
|
|
564
|
+
}), /* @__PURE__ */ E("div", {
|
|
568
565
|
className: "flex gap-2",
|
|
569
|
-
children: [/* @__PURE__ */
|
|
566
|
+
children: [/* @__PURE__ */ T(F, {
|
|
570
567
|
id: "quote-symbol",
|
|
571
568
|
value: Et,
|
|
572
569
|
onChange: (e) => Dt(e.target.value.toUpperCase()),
|
|
573
570
|
placeholder: "AAPL",
|
|
574
571
|
className: "w-28"
|
|
575
|
-
}), /* @__PURE__ */
|
|
572
|
+
}), /* @__PURE__ */ E(O, {
|
|
576
573
|
variant: "outline",
|
|
577
574
|
size: "sm",
|
|
578
575
|
disabled: !Et || q.isFetching,
|
|
579
576
|
onClick: () => q.refetch(),
|
|
580
|
-
children: [/* @__PURE__ */
|
|
577
|
+
children: [/* @__PURE__ */ T(ke, {
|
|
581
578
|
className: "size-4",
|
|
582
579
|
"aria-hidden": "true"
|
|
583
580
|
}), "Quote"]
|
|
584
581
|
})]
|
|
585
582
|
})]
|
|
586
|
-
}), q.data ? /* @__PURE__ */
|
|
583
|
+
}), q.data ? /* @__PURE__ */ E("span", {
|
|
587
584
|
className: "text-sm text-text-primary",
|
|
588
585
|
children: [
|
|
589
586
|
q.data.symbol,
|
|
590
587
|
":",
|
|
591
588
|
" ",
|
|
592
|
-
/* @__PURE__ */
|
|
589
|
+
/* @__PURE__ */ T("span", {
|
|
593
590
|
className: "font-semibold",
|
|
594
591
|
children: h(q.data.price, q.data.currency ?? "USD")
|
|
595
592
|
}),
|
|
596
593
|
" ",
|
|
597
|
-
/* @__PURE__ */
|
|
594
|
+
/* @__PURE__ */ E("span", {
|
|
598
595
|
className: "text-xs text-text-muted",
|
|
599
596
|
children: ["via ", q.data.source]
|
|
600
597
|
})
|
|
601
598
|
]
|
|
602
|
-
}) : q.isError ? /* @__PURE__ */
|
|
599
|
+
}) : q.isError ? /* @__PURE__ */ T("span", {
|
|
603
600
|
className: "text-sm text-status-error-text",
|
|
604
601
|
children: "Quote unavailable"
|
|
605
602
|
}) : null]
|
|
606
603
|
}),
|
|
607
|
-
/* @__PURE__ */
|
|
604
|
+
/* @__PURE__ */ E("div", {
|
|
608
605
|
className: "grid gap-3 rounded-lg border border-border-subtle bg-bg-sunken p-3 sm:grid-cols-5 sm:items-end",
|
|
609
606
|
children: [
|
|
610
|
-
/* @__PURE__ */
|
|
607
|
+
/* @__PURE__ */ E("div", {
|
|
611
608
|
className: "space-y-1.5",
|
|
612
|
-
children: [/* @__PURE__ */
|
|
609
|
+
children: [/* @__PURE__ */ T(I, {
|
|
613
610
|
htmlFor: "ti-symbol",
|
|
614
611
|
children: "Symbol"
|
|
615
|
-
}), /* @__PURE__ */
|
|
612
|
+
}), /* @__PURE__ */ T(F, {
|
|
616
613
|
id: "ti-symbol",
|
|
617
614
|
value: Ot,
|
|
618
615
|
onChange: (e) => kt(e.target.value.toUpperCase()),
|
|
619
616
|
placeholder: "MSFT"
|
|
620
617
|
})]
|
|
621
618
|
}),
|
|
622
|
-
/* @__PURE__ */
|
|
619
|
+
/* @__PURE__ */ E("div", {
|
|
623
620
|
className: "space-y-1.5",
|
|
624
|
-
children: [/* @__PURE__ */
|
|
621
|
+
children: [/* @__PURE__ */ T(I, { children: "Action" }), /* @__PURE__ */ E(Ge, {
|
|
625
622
|
value: At,
|
|
626
623
|
onValueChange: (e) => jt(e),
|
|
627
|
-
children: [/* @__PURE__ */
|
|
624
|
+
children: [/* @__PURE__ */ T(Je, { children: /* @__PURE__ */ T(Ye, {}) }), /* @__PURE__ */ E(Ke, { children: [/* @__PURE__ */ T(qe, {
|
|
628
625
|
value: "BUY",
|
|
629
626
|
children: "Buy"
|
|
630
|
-
}), /* @__PURE__ */
|
|
627
|
+
}), /* @__PURE__ */ T(qe, {
|
|
631
628
|
value: "SELL",
|
|
632
629
|
children: "Sell"
|
|
633
630
|
})] })]
|
|
634
631
|
})]
|
|
635
632
|
}),
|
|
636
|
-
/* @__PURE__ */
|
|
633
|
+
/* @__PURE__ */ E("div", {
|
|
637
634
|
className: "space-y-1.5",
|
|
638
|
-
children: [/* @__PURE__ */
|
|
635
|
+
children: [/* @__PURE__ */ T(I, {
|
|
639
636
|
htmlFor: "ti-quantity",
|
|
640
637
|
children: "Quantity"
|
|
641
|
-
}), /* @__PURE__ */
|
|
638
|
+
}), /* @__PURE__ */ T(F, {
|
|
642
639
|
id: "ti-quantity",
|
|
643
640
|
type: "number",
|
|
644
641
|
min: "0",
|
|
@@ -647,21 +644,21 @@ function V() {
|
|
|
647
644
|
onChange: (e) => Nt(e.target.value)
|
|
648
645
|
})]
|
|
649
646
|
}),
|
|
650
|
-
/* @__PURE__ */
|
|
647
|
+
/* @__PURE__ */ E("div", {
|
|
651
648
|
className: "space-y-1.5 sm:col-span-2",
|
|
652
|
-
children: [/* @__PURE__ */
|
|
649
|
+
children: [/* @__PURE__ */ T(I, {
|
|
653
650
|
htmlFor: "ti-rationale",
|
|
654
651
|
children: "Rationale"
|
|
655
|
-
}), /* @__PURE__ */
|
|
652
|
+
}), /* @__PURE__ */ T(F, {
|
|
656
653
|
id: "ti-rationale",
|
|
657
654
|
value: Pt,
|
|
658
655
|
onChange: (e) => Ft(e.target.value),
|
|
659
656
|
placeholder: "Optional"
|
|
660
657
|
})]
|
|
661
658
|
}),
|
|
662
|
-
/* @__PURE__ */
|
|
659
|
+
/* @__PURE__ */ T("div", {
|
|
663
660
|
className: "sm:col-span-5",
|
|
664
|
-
children: /* @__PURE__ */
|
|
661
|
+
children: /* @__PURE__ */ E(O, {
|
|
665
662
|
size: "sm",
|
|
666
663
|
disabled: !V || !Ot.trim() || !Mt || Number(Mt) <= 0 || Tt.isPending,
|
|
667
664
|
onClick: () => {
|
|
@@ -675,7 +672,7 @@ function V() {
|
|
|
675
672
|
kt(""), Nt(""), Ft("");
|
|
676
673
|
} });
|
|
677
674
|
},
|
|
678
|
-
children: [/* @__PURE__ */
|
|
675
|
+
children: [/* @__PURE__ */ T(Te, {
|
|
679
676
|
className: "size-4",
|
|
680
677
|
"aria-hidden": "true"
|
|
681
678
|
}), Tt.isPending ? "Creating…" : "Create instruction"]
|
|
@@ -683,48 +680,48 @@ function V() {
|
|
|
683
680
|
})
|
|
684
681
|
]
|
|
685
682
|
}),
|
|
686
|
-
V ? G.isLoading ? /* @__PURE__ */
|
|
687
|
-
icon: /* @__PURE__ */
|
|
683
|
+
V ? G.isLoading ? /* @__PURE__ */ T(p, {}) : G.isError ? /* @__PURE__ */ T(f, { onRetry: () => G.refetch() }) : G.data.length === 0 ? /* @__PURE__ */ T(d, {
|
|
684
|
+
icon: /* @__PURE__ */ T(Ce, {
|
|
688
685
|
className: "size-6",
|
|
689
686
|
"aria-hidden": "true"
|
|
690
687
|
}),
|
|
691
688
|
title: "No trade instructions yet",
|
|
692
689
|
description: "Create one above, or generate one from a rebalance proposal's trades."
|
|
693
|
-
}) : /* @__PURE__ */
|
|
694
|
-
/* @__PURE__ */
|
|
695
|
-
/* @__PURE__ */
|
|
696
|
-
/* @__PURE__ */
|
|
697
|
-
/* @__PURE__ */
|
|
698
|
-
/* @__PURE__ */
|
|
699
|
-
/* @__PURE__ */
|
|
700
|
-
/* @__PURE__ */
|
|
690
|
+
}) : /* @__PURE__ */ E(Xe, { children: [/* @__PURE__ */ T(Qe, { children: /* @__PURE__ */ E(z, { children: [
|
|
691
|
+
/* @__PURE__ */ T(R, { children: "Symbol" }),
|
|
692
|
+
/* @__PURE__ */ T(R, { children: "Action" }),
|
|
693
|
+
/* @__PURE__ */ T(R, { children: "Qty" }),
|
|
694
|
+
/* @__PURE__ */ T(R, { children: "Reference price" }),
|
|
695
|
+
/* @__PURE__ */ T(R, { children: "Source" }),
|
|
696
|
+
/* @__PURE__ */ T(R, { children: "Status" }),
|
|
697
|
+
/* @__PURE__ */ T(R, {
|
|
701
698
|
className: "text-right",
|
|
702
699
|
children: "Review"
|
|
703
700
|
})
|
|
704
|
-
] }) }), /* @__PURE__ */
|
|
705
|
-
/* @__PURE__ */
|
|
701
|
+
] }) }), /* @__PURE__ */ T(Ze, { children: G.data.map((e) => /* @__PURE__ */ E(z, { children: [
|
|
702
|
+
/* @__PURE__ */ T(L, {
|
|
706
703
|
className: "font-medium",
|
|
707
704
|
children: e.symbol
|
|
708
705
|
}),
|
|
709
|
-
/* @__PURE__ */
|
|
706
|
+
/* @__PURE__ */ T(L, { children: /* @__PURE__ */ T(D, {
|
|
710
707
|
variant: e.action === "BUY" ? "default" : "secondary",
|
|
711
708
|
children: e.action
|
|
712
709
|
}) }),
|
|
713
|
-
/* @__PURE__ */
|
|
714
|
-
/* @__PURE__ */
|
|
715
|
-
/* @__PURE__ */
|
|
710
|
+
/* @__PURE__ */ T(L, { children: e.quantity }),
|
|
711
|
+
/* @__PURE__ */ T(L, { children: e.referencePrice == null ? "—" : h(e.referencePrice) }),
|
|
712
|
+
/* @__PURE__ */ T(L, {
|
|
716
713
|
className: "text-xs text-text-muted",
|
|
717
714
|
children: e.priceSource ?? "—"
|
|
718
715
|
}),
|
|
719
|
-
/* @__PURE__ */
|
|
716
|
+
/* @__PURE__ */ T(L, { children: /* @__PURE__ */ T(D, {
|
|
720
717
|
variant: _(e.status),
|
|
721
718
|
children: e.status
|
|
722
719
|
}) }),
|
|
723
|
-
/* @__PURE__ */
|
|
720
|
+
/* @__PURE__ */ T(L, {
|
|
724
721
|
className: "text-right",
|
|
725
|
-
children: e.status === "PENDING_REVIEW" ? /* @__PURE__ */
|
|
722
|
+
children: e.status === "PENDING_REVIEW" ? /* @__PURE__ */ E("div", {
|
|
726
723
|
className: "flex justify-end gap-1.5",
|
|
727
|
-
children: [/* @__PURE__ */
|
|
724
|
+
children: [/* @__PURE__ */ T(O, {
|
|
728
725
|
size: "sm",
|
|
729
726
|
variant: "ghost",
|
|
730
727
|
disabled: K.isPending,
|
|
@@ -732,11 +729,11 @@ function V() {
|
|
|
732
729
|
id: e.id,
|
|
733
730
|
status: "ACKNOWLEDGED"
|
|
734
731
|
}),
|
|
735
|
-
children: /* @__PURE__ */
|
|
732
|
+
children: /* @__PURE__ */ T(be, {
|
|
736
733
|
className: "size-4",
|
|
737
734
|
"aria-hidden": "true"
|
|
738
735
|
})
|
|
739
|
-
}), /* @__PURE__ */
|
|
736
|
+
}), /* @__PURE__ */ T(O, {
|
|
740
737
|
size: "sm",
|
|
741
738
|
variant: "ghost",
|
|
742
739
|
disabled: K.isPending,
|
|
@@ -744,18 +741,18 @@ function V() {
|
|
|
744
741
|
id: e.id,
|
|
745
742
|
status: "DISMISSED"
|
|
746
743
|
}),
|
|
747
|
-
children: /* @__PURE__ */ w
|
|
744
|
+
children: /* @__PURE__ */ T(w, {
|
|
748
745
|
className: "size-4",
|
|
749
746
|
"aria-hidden": "true"
|
|
750
747
|
})
|
|
751
748
|
})]
|
|
752
|
-
}) : /* @__PURE__ */
|
|
749
|
+
}) : /* @__PURE__ */ T("span", {
|
|
753
750
|
className: "text-xs text-text-muted",
|
|
754
751
|
children: "Reviewed"
|
|
755
752
|
})
|
|
756
753
|
})
|
|
757
|
-
] }, e.id)) })] }) : /* @__PURE__ */
|
|
758
|
-
icon: /* @__PURE__ */
|
|
754
|
+
] }, e.id)) })] }) : /* @__PURE__ */ T(d, {
|
|
755
|
+
icon: /* @__PURE__ */ T(Ce, {
|
|
759
756
|
className: "size-6",
|
|
760
757
|
"aria-hidden": "true"
|
|
761
758
|
}),
|
|
@@ -764,75 +761,75 @@ function V() {
|
|
|
764
761
|
})
|
|
765
762
|
]
|
|
766
763
|
})] }),
|
|
767
|
-
/* @__PURE__ */
|
|
764
|
+
/* @__PURE__ */ E(k, { children: [/* @__PURE__ */ E(M, { children: [/* @__PURE__ */ E(N, {
|
|
768
765
|
className: "flex items-center gap-2",
|
|
769
|
-
children: [/* @__PURE__ */
|
|
766
|
+
children: [/* @__PURE__ */ T(De, {
|
|
770
767
|
className: "h-5 w-5",
|
|
771
768
|
"aria-hidden": "true"
|
|
772
769
|
}), "Rebalance proposals"]
|
|
773
|
-
}), /* @__PURE__ */
|
|
774
|
-
icon: /* @__PURE__ */
|
|
770
|
+
}), /* @__PURE__ */ T(j, { children: "Drift against target allocation, with lifecycle actions per proposal." })] }), /* @__PURE__ */ T(A, { children: pe ? /* @__PURE__ */ T(p, {}) : me ? /* @__PURE__ */ T(f, { onRetry: () => ge() }) : c.length === 0 ? /* @__PURE__ */ T(d, {
|
|
771
|
+
icon: /* @__PURE__ */ T(De, {
|
|
775
772
|
className: "size-6",
|
|
776
773
|
"aria-hidden": "true"
|
|
777
774
|
}),
|
|
778
775
|
title: "No rebalance proposals",
|
|
779
776
|
description: cn ? "Create a proposal when a portfolio drifts from its target allocation." : "Create a portfolio first, then propose a rebalance when it drifts.",
|
|
780
|
-
action: cn ? /* @__PURE__ */
|
|
777
|
+
action: cn ? /* @__PURE__ */ E(O, {
|
|
781
778
|
size: "sm",
|
|
782
779
|
onClick: ln,
|
|
783
|
-
children: [/* @__PURE__ */
|
|
780
|
+
children: [/* @__PURE__ */ T(Te, {
|
|
784
781
|
className: "size-4",
|
|
785
782
|
"aria-hidden": "true"
|
|
786
783
|
}), "New proposal"]
|
|
787
784
|
}) : void 0
|
|
788
|
-
}) : /* @__PURE__ */
|
|
785
|
+
}) : /* @__PURE__ */ T("div", {
|
|
789
786
|
className: "overflow-x-auto",
|
|
790
|
-
children: /* @__PURE__ */
|
|
791
|
-
/* @__PURE__ */
|
|
792
|
-
/* @__PURE__ */
|
|
787
|
+
children: /* @__PURE__ */ E(Xe, { children: [/* @__PURE__ */ T(Qe, { children: /* @__PURE__ */ E(z, { children: [
|
|
788
|
+
/* @__PURE__ */ T(R, { children: "Portfolio" }),
|
|
789
|
+
/* @__PURE__ */ T(R, {
|
|
793
790
|
className: "text-right",
|
|
794
791
|
children: "Drift"
|
|
795
792
|
}),
|
|
796
|
-
/* @__PURE__ */
|
|
797
|
-
/* @__PURE__ */
|
|
798
|
-
/* @__PURE__ */
|
|
799
|
-
/* @__PURE__ */
|
|
800
|
-
/* @__PURE__ */
|
|
793
|
+
/* @__PURE__ */ T(R, { children: "Status" }),
|
|
794
|
+
/* @__PURE__ */ T(R, { children: "Rationale" }),
|
|
795
|
+
/* @__PURE__ */ T(R, { children: "Trades" }),
|
|
796
|
+
/* @__PURE__ */ T(R, { children: "Created" }),
|
|
797
|
+
/* @__PURE__ */ T(R, {
|
|
801
798
|
className: "w-12 text-right",
|
|
802
799
|
children: "Actions"
|
|
803
800
|
})
|
|
804
|
-
] }) }), /* @__PURE__ */
|
|
805
|
-
let t = Q.get(e.portfolioId), n = fn(e), r =
|
|
806
|
-
return /* @__PURE__ */
|
|
801
|
+
] }) }), /* @__PURE__ */ T(Ze, { children: c.map((e) => {
|
|
802
|
+
let t = Q.get(e.portfolioId), n = fn(e), r = et[e.status], i = t?.driftThresholdPct, a = i != null && i > 0 ? Math.min(100, e.driftPct / i * 100) : null;
|
|
803
|
+
return /* @__PURE__ */ E(z, {
|
|
807
804
|
onClick: () => Qt(e),
|
|
808
805
|
className: "cursor-pointer transition-colors motion-safe:hover:bg-bg-elevated",
|
|
809
806
|
children: [
|
|
810
|
-
/* @__PURE__ */
|
|
807
|
+
/* @__PURE__ */ E(L, { children: [/* @__PURE__ */ T("p", {
|
|
811
808
|
className: "font-medium text-text-primary",
|
|
812
809
|
children: t?.name ?? "Unknown portfolio"
|
|
813
|
-
}), /* @__PURE__ */
|
|
810
|
+
}), /* @__PURE__ */ E("p", {
|
|
814
811
|
className: "text-xs text-text-secondary",
|
|
815
812
|
children: [t?.baseCurrency ?? "—", i == null ? "" : ` · threshold ${g(i)}`]
|
|
816
813
|
})] }),
|
|
817
|
-
/* @__PURE__ */
|
|
814
|
+
/* @__PURE__ */ E(L, {
|
|
818
815
|
className: "text-right",
|
|
819
|
-
children: [/* @__PURE__ */
|
|
816
|
+
children: [/* @__PURE__ */ E("span", {
|
|
820
817
|
className: `inline-flex items-center justify-end gap-1 font-semibold tabular-nums ${n ? "text-status-error-text" : "text-text-primary"}`,
|
|
821
|
-
children: [n ? /* @__PURE__ */
|
|
818
|
+
children: [n ? /* @__PURE__ */ T(ve, {
|
|
822
819
|
className: "size-4",
|
|
823
820
|
"aria-hidden": "true"
|
|
824
821
|
}) : null, g(e.driftPct)]
|
|
825
|
-
}), a == null ? n ? /* @__PURE__ */
|
|
822
|
+
}), a == null ? n ? /* @__PURE__ */ T("p", {
|
|
826
823
|
className: "text-xs text-status-error-text",
|
|
827
824
|
children: "Over threshold"
|
|
828
|
-
}) : null : /* @__PURE__ */
|
|
825
|
+
}) : null : /* @__PURE__ */ T("div", {
|
|
829
826
|
className: "ml-auto mt-1 h-1.5 w-24 overflow-hidden rounded-full bg-bg-sunken",
|
|
830
827
|
role: "progressbar",
|
|
831
828
|
"aria-valuenow": Math.round(a),
|
|
832
829
|
"aria-valuemin": 0,
|
|
833
830
|
"aria-valuemax": 100,
|
|
834
831
|
"aria-label": `Drift vs threshold for ${t?.name ?? "portfolio"}`,
|
|
835
|
-
children: /* @__PURE__ */
|
|
832
|
+
children: /* @__PURE__ */ T("div", {
|
|
836
833
|
className: "h-full rounded-full",
|
|
837
834
|
style: {
|
|
838
835
|
width: `${a}%`,
|
|
@@ -841,60 +838,60 @@ function V() {
|
|
|
841
838
|
})
|
|
842
839
|
})]
|
|
843
840
|
}),
|
|
844
|
-
/* @__PURE__ */
|
|
841
|
+
/* @__PURE__ */ T(L, { children: /* @__PURE__ */ T(D, {
|
|
845
842
|
variant: _(e.status),
|
|
846
|
-
children:
|
|
843
|
+
children: B(e.status)
|
|
847
844
|
}) }),
|
|
848
|
-
/* @__PURE__ */
|
|
845
|
+
/* @__PURE__ */ T(L, {
|
|
849
846
|
className: "max-w-xs",
|
|
850
|
-
children: /* @__PURE__ */
|
|
847
|
+
children: /* @__PURE__ */ T("p", {
|
|
851
848
|
className: "truncate text-sm text-text-secondary",
|
|
852
849
|
children: e.rationale ?? "—"
|
|
853
850
|
})
|
|
854
851
|
}),
|
|
855
|
-
/* @__PURE__ */
|
|
852
|
+
/* @__PURE__ */ T(L, {
|
|
856
853
|
className: "text-sm text-text-secondary",
|
|
857
854
|
children: ct(e.trades)
|
|
858
855
|
}),
|
|
859
|
-
/* @__PURE__ */
|
|
856
|
+
/* @__PURE__ */ T(L, {
|
|
860
857
|
className: "text-sm text-text-secondary",
|
|
861
858
|
children: m(e.createdAt)
|
|
862
859
|
}),
|
|
863
|
-
/* @__PURE__ */
|
|
860
|
+
/* @__PURE__ */ T(L, {
|
|
864
861
|
className: "text-right",
|
|
865
862
|
onClick: (e) => e.stopPropagation(),
|
|
866
|
-
children: /* @__PURE__ */
|
|
863
|
+
children: /* @__PURE__ */ E(Be, { children: [/* @__PURE__ */ T(We, {
|
|
867
864
|
asChild: !0,
|
|
868
|
-
children: /* @__PURE__ */
|
|
865
|
+
children: /* @__PURE__ */ T(O, {
|
|
869
866
|
variant: "ghost",
|
|
870
867
|
size: "sm",
|
|
871
868
|
"aria-label": `Actions for ${t?.name ?? "proposal"}`,
|
|
872
|
-
children: /* @__PURE__ */
|
|
869
|
+
children: /* @__PURE__ */ T(we, {
|
|
873
870
|
className: "size-4",
|
|
874
871
|
"aria-hidden": "true"
|
|
875
872
|
})
|
|
876
873
|
})
|
|
877
|
-
}), /* @__PURE__ */
|
|
874
|
+
}), /* @__PURE__ */ E(Ve, {
|
|
878
875
|
align: "end",
|
|
879
|
-
children: [/* @__PURE__ */
|
|
876
|
+
children: [/* @__PURE__ */ E(P, {
|
|
880
877
|
onClick: () => Qt(e),
|
|
881
|
-
children: [/* @__PURE__ */
|
|
878
|
+
children: [/* @__PURE__ */ T(xe, {
|
|
882
879
|
className: "size-4",
|
|
883
880
|
"aria-hidden": "true"
|
|
884
881
|
}), "View details"]
|
|
885
|
-
}), r.length > 0 ? /* @__PURE__ */
|
|
886
|
-
/* @__PURE__ */
|
|
887
|
-
/* @__PURE__ */
|
|
882
|
+
}), r.length > 0 ? /* @__PURE__ */ E(Me, { children: [
|
|
883
|
+
/* @__PURE__ */ T(Ue, {}),
|
|
884
|
+
/* @__PURE__ */ T(He, { children: "Advance to" }),
|
|
888
885
|
r.map((t) => {
|
|
889
886
|
let n = t === "REJECTED" || t === "CANCELLED";
|
|
890
|
-
return /* @__PURE__ */
|
|
887
|
+
return /* @__PURE__ */ E(P, {
|
|
891
888
|
disabled: J.isPending,
|
|
892
889
|
className: n ? "text-status-error-text" : void 0,
|
|
893
890
|
onClick: () => dn(e, t),
|
|
894
|
-
children: [
|
|
891
|
+
children: [T(n ? w : ye, {
|
|
895
892
|
className: "size-4",
|
|
896
893
|
"aria-hidden": "true"
|
|
897
|
-
}),
|
|
894
|
+
}), B(t)]
|
|
898
895
|
}, t);
|
|
899
896
|
})
|
|
900
897
|
] }) : null]
|
|
@@ -904,75 +901,75 @@ function V() {
|
|
|
904
901
|
}, e.id);
|
|
905
902
|
}) })] })
|
|
906
903
|
}) })] }),
|
|
907
|
-
/* @__PURE__ */
|
|
904
|
+
/* @__PURE__ */ E(k, { children: [/* @__PURE__ */ E(M, { children: [/* @__PURE__ */ E(N, {
|
|
908
905
|
className: "flex items-center gap-2",
|
|
909
|
-
children: [/* @__PURE__ */
|
|
906
|
+
children: [/* @__PURE__ */ T(S, {
|
|
910
907
|
className: "h-5 w-5",
|
|
911
908
|
"aria-hidden": "true"
|
|
912
909
|
}), "Risk insights"]
|
|
913
|
-
}), /* @__PURE__ */
|
|
914
|
-
icon: /* @__PURE__ */
|
|
910
|
+
}), /* @__PURE__ */ T(j, { children: "Drift, concentration, cash-drag and fee-anomaly signals detected across your portfolios." })] }), /* @__PURE__ */ T(A, { children: zt ? /* @__PURE__ */ T(p, {}) : Vt ? /* @__PURE__ */ T(f, { onRetry: () => Ht() }) : en.length === 0 ? /* @__PURE__ */ T(d, {
|
|
911
|
+
icon: /* @__PURE__ */ T(C, {
|
|
915
912
|
className: "size-6",
|
|
916
913
|
"aria-hidden": "true"
|
|
917
914
|
}),
|
|
918
915
|
title: "No risk insights",
|
|
919
916
|
description: "No drift, concentration, cash-drag or fee-anomaly signals are open right now."
|
|
920
|
-
}) : /* @__PURE__ */
|
|
917
|
+
}) : /* @__PURE__ */ E("div", {
|
|
921
918
|
className: "space-y-3",
|
|
922
|
-
children: [en.map((e, t) => /* @__PURE__ */
|
|
919
|
+
children: [en.map((e, t) => /* @__PURE__ */ T(l, {
|
|
923
920
|
index: t,
|
|
924
|
-
children: /* @__PURE__ */
|
|
921
|
+
children: /* @__PURE__ */ T(mt, {
|
|
925
922
|
insight: e,
|
|
926
923
|
onAcknowledge: () => Wt.mutate(e.id),
|
|
927
924
|
onResolve: () => Kt.mutate(e.id),
|
|
928
925
|
onDismiss: () => Gt.mutate(e.id),
|
|
929
926
|
actionPending: Wt.isPending || Kt.isPending || Gt.isPending
|
|
930
927
|
})
|
|
931
|
-
}, e.id)), /* @__PURE__ */
|
|
928
|
+
}, e.id)), /* @__PURE__ */ T(le, {
|
|
932
929
|
hasMore: Lt,
|
|
933
930
|
onClick: Rt,
|
|
934
931
|
loading: Bt,
|
|
935
932
|
label: "Load more insights"
|
|
936
933
|
})]
|
|
937
934
|
}) })] }),
|
|
938
|
-
/* @__PURE__ */
|
|
935
|
+
/* @__PURE__ */ T(Ne, {
|
|
939
936
|
open: qt,
|
|
940
937
|
onOpenChange: Jt,
|
|
941
|
-
children: /* @__PURE__ */
|
|
942
|
-
/* @__PURE__ */
|
|
943
|
-
cn ? /* @__PURE__ */
|
|
938
|
+
children: /* @__PURE__ */ E(Fe, { children: [
|
|
939
|
+
/* @__PURE__ */ E(Re, { children: [/* @__PURE__ */ T(ze, { children: "New rebalance proposal" }), /* @__PURE__ */ T(Ie, { children: "Propose a rebalance for a portfolio that has drifted from its target allocation." })] }),
|
|
940
|
+
cn ? /* @__PURE__ */ E("div", {
|
|
944
941
|
className: "grid gap-4",
|
|
945
942
|
children: [
|
|
946
|
-
/* @__PURE__ */
|
|
943
|
+
/* @__PURE__ */ E("div", {
|
|
947
944
|
className: "grid gap-4 sm:grid-cols-2",
|
|
948
|
-
children: [/* @__PURE__ */
|
|
945
|
+
children: [/* @__PURE__ */ E("div", {
|
|
949
946
|
className: "space-y-2",
|
|
950
|
-
children: [/* @__PURE__ */
|
|
947
|
+
children: [/* @__PURE__ */ E(I, {
|
|
951
948
|
htmlFor: "prop-portfolio",
|
|
952
|
-
children: ["Portfolio ", /* @__PURE__ */
|
|
949
|
+
children: ["Portfolio ", /* @__PURE__ */ T("span", {
|
|
953
950
|
className: "text-status-error-text",
|
|
954
951
|
children: "*"
|
|
955
952
|
})]
|
|
956
|
-
}), /* @__PURE__ */
|
|
953
|
+
}), /* @__PURE__ */ E(Ge, {
|
|
957
954
|
value: Y.portfolioId,
|
|
958
955
|
onValueChange: (e) => X((t) => ({
|
|
959
956
|
...t,
|
|
960
957
|
portfolioId: e
|
|
961
958
|
})),
|
|
962
|
-
children: [/* @__PURE__ */
|
|
959
|
+
children: [/* @__PURE__ */ T(Je, {
|
|
963
960
|
id: "prop-portfolio",
|
|
964
|
-
children: /* @__PURE__ */
|
|
965
|
-
}), /* @__PURE__ */
|
|
961
|
+
children: /* @__PURE__ */ T(Ye, { placeholder: "Select a portfolio" })
|
|
962
|
+
}), /* @__PURE__ */ T(Ke, { children: v.map((e) => /* @__PURE__ */ T(qe, {
|
|
966
963
|
value: e.id,
|
|
967
964
|
children: e.name
|
|
968
965
|
}, e.id)) })]
|
|
969
966
|
})]
|
|
970
|
-
}), /* @__PURE__ */
|
|
967
|
+
}), /* @__PURE__ */ E("div", {
|
|
971
968
|
className: "space-y-2",
|
|
972
|
-
children: [/* @__PURE__ */
|
|
969
|
+
children: [/* @__PURE__ */ T(I, {
|
|
973
970
|
htmlFor: "prop-drift",
|
|
974
971
|
children: "Drift %"
|
|
975
|
-
}), /* @__PURE__ */
|
|
972
|
+
}), /* @__PURE__ */ T(F, {
|
|
976
973
|
id: "prop-drift",
|
|
977
974
|
type: "number",
|
|
978
975
|
value: Y.driftPct,
|
|
@@ -984,12 +981,12 @@ function V() {
|
|
|
984
981
|
})]
|
|
985
982
|
})]
|
|
986
983
|
}),
|
|
987
|
-
/* @__PURE__ */
|
|
984
|
+
/* @__PURE__ */ E("div", {
|
|
988
985
|
className: "space-y-2",
|
|
989
|
-
children: [/* @__PURE__ */
|
|
986
|
+
children: [/* @__PURE__ */ T(I, {
|
|
990
987
|
htmlFor: "prop-rationale",
|
|
991
988
|
children: "Rationale"
|
|
992
|
-
}), /* @__PURE__ */
|
|
989
|
+
}), /* @__PURE__ */ T($e, {
|
|
993
990
|
id: "prop-rationale",
|
|
994
991
|
value: Y.rationale,
|
|
995
992
|
onChange: (e) => X((t) => ({
|
|
@@ -999,14 +996,14 @@ function V() {
|
|
|
999
996
|
placeholder: "Why is this rebalance needed?"
|
|
1000
997
|
})]
|
|
1001
998
|
}),
|
|
1002
|
-
/* @__PURE__ */
|
|
999
|
+
/* @__PURE__ */ E("div", {
|
|
1003
1000
|
className: "space-y-2",
|
|
1004
1001
|
children: [
|
|
1005
|
-
/* @__PURE__ */
|
|
1002
|
+
/* @__PURE__ */ T(I, {
|
|
1006
1003
|
htmlFor: "prop-trades",
|
|
1007
1004
|
children: "Trades (JSON, optional)"
|
|
1008
1005
|
}),
|
|
1009
|
-
/* @__PURE__ */
|
|
1006
|
+
/* @__PURE__ */ T($e, {
|
|
1010
1007
|
id: "prop-trades",
|
|
1011
1008
|
className: "font-mono text-xs",
|
|
1012
1009
|
value: Y.trades,
|
|
@@ -1018,28 +1015,28 @@ function V() {
|
|
|
1018
1015
|
},
|
|
1019
1016
|
placeholder: "e.g. [{\"symbol\":\"VOO\",\"action\":\"SELL\",\"quantity\":10}]"
|
|
1020
1017
|
}),
|
|
1021
|
-
Yt ? /* @__PURE__ */
|
|
1018
|
+
Yt ? /* @__PURE__ */ T("p", {
|
|
1022
1019
|
className: "text-xs text-status-error-text",
|
|
1023
1020
|
children: Yt
|
|
1024
1021
|
}) : null
|
|
1025
1022
|
]
|
|
1026
1023
|
})
|
|
1027
1024
|
]
|
|
1028
|
-
}) : /* @__PURE__ */
|
|
1029
|
-
icon: /* @__PURE__ */
|
|
1025
|
+
}) : /* @__PURE__ */ T(d, {
|
|
1026
|
+
icon: /* @__PURE__ */ T(De, {
|
|
1030
1027
|
className: "size-6",
|
|
1031
1028
|
"aria-hidden": "true"
|
|
1032
1029
|
}),
|
|
1033
1030
|
title: "Create a portfolio first",
|
|
1034
1031
|
description: "A rebalance proposal targets a portfolio. Add a portfolio on the Portfolios page, then return here to propose a rebalance."
|
|
1035
1032
|
}),
|
|
1036
|
-
/* @__PURE__ */
|
|
1033
|
+
/* @__PURE__ */ E(Le, { children: [/* @__PURE__ */ T(Pe, {
|
|
1037
1034
|
asChild: !0,
|
|
1038
|
-
children: /* @__PURE__ */
|
|
1035
|
+
children: /* @__PURE__ */ T(O, {
|
|
1039
1036
|
variant: "outline",
|
|
1040
1037
|
children: "Cancel"
|
|
1041
1038
|
})
|
|
1042
|
-
}), /* @__PURE__ */
|
|
1039
|
+
}), /* @__PURE__ */ T(O, {
|
|
1043
1040
|
onClick: un,
|
|
1044
1041
|
disabled: !Y.portfolioId || Ut.isPending,
|
|
1045
1042
|
children: Ut.isPending ? "Creating…" : "Create proposal"
|
|
@@ -1048,11 +1045,11 @@ function V() {
|
|
|
1048
1045
|
}),
|
|
1049
1046
|
(() => {
|
|
1050
1047
|
let e = Zt ? c.find((e) => e.id === Zt.id) ?? Zt : null, t = e ? It.filter((t) => t.subjectId === e.portfolioId) : [];
|
|
1051
|
-
return /* @__PURE__ */
|
|
1048
|
+
return /* @__PURE__ */ T(dt, {
|
|
1052
1049
|
proposal: e,
|
|
1053
1050
|
portfolio: e ? Q.get(e.portfolioId) ?? null : null,
|
|
1054
1051
|
relatedInsights: t,
|
|
1055
|
-
nextStatuses: e ?
|
|
1052
|
+
nextStatuses: e ? et[e.status] : [],
|
|
1056
1053
|
transitionPending: J.isPending,
|
|
1057
1054
|
onTransition: (t) => {
|
|
1058
1055
|
e && dn(e, t);
|
|
@@ -1062,13 +1059,13 @@ function V() {
|
|
|
1062
1059
|
}
|
|
1063
1060
|
});
|
|
1064
1061
|
})(),
|
|
1065
|
-
/* @__PURE__ */
|
|
1062
|
+
/* @__PURE__ */ T(ue, {
|
|
1066
1063
|
open: Z !== null,
|
|
1067
1064
|
onOpenChange: (e) => {
|
|
1068
1065
|
e || $t(null);
|
|
1069
1066
|
},
|
|
1070
1067
|
title: Z?.status === "REJECTED" ? "Reject this proposal?" : "Cancel this proposal?",
|
|
1071
|
-
description: Z ? `This moves the rebalance proposal for ${Q.get(Z.proposal.portfolioId)?.name ?? "this portfolio"} to ${
|
|
1068
|
+
description: Z ? `This moves the rebalance proposal for ${Q.get(Z.proposal.portfolioId)?.name ?? "this portfolio"} to ${B(Z.status)}. This cannot be undone.` : void 0,
|
|
1072
1069
|
confirmLabel: Z?.status === "REJECTED" ? "Reject" : "Cancel proposal",
|
|
1073
1070
|
cancelLabel: "Keep",
|
|
1074
1071
|
destructive: !0,
|
|
@@ -1084,194 +1081,194 @@ function V() {
|
|
|
1084
1081
|
});
|
|
1085
1082
|
}
|
|
1086
1083
|
function dt({ proposal: e, portfolio: t, relatedInsights: n, nextStatuses: r, transitionPending: i, onTransition: a, onOpenChange: o }) {
|
|
1087
|
-
let s = e ?
|
|
1088
|
-
return /* @__PURE__ */
|
|
1084
|
+
let s = e ? st(e.trades) : null, ee = e != null && t?.driftThresholdPct != null && Number.isFinite(t.driftThresholdPct) && e.driftPct >= t.driftThresholdPct;
|
|
1085
|
+
return /* @__PURE__ */ T(Ne, {
|
|
1089
1086
|
open: e !== null,
|
|
1090
1087
|
onOpenChange: o,
|
|
1091
|
-
children: /* @__PURE__ */
|
|
1088
|
+
children: /* @__PURE__ */ T(Fe, {
|
|
1092
1089
|
className: "max-h-[88vh] max-w-3xl overflow-y-auto",
|
|
1093
|
-
children: e ? /* @__PURE__ */
|
|
1094
|
-
/* @__PURE__ */
|
|
1095
|
-
/* @__PURE__ */
|
|
1090
|
+
children: e ? /* @__PURE__ */ E(Me, { children: [
|
|
1091
|
+
/* @__PURE__ */ E(Re, { children: [
|
|
1092
|
+
/* @__PURE__ */ T("p", {
|
|
1096
1093
|
className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
|
|
1097
1094
|
children: "Detail"
|
|
1098
1095
|
}),
|
|
1099
|
-
/* @__PURE__ */
|
|
1096
|
+
/* @__PURE__ */ E(ze, {
|
|
1100
1097
|
className: "flex flex-wrap items-center gap-2 text-xl",
|
|
1101
1098
|
children: [
|
|
1102
1099
|
t?.name ?? "Rebalance proposal",
|
|
1103
|
-
/* @__PURE__ */
|
|
1100
|
+
/* @__PURE__ */ T("span", {
|
|
1104
1101
|
className: "text-text-secondary",
|
|
1105
1102
|
children: "— Rebalance proposal"
|
|
1106
1103
|
}),
|
|
1107
|
-
/* @__PURE__ */
|
|
1104
|
+
/* @__PURE__ */ T(D, {
|
|
1108
1105
|
variant: _(e.status),
|
|
1109
|
-
children:
|
|
1106
|
+
children: B(e.status)
|
|
1110
1107
|
})
|
|
1111
1108
|
]
|
|
1112
1109
|
}),
|
|
1113
|
-
/* @__PURE__ */
|
|
1110
|
+
/* @__PURE__ */ E(Ie, { children: [
|
|
1114
1111
|
"Created ",
|
|
1115
1112
|
m(e.createdAt),
|
|
1116
1113
|
e.executedAt ? ` · executed ${m(e.executedAt)}` : ""
|
|
1117
1114
|
] })
|
|
1118
1115
|
] }),
|
|
1119
|
-
/* @__PURE__ */
|
|
1116
|
+
/* @__PURE__ */ T("div", {
|
|
1120
1117
|
className: "rounded-xl border border-border-subtle bg-bg-surface p-4",
|
|
1121
|
-
children: /* @__PURE__ */
|
|
1122
|
-
steps:
|
|
1123
|
-
current:
|
|
1118
|
+
children: /* @__PURE__ */ T(pe, {
|
|
1119
|
+
steps: nt,
|
|
1120
|
+
current: B(e.status)
|
|
1124
1121
|
})
|
|
1125
1122
|
}),
|
|
1126
|
-
/* @__PURE__ */
|
|
1123
|
+
/* @__PURE__ */ E("div", {
|
|
1127
1124
|
className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-4",
|
|
1128
1125
|
children: [
|
|
1129
|
-
/* @__PURE__ */
|
|
1126
|
+
/* @__PURE__ */ T(u, {
|
|
1130
1127
|
label: "Drift",
|
|
1131
1128
|
value: g(e.driftPct),
|
|
1132
1129
|
deltaTone: ee ? "negative" : "neutral",
|
|
1133
1130
|
glow: ee,
|
|
1134
|
-
icon: /* @__PURE__ */
|
|
1131
|
+
icon: /* @__PURE__ */ T(x, {
|
|
1135
1132
|
className: "size-4",
|
|
1136
1133
|
"aria-hidden": "true"
|
|
1137
1134
|
})
|
|
1138
1135
|
}),
|
|
1139
|
-
/* @__PURE__ */
|
|
1136
|
+
/* @__PURE__ */ T(u, {
|
|
1140
1137
|
label: "Threshold",
|
|
1141
1138
|
value: t?.driftThresholdPct == null ? "—" : g(t.driftThresholdPct)
|
|
1142
1139
|
}),
|
|
1143
|
-
/* @__PURE__ */
|
|
1140
|
+
/* @__PURE__ */ E("div", {
|
|
1144
1141
|
className: "rounded-xl border border-border-subtle bg-bg-surface p-4",
|
|
1145
|
-
children: [/* @__PURE__ */
|
|
1142
|
+
children: [/* @__PURE__ */ T("p", {
|
|
1146
1143
|
className: "text-xs text-text-secondary",
|
|
1147
1144
|
children: "Proposed by"
|
|
1148
|
-
}), /* @__PURE__ */
|
|
1145
|
+
}), /* @__PURE__ */ T("p", {
|
|
1149
1146
|
className: "mt-1 truncate text-sm font-medium text-text-primary",
|
|
1150
|
-
children: e.proposedById ? /* @__PURE__ */
|
|
1147
|
+
children: e.proposedById ? /* @__PURE__ */ T(c, { id: e.proposedById }) : "—"
|
|
1151
1148
|
})]
|
|
1152
1149
|
}),
|
|
1153
|
-
/* @__PURE__ */
|
|
1150
|
+
/* @__PURE__ */ E("div", {
|
|
1154
1151
|
className: "rounded-xl border border-border-subtle bg-bg-surface p-4",
|
|
1155
|
-
children: [/* @__PURE__ */
|
|
1152
|
+
children: [/* @__PURE__ */ T("p", {
|
|
1156
1153
|
className: "text-xs text-text-secondary",
|
|
1157
1154
|
children: "Approved by"
|
|
1158
|
-
}), /* @__PURE__ */
|
|
1155
|
+
}), /* @__PURE__ */ T("p", {
|
|
1159
1156
|
className: "mt-1 truncate text-sm font-medium text-text-primary",
|
|
1160
|
-
children: e.approvedById ? /* @__PURE__ */
|
|
1157
|
+
children: e.approvedById ? /* @__PURE__ */ T(c, { id: e.approvedById }) : "—"
|
|
1161
1158
|
})]
|
|
1162
1159
|
})
|
|
1163
1160
|
]
|
|
1164
1161
|
}),
|
|
1165
|
-
/* @__PURE__ */
|
|
1162
|
+
/* @__PURE__ */ E("div", {
|
|
1166
1163
|
className: "space-y-2",
|
|
1167
|
-
children: [/* @__PURE__ */
|
|
1164
|
+
children: [/* @__PURE__ */ T("h3", {
|
|
1168
1165
|
className: "text-sm font-semibold text-text-primary",
|
|
1169
1166
|
children: "Proposed trades"
|
|
1170
|
-
}), s && s.length > 0 ? /* @__PURE__ */
|
|
1167
|
+
}), s && s.length > 0 ? /* @__PURE__ */ T("div", {
|
|
1171
1168
|
className: "overflow-x-auto rounded-lg border border-border-subtle",
|
|
1172
|
-
children: /* @__PURE__ */
|
|
1173
|
-
/* @__PURE__ */
|
|
1174
|
-
/* @__PURE__ */
|
|
1175
|
-
/* @__PURE__ */
|
|
1169
|
+
children: /* @__PURE__ */ E(Xe, { children: [/* @__PURE__ */ T(Qe, { children: /* @__PURE__ */ E(z, { children: [
|
|
1170
|
+
/* @__PURE__ */ T(R, { children: "Action" }),
|
|
1171
|
+
/* @__PURE__ */ T(R, { children: "Symbol" }),
|
|
1172
|
+
/* @__PURE__ */ T(R, {
|
|
1176
1173
|
className: "text-right",
|
|
1177
1174
|
children: "Quantity"
|
|
1178
1175
|
}),
|
|
1179
|
-
/* @__PURE__ */
|
|
1176
|
+
/* @__PURE__ */ T(R, {
|
|
1180
1177
|
className: "text-right",
|
|
1181
1178
|
children: "Est. value"
|
|
1182
1179
|
})
|
|
1183
|
-
] }) }), /* @__PURE__ */
|
|
1184
|
-
/* @__PURE__ */
|
|
1185
|
-
className: `font-semibold ${
|
|
1180
|
+
] }) }), /* @__PURE__ */ T(Ze, { children: s.map((e, n) => /* @__PURE__ */ E(z, { children: [
|
|
1181
|
+
/* @__PURE__ */ T(L, {
|
|
1182
|
+
className: `font-semibold ${V(e.action)}`,
|
|
1186
1183
|
children: e.action ? e.action.toUpperCase() : "—"
|
|
1187
1184
|
}),
|
|
1188
|
-
/* @__PURE__ */
|
|
1185
|
+
/* @__PURE__ */ T(L, {
|
|
1189
1186
|
className: "font-medium text-text-primary",
|
|
1190
1187
|
children: e.symbol ?? "—"
|
|
1191
1188
|
}),
|
|
1192
|
-
/* @__PURE__ */
|
|
1189
|
+
/* @__PURE__ */ T(L, {
|
|
1193
1190
|
className: "text-right tabular-nums text-text-secondary",
|
|
1194
1191
|
children: e.quantity == null ? "—" : e.quantity.toLocaleString()
|
|
1195
1192
|
}),
|
|
1196
|
-
/* @__PURE__ */
|
|
1193
|
+
/* @__PURE__ */ T(L, {
|
|
1197
1194
|
className: "text-right tabular-nums text-text-secondary",
|
|
1198
1195
|
children: e.value == null ? "—" : h(e.value, t?.baseCurrency ?? "USD")
|
|
1199
1196
|
})
|
|
1200
1197
|
] }, n)) })] })
|
|
1201
|
-
}) : /* @__PURE__ */
|
|
1198
|
+
}) : /* @__PURE__ */ E("p", {
|
|
1202
1199
|
className: "text-sm text-text-secondary",
|
|
1203
1200
|
children: [ct(e.trades), " — no structured trade breakdown available."]
|
|
1204
1201
|
})]
|
|
1205
1202
|
}),
|
|
1206
|
-
/* @__PURE__ */
|
|
1203
|
+
/* @__PURE__ */ E("div", {
|
|
1207
1204
|
className: "space-y-1",
|
|
1208
|
-
children: [/* @__PURE__ */
|
|
1205
|
+
children: [/* @__PURE__ */ T("h3", {
|
|
1209
1206
|
className: "text-sm font-semibold text-text-primary",
|
|
1210
1207
|
children: "Rationale"
|
|
1211
|
-
}), /* @__PURE__ */
|
|
1208
|
+
}), /* @__PURE__ */ T("p", {
|
|
1212
1209
|
className: "text-sm text-text-secondary",
|
|
1213
1210
|
children: e.rationale ?? "—"
|
|
1214
1211
|
})]
|
|
1215
1212
|
}),
|
|
1216
|
-
r.length > 0 ? /* @__PURE__ */
|
|
1213
|
+
r.length > 0 ? /* @__PURE__ */ T("div", {
|
|
1217
1214
|
className: "flex flex-wrap gap-2",
|
|
1218
1215
|
children: r.map((e) => {
|
|
1219
1216
|
let t = e === "REJECTED" || e === "CANCELLED";
|
|
1220
|
-
return /* @__PURE__ */
|
|
1217
|
+
return /* @__PURE__ */ E(O, {
|
|
1221
1218
|
variant: t ? "outline" : "default",
|
|
1222
1219
|
size: "sm",
|
|
1223
1220
|
disabled: i,
|
|
1224
1221
|
className: t ? "text-status-error-text" : void 0,
|
|
1225
1222
|
onClick: () => a(e),
|
|
1226
|
-
children: [
|
|
1223
|
+
children: [T(t ? w : ye, {
|
|
1227
1224
|
className: "size-4",
|
|
1228
1225
|
"aria-hidden": "true"
|
|
1229
|
-
}),
|
|
1226
|
+
}), B(e)]
|
|
1230
1227
|
}, e);
|
|
1231
1228
|
})
|
|
1232
1229
|
}) : null,
|
|
1233
|
-
n.length > 0 ? /* @__PURE__ */
|
|
1230
|
+
n.length > 0 ? /* @__PURE__ */ E("div", {
|
|
1234
1231
|
className: "space-y-2 border-t border-border-subtle pt-4",
|
|
1235
|
-
children: [/* @__PURE__ */
|
|
1232
|
+
children: [/* @__PURE__ */ E("h3", {
|
|
1236
1233
|
className: "flex items-center gap-2 text-sm font-semibold text-text-primary",
|
|
1237
|
-
children: [/* @__PURE__ */
|
|
1234
|
+
children: [/* @__PURE__ */ T(S, {
|
|
1238
1235
|
className: "size-4",
|
|
1239
1236
|
"aria-hidden": "true"
|
|
1240
1237
|
}), "Risk insights"]
|
|
1241
|
-
}), /* @__PURE__ */
|
|
1238
|
+
}), /* @__PURE__ */ T("ul", {
|
|
1242
1239
|
className: "space-y-2",
|
|
1243
|
-
children: n.map((e) => /* @__PURE__ */
|
|
1240
|
+
children: n.map((e) => /* @__PURE__ */ E("li", {
|
|
1244
1241
|
className: "rounded-lg border border-border-subtle bg-bg-surface p-3",
|
|
1245
|
-
children: [/* @__PURE__ */
|
|
1242
|
+
children: [/* @__PURE__ */ E("div", {
|
|
1246
1243
|
className: "flex flex-wrap items-center gap-2",
|
|
1247
1244
|
children: [
|
|
1248
|
-
/* @__PURE__ */
|
|
1245
|
+
/* @__PURE__ */ T("span", {
|
|
1249
1246
|
className: "text-sm font-medium text-text-primary",
|
|
1250
1247
|
children: e.title
|
|
1251
1248
|
}),
|
|
1252
|
-
/* @__PURE__ */
|
|
1249
|
+
/* @__PURE__ */ T(D, {
|
|
1253
1250
|
variant: _(e.severity),
|
|
1254
|
-
children:
|
|
1251
|
+
children: B(e.severity)
|
|
1255
1252
|
}),
|
|
1256
|
-
/* @__PURE__ */
|
|
1253
|
+
/* @__PURE__ */ T(D, {
|
|
1257
1254
|
variant: "outline",
|
|
1258
|
-
children:
|
|
1255
|
+
children: B(e.type)
|
|
1259
1256
|
}),
|
|
1260
|
-
/* @__PURE__ */
|
|
1257
|
+
/* @__PURE__ */ T(D, {
|
|
1261
1258
|
variant: _(e.status),
|
|
1262
|
-
children:
|
|
1259
|
+
children: B(e.status)
|
|
1263
1260
|
})
|
|
1264
1261
|
]
|
|
1265
|
-
}), e.detail ? /* @__PURE__ */
|
|
1262
|
+
}), e.detail ? /* @__PURE__ */ T("p", {
|
|
1266
1263
|
className: "mt-1 text-xs text-text-secondary",
|
|
1267
1264
|
children: e.detail
|
|
1268
1265
|
}) : null]
|
|
1269
1266
|
}, e.id))
|
|
1270
1267
|
})]
|
|
1271
1268
|
}) : null,
|
|
1272
|
-
/* @__PURE__ */
|
|
1269
|
+
/* @__PURE__ */ T("div", {
|
|
1273
1270
|
className: "border-t border-border-subtle pt-4",
|
|
1274
|
-
children: /* @__PURE__ */
|
|
1271
|
+
children: /* @__PURE__ */ T(v, {
|
|
1275
1272
|
entityType: "brainyrich-rebalance",
|
|
1276
1273
|
entityId: e.id,
|
|
1277
1274
|
heading: "Discussion"
|
|
@@ -1282,56 +1279,50 @@ function dt({ proposal: e, portfolio: t, relatedInsights: n, nextStatuses: r, tr
|
|
|
1282
1279
|
});
|
|
1283
1280
|
}
|
|
1284
1281
|
function ft({ signal: e }) {
|
|
1285
|
-
let t =
|
|
1286
|
-
return /* @__PURE__ */
|
|
1282
|
+
let t = ge(e.metrics);
|
|
1283
|
+
return /* @__PURE__ */ E("li", {
|
|
1287
1284
|
className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
|
|
1288
1285
|
children: [
|
|
1289
|
-
/* @__PURE__ */
|
|
1286
|
+
/* @__PURE__ */ E("div", {
|
|
1290
1287
|
className: "flex flex-wrap items-center gap-2",
|
|
1291
1288
|
children: [
|
|
1292
|
-
/* @__PURE__ */
|
|
1289
|
+
/* @__PURE__ */ T("p", {
|
|
1293
1290
|
className: "font-medium text-text-primary",
|
|
1294
1291
|
children: e.title
|
|
1295
1292
|
}),
|
|
1296
|
-
/* @__PURE__ */
|
|
1293
|
+
/* @__PURE__ */ T(D, {
|
|
1297
1294
|
variant: _(e.severity),
|
|
1298
|
-
children:
|
|
1295
|
+
children: B(e.severity)
|
|
1299
1296
|
}),
|
|
1300
|
-
/* @__PURE__ */
|
|
1297
|
+
/* @__PURE__ */ T(D, {
|
|
1301
1298
|
variant: "outline",
|
|
1302
|
-
children:
|
|
1299
|
+
children: B(e.kind)
|
|
1303
1300
|
})
|
|
1304
1301
|
]
|
|
1305
1302
|
}),
|
|
1306
|
-
e.detail ? /* @__PURE__ */
|
|
1303
|
+
e.detail ? /* @__PURE__ */ T("p", {
|
|
1307
1304
|
className: "mt-1 text-sm text-text-secondary",
|
|
1308
1305
|
children: e.detail
|
|
1309
1306
|
}) : null,
|
|
1310
|
-
t
|
|
1311
|
-
className: "mt-3
|
|
1312
|
-
children: t.
|
|
1313
|
-
className: "
|
|
1314
|
-
children:
|
|
1315
|
-
|
|
1316
|
-
children: z(e)
|
|
1317
|
-
}), /* @__PURE__ */ w("dd", {
|
|
1318
|
-
className: "truncate text-sm font-medium tabular-nums text-text-primary",
|
|
1319
|
-
children: ot(t)
|
|
1320
|
-
})]
|
|
1321
|
-
}, e))
|
|
1307
|
+
t ? /* @__PURE__ */ E("div", {
|
|
1308
|
+
className: "mt-3 space-y-2",
|
|
1309
|
+
children: [t.formula ? /* @__PURE__ */ T("p", {
|
|
1310
|
+
className: "break-words text-xs text-text-secondary",
|
|
1311
|
+
children: t.formula
|
|
1312
|
+
}) : null, /* @__PURE__ */ T(me, { entries: t.entries })]
|
|
1322
1313
|
}) : null
|
|
1323
1314
|
]
|
|
1324
1315
|
});
|
|
1325
1316
|
}
|
|
1326
1317
|
function pt({ opportunity: e }) {
|
|
1327
|
-
let t =
|
|
1328
|
-
return /* @__PURE__ */
|
|
1318
|
+
let t = ge(e.metrics);
|
|
1319
|
+
return /* @__PURE__ */ E("li", {
|
|
1329
1320
|
className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
|
|
1330
1321
|
children: [
|
|
1331
|
-
/* @__PURE__ */
|
|
1322
|
+
/* @__PURE__ */ E("div", {
|
|
1332
1323
|
className: "flex flex-wrap items-center gap-2",
|
|
1333
1324
|
children: [
|
|
1334
|
-
/* @__PURE__ */
|
|
1325
|
+
/* @__PURE__ */ E("p", {
|
|
1335
1326
|
className: "font-medium text-text-primary",
|
|
1336
1327
|
children: [
|
|
1337
1328
|
e.symbol,
|
|
@@ -1339,21 +1330,21 @@ function pt({ opportunity: e }) {
|
|
|
1339
1330
|
h(e.unrealizedLoss)
|
|
1340
1331
|
]
|
|
1341
1332
|
}),
|
|
1342
|
-
/* @__PURE__ */
|
|
1333
|
+
/* @__PURE__ */ T(D, {
|
|
1343
1334
|
variant: _(e.severity),
|
|
1344
|
-
children:
|
|
1335
|
+
children: B(e.severity)
|
|
1345
1336
|
}),
|
|
1346
|
-
e.washSaleRisk ? /* @__PURE__ */
|
|
1337
|
+
e.washSaleRisk ? /* @__PURE__ */ E(D, {
|
|
1347
1338
|
variant: "outline",
|
|
1348
1339
|
className: "text-status-error-text",
|
|
1349
|
-
children: [/* @__PURE__ */
|
|
1340
|
+
children: [/* @__PURE__ */ T(ve, {
|
|
1350
1341
|
className: "mr-1 size-3",
|
|
1351
1342
|
"aria-hidden": "true"
|
|
1352
1343
|
}), "Wash-sale caution"]
|
|
1353
1344
|
}) : null
|
|
1354
1345
|
]
|
|
1355
1346
|
}),
|
|
1356
|
-
/* @__PURE__ */
|
|
1347
|
+
/* @__PURE__ */ E("p", {
|
|
1357
1348
|
className: "mt-1 text-sm text-text-secondary",
|
|
1358
1349
|
children: [
|
|
1359
1350
|
"Market value ",
|
|
@@ -1366,99 +1357,93 @@ function pt({ opportunity: e }) {
|
|
|
1366
1357
|
" of portfolio value"
|
|
1367
1358
|
]
|
|
1368
1359
|
}),
|
|
1369
|
-
e.washSaleReason ? /* @__PURE__ */
|
|
1360
|
+
e.washSaleReason ? /* @__PURE__ */ T("p", {
|
|
1370
1361
|
className: "mt-1 text-xs text-status-error-text",
|
|
1371
1362
|
children: e.washSaleReason
|
|
1372
1363
|
}) : null,
|
|
1373
|
-
t
|
|
1374
|
-
className: "mt-3
|
|
1375
|
-
children: t.
|
|
1376
|
-
className: "
|
|
1377
|
-
children:
|
|
1378
|
-
|
|
1379
|
-
children: z(e)
|
|
1380
|
-
}), /* @__PURE__ */ w("dd", {
|
|
1381
|
-
className: "truncate text-sm font-medium tabular-nums text-text-primary",
|
|
1382
|
-
children: ot(t)
|
|
1383
|
-
})]
|
|
1384
|
-
}, e))
|
|
1364
|
+
t ? /* @__PURE__ */ E("div", {
|
|
1365
|
+
className: "mt-3 space-y-2",
|
|
1366
|
+
children: [t.formula ? /* @__PURE__ */ T("p", {
|
|
1367
|
+
className: "break-words text-xs text-text-secondary",
|
|
1368
|
+
children: t.formula
|
|
1369
|
+
}) : null, /* @__PURE__ */ T(me, { entries: t.entries })]
|
|
1385
1370
|
}) : null
|
|
1386
1371
|
]
|
|
1387
1372
|
});
|
|
1388
1373
|
}
|
|
1389
1374
|
function mt({ insight: e, onAcknowledge: t, onResolve: n, onDismiss: r, actionPending: i }) {
|
|
1390
1375
|
let a = e.status === "RESOLVED" || e.status === "DISMISSED";
|
|
1391
|
-
return /* @__PURE__ */
|
|
1376
|
+
return /* @__PURE__ */ E("div", {
|
|
1392
1377
|
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))]",
|
|
1393
|
-
children: [/* @__PURE__ */
|
|
1378
|
+
children: [/* @__PURE__ */ E("div", {
|
|
1394
1379
|
className: "min-w-0 space-y-1",
|
|
1395
1380
|
children: [
|
|
1396
|
-
/* @__PURE__ */
|
|
1381
|
+
/* @__PURE__ */ E("div", {
|
|
1397
1382
|
className: "flex flex-wrap items-center gap-2",
|
|
1398
1383
|
children: [
|
|
1399
|
-
/* @__PURE__ */
|
|
1384
|
+
/* @__PURE__ */ T("p", {
|
|
1400
1385
|
className: "font-medium text-text-primary",
|
|
1401
1386
|
children: e.title
|
|
1402
1387
|
}),
|
|
1403
|
-
/* @__PURE__ */
|
|
1388
|
+
/* @__PURE__ */ T(D, {
|
|
1404
1389
|
variant: _(e.severity),
|
|
1405
|
-
children:
|
|
1390
|
+
children: B(e.severity)
|
|
1406
1391
|
}),
|
|
1407
|
-
/* @__PURE__ */
|
|
1392
|
+
/* @__PURE__ */ T(D, {
|
|
1408
1393
|
variant: "outline",
|
|
1409
|
-
children:
|
|
1394
|
+
children: B(e.type)
|
|
1410
1395
|
}),
|
|
1411
|
-
/* @__PURE__ */
|
|
1396
|
+
/* @__PURE__ */ T(D, {
|
|
1412
1397
|
variant: _(e.status),
|
|
1413
|
-
children:
|
|
1398
|
+
children: B(e.status)
|
|
1414
1399
|
})
|
|
1415
1400
|
]
|
|
1416
1401
|
}),
|
|
1417
|
-
e.detail ? /* @__PURE__ */
|
|
1402
|
+
e.detail ? /* @__PURE__ */ T("p", {
|
|
1418
1403
|
className: "text-sm text-text-secondary",
|
|
1419
1404
|
children: e.detail
|
|
1420
1405
|
}) : null,
|
|
1421
|
-
/* @__PURE__ */
|
|
1406
|
+
/* @__PURE__ */ E("p", {
|
|
1422
1407
|
className: "text-xs text-text-muted",
|
|
1423
1408
|
children: ["Detected ", m(e.createdAt)]
|
|
1424
1409
|
})
|
|
1425
1410
|
]
|
|
1426
|
-
}), a ? /* @__PURE__ */
|
|
1411
|
+
}), a ? /* @__PURE__ */ T("span", {
|
|
1427
1412
|
className: "mt-1 text-xs text-text-muted",
|
|
1428
1413
|
children: "Closed"
|
|
1429
|
-
}) : /* @__PURE__ */
|
|
1414
|
+
}) : /* @__PURE__ */ E(Be, { children: [/* @__PURE__ */ T(We, {
|
|
1430
1415
|
asChild: !0,
|
|
1431
|
-
children: /* @__PURE__ */
|
|
1416
|
+
children: /* @__PURE__ */ T(O, {
|
|
1432
1417
|
variant: "ghost",
|
|
1433
1418
|
size: "sm",
|
|
1434
1419
|
"aria-label": `Actions for ${e.title}`,
|
|
1435
1420
|
disabled: i,
|
|
1436
|
-
children: /* @__PURE__ */
|
|
1421
|
+
children: /* @__PURE__ */ T(we, {
|
|
1437
1422
|
className: "size-4",
|
|
1438
1423
|
"aria-hidden": "true"
|
|
1439
1424
|
})
|
|
1440
1425
|
})
|
|
1441
|
-
}), /* @__PURE__ */
|
|
1426
|
+
}), /* @__PURE__ */ E(Ve, {
|
|
1442
1427
|
align: "end",
|
|
1443
1428
|
children: [
|
|
1444
|
-
e.status === "OPEN" ? /* @__PURE__ */
|
|
1429
|
+
e.status === "OPEN" ? /* @__PURE__ */ E(P, {
|
|
1445
1430
|
onClick: t,
|
|
1446
|
-
children: [/* @__PURE__ */
|
|
1431
|
+
children: [/* @__PURE__ */ T(be, {
|
|
1447
1432
|
className: "size-4",
|
|
1448
1433
|
"aria-hidden": "true"
|
|
1449
1434
|
}), "Acknowledge"]
|
|
1450
1435
|
}) : null,
|
|
1451
|
-
/* @__PURE__ */
|
|
1436
|
+
/* @__PURE__ */ E(P, {
|
|
1452
1437
|
onClick: n,
|
|
1453
|
-
children: [/* @__PURE__ */
|
|
1438
|
+
children: [/* @__PURE__ */ T(C, {
|
|
1454
1439
|
className: "size-4",
|
|
1455
1440
|
"aria-hidden": "true"
|
|
1456
1441
|
}), "Resolve"]
|
|
1457
1442
|
}),
|
|
1458
|
-
/* @__PURE__ */
|
|
1443
|
+
/* @__PURE__ */ E(P, {
|
|
1459
1444
|
className: "text-status-error-text",
|
|
1460
1445
|
onClick: r,
|
|
1461
|
-
children: [/* @__PURE__ */ w
|
|
1446
|
+
children: [/* @__PURE__ */ T(w, {
|
|
1462
1447
|
className: "size-4",
|
|
1463
1448
|
"aria-hidden": "true"
|
|
1464
1449
|
}), "Dismiss"]
|
|
@@ -1468,6 +1453,6 @@ function mt({ insight: e, onAcknowledge: t, onResolve: n, onDismiss: r, actionPe
|
|
|
1468
1453
|
});
|
|
1469
1454
|
}
|
|
1470
1455
|
//#endregion
|
|
1471
|
-
export {
|
|
1456
|
+
export { H as RiskPage };
|
|
1472
1457
|
|
|
1473
1458
|
//# sourceMappingURL=RiskPage.js.map
|