@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.
Files changed (114) hide show
  1. package/README.md +12 -0
  2. package/dist/brainyrich/BrainyRichRoot.d.ts +5 -0
  3. package/dist/brainyrich/BrainyRichRoot.d.ts.map +1 -0
  4. package/dist/brainyrich/BrainyRichRoot.js +161 -0
  5. package/dist/brainyrich/BrainyRichRoot.js.map +1 -0
  6. package/dist/brainyrich/BrainyRichRoutes.d.ts +2 -0
  7. package/dist/brainyrich/BrainyRichRoutes.d.ts.map +1 -0
  8. package/dist/brainyrich/BrainyRichRoutes.js +95 -0
  9. package/dist/brainyrich/BrainyRichRoutes.js.map +1 -0
  10. package/dist/brainyrich/index.d.ts +5 -0
  11. package/dist/brainyrich/index.d.ts.map +1 -0
  12. package/dist/brainyrich/index.js +3 -0
  13. package/dist/brainyrich/pages/AccountsPage.d.ts +2 -0
  14. package/dist/brainyrich/pages/AccountsPage.d.ts.map +1 -0
  15. package/dist/brainyrich/pages/AccountsPage.js +184 -0
  16. package/dist/brainyrich/pages/AccountsPage.js.map +1 -0
  17. package/dist/brainyrich/pages/AdvisorsPage.d.ts +2 -0
  18. package/dist/brainyrich/pages/AdvisorsPage.d.ts.map +1 -0
  19. package/dist/brainyrich/pages/AdvisorsPage.js +375 -0
  20. package/dist/brainyrich/pages/AdvisorsPage.js.map +1 -0
  21. package/dist/brainyrich/pages/AiAssistantPage.d.ts +2 -0
  22. package/dist/brainyrich/pages/AiAssistantPage.d.ts.map +1 -0
  23. package/dist/brainyrich/pages/AiAssistantPage.js +389 -0
  24. package/dist/brainyrich/pages/AiAssistantPage.js.map +1 -0
  25. package/dist/brainyrich/pages/AnalyticsPage.d.ts +2 -0
  26. package/dist/brainyrich/pages/AnalyticsPage.d.ts.map +1 -0
  27. package/dist/brainyrich/pages/AnalyticsPage.js +316 -0
  28. package/dist/brainyrich/pages/AnalyticsPage.js.map +1 -0
  29. package/dist/brainyrich/pages/AssistantPage.d.ts +2 -0
  30. package/dist/brainyrich/pages/AssistantPage.d.ts.map +1 -0
  31. package/dist/brainyrich/pages/AssistantPage.js +332 -0
  32. package/dist/brainyrich/pages/AssistantPage.js.map +1 -0
  33. package/dist/brainyrich/pages/DashboardPage.d.ts +2 -0
  34. package/dist/brainyrich/pages/DashboardPage.d.ts.map +1 -0
  35. package/dist/brainyrich/pages/DashboardPage.js +258 -0
  36. package/dist/brainyrich/pages/DashboardPage.js.map +1 -0
  37. package/dist/brainyrich/pages/EstatePage.d.ts +2 -0
  38. package/dist/brainyrich/pages/EstatePage.d.ts.map +1 -0
  39. package/dist/brainyrich/pages/EstatePage.js +269 -0
  40. package/dist/brainyrich/pages/EstatePage.js.map +1 -0
  41. package/dist/brainyrich/pages/FamilyPage.d.ts +2 -0
  42. package/dist/brainyrich/pages/FamilyPage.d.ts.map +1 -0
  43. package/dist/brainyrich/pages/FamilyPage.js +358 -0
  44. package/dist/brainyrich/pages/FamilyPage.js.map +1 -0
  45. package/dist/brainyrich/pages/GoalsPage.d.ts +2 -0
  46. package/dist/brainyrich/pages/GoalsPage.d.ts.map +1 -0
  47. package/dist/brainyrich/pages/GoalsPage.js +160 -0
  48. package/dist/brainyrich/pages/GoalsPage.js.map +1 -0
  49. package/dist/brainyrich/pages/InsurancePage.d.ts +2 -0
  50. package/dist/brainyrich/pages/InsurancePage.d.ts.map +1 -0
  51. package/dist/brainyrich/pages/InsurancePage.js +181 -0
  52. package/dist/brainyrich/pages/InsurancePage.js.map +1 -0
  53. package/dist/brainyrich/pages/InvestmentsPage.d.ts +2 -0
  54. package/dist/brainyrich/pages/InvestmentsPage.d.ts.map +1 -0
  55. package/dist/brainyrich/pages/InvestmentsPage.js +330 -0
  56. package/dist/brainyrich/pages/InvestmentsPage.js.map +1 -0
  57. package/dist/brainyrich/pages/MarketplacePage.d.ts +2 -0
  58. package/dist/brainyrich/pages/MarketplacePage.d.ts.map +1 -0
  59. package/dist/brainyrich/pages/MarketplacePage.js +450 -0
  60. package/dist/brainyrich/pages/MarketplacePage.js.map +1 -0
  61. package/dist/brainyrich/pages/PortfoliosPage.d.ts +2 -0
  62. package/dist/brainyrich/pages/PortfoliosPage.d.ts.map +1 -0
  63. package/dist/brainyrich/pages/PortfoliosPage.js +175 -0
  64. package/dist/brainyrich/pages/PortfoliosPage.js.map +1 -0
  65. package/dist/brainyrich/pages/ReportsPage.d.ts +2 -0
  66. package/dist/brainyrich/pages/ReportsPage.d.ts.map +1 -0
  67. package/dist/brainyrich/pages/ReportsPage.js +261 -0
  68. package/dist/brainyrich/pages/ReportsPage.js.map +1 -0
  69. package/dist/brainyrich/pages/RiskPage.d.ts +2 -0
  70. package/dist/brainyrich/pages/RiskPage.d.ts.map +1 -0
  71. package/dist/brainyrich/pages/RiskPage.js +222 -0
  72. package/dist/brainyrich/pages/RiskPage.js.map +1 -0
  73. package/dist/brainyrich/pages/TaxPage.d.ts +2 -0
  74. package/dist/brainyrich/pages/TaxPage.d.ts.map +1 -0
  75. package/dist/brainyrich/pages/TaxPage.js +246 -0
  76. package/dist/brainyrich/pages/TaxPage.js.map +1 -0
  77. package/dist/brainyrich/pages/_shared.d.ts +21 -0
  78. package/dist/brainyrich/pages/_shared.d.ts.map +1 -0
  79. package/dist/brainyrich/pages/_shared.js +63 -0
  80. package/dist/brainyrich/pages/_shared.js.map +1 -0
  81. package/dist/brainyrich/providers/BrainyRichProvider.d.ts +6 -0
  82. package/dist/brainyrich/providers/BrainyRichProvider.d.ts.map +1 -0
  83. package/dist/brainyrich/providers/BrainyRichProvider.js +27 -0
  84. package/dist/brainyrich/providers/BrainyRichProvider.js.map +1 -0
  85. package/dist/brainyrich/store/brainyrichStore.d.ts +19 -0
  86. package/dist/brainyrich/store/brainyrichStore.d.ts.map +1 -0
  87. package/dist/brainyrich/store/brainyrichStore.js +272 -0
  88. package/dist/brainyrich/store/brainyrichStore.js.map +1 -0
  89. package/dist/brainyrich/types/index.d.ts +116 -0
  90. package/dist/brainyrich/types/index.d.ts.map +1 -0
  91. package/dist/brainyrich/utils/cn.d.ts +4 -0
  92. package/dist/brainyrich/utils/cn.d.ts.map +1 -0
  93. package/dist/brainyrich/utils/i18n.d.ts +6 -0
  94. package/dist/brainyrich/utils/i18n.d.ts.map +1 -0
  95. package/dist/brainyrich/utils/i18n.js +15 -0
  96. package/dist/brainyrich/utils/i18n.js.map +1 -0
  97. package/dist/brainyrich/utils/navigation.d.ts +2 -0
  98. package/dist/brainyrich/utils/navigation.d.ts.map +1 -0
  99. package/dist/brainyrich/utils/navigation.js +8 -0
  100. package/dist/brainyrich/utils/navigation.js.map +1 -0
  101. package/dist/dev/main.d.ts +2 -0
  102. package/dist/dev/main.d.ts.map +1 -0
  103. package/dist/generated/global-operations.d.ts +2 -0
  104. package/dist/generated/global-operations.d.ts.map +1 -0
  105. package/dist/generated/global-types.d.ts +18199 -0
  106. package/dist/generated/global-types.d.ts.map +1 -0
  107. package/dist/generated/wspace-operations.d.ts +2 -0
  108. package/dist/generated/wspace-operations.d.ts.map +1 -0
  109. package/dist/generated/wspace-types.d.ts +43046 -0
  110. package/dist/generated/wspace-types.d.ts.map +1 -0
  111. package/dist/index.d.ts +2 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +5 -0
  114. package/package.json +107 -0
@@ -0,0 +1,332 @@
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 { useState as i } from "react";
4
+ import { AlertTriangle as a, ArrowRight as o, BarChart3 as s, Brain as c, Briefcase as l, Calculator as u, CheckCircle2 as d, CircleDot as f, MessageSquare as p, Receipt as m, Send as h, ShieldAlert as g, Target as _, TrendingUp as v, Zap as y } from "lucide-react";
5
+ import { jsx as b, jsxs as x } from "react/jsx-runtime";
6
+ import { Badge as S, Button as C, Card as w, CardContent as T, CardHeader as E, CardTitle as D, Input as O } from "@burdenoff/fe-libs/ui";
7
+ //#region src/brainyrich/pages/AssistantPage.tsx
8
+ var k = /* @__PURE__ */ new Date(0), A = [
9
+ {
10
+ title: "Portfolio Analysis",
11
+ description: "Performance breakdown and rebalancing suggestions",
12
+ icon: l,
13
+ color: "text-blue-600"
14
+ },
15
+ {
16
+ title: "Market Update",
17
+ description: "Latest indices, sector performance, and trends",
18
+ icon: v,
19
+ color: "text-emerald-600"
20
+ },
21
+ {
22
+ title: "Tax Optimization",
23
+ description: "Deduction planner and tax-loss harvesting strategy",
24
+ icon: u,
25
+ color: "text-amber-600"
26
+ },
27
+ {
28
+ title: "Goal Planning",
29
+ description: "SIP projections and milestone tracking",
30
+ icon: _,
31
+ color: "text-purple-600"
32
+ },
33
+ {
34
+ title: "Risk Assessment",
35
+ description: "Concentration risk, coverage gaps, stress tests",
36
+ icon: g,
37
+ color: "text-red-600"
38
+ },
39
+ {
40
+ title: "Expense Analysis",
41
+ description: "Premium outflows, advisory fees, and fund costs",
42
+ icon: m,
43
+ color: "text-teal-600"
44
+ }
45
+ ];
46
+ function j(e, t) {
47
+ let n = e.toLowerCase();
48
+ return n.includes("portfolio") ? `Your total portfolio value is ${t}. The Growth Portfolio leads at 12.4% YTD. Technology sector concentration is elevated at 34% — consider trimming overweight positions. I can run a detailed rebalancing scenario if you'd like.` : n.includes("market") ? "S&P 500 is up 1.2% at 5,321. NIFTY 50 gained 0.8% to 23,851. Financials and IT are leading sectors. Bond yields remain stable. Your holdings are outperforming the broader index by 2.1% on average." : n.includes("tax") ? "Your FY 2026-27 tax documents show $3,200 in unrealized losses available for tax-loss harvesting. Section 80C utilization is at 72%. Uploading your rental income proof would complete your filing preparation." : n.includes("goal") ? "Retirement Corpus is 61.6% funded ($1.54M / $2.5M). Child Education Fund is at 45.5% ($364K / $800K). Increasing monthly SIPs by $500 would improve the education fund trajectory by 8 months." : n.includes("risk") ? "You have 3 active risk alerts: equity concentration above policy band (High), insurance under-coverage for dependents (Medium), and emergency corpus at 5.6 months (Low). The high-severity tech concentration needs immediate attention." : n.includes("expense") || n.includes("cost") || n.includes("fee") ? "Annual premiums total $44,500 across life and health insurance. Advisory fees run 0.45% AUM. Fund expense ratios average 0.32% weighted. Total annual cost of ownership is approximately $8,200 on your invested portfolio." : `I can help you with portfolio analysis, market updates, tax optimization, goal planning, risk assessment, and expense analysis. Your portfolio is at ${t} — what area would you like to focus on?`;
49
+ }
50
+ function M() {
51
+ let { metrics: l, portfolios: u, risks: m, goals: g } = e(), _ = u.reduce((e, t) => e + t.value, 0), [v, M] = i([{
52
+ id: 1,
53
+ type: "assistant",
54
+ content: `Hello! I'm your financial assistant. Your portfolio is at ${r(_)} and you have ${m.length} risk alerts. Choose a quick action below or ask me anything.`,
55
+ timestamp: k
56
+ }]), [N, P] = i(""), F = () => {
57
+ if (!N.trim()) return;
58
+ let e = {
59
+ id: v.length + 1,
60
+ type: "user",
61
+ content: N,
62
+ timestamp: /* @__PURE__ */ new Date()
63
+ };
64
+ M((t) => [...t, e]), P(""), setTimeout(() => {
65
+ let e = {
66
+ id: v.length + 2,
67
+ type: "assistant",
68
+ content: j(N, r(_)),
69
+ timestamp: /* @__PURE__ */ new Date()
70
+ };
71
+ M((t) => [...t, e]);
72
+ }, 800);
73
+ }, I = [
74
+ {
75
+ type: "recommendation",
76
+ title: "Rebalancing Opportunity",
77
+ description: "Equity allocation is 5% above target band. Consider rebalancing into bonds.",
78
+ impact: "Medium"
79
+ },
80
+ {
81
+ type: "alert",
82
+ title: "Tax Loss Harvesting",
83
+ description: "$3,200 in unrealized losses available before FY end.",
84
+ impact: "High"
85
+ },
86
+ {
87
+ type: "opportunity",
88
+ title: "Emergency Fund Gap",
89
+ description: "Liquid reserve covers 5.6 months. Consider increasing to 6-month target.",
90
+ impact: "Low"
91
+ }
92
+ ], L = (e) => b(e === "High" ? a : e === "Medium" ? f : d, { className: "h-3 w-3" }), R = (e) => e === "High" ? "bg-red-50 text-red-700 border-red-200" : e === "Medium" ? "bg-amber-50 text-amber-700 border-amber-200" : "bg-green-50 text-green-700 border-green-200";
93
+ return /* @__PURE__ */ x(n, {
94
+ title: "Financial Assistant",
95
+ description: "Quick financial advice, insights, and action shortcuts",
96
+ badges: ["Online"],
97
+ actionLabel: "New Conversation",
98
+ children: [/* @__PURE__ */ b(t, { items: [
99
+ {
100
+ label: "Conversations",
101
+ value: "47",
102
+ trend: "+5 this week"
103
+ },
104
+ {
105
+ label: "Recommendations",
106
+ value: "23",
107
+ trend: "18 accepted"
108
+ },
109
+ {
110
+ label: "Actions Taken",
111
+ value: "12",
112
+ trend: "$2,450 savings"
113
+ },
114
+ {
115
+ label: "Avg Goal Progress",
116
+ value: `${g.length ? Math.round(g.reduce((e, t) => e + t.currentAmount / t.targetAmount * 100, 0) / g.length) : 0}%`,
117
+ trend: `${g.length} active goals`
118
+ }
119
+ ] }), /* @__PURE__ */ x("div", {
120
+ className: "grid grid-cols-1 gap-6 lg:grid-cols-4",
121
+ children: [/* @__PURE__ */ x("div", {
122
+ className: "space-y-6 lg:col-span-3",
123
+ children: [/* @__PURE__ */ x(w, { children: [/* @__PURE__ */ b(E, {
124
+ className: "border-b py-3",
125
+ children: /* @__PURE__ */ x(D, {
126
+ className: "flex items-center gap-2 text-base",
127
+ children: [
128
+ /* @__PURE__ */ b(p, { className: "h-5 w-5" }),
129
+ "Chat",
130
+ /* @__PURE__ */ x("div", {
131
+ className: "ml-auto flex items-center gap-1 text-xs font-normal text-muted-foreground",
132
+ children: [/* @__PURE__ */ b("div", { className: "h-2 w-2 animate-pulse rounded-full bg-green-500" }), "Ready"]
133
+ })
134
+ ]
135
+ })
136
+ }), /* @__PURE__ */ x(T, {
137
+ className: "p-0",
138
+ children: [/* @__PURE__ */ b("div", {
139
+ className: "h-80 space-y-3 overflow-y-auto p-4",
140
+ children: v.map((e) => /* @__PURE__ */ b("div", {
141
+ className: `flex ${e.type === "user" ? "justify-end" : "justify-start"}`,
142
+ children: /* @__PURE__ */ x("div", {
143
+ className: `max-w-[75%] rounded-lg px-4 py-2 ${e.type === "user" ? "bg-primary text-primary-foreground" : "bg-muted"}`,
144
+ children: [/* @__PURE__ */ b("p", {
145
+ className: "text-sm",
146
+ children: e.content
147
+ }), /* @__PURE__ */ b("p", {
148
+ className: "mt-1 text-[10px] opacity-60",
149
+ children: e.timestamp.toLocaleTimeString([], {
150
+ hour: "2-digit",
151
+ minute: "2-digit"
152
+ })
153
+ })]
154
+ })
155
+ }, e.id))
156
+ }), /* @__PURE__ */ b("div", {
157
+ className: "border-t p-3",
158
+ children: /* @__PURE__ */ x("div", {
159
+ className: "flex gap-2",
160
+ children: [/* @__PURE__ */ b(O, {
161
+ value: N,
162
+ onChange: (e) => P(e.target.value),
163
+ onKeyDown: (e) => e.key === "Enter" && F(),
164
+ placeholder: "Ask about your finances..."
165
+ }), /* @__PURE__ */ b(C, {
166
+ onClick: F,
167
+ disabled: !N.trim(),
168
+ size: "sm",
169
+ children: /* @__PURE__ */ b(h, { className: "h-4 w-4" })
170
+ })]
171
+ })
172
+ })]
173
+ })] }), /* @__PURE__ */ x(w, { children: [/* @__PURE__ */ b(E, {
174
+ className: "pb-3",
175
+ children: /* @__PURE__ */ x(D, {
176
+ className: "flex items-center gap-2 text-base",
177
+ children: [/* @__PURE__ */ b(y, { className: "h-5 w-5" }), "Quick Actions"]
178
+ })
179
+ }), /* @__PURE__ */ b(T, { children: /* @__PURE__ */ b("div", {
180
+ className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-3",
181
+ children: A.map((e) => /* @__PURE__ */ x("button", {
182
+ type: "button",
183
+ className: "group flex items-start gap-3 rounded-lg border p-3 text-left transition-colors hover:bg-accent",
184
+ onClick: () => P(e.title),
185
+ children: [
186
+ /* @__PURE__ */ b(e.icon, { className: `mt-0.5 h-5 w-5 shrink-0 ${e.color}` }),
187
+ /* @__PURE__ */ x("div", {
188
+ className: "min-w-0 flex-1",
189
+ children: [/* @__PURE__ */ b("p", {
190
+ className: "text-sm font-medium",
191
+ children: e.title
192
+ }), /* @__PURE__ */ b("p", {
193
+ className: "mt-0.5 text-xs text-muted-foreground",
194
+ children: e.description
195
+ })]
196
+ }),
197
+ /* @__PURE__ */ b(o, { className: "mt-0.5 h-4 w-4 shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100" })
198
+ ]
199
+ }, e.title))
200
+ }) })] })]
201
+ }), /* @__PURE__ */ x("div", {
202
+ className: "space-y-4 lg:col-span-1",
203
+ children: [
204
+ /* @__PURE__ */ x(w, { children: [/* @__PURE__ */ b(E, {
205
+ className: "pb-2",
206
+ children: /* @__PURE__ */ x(D, {
207
+ className: "flex items-center gap-2 text-sm",
208
+ children: [/* @__PURE__ */ b(c, { className: "h-4 w-4" }), "AI Insights"]
209
+ })
210
+ }), /* @__PURE__ */ x(T, {
211
+ className: "space-y-2 p-3 pt-0",
212
+ children: [I.map((e) => /* @__PURE__ */ x("div", {
213
+ className: "rounded-lg border p-2.5 transition-colors hover:bg-accent",
214
+ children: [/* @__PURE__ */ x("div", {
215
+ className: "mb-1 flex items-start justify-between gap-2",
216
+ children: [/* @__PURE__ */ b("p", {
217
+ className: "text-xs font-medium",
218
+ children: e.title
219
+ }), /* @__PURE__ */ x("span", {
220
+ className: `inline-flex items-center gap-1 rounded-full border px-1.5 py-0.5 text-[10px] font-medium ${R(e.impact)}`,
221
+ children: [L(e.impact), e.impact]
222
+ })]
223
+ }), /* @__PURE__ */ b("p", {
224
+ className: "text-[11px] text-muted-foreground",
225
+ children: e.description
226
+ })]
227
+ }, e.title)), /* @__PURE__ */ b(C, {
228
+ variant: "outline",
229
+ size: "sm",
230
+ className: "w-full",
231
+ children: "View All Insights"
232
+ })]
233
+ })] }),
234
+ /* @__PURE__ */ x(w, { children: [/* @__PURE__ */ b(E, {
235
+ className: "pb-2",
236
+ children: /* @__PURE__ */ x(D, {
237
+ className: "flex items-center gap-2 text-sm",
238
+ children: [/* @__PURE__ */ b(s, { className: "h-4 w-4" }), "Assistant Stats"]
239
+ })
240
+ }), /* @__PURE__ */ b(T, {
241
+ className: "space-y-2 p-3 pt-0",
242
+ children: [
243
+ {
244
+ label: "Total Conversations",
245
+ value: "47"
246
+ },
247
+ {
248
+ label: "Recommendations Given",
249
+ value: "23"
250
+ },
251
+ {
252
+ label: "Actions Taken",
253
+ value: "12"
254
+ },
255
+ {
256
+ label: "Savings Generated",
257
+ value: "$2,450",
258
+ highlight: !0
259
+ }
260
+ ].map((e) => /* @__PURE__ */ x("div", {
261
+ className: "flex items-center justify-between text-sm",
262
+ children: [/* @__PURE__ */ b("span", {
263
+ className: "text-muted-foreground",
264
+ children: e.label
265
+ }), /* @__PURE__ */ b("span", {
266
+ className: `font-medium ${e.highlight ? "text-emerald-600" : ""}`,
267
+ children: e.value
268
+ })]
269
+ }, e.label))
270
+ })] }),
271
+ /* @__PURE__ */ x(w, { children: [/* @__PURE__ */ b(E, {
272
+ className: "pb-2",
273
+ children: /* @__PURE__ */ b(D, {
274
+ className: "text-sm",
275
+ children: "Capabilities"
276
+ })
277
+ }), /* @__PURE__ */ b(T, {
278
+ className: "space-y-1.5 p-3 pt-0",
279
+ children: [
280
+ {
281
+ name: "Portfolio Analysis",
282
+ active: !0
283
+ },
284
+ {
285
+ name: "Investment Advice",
286
+ active: !0
287
+ },
288
+ {
289
+ name: "Tax Optimization",
290
+ active: !0
291
+ },
292
+ {
293
+ name: "Goal Planning",
294
+ active: !0
295
+ },
296
+ {
297
+ name: "Risk Assessment",
298
+ active: !0
299
+ },
300
+ {
301
+ name: "Voice Commands",
302
+ active: !1
303
+ },
304
+ {
305
+ name: "Document Analysis",
306
+ active: !1
307
+ }
308
+ ].map((e) => /* @__PURE__ */ x("div", {
309
+ className: "flex items-center gap-2 text-sm",
310
+ children: [
311
+ e.active ? /* @__PURE__ */ b(d, { className: "h-3.5 w-3.5 text-emerald-600" }) : /* @__PURE__ */ b(f, { className: "h-3.5 w-3.5 text-amber-500" }),
312
+ /* @__PURE__ */ b("span", {
313
+ className: e.active ? "" : "text-muted-foreground",
314
+ children: e.name
315
+ }),
316
+ e.active ? null : /* @__PURE__ */ b(S, {
317
+ variant: "outline",
318
+ className: "ml-auto text-[9px]",
319
+ children: "Soon"
320
+ })
321
+ ]
322
+ }, e.name))
323
+ })] })
324
+ ]
325
+ })]
326
+ })]
327
+ });
328
+ }
329
+ //#endregion
330
+ export { M as AssistantPage };
331
+
332
+ //# sourceMappingURL=AssistantPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantPage.js","names":[],"sources":["../../../src/brainyrich/pages/AssistantPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Input,\n} from '@burdenoff/fe-libs/ui';\nimport {\n MessageSquare,\n Send,\n Briefcase,\n TrendingUp,\n Calculator,\n Target,\n ShieldAlert,\n Receipt,\n Zap,\n CheckCircle2,\n CircleDot,\n AlertTriangle,\n BarChart3,\n Brain,\n ArrowRight,\n} from 'lucide-react';\nimport { useBrainyRichStore } from '../store/brainyrichStore';\n\nconst ASSISTANT_MESSAGE_TIME = new Date(0);\nimport { SectionShell, KpiGrid, formatMoney } from './_shared';\n\ninterface SimpleMessage {\n id: number;\n type: 'user' | 'assistant';\n content: string;\n timestamp: Date;\n}\n\nconst quickActions = [\n {\n title: 'Portfolio Analysis',\n description: 'Performance breakdown and rebalancing suggestions',\n icon: Briefcase,\n color: 'text-blue-600',\n },\n {\n title: 'Market Update',\n description: 'Latest indices, sector performance, and trends',\n icon: TrendingUp,\n color: 'text-emerald-600',\n },\n {\n title: 'Tax Optimization',\n description: 'Deduction planner and tax-loss harvesting strategy',\n icon: Calculator,\n color: 'text-amber-600',\n },\n {\n title: 'Goal Planning',\n description: 'SIP projections and milestone tracking',\n icon: Target,\n color: 'text-purple-600',\n },\n {\n title: 'Risk Assessment',\n description: 'Concentration risk, coverage gaps, stress tests',\n icon: ShieldAlert,\n color: 'text-red-600',\n },\n {\n title: 'Expense Analysis',\n description: 'Premium outflows, advisory fees, and fund costs',\n icon: Receipt,\n color: 'text-teal-600',\n },\n];\n\nfunction generateSimpleResponse(input: string, portfolioValue: string): string {\n const lower = input.toLowerCase();\n if (lower.includes('portfolio')) {\n return `Your total portfolio value is ${portfolioValue}. The Growth Portfolio leads at 12.4% YTD. Technology sector concentration is elevated at 34% — consider trimming overweight positions. I can run a detailed rebalancing scenario if you'd like.`;\n }\n if (lower.includes('market')) {\n return 'S&P 500 is up 1.2% at 5,321. NIFTY 50 gained 0.8% to 23,851. Financials and IT are leading sectors. Bond yields remain stable. Your holdings are outperforming the broader index by 2.1% on average.';\n }\n if (lower.includes('tax')) {\n return 'Your FY 2026-27 tax documents show $3,200 in unrealized losses available for tax-loss harvesting. Section 80C utilization is at 72%. Uploading your rental income proof would complete your filing preparation.';\n }\n if (lower.includes('goal')) {\n return 'Retirement Corpus is 61.6% funded ($1.54M / $2.5M). Child Education Fund is at 45.5% ($364K / $800K). Increasing monthly SIPs by $500 would improve the education fund trajectory by 8 months.';\n }\n if (lower.includes('risk')) {\n return 'You have 3 active risk alerts: equity concentration above policy band (High), insurance under-coverage for dependents (Medium), and emergency corpus at 5.6 months (Low). The high-severity tech concentration needs immediate attention.';\n }\n if (lower.includes('expense') || lower.includes('cost') || lower.includes('fee')) {\n return 'Annual premiums total $44,500 across life and health insurance. Advisory fees run 0.45% AUM. Fund expense ratios average 0.32% weighted. Total annual cost of ownership is approximately $8,200 on your invested portfolio.';\n }\n return `I can help you with portfolio analysis, market updates, tax optimization, goal planning, risk assessment, and expense analysis. Your portfolio is at ${portfolioValue} — what area would you like to focus on?`;\n}\n\nexport function AssistantPage() {\n const { metrics, portfolios, risks, goals } = useBrainyRichStore();\n const totalPortfolioValue = portfolios.reduce((s, p) => s + p.value, 0);\n\n const [messages, setMessages] = useState<SimpleMessage[]>([\n {\n id: 1,\n type: 'assistant',\n content: `Hello! I'm your financial assistant. Your portfolio is at ${formatMoney(totalPortfolioValue)} and you have ${risks.length} risk alerts. Choose a quick action below or ask me anything.`,\n timestamp: ASSISTANT_MESSAGE_TIME,\n },\n ]);\n const [inputValue, setInputValue] = useState('');\n\n const handleSendMessage = () => {\n if (!inputValue.trim()) return;\n\n const userMsg: SimpleMessage = {\n id: messages.length + 1,\n type: 'user',\n content: inputValue,\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, userMsg]);\n setInputValue('');\n\n setTimeout(() => {\n const aiMsg: SimpleMessage = {\n id: messages.length + 2,\n type: 'assistant',\n content: generateSimpleResponse(inputValue, formatMoney(totalPortfolioValue)),\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, aiMsg]);\n }, 800);\n };\n\n const insights = [\n {\n type: 'recommendation' as const,\n title: 'Rebalancing Opportunity',\n description: 'Equity allocation is 5% above target band. Consider rebalancing into bonds.',\n impact: 'Medium' as const,\n },\n {\n type: 'alert' as const,\n title: 'Tax Loss Harvesting',\n description: `$3,200 in unrealized losses available before FY end.`,\n impact: 'High' as const,\n },\n {\n type: 'opportunity' as const,\n title: 'Emergency Fund Gap',\n description: 'Liquid reserve covers 5.6 months. Consider increasing to 6-month target.',\n impact: 'Low' as const,\n },\n ];\n\n const impactIcon = (impact: string) => {\n if (impact === 'High') return <AlertTriangle className=\"h-3 w-3\" />;\n if (impact === 'Medium') return <CircleDot className=\"h-3 w-3\" />;\n return <CheckCircle2 className=\"h-3 w-3\" />;\n };\n\n const impactColor = (impact: string) => {\n if (impact === 'High') return 'bg-red-50 text-red-700 border-red-200';\n if (impact === 'Medium') return 'bg-amber-50 text-amber-700 border-amber-200';\n return 'bg-green-50 text-green-700 border-green-200';\n };\n\n const avgGoalPct = goals.length\n ? Math.round(\n goals.reduce((s, g) => s + (g.currentAmount / g.targetAmount) * 100, 0) / goals.length\n )\n : 0;\n\n return (\n <SectionShell\n title=\"Financial Assistant\"\n description=\"Quick financial advice, insights, and action shortcuts\"\n badges={['Online']}\n actionLabel=\"New Conversation\"\n >\n {/* Stats KPIs */}\n <KpiGrid\n items={[\n { label: 'Conversations', value: '47', trend: '+5 this week' },\n { label: 'Recommendations', value: '23', trend: '18 accepted' },\n { label: 'Actions Taken', value: '12', trend: '$2,450 savings' },\n {\n label: 'Avg Goal Progress',\n value: `${avgGoalPct}%`,\n trend: `${goals.length} active goals`,\n },\n ]}\n />\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-4\">\n {/* Main column */}\n <div className=\"space-y-6 lg:col-span-3\">\n {/* Chat */}\n <Card>\n <CardHeader className=\"border-b py-3\">\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <MessageSquare className=\"h-5 w-5\" />\n Chat\n <div className=\"ml-auto flex items-center gap-1 text-xs font-normal text-muted-foreground\">\n <div className=\"h-2 w-2 animate-pulse rounded-full bg-green-500\" />\n Ready\n </div>\n </CardTitle>\n </CardHeader>\n <CardContent className=\"p-0\">\n <div className=\"h-80 space-y-3 overflow-y-auto p-4\">\n {messages.map((msg) => (\n <div\n key={msg.id}\n className={`flex ${msg.type === 'user' ? 'justify-end' : 'justify-start'}`}\n >\n <div\n className={`max-w-[75%] rounded-lg px-4 py-2 ${\n msg.type === 'user' ? 'bg-primary text-primary-foreground' : 'bg-muted'\n }`}\n >\n <p className=\"text-sm\">{msg.content}</p>\n <p className=\"mt-1 text-[10px] opacity-60\">\n {msg.timestamp.toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n })}\n </p>\n </div>\n </div>\n ))}\n </div>\n <div className=\"border-t p-3\">\n <div className=\"flex gap-2\">\n <Input\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && handleSendMessage()}\n placeholder=\"Ask about your finances...\"\n />\n <Button onClick={handleSendMessage} disabled={!inputValue.trim()} size=\"sm\">\n <Send className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Quick actions */}\n <Card>\n <CardHeader className=\"pb-3\">\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Zap className=\"h-5 w-5\" />\n Quick Actions\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {quickActions.map((action) => (\n <button\n key={action.title}\n type=\"button\"\n className=\"group flex items-start gap-3 rounded-lg border p-3 text-left transition-colors hover:bg-accent\"\n onClick={() => setInputValue(action.title)}\n >\n <action.icon className={`mt-0.5 h-5 w-5 shrink-0 ${action.color}`} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium\">{action.title}</p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{action.description}</p>\n </div>\n <ArrowRight className=\"mt-0.5 h-4 w-4 shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100\" />\n </button>\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-4 lg:col-span-1\">\n {/* AI Insights */}\n <Card>\n <CardHeader className=\"pb-2\">\n <CardTitle className=\"flex items-center gap-2 text-sm\">\n <Brain className=\"h-4 w-4\" />\n AI Insights\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2 p-3 pt-0\">\n {insights.map((insight) => (\n <div\n key={insight.title}\n className=\"rounded-lg border p-2.5 transition-colors hover:bg-accent\"\n >\n <div className=\"mb-1 flex items-start justify-between gap-2\">\n <p className=\"text-xs font-medium\">{insight.title}</p>\n <span\n className={`inline-flex items-center gap-1 rounded-full border px-1.5 py-0.5 text-[10px] font-medium ${impactColor(insight.impact)}`}\n >\n {impactIcon(insight.impact)}\n {insight.impact}\n </span>\n </div>\n <p className=\"text-[11px] text-muted-foreground\">{insight.description}</p>\n </div>\n ))}\n <Button variant=\"outline\" size=\"sm\" className=\"w-full\">\n View All Insights\n </Button>\n </CardContent>\n </Card>\n\n {/* Assistant Stats */}\n <Card>\n <CardHeader className=\"pb-2\">\n <CardTitle className=\"flex items-center gap-2 text-sm\">\n <BarChart3 className=\"h-4 w-4\" />\n Assistant Stats\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2 p-3 pt-0\">\n {[\n { label: 'Total Conversations', value: '47' },\n { label: 'Recommendations Given', value: '23' },\n { label: 'Actions Taken', value: '12' },\n { label: 'Savings Generated', value: '$2,450', highlight: true },\n ].map((stat) => (\n <div key={stat.label} className=\"flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground\">{stat.label}</span>\n <span className={`font-medium ${stat.highlight ? 'text-emerald-600' : ''}`}>\n {stat.value}\n </span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n {/* Features */}\n <Card>\n <CardHeader className=\"pb-2\">\n <CardTitle className=\"text-sm\">Capabilities</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-1.5 p-3 pt-0\">\n {[\n { name: 'Portfolio Analysis', active: true },\n { name: 'Investment Advice', active: true },\n { name: 'Tax Optimization', active: true },\n { name: 'Goal Planning', active: true },\n { name: 'Risk Assessment', active: true },\n { name: 'Voice Commands', active: false },\n { name: 'Document Analysis', active: false },\n ].map((feat) => (\n <div key={feat.name} className=\"flex items-center gap-2 text-sm\">\n {feat.active ? (\n <CheckCircle2 className=\"h-3.5 w-3.5 text-emerald-600\" />\n ) : (\n <CircleDot className=\"h-3.5 w-3.5 text-amber-500\" />\n )}\n <span className={feat.active ? '' : 'text-muted-foreground'}>{feat.name}</span>\n {!feat.active ? (\n <Badge variant=\"outline\" className=\"ml-auto text-[9px]\">\n Soon\n </Badge>\n ) : null}\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n </div>\n </SectionShell>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function DashboardPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=DashboardPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardPage.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/pages/DashboardPage.tsx"],"names":[],"mappings":"AA8BA,wBAAgB,aAAa,4CAkS5B"}
@@ -0,0 +1,258 @@
1
+ import { tWithFallback as e } from "../utils/i18n.js";
2
+ import { useBrainyRichStore as t } from "../store/brainyrichStore.js";
3
+ import { KpiGrid as n, SectionShell as r, formatMoney as i, statusBadgeVariant as a } from "./_shared.js";
4
+ import { ArrowDownRight as o, ArrowUpRight as s, BarChart3 as c, Bell as l, Briefcase as u, Target as d, TrendingUp as f, Wallet as p } from "lucide-react";
5
+ import { useI18n as m } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
6
+ import { jsx as h, jsxs as g } from "react/jsx-runtime";
7
+ import { Badge as _, Button as v, Card as y, CardContent as b, CardDescription as x, CardHeader as S, CardTitle as C } from "@burdenoff/fe-libs/ui";
8
+ //#region src/brainyrich/pages/DashboardPage.tsx
9
+ var w = [
10
+ {
11
+ name: "S&P 500",
12
+ value: "5,321.08",
13
+ change: "+1.2%",
14
+ positive: !0
15
+ },
16
+ {
17
+ name: "NIFTY 50",
18
+ value: "23,851.40",
19
+ change: "+0.8%",
20
+ positive: !0
21
+ },
22
+ {
23
+ name: "NASDAQ",
24
+ value: "16,742.39",
25
+ change: "-0.3%",
26
+ positive: !1
27
+ }
28
+ ];
29
+ function T() {
30
+ let { t: T } = m(), { metrics: E, workItems: D, portfolios: O, holdings: k, goals: A } = t(), j = (t, n, r) => e(T, t, n, r), M = E.map((e) => ({
31
+ ...e,
32
+ label: e.label === "Net Worth" ? j("brainyrich.dashboard.metrics.netWorth", "Net Worth") : e.label === "Invested Assets" ? j("brainyrich.dashboard.metrics.investedAssets", "Invested Assets") : e.label === "Liquidity" ? j("brainyrich.dashboard.metrics.liquidity", "Liquidity") : e.label === "Goal Completion" ? j("brainyrich.dashboard.metrics.goalCompletion", "Goal Completion") : e.label
33
+ })), N = O.reduce((e, t) => e + t.value, 0), P = A.length ? Math.round(A.reduce((e, t) => e + t.currentAmount / t.targetAmount * 100, 0) / A.length) : 0;
34
+ return /* @__PURE__ */ g(r, {
35
+ title: j("brainyrich.dashboard.title", "Wealth Dashboard"),
36
+ description: j("brainyrich.dashboard.description", "Your consolidated financial overview at a glance"),
37
+ actionLabel: j("brainyrich.dashboard.actions.healthCheck", "Run Health Check"),
38
+ badges: [j("brainyrich.dashboard.badges.liveData", "Live Data")],
39
+ children: [
40
+ /* @__PURE__ */ h(n, { items: M }),
41
+ /* @__PURE__ */ g("div", {
42
+ className: "grid gap-6 lg:grid-cols-3",
43
+ children: [/* @__PURE__ */ g(y, {
44
+ className: "lg:col-span-2",
45
+ children: [/* @__PURE__ */ g(S, { children: [/* @__PURE__ */ g(C, {
46
+ className: "flex items-center gap-2",
47
+ children: [/* @__PURE__ */ h(u, { className: "h-5 w-5" }), j("brainyrich.dashboard.sections.portfolioSnapshot", "Portfolio Snapshot")]
48
+ }), /* @__PURE__ */ h(x, { children: j("brainyrich.dashboard.sections.portfolioSnapshotDescription", "Current allocation across strategies") })] }), /* @__PURE__ */ g(b, {
49
+ className: "space-y-4",
50
+ children: [/* @__PURE__ */ g("div", {
51
+ className: "flex items-baseline justify-between",
52
+ children: [/* @__PURE__ */ h("span", {
53
+ className: "text-2xl font-bold",
54
+ children: i(N)
55
+ }), /* @__PURE__ */ g("span", {
56
+ className: "text-sm text-emerald-600 flex items-center gap-1",
57
+ children: [
58
+ /* @__PURE__ */ h(f, { className: "h-3 w-3" }),
59
+ j("brainyrich.dashboard.weightedYtdPrefix", "Weighted YTD +"),
60
+ (O.reduce((e, t) => e + t.ytdReturnPct * t.value, 0) / N).toFixed(1),
61
+ "%"
62
+ ]
63
+ })]
64
+ }), O.map((e) => {
65
+ let t = Math.round(e.value / N * 100);
66
+ return /* @__PURE__ */ g("div", {
67
+ className: "space-y-1",
68
+ children: [
69
+ /* @__PURE__ */ g("div", {
70
+ className: "flex items-center justify-between text-sm",
71
+ children: [/* @__PURE__ */ h("span", {
72
+ className: "font-medium",
73
+ children: e.name
74
+ }), /* @__PURE__ */ g("span", { children: [
75
+ i(e.value),
76
+ " (",
77
+ t,
78
+ "%)"
79
+ ] })]
80
+ }),
81
+ /* @__PURE__ */ h("div", {
82
+ className: "h-2 rounded bg-muted overflow-hidden",
83
+ children: /* @__PURE__ */ h("div", {
84
+ className: "h-2 rounded bg-primary",
85
+ style: { width: `${t}%` }
86
+ })
87
+ }),
88
+ /* @__PURE__ */ g("div", {
89
+ className: "flex items-center justify-between text-xs text-muted-foreground",
90
+ children: [/* @__PURE__ */ g("span", { children: [
91
+ j("brainyrich.dashboard.portfolio.ytdPrefix", "YTD +"),
92
+ e.ytdReturnPct,
93
+ "%"
94
+ ] }), /* @__PURE__ */ h(_, {
95
+ variant: e.risk === "High" ? "destructive" : e.risk === "Moderate" ? "secondary" : "outline",
96
+ className: "text-[10px]",
97
+ children: e.risk
98
+ })]
99
+ })
100
+ ]
101
+ }, e.id);
102
+ })]
103
+ })]
104
+ }), /* @__PURE__ */ g("div", {
105
+ className: "space-y-4",
106
+ children: [/* @__PURE__ */ g(y, { children: [/* @__PURE__ */ h(S, {
107
+ className: "pb-3",
108
+ children: /* @__PURE__ */ g(C, {
109
+ className: "flex items-center gap-2 text-base",
110
+ children: [/* @__PURE__ */ h(c, { className: "h-4 w-4" }), j("brainyrich.dashboard.sections.marketSummary", "Market Summary")]
111
+ })
112
+ }), /* @__PURE__ */ h(b, {
113
+ className: "space-y-3",
114
+ children: w.map((e) => /* @__PURE__ */ g("div", {
115
+ className: "flex items-center justify-between",
116
+ children: [/* @__PURE__ */ h("span", {
117
+ className: "text-sm font-medium",
118
+ children: e.name
119
+ }), /* @__PURE__ */ g("div", {
120
+ className: "text-right",
121
+ children: [/* @__PURE__ */ h("div", {
122
+ className: "text-sm",
123
+ children: e.value
124
+ }), /* @__PURE__ */ g("div", {
125
+ className: `text-xs flex items-center gap-0.5 ${e.positive ? "text-emerald-600" : "text-red-600"}`,
126
+ children: [e.positive ? /* @__PURE__ */ h(s, { className: "h-3 w-3" }) : /* @__PURE__ */ h(o, { className: "h-3 w-3" }), e.change]
127
+ })]
128
+ })]
129
+ }, e.name))
130
+ })] }), /* @__PURE__ */ g(y, { children: [/* @__PURE__ */ h(S, {
131
+ className: "pb-3",
132
+ children: /* @__PURE__ */ g(C, {
133
+ className: "flex items-center gap-2 text-base",
134
+ children: [/* @__PURE__ */ h(d, { className: "h-4 w-4" }), j("brainyrich.dashboard.sections.goalProgress", "Goal Progress")]
135
+ })
136
+ }), /* @__PURE__ */ g(b, {
137
+ className: "space-y-3",
138
+ children: [/* @__PURE__ */ g("div", {
139
+ className: "text-center",
140
+ children: [/* @__PURE__ */ g("span", {
141
+ className: "text-3xl font-bold",
142
+ children: [P, "%"]
143
+ }), /* @__PURE__ */ h("p", {
144
+ className: "text-xs text-muted-foreground mt-1",
145
+ children: j("brainyrich.dashboard.goalProgress.averageCompletion", "Average goal completion")
146
+ })]
147
+ }), A.map((e) => {
148
+ let t = Math.round(e.currentAmount / e.targetAmount * 100);
149
+ return /* @__PURE__ */ g("div", {
150
+ className: "space-y-1",
151
+ children: [/* @__PURE__ */ g("div", {
152
+ className: "flex justify-between text-xs",
153
+ children: [/* @__PURE__ */ h("span", { children: e.title }), /* @__PURE__ */ g("span", { children: [t, "%"] })]
154
+ }), /* @__PURE__ */ h("div", {
155
+ className: "h-1.5 rounded bg-muted overflow-hidden",
156
+ children: /* @__PURE__ */ h("div", {
157
+ className: "h-1.5 rounded bg-emerald-500",
158
+ style: { width: `${t}%` }
159
+ })
160
+ })]
161
+ }, e.id);
162
+ })]
163
+ })] })]
164
+ })]
165
+ }),
166
+ /* @__PURE__ */ g(y, { children: [/* @__PURE__ */ g(S, { children: [/* @__PURE__ */ g(C, {
167
+ className: "flex items-center gap-2",
168
+ children: [/* @__PURE__ */ h(p, { className: "h-5 w-5" }), j("brainyrich.dashboard.sections.topHoldings", "Top Holdings")]
169
+ }), /* @__PURE__ */ h(x, { children: j("brainyrich.dashboard.sections.topHoldingsDescription", "Highest-value positions across all portfolios") })] }), /* @__PURE__ */ h(b, { children: /* @__PURE__ */ h("div", {
170
+ className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-4",
171
+ children: k.map((e) => /* @__PURE__ */ g("div", {
172
+ className: "flex items-center justify-between rounded-lg border p-3",
173
+ children: [/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("p", {
174
+ className: "font-semibold text-sm",
175
+ children: e.symbol
176
+ }), /* @__PURE__ */ h("p", {
177
+ className: "text-xs text-muted-foreground",
178
+ children: e.sector
179
+ })] }), /* @__PURE__ */ g("div", {
180
+ className: "text-right",
181
+ children: [/* @__PURE__ */ h("p", {
182
+ className: "text-sm font-medium",
183
+ children: i(e.marketValue)
184
+ }), /* @__PURE__ */ g("p", {
185
+ className: `text-xs ${e.changePct >= 0 ? "text-emerald-600" : "text-red-600"}`,
186
+ children: [
187
+ e.changePct >= 0 ? "+" : "",
188
+ e.changePct,
189
+ "%"
190
+ ]
191
+ })]
192
+ })]
193
+ }, e.symbol))
194
+ }) })] }),
195
+ /* @__PURE__ */ g(y, { children: [/* @__PURE__ */ g(S, { children: [/* @__PURE__ */ g(C, {
196
+ className: "flex items-center gap-2",
197
+ children: [/* @__PURE__ */ h(l, { className: "h-5 w-5" }), j("brainyrich.dashboard.sections.activeWorkItems", "Active Work Items")]
198
+ }), /* @__PURE__ */ h(x, { children: j("brainyrich.dashboard.sections.activeWorkItemsDescription", "Tasks and initiatives from your wealth operations teams") })] }), /* @__PURE__ */ h(b, {
199
+ className: "space-y-3",
200
+ children: D.map((e) => /* @__PURE__ */ g("div", {
201
+ className: "flex items-center justify-between rounded-lg border p-3",
202
+ children: [/* @__PURE__ */ g("div", {
203
+ className: "space-y-0.5",
204
+ children: [/* @__PURE__ */ h("p", {
205
+ className: "text-sm font-medium",
206
+ children: e.title
207
+ }), /* @__PURE__ */ g("p", {
208
+ className: "text-xs text-muted-foreground",
209
+ children: [
210
+ e.owner,
211
+ " · ",
212
+ e.updatedAt
213
+ ]
214
+ })]
215
+ }), /* @__PURE__ */ h(_, {
216
+ variant: a(e.status),
217
+ children: e.status.replace("_", " ")
218
+ })]
219
+ }, e.id))
220
+ })] }),
221
+ /* @__PURE__ */ h("div", {
222
+ className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-4",
223
+ children: [
224
+ {
225
+ label: j("brainyrich.dashboard.quickActions.placeTradeOrder", "Place Trade Order"),
226
+ desc: j("brainyrich.dashboard.quickActions.placeTradeOrderDesc", "Buy or sell securities")
227
+ },
228
+ {
229
+ label: j("brainyrich.dashboard.quickActions.linkNewAccount", "Link New Account"),
230
+ desc: j("brainyrich.dashboard.quickActions.linkNewAccountDesc", "Connect a financial account")
231
+ },
232
+ {
233
+ label: j("brainyrich.dashboard.quickActions.generateReport", "Generate Report"),
234
+ desc: j("brainyrich.dashboard.quickActions.generateReportDesc", "Create a wealth snapshot")
235
+ },
236
+ {
237
+ label: j("brainyrich.dashboard.quickActions.askWealthAi", "Ask Wealth AI"),
238
+ desc: j("brainyrich.dashboard.quickActions.askWealthAiDesc", "Get personalized advice")
239
+ }
240
+ ].map((e) => /* @__PURE__ */ g(v, {
241
+ variant: "outline",
242
+ className: "h-auto flex-col items-start p-4 text-left",
243
+ children: [/* @__PURE__ */ h("span", {
244
+ className: "font-medium text-sm",
245
+ children: e.label
246
+ }), /* @__PURE__ */ h("span", {
247
+ className: "text-xs text-muted-foreground",
248
+ children: e.desc
249
+ })]
250
+ }, e.label))
251
+ })
252
+ ]
253
+ });
254
+ }
255
+ //#endregion
256
+ export { T as DashboardPage };
257
+
258
+ //# sourceMappingURL=DashboardPage.js.map