@burdenoff/microfe-brainyrich 2026.509.101
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/README.md +12 -0
- package/dist/brainyrich/BrainyRichRoot.d.ts +5 -0
- package/dist/brainyrich/BrainyRichRoot.d.ts.map +1 -0
- package/dist/brainyrich/BrainyRichRoot.js +161 -0
- package/dist/brainyrich/BrainyRichRoot.js.map +1 -0
- package/dist/brainyrich/BrainyRichRoutes.d.ts +2 -0
- package/dist/brainyrich/BrainyRichRoutes.d.ts.map +1 -0
- package/dist/brainyrich/BrainyRichRoutes.js +95 -0
- package/dist/brainyrich/BrainyRichRoutes.js.map +1 -0
- package/dist/brainyrich/index.d.ts +5 -0
- package/dist/brainyrich/index.d.ts.map +1 -0
- package/dist/brainyrich/index.js +3 -0
- package/dist/brainyrich/pages/AccountsPage.d.ts +2 -0
- package/dist/brainyrich/pages/AccountsPage.d.ts.map +1 -0
- package/dist/brainyrich/pages/AccountsPage.js +184 -0
- package/dist/brainyrich/pages/AccountsPage.js.map +1 -0
- package/dist/brainyrich/pages/AdvisorsPage.d.ts +2 -0
- package/dist/brainyrich/pages/AdvisorsPage.d.ts.map +1 -0
- package/dist/brainyrich/pages/AdvisorsPage.js +375 -0
- package/dist/brainyrich/pages/AdvisorsPage.js.map +1 -0
- package/dist/brainyrich/pages/AiAssistantPage.d.ts +2 -0
- package/dist/brainyrich/pages/AiAssistantPage.d.ts.map +1 -0
- package/dist/brainyrich/pages/AiAssistantPage.js +389 -0
- package/dist/brainyrich/pages/AiAssistantPage.js.map +1 -0
- package/dist/brainyrich/pages/AnalyticsPage.d.ts +2 -0
- package/dist/brainyrich/pages/AnalyticsPage.d.ts.map +1 -0
- package/dist/brainyrich/pages/AnalyticsPage.js +316 -0
- package/dist/brainyrich/pages/AnalyticsPage.js.map +1 -0
- package/dist/brainyrich/pages/AssistantPage.d.ts +2 -0
- package/dist/brainyrich/pages/AssistantPage.d.ts.map +1 -0
- package/dist/brainyrich/pages/AssistantPage.js +332 -0
- package/dist/brainyrich/pages/AssistantPage.js.map +1 -0
- package/dist/brainyrich/pages/DashboardPage.d.ts +2 -0
- package/dist/brainyrich/pages/DashboardPage.d.ts.map +1 -0
- package/dist/brainyrich/pages/DashboardPage.js +258 -0
- package/dist/brainyrich/pages/DashboardPage.js.map +1 -0
- package/dist/brainyrich/pages/EstatePage.d.ts +2 -0
- package/dist/brainyrich/pages/EstatePage.d.ts.map +1 -0
- package/dist/brainyrich/pages/EstatePage.js +269 -0
- package/dist/brainyrich/pages/EstatePage.js.map +1 -0
- package/dist/brainyrich/pages/FamilyPage.d.ts +2 -0
- package/dist/brainyrich/pages/FamilyPage.d.ts.map +1 -0
- package/dist/brainyrich/pages/FamilyPage.js +358 -0
- package/dist/brainyrich/pages/FamilyPage.js.map +1 -0
- package/dist/brainyrich/pages/GoalsPage.d.ts +2 -0
- package/dist/brainyrich/pages/GoalsPage.d.ts.map +1 -0
- package/dist/brainyrich/pages/GoalsPage.js +160 -0
- package/dist/brainyrich/pages/GoalsPage.js.map +1 -0
- package/dist/brainyrich/pages/InsurancePage.d.ts +2 -0
- package/dist/brainyrich/pages/InsurancePage.d.ts.map +1 -0
- package/dist/brainyrich/pages/InsurancePage.js +181 -0
- package/dist/brainyrich/pages/InsurancePage.js.map +1 -0
- package/dist/brainyrich/pages/InvestmentsPage.d.ts +2 -0
- package/dist/brainyrich/pages/InvestmentsPage.d.ts.map +1 -0
- package/dist/brainyrich/pages/InvestmentsPage.js +330 -0
- package/dist/brainyrich/pages/InvestmentsPage.js.map +1 -0
- package/dist/brainyrich/pages/MarketplacePage.d.ts +2 -0
- package/dist/brainyrich/pages/MarketplacePage.d.ts.map +1 -0
- package/dist/brainyrich/pages/MarketplacePage.js +450 -0
- package/dist/brainyrich/pages/MarketplacePage.js.map +1 -0
- package/dist/brainyrich/pages/PortfoliosPage.d.ts +2 -0
- package/dist/brainyrich/pages/PortfoliosPage.d.ts.map +1 -0
- package/dist/brainyrich/pages/PortfoliosPage.js +175 -0
- package/dist/brainyrich/pages/PortfoliosPage.js.map +1 -0
- package/dist/brainyrich/pages/ReportsPage.d.ts +2 -0
- package/dist/brainyrich/pages/ReportsPage.d.ts.map +1 -0
- package/dist/brainyrich/pages/ReportsPage.js +261 -0
- package/dist/brainyrich/pages/ReportsPage.js.map +1 -0
- package/dist/brainyrich/pages/RiskPage.d.ts +2 -0
- package/dist/brainyrich/pages/RiskPage.d.ts.map +1 -0
- package/dist/brainyrich/pages/RiskPage.js +222 -0
- package/dist/brainyrich/pages/RiskPage.js.map +1 -0
- package/dist/brainyrich/pages/TaxPage.d.ts +2 -0
- package/dist/brainyrich/pages/TaxPage.d.ts.map +1 -0
- package/dist/brainyrich/pages/TaxPage.js +246 -0
- package/dist/brainyrich/pages/TaxPage.js.map +1 -0
- package/dist/brainyrich/pages/_shared.d.ts +21 -0
- package/dist/brainyrich/pages/_shared.d.ts.map +1 -0
- package/dist/brainyrich/pages/_shared.js +63 -0
- package/dist/brainyrich/pages/_shared.js.map +1 -0
- package/dist/brainyrich/providers/BrainyRichProvider.d.ts +6 -0
- package/dist/brainyrich/providers/BrainyRichProvider.d.ts.map +1 -0
- package/dist/brainyrich/providers/BrainyRichProvider.js +27 -0
- package/dist/brainyrich/providers/BrainyRichProvider.js.map +1 -0
- package/dist/brainyrich/store/brainyrichStore.d.ts +19 -0
- package/dist/brainyrich/store/brainyrichStore.d.ts.map +1 -0
- package/dist/brainyrich/store/brainyrichStore.js +272 -0
- package/dist/brainyrich/store/brainyrichStore.js.map +1 -0
- package/dist/brainyrich/types/index.d.ts +116 -0
- package/dist/brainyrich/types/index.d.ts.map +1 -0
- package/dist/brainyrich/utils/cn.d.ts +4 -0
- package/dist/brainyrich/utils/cn.d.ts.map +1 -0
- package/dist/brainyrich/utils/i18n.d.ts +6 -0
- package/dist/brainyrich/utils/i18n.d.ts.map +1 -0
- package/dist/brainyrich/utils/i18n.js +15 -0
- package/dist/brainyrich/utils/i18n.js.map +1 -0
- package/dist/brainyrich/utils/navigation.d.ts +2 -0
- package/dist/brainyrich/utils/navigation.d.ts.map +1 -0
- package/dist/brainyrich/utils/navigation.js +8 -0
- package/dist/brainyrich/utils/navigation.js.map +1 -0
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/generated/global-operations.d.ts +2 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-types.d.ts +18199 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-types.d.ts +43046 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/package.json +107 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { useBrainyRichStore as e } from "../store/brainyrichStore.js";
|
|
2
|
+
import { KpiGrid as t, SectionShell as n, formatMoney as r } from "./_shared.js";
|
|
3
|
+
import { BarChart3 as i, Download as a } from "lucide-react";
|
|
4
|
+
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
5
|
+
import { Button as c, Card as l, CardContent as u, CardDescription as d, CardHeader as f, CardTitle as p, Tabs as m, TabsContent as h, TabsList as g, TabsTrigger as _ } from "@burdenoff/fe-libs/ui";
|
|
6
|
+
//#region src/brainyrich/pages/AnalyticsPage.tsx
|
|
7
|
+
var v = [
|
|
8
|
+
{
|
|
9
|
+
month: "Jan",
|
|
10
|
+
portfolio: 91e4,
|
|
11
|
+
benchmark: 895e3
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
month: "Feb",
|
|
15
|
+
portfolio: 928e3,
|
|
16
|
+
benchmark: 91e4
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
month: "Mar",
|
|
20
|
+
portfolio: 922e3,
|
|
21
|
+
benchmark: 905e3
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
month: "Apr",
|
|
25
|
+
portfolio: 945e3,
|
|
26
|
+
benchmark: 92e4
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
month: "May",
|
|
30
|
+
portfolio: 948e3,
|
|
31
|
+
benchmark: 925e3
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
month: "Jun",
|
|
35
|
+
portfolio: 97e4,
|
|
36
|
+
benchmark: 94e4
|
|
37
|
+
}
|
|
38
|
+
], y = [
|
|
39
|
+
{
|
|
40
|
+
month: "Jan",
|
|
41
|
+
income: 185e3,
|
|
42
|
+
expenses: 92e3,
|
|
43
|
+
savings: 93e3
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
month: "Feb",
|
|
47
|
+
income: 185e3,
|
|
48
|
+
expenses: 98e3,
|
|
49
|
+
savings: 87e3
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
month: "Mar",
|
|
53
|
+
income: 195e3,
|
|
54
|
+
expenses: 88e3,
|
|
55
|
+
savings: 107e3
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
month: "Apr",
|
|
59
|
+
income: 185e3,
|
|
60
|
+
expenses: 95e3,
|
|
61
|
+
savings: 9e4
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
month: "May",
|
|
65
|
+
income: 185e3,
|
|
66
|
+
expenses: 91e3,
|
|
67
|
+
savings: 94e3
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
month: "Jun",
|
|
71
|
+
income: 2e5,
|
|
72
|
+
expenses: 99e3,
|
|
73
|
+
savings: 101e3
|
|
74
|
+
}
|
|
75
|
+
], b = Math.max(...v.map((e) => e.portfolio)), x = Math.max(...y.map((e) => e.income));
|
|
76
|
+
function S() {
|
|
77
|
+
let { portfolios: S, holdings: C } = e(), w = S.reduce((e, t) => e + t.value, 0);
|
|
78
|
+
return /* @__PURE__ */ s(n, {
|
|
79
|
+
title: "Wealth Analytics",
|
|
80
|
+
description: "Comprehensive insights into your wealth performance and financial flows",
|
|
81
|
+
actionLabel: "Export PDF",
|
|
82
|
+
badges: ["Live Analytics"],
|
|
83
|
+
children: [/* @__PURE__ */ o(t, { items: [
|
|
84
|
+
{
|
|
85
|
+
label: "Total Returns",
|
|
86
|
+
value: "+12.4%",
|
|
87
|
+
trend: "+2.3% vs last month"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
label: "Portfolio Value",
|
|
91
|
+
value: r(w),
|
|
92
|
+
trend: "+$85K YTD"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
label: "Monthly Savings",
|
|
96
|
+
value: r(94e3),
|
|
97
|
+
trend: "51% savings rate"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
label: "Goals Progress",
|
|
101
|
+
value: "68%",
|
|
102
|
+
trend: "+7.4% this quarter"
|
|
103
|
+
}
|
|
104
|
+
] }), /* @__PURE__ */ s(m, {
|
|
105
|
+
defaultValue: "performance",
|
|
106
|
+
className: "space-y-4",
|
|
107
|
+
children: [
|
|
108
|
+
/* @__PURE__ */ s(g, {
|
|
109
|
+
className: "grid w-full grid-cols-3",
|
|
110
|
+
children: [
|
|
111
|
+
/* @__PURE__ */ o(_, {
|
|
112
|
+
value: "performance",
|
|
113
|
+
children: "Performance"
|
|
114
|
+
}),
|
|
115
|
+
/* @__PURE__ */ o(_, {
|
|
116
|
+
value: "allocation",
|
|
117
|
+
children: "Allocation"
|
|
118
|
+
}),
|
|
119
|
+
/* @__PURE__ */ o(_, {
|
|
120
|
+
value: "cashflow",
|
|
121
|
+
children: "Cash Flow"
|
|
122
|
+
})
|
|
123
|
+
]
|
|
124
|
+
}),
|
|
125
|
+
/* @__PURE__ */ s(h, {
|
|
126
|
+
value: "performance",
|
|
127
|
+
className: "space-y-4",
|
|
128
|
+
children: [/* @__PURE__ */ s(l, { children: [/* @__PURE__ */ s(f, {
|
|
129
|
+
className: "flex flex-row items-center justify-between",
|
|
130
|
+
children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o(p, { children: "Portfolio vs Benchmark" }), /* @__PURE__ */ o(d, { children: "6-month performance comparison (CSS bar chart)" })] }), /* @__PURE__ */ s(c, {
|
|
131
|
+
variant: "outline",
|
|
132
|
+
size: "sm",
|
|
133
|
+
children: [/* @__PURE__ */ o(a, { className: "mr-1 h-4 w-4" }), "Export"]
|
|
134
|
+
})]
|
|
135
|
+
}), /* @__PURE__ */ s(u, {
|
|
136
|
+
className: "space-y-3",
|
|
137
|
+
children: [v.map((e) => /* @__PURE__ */ s("div", {
|
|
138
|
+
className: "space-y-1",
|
|
139
|
+
children: [/* @__PURE__ */ s("div", {
|
|
140
|
+
className: "flex items-center justify-between text-xs text-muted-foreground",
|
|
141
|
+
children: [/* @__PURE__ */ o("span", {
|
|
142
|
+
className: "w-8 font-medium",
|
|
143
|
+
children: e.month
|
|
144
|
+
}), /* @__PURE__ */ s("span", { children: [
|
|
145
|
+
"Portfolio: ",
|
|
146
|
+
r(e.portfolio),
|
|
147
|
+
" | Benchmark: ",
|
|
148
|
+
r(e.benchmark)
|
|
149
|
+
] })]
|
|
150
|
+
}), /* @__PURE__ */ s("div", {
|
|
151
|
+
className: "relative h-5 bg-muted rounded overflow-hidden",
|
|
152
|
+
children: [/* @__PURE__ */ o("div", {
|
|
153
|
+
className: "absolute h-5 bg-blue-400/60 rounded",
|
|
154
|
+
style: { width: `${e.benchmark / b * 100}%` }
|
|
155
|
+
}), /* @__PURE__ */ o("div", {
|
|
156
|
+
className: "absolute h-5 bg-blue-600 rounded",
|
|
157
|
+
style: {
|
|
158
|
+
width: `${e.portfolio / b * 100}%`,
|
|
159
|
+
opacity: .8
|
|
160
|
+
}
|
|
161
|
+
})]
|
|
162
|
+
})]
|
|
163
|
+
}, e.month)), /* @__PURE__ */ s("div", {
|
|
164
|
+
className: "flex gap-4 text-xs pt-2",
|
|
165
|
+
children: [/* @__PURE__ */ s("span", {
|
|
166
|
+
className: "flex items-center gap-1",
|
|
167
|
+
children: [/* @__PURE__ */ o("span", { className: "h-2 w-4 bg-blue-600 rounded inline-block" }), " Portfolio"]
|
|
168
|
+
}), /* @__PURE__ */ s("span", {
|
|
169
|
+
className: "flex items-center gap-1",
|
|
170
|
+
children: [/* @__PURE__ */ o("span", { className: "h-2 w-4 bg-blue-400/60 rounded inline-block" }), " Benchmark"]
|
|
171
|
+
})]
|
|
172
|
+
})]
|
|
173
|
+
})] }), /* @__PURE__ */ s(l, { children: [/* @__PURE__ */ s(f, { children: [/* @__PURE__ */ o(p, { children: "Net Worth Trend" }), /* @__PURE__ */ o(d, { children: "Growth trajectory over the past 6 months" })] }), /* @__PURE__ */ o(u, {
|
|
174
|
+
className: "space-y-2",
|
|
175
|
+
children: v.map((e) => /* @__PURE__ */ s("div", {
|
|
176
|
+
className: "flex items-center gap-3",
|
|
177
|
+
children: [
|
|
178
|
+
/* @__PURE__ */ o("span", {
|
|
179
|
+
className: "w-8 text-xs text-muted-foreground",
|
|
180
|
+
children: e.month
|
|
181
|
+
}),
|
|
182
|
+
/* @__PURE__ */ o("div", {
|
|
183
|
+
className: "flex-1 h-4 bg-muted rounded overflow-hidden",
|
|
184
|
+
children: /* @__PURE__ */ o("div", {
|
|
185
|
+
className: "h-4 bg-emerald-500 rounded",
|
|
186
|
+
style: { width: `${e.portfolio / b * 100}%` }
|
|
187
|
+
})
|
|
188
|
+
}),
|
|
189
|
+
/* @__PURE__ */ o("span", {
|
|
190
|
+
className: "text-xs font-medium w-20 text-right",
|
|
191
|
+
children: r(e.portfolio)
|
|
192
|
+
})
|
|
193
|
+
]
|
|
194
|
+
}, e.month))
|
|
195
|
+
})] })]
|
|
196
|
+
}),
|
|
197
|
+
/* @__PURE__ */ s(h, {
|
|
198
|
+
value: "allocation",
|
|
199
|
+
className: "space-y-4",
|
|
200
|
+
children: [/* @__PURE__ */ s(l, { children: [/* @__PURE__ */ s(f, { children: [/* @__PURE__ */ o(p, { children: "Asset Allocation" }), /* @__PURE__ */ o(d, { children: "Current distribution by portfolio strategy" })] }), /* @__PURE__ */ o(u, {
|
|
201
|
+
className: "space-y-4",
|
|
202
|
+
children: S.map((e) => {
|
|
203
|
+
let t = Math.round(e.value / w * 100);
|
|
204
|
+
return /* @__PURE__ */ s("div", {
|
|
205
|
+
className: "space-y-1",
|
|
206
|
+
children: [/* @__PURE__ */ s("div", {
|
|
207
|
+
className: "flex justify-between text-sm",
|
|
208
|
+
children: [/* @__PURE__ */ o("span", {
|
|
209
|
+
className: "font-medium",
|
|
210
|
+
children: e.name
|
|
211
|
+
}), /* @__PURE__ */ s("span", { children: [
|
|
212
|
+
r(e.value),
|
|
213
|
+
" (",
|
|
214
|
+
t,
|
|
215
|
+
"%)"
|
|
216
|
+
] })]
|
|
217
|
+
}), /* @__PURE__ */ o("div", {
|
|
218
|
+
className: "h-4 rounded bg-muted overflow-hidden",
|
|
219
|
+
children: /* @__PURE__ */ o("div", {
|
|
220
|
+
className: "h-4 rounded bg-primary",
|
|
221
|
+
style: { width: `${t}%` }
|
|
222
|
+
})
|
|
223
|
+
})]
|
|
224
|
+
}, e.id);
|
|
225
|
+
})
|
|
226
|
+
})] }), /* @__PURE__ */ s(l, { children: [/* @__PURE__ */ s(f, { children: [/* @__PURE__ */ o(p, { children: "Sector Exposure" }), /* @__PURE__ */ o(d, { children: "Breakdown by sector from holdings" })] }), /* @__PURE__ */ o(u, { children: /* @__PURE__ */ o("div", {
|
|
227
|
+
className: "grid gap-3 md:grid-cols-2",
|
|
228
|
+
children: C.map((e) => /* @__PURE__ */ s("div", {
|
|
229
|
+
className: "flex items-center justify-between rounded-lg border p-3",
|
|
230
|
+
children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("p", {
|
|
231
|
+
className: "text-sm font-medium",
|
|
232
|
+
children: e.symbol
|
|
233
|
+
}), /* @__PURE__ */ o("p", {
|
|
234
|
+
className: "text-xs text-muted-foreground",
|
|
235
|
+
children: e.sector
|
|
236
|
+
})] }), /* @__PURE__ */ o("span", {
|
|
237
|
+
className: "text-sm font-semibold",
|
|
238
|
+
children: r(e.marketValue)
|
|
239
|
+
})]
|
|
240
|
+
}, e.symbol))
|
|
241
|
+
}) })] })]
|
|
242
|
+
}),
|
|
243
|
+
/* @__PURE__ */ o(h, {
|
|
244
|
+
value: "cashflow",
|
|
245
|
+
className: "space-y-4",
|
|
246
|
+
children: /* @__PURE__ */ s(l, { children: [/* @__PURE__ */ s(f, { children: [/* @__PURE__ */ s(p, {
|
|
247
|
+
className: "flex items-center gap-2",
|
|
248
|
+
children: [/* @__PURE__ */ o(i, { className: "h-5 w-5" }), "Income vs Expenses"]
|
|
249
|
+
}), /* @__PURE__ */ o(d, { children: "Monthly financial flow analysis" })] }), /* @__PURE__ */ s(u, {
|
|
250
|
+
className: "space-y-4",
|
|
251
|
+
children: [y.map((e) => /* @__PURE__ */ s("div", {
|
|
252
|
+
className: "space-y-1",
|
|
253
|
+
children: [/* @__PURE__ */ s("div", {
|
|
254
|
+
className: "flex items-center justify-between text-xs",
|
|
255
|
+
children: [
|
|
256
|
+
/* @__PURE__ */ o("span", {
|
|
257
|
+
className: "font-medium w-8",
|
|
258
|
+
children: e.month
|
|
259
|
+
}),
|
|
260
|
+
/* @__PURE__ */ s("span", {
|
|
261
|
+
className: "text-emerald-600",
|
|
262
|
+
children: ["Income: ", r(e.income)]
|
|
263
|
+
}),
|
|
264
|
+
/* @__PURE__ */ s("span", {
|
|
265
|
+
className: "text-red-500",
|
|
266
|
+
children: ["Expenses: ", r(e.expenses)]
|
|
267
|
+
}),
|
|
268
|
+
/* @__PURE__ */ s("span", {
|
|
269
|
+
className: "text-blue-600",
|
|
270
|
+
children: ["Saved: ", r(e.savings)]
|
|
271
|
+
})
|
|
272
|
+
]
|
|
273
|
+
}), /* @__PURE__ */ s("div", {
|
|
274
|
+
className: "flex gap-1",
|
|
275
|
+
children: [
|
|
276
|
+
/* @__PURE__ */ o("div", {
|
|
277
|
+
className: "h-3 rounded bg-emerald-500",
|
|
278
|
+
style: { width: `${e.income / x * 50}%` }
|
|
279
|
+
}),
|
|
280
|
+
/* @__PURE__ */ o("div", {
|
|
281
|
+
className: "h-3 rounded bg-red-400",
|
|
282
|
+
style: { width: `${e.expenses / x * 50}%` }
|
|
283
|
+
}),
|
|
284
|
+
/* @__PURE__ */ o("div", {
|
|
285
|
+
className: "h-3 rounded bg-blue-500",
|
|
286
|
+
style: { width: `${e.savings / x * 50}%` }
|
|
287
|
+
})
|
|
288
|
+
]
|
|
289
|
+
})]
|
|
290
|
+
}, e.month)), /* @__PURE__ */ s("div", {
|
|
291
|
+
className: "flex gap-4 text-xs pt-2",
|
|
292
|
+
children: [
|
|
293
|
+
/* @__PURE__ */ s("span", {
|
|
294
|
+
className: "flex items-center gap-1",
|
|
295
|
+
children: [/* @__PURE__ */ o("span", { className: "h-2 w-4 bg-emerald-500 rounded inline-block" }), " Income"]
|
|
296
|
+
}),
|
|
297
|
+
/* @__PURE__ */ s("span", {
|
|
298
|
+
className: "flex items-center gap-1",
|
|
299
|
+
children: [/* @__PURE__ */ o("span", { className: "h-2 w-4 bg-red-400 rounded inline-block" }), " Expenses"]
|
|
300
|
+
}),
|
|
301
|
+
/* @__PURE__ */ s("span", {
|
|
302
|
+
className: "flex items-center gap-1",
|
|
303
|
+
children: [/* @__PURE__ */ o("span", { className: "h-2 w-4 bg-blue-500 rounded inline-block" }), " Savings"]
|
|
304
|
+
})
|
|
305
|
+
]
|
|
306
|
+
})]
|
|
307
|
+
})] })
|
|
308
|
+
})
|
|
309
|
+
]
|
|
310
|
+
})]
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
//#endregion
|
|
314
|
+
export { S as AnalyticsPage };
|
|
315
|
+
|
|
316
|
+
//# sourceMappingURL=AnalyticsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnalyticsPage.js","names":[],"sources":["../../../src/brainyrich/pages/AnalyticsPage.tsx"],"sourcesContent":["import {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Button,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { TrendingUp, TrendingDown, DollarSign, Target, Download, BarChart3 } from 'lucide-react';\nimport { useBrainyRichStore } from '../store/brainyrichStore';\nimport { SectionShell, KpiGrid, formatMoney } from './_shared';\n\nconst performanceData = [\n { month: 'Jan', portfolio: 910000, benchmark: 895000 },\n { month: 'Feb', portfolio: 928000, benchmark: 910000 },\n { month: 'Mar', portfolio: 922000, benchmark: 905000 },\n { month: 'Apr', portfolio: 945000, benchmark: 920000 },\n { month: 'May', portfolio: 948000, benchmark: 925000 },\n { month: 'Jun', portfolio: 970000, benchmark: 940000 },\n];\n\nconst incomeExpenseData = [\n { month: 'Jan', income: 185000, expenses: 92000, savings: 93000 },\n { month: 'Feb', income: 185000, expenses: 98000, savings: 87000 },\n { month: 'Mar', income: 195000, expenses: 88000, savings: 107000 },\n { month: 'Apr', income: 185000, expenses: 95000, savings: 90000 },\n { month: 'May', income: 185000, expenses: 91000, savings: 94000 },\n { month: 'Jun', income: 200000, expenses: 99000, savings: 101000 },\n];\n\nconst maxPortfolio = Math.max(...performanceData.map((d) => d.portfolio));\nconst maxIncome = Math.max(...incomeExpenseData.map((d) => d.income));\n\nexport function AnalyticsPage() {\n const { portfolios, holdings } = useBrainyRichStore();\n const totalValue = portfolios.reduce((s, p) => s + p.value, 0);\n\n return (\n <SectionShell\n title=\"Wealth Analytics\"\n description=\"Comprehensive insights into your wealth performance and financial flows\"\n actionLabel=\"Export PDF\"\n badges={['Live Analytics']}\n >\n <KpiGrid\n items={[\n { label: 'Total Returns', value: '+12.4%', trend: '+2.3% vs last month' },\n { label: 'Portfolio Value', value: formatMoney(totalValue), trend: '+$85K YTD' },\n { label: 'Monthly Savings', value: formatMoney(94000), trend: '51% savings rate' },\n { label: 'Goals Progress', value: '68%', trend: '+7.4% this quarter' },\n ]}\n />\n\n <Tabs defaultValue=\"performance\" className=\"space-y-4\">\n <TabsList className=\"grid w-full grid-cols-3\">\n <TabsTrigger value=\"performance\">Performance</TabsTrigger>\n <TabsTrigger value=\"allocation\">Allocation</TabsTrigger>\n <TabsTrigger value=\"cashflow\">Cash Flow</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"performance\" className=\"space-y-4\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <div>\n <CardTitle>Portfolio vs Benchmark</CardTitle>\n <CardDescription>6-month performance comparison (CSS bar chart)</CardDescription>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n <Download className=\"mr-1 h-4 w-4\" />\n Export\n </Button>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {performanceData.map((d) => (\n <div key={d.month} className=\"space-y-1\">\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span className=\"w-8 font-medium\">{d.month}</span>\n <span>\n Portfolio: {formatMoney(d.portfolio)} | Benchmark: {formatMoney(d.benchmark)}\n </span>\n </div>\n <div className=\"relative h-5 bg-muted rounded overflow-hidden\">\n <div\n className=\"absolute h-5 bg-blue-400/60 rounded\"\n style={{ width: `${(d.benchmark / maxPortfolio) * 100}%` }}\n />\n <div\n className=\"absolute h-5 bg-blue-600 rounded\"\n style={{ width: `${(d.portfolio / maxPortfolio) * 100}%`, opacity: 0.8 }}\n />\n </div>\n </div>\n ))}\n <div className=\"flex gap-4 text-xs pt-2\">\n <span className=\"flex items-center gap-1\">\n <span className=\"h-2 w-4 bg-blue-600 rounded inline-block\" /> Portfolio\n </span>\n <span className=\"flex items-center gap-1\">\n <span className=\"h-2 w-4 bg-blue-400/60 rounded inline-block\" /> Benchmark\n </span>\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Net Worth Trend</CardTitle>\n <CardDescription>Growth trajectory over the past 6 months</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {performanceData.map((d) => (\n <div key={d.month} className=\"flex items-center gap-3\">\n <span className=\"w-8 text-xs text-muted-foreground\">{d.month}</span>\n <div className=\"flex-1 h-4 bg-muted rounded overflow-hidden\">\n <div\n className=\"h-4 bg-emerald-500 rounded\"\n style={{ width: `${(d.portfolio / maxPortfolio) * 100}%` }}\n />\n </div>\n <span className=\"text-xs font-medium w-20 text-right\">\n {formatMoney(d.portfolio)}\n </span>\n </div>\n ))}\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"allocation\" className=\"space-y-4\">\n <Card>\n <CardHeader>\n <CardTitle>Asset Allocation</CardTitle>\n <CardDescription>Current distribution by portfolio strategy</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {portfolios.map((p) => {\n const pct = Math.round((p.value / totalValue) * 100);\n return (\n <div key={p.id} className=\"space-y-1\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"font-medium\">{p.name}</span>\n <span>\n {formatMoney(p.value)} ({pct}%)\n </span>\n </div>\n <div className=\"h-4 rounded bg-muted overflow-hidden\">\n <div className=\"h-4 rounded bg-primary\" style={{ width: `${pct}%` }} />\n </div>\n </div>\n );\n })}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Sector Exposure</CardTitle>\n <CardDescription>Breakdown by sector from holdings</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid gap-3 md:grid-cols-2\">\n {holdings.map((h) => (\n <div\n key={h.symbol}\n className=\"flex items-center justify-between rounded-lg border p-3\"\n >\n <div>\n <p className=\"text-sm font-medium\">{h.symbol}</p>\n <p className=\"text-xs text-muted-foreground\">{h.sector}</p>\n </div>\n <span className=\"text-sm font-semibold\">{formatMoney(h.marketValue)}</span>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"cashflow\" className=\"space-y-4\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <BarChart3 className=\"h-5 w-5\" />\n Income vs Expenses\n </CardTitle>\n <CardDescription>Monthly financial flow analysis</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {incomeExpenseData.map((d) => (\n <div key={d.month} className=\"space-y-1\">\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"font-medium w-8\">{d.month}</span>\n <span className=\"text-emerald-600\">Income: {formatMoney(d.income)}</span>\n <span className=\"text-red-500\">Expenses: {formatMoney(d.expenses)}</span>\n <span className=\"text-blue-600\">Saved: {formatMoney(d.savings)}</span>\n </div>\n <div className=\"flex gap-1\">\n <div\n className=\"h-3 rounded bg-emerald-500\"\n style={{ width: `${(d.income / maxIncome) * 50}%` }}\n />\n <div\n className=\"h-3 rounded bg-red-400\"\n style={{ width: `${(d.expenses / maxIncome) * 50}%` }}\n />\n <div\n className=\"h-3 rounded bg-blue-500\"\n style={{ width: `${(d.savings / maxIncome) * 50}%` }}\n />\n </div>\n </div>\n ))}\n <div className=\"flex gap-4 text-xs pt-2\">\n <span className=\"flex items-center gap-1\">\n <span className=\"h-2 w-4 bg-emerald-500 rounded inline-block\" /> Income\n </span>\n <span className=\"flex items-center gap-1\">\n <span className=\"h-2 w-4 bg-red-400 rounded inline-block\" /> Expenses\n </span>\n <span className=\"flex items-center gap-1\">\n <span className=\"h-2 w-4 bg-blue-500 rounded inline-block\" /> Savings\n </span>\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n </SectionShell>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssistantPage.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/pages/AssistantPage.tsx"],"names":[],"mappings":"AAqGA,wBAAgB,aAAa,4CAmR5B"}
|