@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,175 @@
|
|
|
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 { Briefcase as i, PieChart as a, Plus as o, RefreshCw as s, TrendingUp as c } from "lucide-react";
|
|
4
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
5
|
+
import { Badge as d, Button as f, Card as p, CardContent as m, CardDescription as h, CardHeader as g, CardTitle as _, Table as v, TableBody as y, TableCell as b, TableHead as x, TableHeader as S, TableRow as C } from "@burdenoff/fe-libs/ui";
|
|
6
|
+
//#region src/brainyrich/pages/PortfoliosPage.tsx
|
|
7
|
+
function w() {
|
|
8
|
+
let { portfolios: w, holdings: T } = e(), E = w.reduce((e, t) => e + t.value, 0), D = w.reduce((e, t) => e + t.ytdReturnPct * t.value, 0) / E;
|
|
9
|
+
return /* @__PURE__ */ u(n, {
|
|
10
|
+
title: "Portfolio Management",
|
|
11
|
+
description: "Monitor, analyze, and rebalance your investment portfolios",
|
|
12
|
+
actionLabel: "Create Portfolio",
|
|
13
|
+
badges: ["3 Active Portfolios"],
|
|
14
|
+
children: [
|
|
15
|
+
/* @__PURE__ */ l(t, { items: [
|
|
16
|
+
{
|
|
17
|
+
label: "Total Portfolio Value",
|
|
18
|
+
value: r(E),
|
|
19
|
+
trend: "+9.8% overall"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
label: "Active Portfolios",
|
|
23
|
+
value: String(w.length)
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
label: "Weighted YTD Return",
|
|
27
|
+
value: `${D.toFixed(1)}%`,
|
|
28
|
+
trend: "Above benchmark"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
label: "Asset Count",
|
|
32
|
+
value: String(T.length),
|
|
33
|
+
trend: "Across all strategies"
|
|
34
|
+
}
|
|
35
|
+
] }),
|
|
36
|
+
/* @__PURE__ */ l("div", {
|
|
37
|
+
className: "grid gap-4 lg:grid-cols-3",
|
|
38
|
+
children: w.map((e) => {
|
|
39
|
+
let t = Math.round(e.value / E * 100);
|
|
40
|
+
return /* @__PURE__ */ u(p, { children: [/* @__PURE__ */ l(g, {
|
|
41
|
+
className: "pb-3",
|
|
42
|
+
children: /* @__PURE__ */ u("div", {
|
|
43
|
+
className: "flex items-center justify-between",
|
|
44
|
+
children: [/* @__PURE__ */ u(_, {
|
|
45
|
+
className: "text-base flex items-center gap-2",
|
|
46
|
+
children: [/* @__PURE__ */ l(i, { className: "h-4 w-4" }), e.name]
|
|
47
|
+
}), /* @__PURE__ */ u(d, {
|
|
48
|
+
variant: e.risk === "High" ? "destructive" : e.risk === "Moderate" ? "secondary" : "outline",
|
|
49
|
+
children: [e.risk, " Risk"]
|
|
50
|
+
})]
|
|
51
|
+
})
|
|
52
|
+
}), /* @__PURE__ */ u(m, {
|
|
53
|
+
className: "space-y-3",
|
|
54
|
+
children: [
|
|
55
|
+
/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("span", {
|
|
56
|
+
className: "text-2xl font-bold",
|
|
57
|
+
children: r(e.value)
|
|
58
|
+
}), /* @__PURE__ */ u("span", {
|
|
59
|
+
className: "ml-2 text-sm text-emerald-600",
|
|
60
|
+
children: [
|
|
61
|
+
"+",
|
|
62
|
+
e.ytdReturnPct,
|
|
63
|
+
"% YTD"
|
|
64
|
+
]
|
|
65
|
+
})] }),
|
|
66
|
+
/* @__PURE__ */ u("div", {
|
|
67
|
+
className: "space-y-1",
|
|
68
|
+
children: [/* @__PURE__ */ u("div", {
|
|
69
|
+
className: "flex justify-between text-xs text-muted-foreground",
|
|
70
|
+
children: [/* @__PURE__ */ l("span", { children: "Portfolio allocation" }), /* @__PURE__ */ u("span", { children: [t, "%"] })]
|
|
71
|
+
}), /* @__PURE__ */ l("div", {
|
|
72
|
+
className: "h-2 rounded bg-muted overflow-hidden",
|
|
73
|
+
children: /* @__PURE__ */ l("div", {
|
|
74
|
+
className: "h-2 rounded bg-primary",
|
|
75
|
+
style: { width: `${t}%` }
|
|
76
|
+
})
|
|
77
|
+
})]
|
|
78
|
+
}),
|
|
79
|
+
/* @__PURE__ */ u("div", {
|
|
80
|
+
className: "flex gap-2",
|
|
81
|
+
children: [/* @__PURE__ */ u(f, {
|
|
82
|
+
variant: "outline",
|
|
83
|
+
size: "sm",
|
|
84
|
+
className: "flex-1",
|
|
85
|
+
children: [/* @__PURE__ */ l(c, { className: "mr-1 h-3 w-3" }), "Analyze"]
|
|
86
|
+
}), /* @__PURE__ */ u(f, {
|
|
87
|
+
variant: "outline",
|
|
88
|
+
size: "sm",
|
|
89
|
+
className: "flex-1",
|
|
90
|
+
children: [/* @__PURE__ */ l(s, { className: "mr-1 h-3 w-3" }), "Rebalance"]
|
|
91
|
+
})]
|
|
92
|
+
})
|
|
93
|
+
]
|
|
94
|
+
})] }, e.id);
|
|
95
|
+
})
|
|
96
|
+
}),
|
|
97
|
+
/* @__PURE__ */ u(p, { children: [/* @__PURE__ */ u(g, { children: [/* @__PURE__ */ u(_, {
|
|
98
|
+
className: "flex items-center gap-2",
|
|
99
|
+
children: [/* @__PURE__ */ l(a, { className: "h-5 w-5" }), "Allocation Breakdown"]
|
|
100
|
+
}), /* @__PURE__ */ l(h, { children: "Visual distribution of capital across strategies" })] }), /* @__PURE__ */ u(m, { children: [/* @__PURE__ */ l("div", {
|
|
101
|
+
className: "flex h-8 rounded overflow-hidden",
|
|
102
|
+
children: w.map((e, t) => {
|
|
103
|
+
let n = [
|
|
104
|
+
"bg-blue-500",
|
|
105
|
+
"bg-purple-500",
|
|
106
|
+
"bg-emerald-500"
|
|
107
|
+
], r = e.value / E * 100;
|
|
108
|
+
return /* @__PURE__ */ u("div", {
|
|
109
|
+
className: `${n[t % n.length]} flex items-center justify-center text-[10px] font-medium text-white`,
|
|
110
|
+
style: { width: `${r}%` },
|
|
111
|
+
children: [r.toFixed(0), "%"]
|
|
112
|
+
}, e.id);
|
|
113
|
+
})
|
|
114
|
+
}), /* @__PURE__ */ l("div", {
|
|
115
|
+
className: "mt-3 flex flex-wrap gap-4",
|
|
116
|
+
children: w.map((e, t) => {
|
|
117
|
+
let n = [
|
|
118
|
+
"bg-blue-500",
|
|
119
|
+
"bg-purple-500",
|
|
120
|
+
"bg-emerald-500"
|
|
121
|
+
];
|
|
122
|
+
return /* @__PURE__ */ u("div", {
|
|
123
|
+
className: "flex items-center gap-2 text-sm",
|
|
124
|
+
children: [/* @__PURE__ */ l("div", { className: `h-3 w-3 rounded-full ${n[t % n.length]}` }), e.name]
|
|
125
|
+
}, e.id);
|
|
126
|
+
})
|
|
127
|
+
})] })] }),
|
|
128
|
+
/* @__PURE__ */ u(p, { children: [/* @__PURE__ */ u(g, {
|
|
129
|
+
className: "flex flex-row items-center justify-between",
|
|
130
|
+
children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l(_, { children: "Holdings" }), /* @__PURE__ */ l(h, { children: "All securities across every portfolio" })] }), /* @__PURE__ */ u(f, {
|
|
131
|
+
size: "sm",
|
|
132
|
+
children: [/* @__PURE__ */ l(o, { className: "mr-1 h-4 w-4" }), "Add Position"]
|
|
133
|
+
})]
|
|
134
|
+
}), /* @__PURE__ */ l(m, { children: /* @__PURE__ */ u(v, { children: [/* @__PURE__ */ l(S, { children: /* @__PURE__ */ u(C, { children: [
|
|
135
|
+
/* @__PURE__ */ l(x, { children: "Symbol" }),
|
|
136
|
+
/* @__PURE__ */ l(x, { children: "Name" }),
|
|
137
|
+
/* @__PURE__ */ l(x, { children: "Sector" }),
|
|
138
|
+
/* @__PURE__ */ l(x, {
|
|
139
|
+
className: "text-right",
|
|
140
|
+
children: "Market Value"
|
|
141
|
+
}),
|
|
142
|
+
/* @__PURE__ */ l(x, {
|
|
143
|
+
className: "text-right",
|
|
144
|
+
children: "Change %"
|
|
145
|
+
})
|
|
146
|
+
] }) }), /* @__PURE__ */ l(y, { children: T.map((e) => /* @__PURE__ */ u(C, { children: [
|
|
147
|
+
/* @__PURE__ */ l(b, {
|
|
148
|
+
className: "font-semibold",
|
|
149
|
+
children: e.symbol
|
|
150
|
+
}),
|
|
151
|
+
/* @__PURE__ */ l(b, { children: e.name }),
|
|
152
|
+
/* @__PURE__ */ l(b, { children: /* @__PURE__ */ l(d, {
|
|
153
|
+
variant: "outline",
|
|
154
|
+
children: e.sector
|
|
155
|
+
}) }),
|
|
156
|
+
/* @__PURE__ */ l(b, {
|
|
157
|
+
className: "text-right",
|
|
158
|
+
children: r(e.marketValue)
|
|
159
|
+
}),
|
|
160
|
+
/* @__PURE__ */ u(b, {
|
|
161
|
+
className: `text-right ${e.changePct >= 0 ? "text-emerald-600" : "text-red-600"}`,
|
|
162
|
+
children: [
|
|
163
|
+
e.changePct >= 0 ? "+" : "",
|
|
164
|
+
e.changePct,
|
|
165
|
+
"%"
|
|
166
|
+
]
|
|
167
|
+
})
|
|
168
|
+
] }, e.symbol)) })] }) })] })
|
|
169
|
+
]
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
//#endregion
|
|
173
|
+
export { w as PortfoliosPage };
|
|
174
|
+
|
|
175
|
+
//# sourceMappingURL=PortfoliosPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PortfoliosPage.js","names":[],"sources":["../../../src/brainyrich/pages/PortfoliosPage.tsx"],"sourcesContent":["import {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Badge,\n Button,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@burdenoff/fe-libs/ui';\nimport { Briefcase, TrendingUp, PieChart, Plus, RefreshCw } from 'lucide-react';\nimport { useBrainyRichStore } from '../store/brainyrichStore';\nimport { SectionShell, KpiGrid, formatMoney } from './_shared';\n\nexport function PortfoliosPage() {\n const { portfolios, holdings } = useBrainyRichStore();\n const totalValue = portfolios.reduce((s, p) => s + p.value, 0);\n const weightedReturn = portfolios.reduce((s, p) => s + p.ytdReturnPct * p.value, 0) / totalValue;\n\n return (\n <SectionShell\n title=\"Portfolio Management\"\n description=\"Monitor, analyze, and rebalance your investment portfolios\"\n actionLabel=\"Create Portfolio\"\n badges={['3 Active Portfolios']}\n >\n <KpiGrid\n items={[\n {\n label: 'Total Portfolio Value',\n value: formatMoney(totalValue),\n trend: '+9.8% overall',\n },\n { label: 'Active Portfolios', value: String(portfolios.length) },\n {\n label: 'Weighted YTD Return',\n value: `${weightedReturn.toFixed(1)}%`,\n trend: 'Above benchmark',\n },\n { label: 'Asset Count', value: String(holdings.length), trend: 'Across all strategies' },\n ]}\n />\n\n {/* Portfolio cards */}\n <div className=\"grid gap-4 lg:grid-cols-3\">\n {portfolios.map((p) => {\n const allocPct = Math.round((p.value / totalValue) * 100);\n return (\n <Card key={p.id}>\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base flex items-center gap-2\">\n <Briefcase className=\"h-4 w-4\" />\n {p.name}\n </CardTitle>\n <Badge\n variant={\n p.risk === 'High'\n ? 'destructive'\n : p.risk === 'Moderate'\n ? 'secondary'\n : 'outline'\n }\n >\n {p.risk} Risk\n </Badge>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <div>\n <span className=\"text-2xl font-bold\">{formatMoney(p.value)}</span>\n <span className=\"ml-2 text-sm text-emerald-600\">+{p.ytdReturnPct}% YTD</span>\n </div>\n <div className=\"space-y-1\">\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>Portfolio allocation</span>\n <span>{allocPct}%</span>\n </div>\n <div className=\"h-2 rounded bg-muted overflow-hidden\">\n <div className=\"h-2 rounded bg-primary\" style={{ width: `${allocPct}%` }} />\n </div>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" className=\"flex-1\">\n <TrendingUp className=\"mr-1 h-3 w-3\" />\n Analyze\n </Button>\n <Button variant=\"outline\" size=\"sm\" className=\"flex-1\">\n <RefreshCw className=\"mr-1 h-3 w-3\" />\n Rebalance\n </Button>\n </div>\n </CardContent>\n </Card>\n );\n })}\n </div>\n\n {/* Allocation breakdown bar */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <PieChart className=\"h-5 w-5\" />\n Allocation Breakdown\n </CardTitle>\n <CardDescription>Visual distribution of capital across strategies</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"flex h-8 rounded overflow-hidden\">\n {portfolios.map((p, i) => {\n const colors = ['bg-blue-500', 'bg-purple-500', 'bg-emerald-500'];\n const pct = (p.value / totalValue) * 100;\n return (\n <div\n key={p.id}\n className={`${colors[i % colors.length]} flex items-center justify-center text-[10px] font-medium text-white`}\n style={{ width: `${pct}%` }}\n >\n {pct.toFixed(0)}%\n </div>\n );\n })}\n </div>\n <div className=\"mt-3 flex flex-wrap gap-4\">\n {portfolios.map((p, i) => {\n const dotColors = ['bg-blue-500', 'bg-purple-500', 'bg-emerald-500'];\n return (\n <div key={p.id} className=\"flex items-center gap-2 text-sm\">\n <div className={`h-3 w-3 rounded-full ${dotColors[i % dotColors.length]}`} />\n {p.name}\n </div>\n );\n })}\n </div>\n </CardContent>\n </Card>\n\n {/* Holdings table */}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <div>\n <CardTitle>Holdings</CardTitle>\n <CardDescription>All securities across every portfolio</CardDescription>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-1 h-4 w-4\" />\n Add Position\n </Button>\n </CardHeader>\n <CardContent>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Symbol</TableHead>\n <TableHead>Name</TableHead>\n <TableHead>Sector</TableHead>\n <TableHead className=\"text-right\">Market Value</TableHead>\n <TableHead className=\"text-right\">Change %</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {holdings.map((h) => (\n <TableRow key={h.symbol}>\n <TableCell className=\"font-semibold\">{h.symbol}</TableCell>\n <TableCell>{h.name}</TableCell>\n <TableCell>\n <Badge variant=\"outline\">{h.sector}</Badge>\n </TableCell>\n <TableCell className=\"text-right\">{formatMoney(h.marketValue)}</TableCell>\n <TableCell\n className={`text-right ${h.changePct >= 0 ? 'text-emerald-600' : 'text-red-600'}`}\n >\n {h.changePct >= 0 ? '+' : ''}\n {h.changePct}%\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n </SectionShell>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReportsPage.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/pages/ReportsPage.tsx"],"names":[],"mappings":"AA0GA,wBAAgB,WAAW,4CAqI1B"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { useBrainyRichStore as e } from "../store/brainyrichStore.js";
|
|
2
|
+
import { KpiGrid as t, SectionShell as n } from "./_shared.js";
|
|
3
|
+
import { Calendar as r, Clock as i, Download as a, FileText as o } from "lucide-react";
|
|
4
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
5
|
+
import { Badge as l, Button as u, Card as d, CardContent as f, CardHeader as p, CardTitle as m } from "@burdenoff/fe-libs/ui";
|
|
6
|
+
//#region src/brainyrich/pages/ReportsPage.tsx
|
|
7
|
+
var h = [
|
|
8
|
+
{
|
|
9
|
+
category: "Portfolio Reports",
|
|
10
|
+
items: [
|
|
11
|
+
{
|
|
12
|
+
name: "Portfolio Performance",
|
|
13
|
+
desc: "Comprehensive return analysis",
|
|
14
|
+
frequency: "Monthly",
|
|
15
|
+
last: "2026-06-01"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: "Asset Allocation",
|
|
19
|
+
desc: "Current vs target allocation",
|
|
20
|
+
frequency: "Quarterly",
|
|
21
|
+
last: "2026-05-01"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: "Holdings Summary",
|
|
25
|
+
desc: "Detailed position report",
|
|
26
|
+
frequency: "Weekly",
|
|
27
|
+
last: "2026-06-08"
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
category: "Tax Reports",
|
|
33
|
+
items: [
|
|
34
|
+
{
|
|
35
|
+
name: "Tax Loss Harvesting",
|
|
36
|
+
desc: "Realized & unrealized gains/losses",
|
|
37
|
+
frequency: "Monthly",
|
|
38
|
+
last: "2026-06-01"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: "Tax-Efficient Strategies",
|
|
42
|
+
desc: "Optimization recommendations",
|
|
43
|
+
frequency: "Quarterly",
|
|
44
|
+
last: "2026-04-01"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: "Year-End Tax Summary",
|
|
48
|
+
desc: "Annual tax impact analysis",
|
|
49
|
+
frequency: "Annually",
|
|
50
|
+
last: "2025-12-31"
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
category: "Risk Reports",
|
|
56
|
+
items: [{
|
|
57
|
+
name: "Risk Assessment",
|
|
58
|
+
desc: "Portfolio risk metrics",
|
|
59
|
+
frequency: "Monthly",
|
|
60
|
+
last: "2026-06-01"
|
|
61
|
+
}, {
|
|
62
|
+
name: "Stress Test Results",
|
|
63
|
+
desc: "Crisis scenario analysis",
|
|
64
|
+
frequency: "Quarterly",
|
|
65
|
+
last: "2026-04-01"
|
|
66
|
+
}]
|
|
67
|
+
}
|
|
68
|
+
], g = [
|
|
69
|
+
{
|
|
70
|
+
name: "Weekly Holdings Summary",
|
|
71
|
+
nextRun: "2026-06-15",
|
|
72
|
+
frequency: "Weekly",
|
|
73
|
+
recipients: "you@brainyrich.com"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: "Monthly Performance Report",
|
|
77
|
+
nextRun: "2026-07-01",
|
|
78
|
+
frequency: "Monthly",
|
|
79
|
+
recipients: "you@brainyrich.com"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: "Quarterly Tax Summary",
|
|
83
|
+
nextRun: "2026-10-01",
|
|
84
|
+
frequency: "Quarterly",
|
|
85
|
+
recipients: "you@brainyrich.com, advisor@firm.com"
|
|
86
|
+
}
|
|
87
|
+
];
|
|
88
|
+
function _() {
|
|
89
|
+
let { reports: _ } = e();
|
|
90
|
+
return /* @__PURE__ */ c(n, {
|
|
91
|
+
title: "Reports & Documents",
|
|
92
|
+
description: "Generate, schedule, and download your financial reports",
|
|
93
|
+
actionLabel: "Generate Custom Report",
|
|
94
|
+
badges: [`${_.length} Recent Reports`],
|
|
95
|
+
children: [/* @__PURE__ */ s(t, { items: [
|
|
96
|
+
{
|
|
97
|
+
label: "Total Reports",
|
|
98
|
+
value: "127",
|
|
99
|
+
trend: "Generated this year"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
label: "Scheduled Reports",
|
|
103
|
+
value: String(g.length),
|
|
104
|
+
trend: "Active schedules"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
label: "Ready to Download",
|
|
108
|
+
value: String(_.length)
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
label: "Report Formats",
|
|
112
|
+
value: "3",
|
|
113
|
+
trend: "PDF, Excel, CSV"
|
|
114
|
+
}
|
|
115
|
+
] }), /* @__PURE__ */ c("div", {
|
|
116
|
+
className: "grid gap-4 lg:grid-cols-3",
|
|
117
|
+
children: [/* @__PURE__ */ s("div", {
|
|
118
|
+
className: "lg:col-span-2 space-y-4",
|
|
119
|
+
children: h.map((e) => /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ s(p, { children: /* @__PURE__ */ s(m, {
|
|
120
|
+
className: "text-base",
|
|
121
|
+
children: e.category
|
|
122
|
+
}) }), /* @__PURE__ */ s(f, {
|
|
123
|
+
className: "space-y-2",
|
|
124
|
+
children: e.items.map((e) => /* @__PURE__ */ c("div", {
|
|
125
|
+
className: "flex items-center justify-between rounded-lg border p-3",
|
|
126
|
+
children: [
|
|
127
|
+
/* @__PURE__ */ c("div", {
|
|
128
|
+
className: "flex-1",
|
|
129
|
+
children: [/* @__PURE__ */ s("p", {
|
|
130
|
+
className: "font-medium text-sm",
|
|
131
|
+
children: e.name
|
|
132
|
+
}), /* @__PURE__ */ s("p", {
|
|
133
|
+
className: "text-xs text-muted-foreground",
|
|
134
|
+
children: e.desc
|
|
135
|
+
})]
|
|
136
|
+
}),
|
|
137
|
+
/* @__PURE__ */ c("div", {
|
|
138
|
+
className: "text-center mx-4",
|
|
139
|
+
children: [/* @__PURE__ */ s(l, {
|
|
140
|
+
variant: "outline",
|
|
141
|
+
className: "text-[10px]",
|
|
142
|
+
children: e.frequency
|
|
143
|
+
}), /* @__PURE__ */ c("p", {
|
|
144
|
+
className: "text-[10px] text-muted-foreground mt-0.5",
|
|
145
|
+
children: ["Last: ", e.last]
|
|
146
|
+
})]
|
|
147
|
+
}),
|
|
148
|
+
/* @__PURE__ */ c("div", {
|
|
149
|
+
className: "flex gap-1",
|
|
150
|
+
children: [/* @__PURE__ */ s(u, {
|
|
151
|
+
variant: "outline",
|
|
152
|
+
size: "sm",
|
|
153
|
+
children: "Generate"
|
|
154
|
+
}), /* @__PURE__ */ s(u, {
|
|
155
|
+
variant: "outline",
|
|
156
|
+
size: "sm",
|
|
157
|
+
children: /* @__PURE__ */ s(r, { className: "h-3 w-3" })
|
|
158
|
+
})]
|
|
159
|
+
})
|
|
160
|
+
]
|
|
161
|
+
}, e.name))
|
|
162
|
+
})] }, e.category))
|
|
163
|
+
}), /* @__PURE__ */ c("div", {
|
|
164
|
+
className: "space-y-4",
|
|
165
|
+
children: [
|
|
166
|
+
/* @__PURE__ */ c(d, { children: [/* @__PURE__ */ s(p, { children: /* @__PURE__ */ c(m, {
|
|
167
|
+
className: "flex items-center gap-2 text-base",
|
|
168
|
+
children: [/* @__PURE__ */ s(o, { className: "h-4 w-4" }), "Recent Reports"]
|
|
169
|
+
}) }), /* @__PURE__ */ s(f, {
|
|
170
|
+
className: "space-y-3",
|
|
171
|
+
children: _.map((e) => /* @__PURE__ */ c("div", {
|
|
172
|
+
className: "rounded-lg border p-3",
|
|
173
|
+
children: [
|
|
174
|
+
/* @__PURE__ */ s("p", {
|
|
175
|
+
className: "font-medium text-sm",
|
|
176
|
+
children: e.title
|
|
177
|
+
}),
|
|
178
|
+
/* @__PURE__ */ c("p", {
|
|
179
|
+
className: "text-xs text-muted-foreground",
|
|
180
|
+
children: [
|
|
181
|
+
e.period,
|
|
182
|
+
" · Generated ",
|
|
183
|
+
e.generatedAt
|
|
184
|
+
]
|
|
185
|
+
}),
|
|
186
|
+
/* @__PURE__ */ c(u, {
|
|
187
|
+
variant: "outline",
|
|
188
|
+
size: "sm",
|
|
189
|
+
className: "mt-2 w-full",
|
|
190
|
+
children: [/* @__PURE__ */ s(a, { className: "mr-1 h-3 w-3" }), "Download"]
|
|
191
|
+
})
|
|
192
|
+
]
|
|
193
|
+
}, e.id))
|
|
194
|
+
})] }),
|
|
195
|
+
/* @__PURE__ */ c(d, { children: [/* @__PURE__ */ s(p, { children: /* @__PURE__ */ c(m, {
|
|
196
|
+
className: "flex items-center gap-2 text-base",
|
|
197
|
+
children: [/* @__PURE__ */ s(i, { className: "h-4 w-4" }), "Scheduled Reports"]
|
|
198
|
+
}) }), /* @__PURE__ */ s(f, {
|
|
199
|
+
className: "space-y-3",
|
|
200
|
+
children: g.map((e) => /* @__PURE__ */ c("div", {
|
|
201
|
+
className: "rounded-lg border p-3",
|
|
202
|
+
children: [
|
|
203
|
+
/* @__PURE__ */ s("p", {
|
|
204
|
+
className: "font-medium text-sm",
|
|
205
|
+
children: e.name
|
|
206
|
+
}),
|
|
207
|
+
/* @__PURE__ */ c("p", {
|
|
208
|
+
className: "text-xs text-muted-foreground",
|
|
209
|
+
children: [
|
|
210
|
+
"Next: ",
|
|
211
|
+
e.nextRun,
|
|
212
|
+
" · ",
|
|
213
|
+
e.frequency
|
|
214
|
+
]
|
|
215
|
+
}),
|
|
216
|
+
/* @__PURE__ */ s("p", {
|
|
217
|
+
className: "text-xs text-muted-foreground",
|
|
218
|
+
children: e.recipients
|
|
219
|
+
})
|
|
220
|
+
]
|
|
221
|
+
}, e.name))
|
|
222
|
+
})] }),
|
|
223
|
+
/* @__PURE__ */ c(d, { children: [/* @__PURE__ */ s(p, { children: /* @__PURE__ */ s(m, {
|
|
224
|
+
className: "text-base",
|
|
225
|
+
children: "Export Formats"
|
|
226
|
+
}) }), /* @__PURE__ */ s(f, {
|
|
227
|
+
className: "space-y-2",
|
|
228
|
+
children: [
|
|
229
|
+
{
|
|
230
|
+
format: "PDF",
|
|
231
|
+
status: "Available"
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
format: "Excel (.xlsx)",
|
|
235
|
+
status: "Available"
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
format: "CSV",
|
|
239
|
+
status: "Available"
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
format: "Interactive Dashboard",
|
|
243
|
+
status: "Coming Soon"
|
|
244
|
+
}
|
|
245
|
+
].map((e) => /* @__PURE__ */ c("div", {
|
|
246
|
+
className: "flex justify-between text-sm",
|
|
247
|
+
children: [/* @__PURE__ */ s("span", { children: e.format }), /* @__PURE__ */ s("span", {
|
|
248
|
+
className: e.status === "Available" ? "text-emerald-600" : "text-yellow-600",
|
|
249
|
+
children: e.status === "Available" ? "Available" : "Coming Soon"
|
|
250
|
+
})]
|
|
251
|
+
}, e.format))
|
|
252
|
+
})] })
|
|
253
|
+
]
|
|
254
|
+
})]
|
|
255
|
+
})]
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
//#endregion
|
|
259
|
+
export { _ as ReportsPage };
|
|
260
|
+
|
|
261
|
+
//# sourceMappingURL=ReportsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReportsPage.js","names":[],"sources":["../../../src/brainyrich/pages/ReportsPage.tsx"],"sourcesContent":["import {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Badge,\n Button,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@burdenoff/fe-libs/ui';\nimport { FileText, Download, Calendar, Clock } from 'lucide-react';\nimport { useBrainyRichStore } from '../store/brainyrichStore';\nimport { SectionShell, KpiGrid } from './_shared';\n\nconst reportCatalog = [\n {\n category: 'Portfolio Reports',\n items: [\n {\n name: 'Portfolio Performance',\n desc: 'Comprehensive return analysis',\n frequency: 'Monthly',\n last: '2026-06-01',\n },\n {\n name: 'Asset Allocation',\n desc: 'Current vs target allocation',\n frequency: 'Quarterly',\n last: '2026-05-01',\n },\n {\n name: 'Holdings Summary',\n desc: 'Detailed position report',\n frequency: 'Weekly',\n last: '2026-06-08',\n },\n ],\n },\n {\n category: 'Tax Reports',\n items: [\n {\n name: 'Tax Loss Harvesting',\n desc: 'Realized & unrealized gains/losses',\n frequency: 'Monthly',\n last: '2026-06-01',\n },\n {\n name: 'Tax-Efficient Strategies',\n desc: 'Optimization recommendations',\n frequency: 'Quarterly',\n last: '2026-04-01',\n },\n {\n name: 'Year-End Tax Summary',\n desc: 'Annual tax impact analysis',\n frequency: 'Annually',\n last: '2025-12-31',\n },\n ],\n },\n {\n category: 'Risk Reports',\n items: [\n {\n name: 'Risk Assessment',\n desc: 'Portfolio risk metrics',\n frequency: 'Monthly',\n last: '2026-06-01',\n },\n {\n name: 'Stress Test Results',\n desc: 'Crisis scenario analysis',\n frequency: 'Quarterly',\n last: '2026-04-01',\n },\n ],\n },\n];\n\nconst scheduledReports = [\n {\n name: 'Weekly Holdings Summary',\n nextRun: '2026-06-15',\n frequency: 'Weekly',\n recipients: 'you@brainyrich.com',\n },\n {\n name: 'Monthly Performance Report',\n nextRun: '2026-07-01',\n frequency: 'Monthly',\n recipients: 'you@brainyrich.com',\n },\n {\n name: 'Quarterly Tax Summary',\n nextRun: '2026-10-01',\n frequency: 'Quarterly',\n recipients: 'you@brainyrich.com, advisor@firm.com',\n },\n];\n\nexport function ReportsPage() {\n const { reports } = useBrainyRichStore();\n\n return (\n <SectionShell\n title=\"Reports & Documents\"\n description=\"Generate, schedule, and download your financial reports\"\n actionLabel=\"Generate Custom Report\"\n badges={[`${reports.length} Recent Reports`]}\n >\n <KpiGrid\n items={[\n { label: 'Total Reports', value: '127', trend: 'Generated this year' },\n {\n label: 'Scheduled Reports',\n value: String(scheduledReports.length),\n trend: 'Active schedules',\n },\n { label: 'Ready to Download', value: String(reports.length) },\n { label: 'Report Formats', value: '3', trend: 'PDF, Excel, CSV' },\n ]}\n />\n\n <div className=\"grid gap-4 lg:grid-cols-3\">\n {/* Report catalog */}\n <div className=\"lg:col-span-2 space-y-4\">\n {reportCatalog.map((cat) => (\n <Card key={cat.category}>\n <CardHeader>\n <CardTitle className=\"text-base\">{cat.category}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {cat.items.map((r) => (\n <div\n key={r.name}\n className=\"flex items-center justify-between rounded-lg border p-3\"\n >\n <div className=\"flex-1\">\n <p className=\"font-medium text-sm\">{r.name}</p>\n <p className=\"text-xs text-muted-foreground\">{r.desc}</p>\n </div>\n <div className=\"text-center mx-4\">\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {r.frequency}\n </Badge>\n <p className=\"text-[10px] text-muted-foreground mt-0.5\">Last: {r.last}</p>\n </div>\n <div className=\"flex gap-1\">\n <Button variant=\"outline\" size=\"sm\">\n Generate\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n <Calendar className=\"h-3 w-3\" />\n </Button>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n ))}\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <FileText className=\"h-4 w-4\" />\n Recent Reports\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {reports.map((r) => (\n <div key={r.id} className=\"rounded-lg border p-3\">\n <p className=\"font-medium text-sm\">{r.title}</p>\n <p className=\"text-xs text-muted-foreground\">\n {r.period} · Generated {r.generatedAt}\n </p>\n <Button variant=\"outline\" size=\"sm\" className=\"mt-2 w-full\">\n <Download className=\"mr-1 h-3 w-3\" />\n Download\n </Button>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Clock className=\"h-4 w-4\" />\n Scheduled Reports\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {scheduledReports.map((s) => (\n <div key={s.name} className=\"rounded-lg border p-3\">\n <p className=\"font-medium text-sm\">{s.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n Next: {s.nextRun} · {s.frequency}\n </p>\n <p className=\"text-xs text-muted-foreground\">{s.recipients}</p>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Export Formats</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {[\n { format: 'PDF', status: 'Available' },\n { format: 'Excel (.xlsx)', status: 'Available' },\n { format: 'CSV', status: 'Available' },\n { format: 'Interactive Dashboard', status: 'Coming Soon' },\n ].map((f) => (\n <div key={f.format} className=\"flex justify-between text-sm\">\n <span>{f.format}</span>\n <span\n className={f.status === 'Available' ? 'text-emerald-600' : 'text-yellow-600'}\n >\n {f.status === 'Available' ? 'Available' : 'Coming Soon'}\n </span>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n </div>\n </SectionShell>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RiskPage.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/pages/RiskPage.tsx"],"names":[],"mappings":"AAwCA,wBAAgB,QAAQ,4CAyJvB"}
|