@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,358 @@
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 { AlertTriangle as i, CheckCircle as a, Shield as o, Target as s, TrendingUp as c, UserPlus as l } from "lucide-react";
4
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
5
+ import { Badge as f, Button as p, Card as m, CardContent as h, CardDescription as g, CardHeader as _, CardTitle as v, Tabs as y, TabsContent as b, TabsList as x, TabsTrigger as S } from "@burdenoff/fe-libs/ui";
6
+ //#region src/brainyrich/pages/FamilyPage.tsx
7
+ var C = [
8
+ {
9
+ id: "f1",
10
+ name: "Vikram Raghavan",
11
+ role: "Primary Owner",
12
+ status: "Active",
13
+ permissions: "Full Access",
14
+ lastActive: "Just now"
15
+ },
16
+ {
17
+ id: "f2",
18
+ name: "Priya Raghavan",
19
+ role: "Spouse",
20
+ status: "Active",
21
+ permissions: "Financial Planning, View Accounts",
22
+ lastActive: "30 min ago"
23
+ },
24
+ {
25
+ id: "f3",
26
+ name: "Aditya Raghavan",
27
+ role: "Child",
28
+ status: "Active",
29
+ permissions: "View Goals, Education Fund",
30
+ lastActive: "2 hrs ago"
31
+ },
32
+ {
33
+ id: "f4",
34
+ name: "Kavya Raghavan",
35
+ role: "Child",
36
+ status: "Pending",
37
+ permissions: "View Goals, Education Fund",
38
+ lastActive: "Invited"
39
+ }
40
+ ], w = [
41
+ {
42
+ id: "fg1",
43
+ title: "Emergency Fund",
44
+ category: "Safety Net",
45
+ target: 6e5,
46
+ current: 54e4,
47
+ status: "On Track",
48
+ assignees: ["Vikram", "Priya"]
49
+ },
50
+ {
51
+ id: "fg2",
52
+ title: "Aditya's College Fund",
53
+ category: "Education",
54
+ target: 25e5,
55
+ current: 118e4,
56
+ status: "On Track",
57
+ assignees: [
58
+ "Vikram",
59
+ "Priya",
60
+ "Aditya"
61
+ ]
62
+ },
63
+ {
64
+ id: "fg3",
65
+ title: "Family Vacation - Japan",
66
+ category: "Lifestyle",
67
+ target: 4e5,
68
+ current: 31e4,
69
+ status: "On Track",
70
+ assignees: ["Vikram", "Priya"]
71
+ },
72
+ {
73
+ id: "fg4",
74
+ title: "Home Renovation",
75
+ category: "Home",
76
+ target: 12e5,
77
+ current: 38e4,
78
+ status: "Behind",
79
+ assignees: ["Vikram", "Priya"]
80
+ }
81
+ ];
82
+ function T() {
83
+ let { goals: T } = e();
84
+ return /* @__PURE__ */ d(n, {
85
+ title: "Family Wealth Hub",
86
+ description: "Collaborative financial planning for your family members",
87
+ actionLabel: "Invite Member",
88
+ badges: ["4 Family Members"],
89
+ children: [/* @__PURE__ */ u(t, { items: [
90
+ {
91
+ label: "Active Members",
92
+ value: "3/4",
93
+ trend: "1 pending invite"
94
+ },
95
+ {
96
+ label: "Family Net Worth",
97
+ value: r(245e4),
98
+ trend: "+6.2% YTD"
99
+ },
100
+ {
101
+ label: "Family Goals",
102
+ value: `${w.filter((e) => e.status === "On Track").length}/${w.length}`,
103
+ trend: "On track"
104
+ },
105
+ {
106
+ label: "Monthly Budget",
107
+ value: r(95e3),
108
+ trend: "Shared allocation"
109
+ }
110
+ ] }), /* @__PURE__ */ d(y, {
111
+ defaultValue: "overview",
112
+ className: "space-y-4",
113
+ children: [
114
+ /* @__PURE__ */ d(x, {
115
+ className: "grid w-full grid-cols-3",
116
+ children: [
117
+ /* @__PURE__ */ u(S, {
118
+ value: "overview",
119
+ children: "Overview"
120
+ }),
121
+ /* @__PURE__ */ u(S, {
122
+ value: "members",
123
+ children: "Members"
124
+ }),
125
+ /* @__PURE__ */ u(S, {
126
+ value: "goals",
127
+ children: "Family Goals"
128
+ })
129
+ ]
130
+ }),
131
+ /* @__PURE__ */ d(b, {
132
+ value: "overview",
133
+ className: "space-y-4",
134
+ children: [/* @__PURE__ */ d("div", {
135
+ className: "grid gap-4 lg:grid-cols-2",
136
+ children: [/* @__PURE__ */ d(m, { children: [/* @__PURE__ */ u(_, { children: /* @__PURE__ */ d(v, {
137
+ className: "flex items-center gap-2 text-base",
138
+ children: [/* @__PURE__ */ u(c, { className: "h-4 w-4" }), "Recent Family Activity"]
139
+ }) }), /* @__PURE__ */ u(h, {
140
+ className: "space-y-3",
141
+ children: [
142
+ {
143
+ member: "Priya Raghavan",
144
+ action: "Updated emergency fund goal",
145
+ time: "2 hours ago"
146
+ },
147
+ {
148
+ member: "Vikram Raghavan",
149
+ action: "Added $5,000 to vacation savings",
150
+ time: "1 day ago"
151
+ },
152
+ {
153
+ member: "Aditya Raghavan",
154
+ action: "Checked college fund progress",
155
+ time: "2 days ago"
156
+ },
157
+ {
158
+ member: "Priya Raghavan",
159
+ action: "Invited Kavya to family account",
160
+ time: "3 days ago"
161
+ }
162
+ ].map((e, t) => /* @__PURE__ */ d("div", {
163
+ className: "flex items-center gap-3 rounded-lg border p-2.5",
164
+ children: [
165
+ /* @__PURE__ */ u("div", {
166
+ className: "flex h-8 w-8 items-center justify-center rounded-full bg-blue-100 text-xs font-bold text-blue-600",
167
+ children: e.member.split(" ").map((e) => e[0]).join("")
168
+ }),
169
+ /* @__PURE__ */ d("div", {
170
+ className: "flex-1",
171
+ children: [/* @__PURE__ */ u("p", {
172
+ className: "text-sm font-medium",
173
+ children: e.member
174
+ }), /* @__PURE__ */ u("p", {
175
+ className: "text-xs text-muted-foreground",
176
+ children: e.action
177
+ })]
178
+ }),
179
+ /* @__PURE__ */ u("span", {
180
+ className: "text-xs text-muted-foreground",
181
+ children: e.time
182
+ })
183
+ ]
184
+ }, t))
185
+ })] }), /* @__PURE__ */ d(m, { children: [/* @__PURE__ */ u(_, { children: /* @__PURE__ */ d(v, {
186
+ className: "flex items-center gap-2 text-base",
187
+ children: [/* @__PURE__ */ u(s, { className: "h-4 w-4" }), "Goal Progress Summary"]
188
+ }) }), /* @__PURE__ */ u(h, {
189
+ className: "space-y-3",
190
+ children: w.map((e) => {
191
+ let t = Math.round(e.current / e.target * 100);
192
+ return /* @__PURE__ */ d("div", {
193
+ className: "space-y-1",
194
+ children: [
195
+ /* @__PURE__ */ d("div", {
196
+ className: "flex justify-between text-sm",
197
+ children: [/* @__PURE__ */ u("span", {
198
+ className: "font-medium",
199
+ children: e.title
200
+ }), /* @__PURE__ */ d("span", { children: [t, "%"] })]
201
+ }),
202
+ /* @__PURE__ */ u("div", {
203
+ className: "h-2 rounded bg-muted overflow-hidden",
204
+ children: /* @__PURE__ */ u("div", {
205
+ className: `h-2 rounded ${e.status === "On Track" ? "bg-emerald-500" : "bg-yellow-500"}`,
206
+ style: { width: `${t}%` }
207
+ })
208
+ }),
209
+ /* @__PURE__ */ d("div", {
210
+ className: "flex justify-between text-xs text-muted-foreground",
211
+ children: [/* @__PURE__ */ u("span", { children: r(e.current) }), /* @__PURE__ */ u("span", { children: r(e.target) })]
212
+ })
213
+ ]
214
+ }, e.id);
215
+ })
216
+ })] })]
217
+ }), /* @__PURE__ */ d(m, { children: [/* @__PURE__ */ u(_, { children: /* @__PURE__ */ u(v, { children: "Family Financial Health" }) }), /* @__PURE__ */ u(h, { children: /* @__PURE__ */ u("div", {
218
+ className: "grid grid-cols-1 md:grid-cols-3 gap-4",
219
+ children: [
220
+ {
221
+ icon: a,
222
+ label: "Emergency Fund",
223
+ detail: "90% funded",
224
+ color: "bg-emerald-50 text-emerald-600"
225
+ },
226
+ {
227
+ icon: c,
228
+ label: "Savings Rate",
229
+ detail: "24% monthly",
230
+ color: "bg-blue-50 text-blue-600"
231
+ },
232
+ {
233
+ icon: i,
234
+ label: "Insurance Review",
235
+ detail: "Due for update",
236
+ color: "bg-yellow-50 text-yellow-600"
237
+ }
238
+ ].map((e) => /* @__PURE__ */ d("div", {
239
+ className: `text-center p-4 rounded-lg ${e.color.split(" ")[0]}`,
240
+ children: [
241
+ /* @__PURE__ */ u(e.icon, { className: `h-7 w-7 mx-auto mb-2 ${e.color.split(" ")[1]}` }),
242
+ /* @__PURE__ */ u("p", {
243
+ className: "font-semibold text-sm",
244
+ children: e.label
245
+ }),
246
+ /* @__PURE__ */ u("p", {
247
+ className: "text-xs text-muted-foreground",
248
+ children: e.detail
249
+ })
250
+ ]
251
+ }, e.label))
252
+ }) })] })]
253
+ }),
254
+ /* @__PURE__ */ u(b, {
255
+ value: "members",
256
+ className: "space-y-4",
257
+ children: /* @__PURE__ */ d(m, { children: [/* @__PURE__ */ d(_, {
258
+ className: "flex flex-row items-center justify-between",
259
+ children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u(v, { children: "Family Members" }), /* @__PURE__ */ u(g, { children: "Manage access and permissions" })] }), /* @__PURE__ */ d(p, {
260
+ size: "sm",
261
+ children: [/* @__PURE__ */ u(l, { className: "mr-1 h-4 w-4" }), "Invite"]
262
+ })]
263
+ }), /* @__PURE__ */ u(h, {
264
+ className: "space-y-3",
265
+ children: C.map((e) => /* @__PURE__ */ d("div", {
266
+ className: "flex items-center justify-between rounded-lg border p-3",
267
+ children: [/* @__PURE__ */ d("div", {
268
+ className: "flex items-center gap-3",
269
+ children: [/* @__PURE__ */ u("div", {
270
+ className: "flex h-10 w-10 items-center justify-center rounded-full bg-blue-100 font-bold text-sm text-blue-600",
271
+ children: e.name.split(" ").map((e) => e[0]).join("")
272
+ }), /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
273
+ className: "font-medium text-sm",
274
+ children: e.name
275
+ }), /* @__PURE__ */ d("p", {
276
+ className: "text-xs text-muted-foreground",
277
+ children: [
278
+ e.role,
279
+ " · ",
280
+ e.permissions
281
+ ]
282
+ })] })]
283
+ }), /* @__PURE__ */ d("div", {
284
+ className: "flex items-center gap-2",
285
+ children: [
286
+ /* @__PURE__ */ u(f, {
287
+ variant: e.status === "Active" ? "default" : "secondary",
288
+ children: e.status
289
+ }),
290
+ /* @__PURE__ */ u("span", {
291
+ className: "text-xs text-muted-foreground",
292
+ children: e.lastActive
293
+ }),
294
+ /* @__PURE__ */ u(p, {
295
+ variant: "outline",
296
+ size: "sm",
297
+ children: /* @__PURE__ */ u(o, { className: "h-3 w-3" })
298
+ })
299
+ ]
300
+ })]
301
+ }, e.id))
302
+ })] })
303
+ }),
304
+ /* @__PURE__ */ u(b, {
305
+ value: "goals",
306
+ className: "space-y-4",
307
+ children: w.map((e) => {
308
+ let t = Math.round(e.current / e.target * 100);
309
+ return /* @__PURE__ */ u(m, { children: /* @__PURE__ */ d(h, {
310
+ className: "p-4 space-y-3",
311
+ children: [
312
+ /* @__PURE__ */ d("div", {
313
+ className: "flex items-center justify-between",
314
+ children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
315
+ className: "font-semibold",
316
+ children: e.title
317
+ }), /* @__PURE__ */ d("p", {
318
+ className: "text-xs text-muted-foreground",
319
+ children: [
320
+ e.category,
321
+ " · Assigned to: ",
322
+ e.assignees.join(", ")
323
+ ]
324
+ })] }), /* @__PURE__ */ u(f, {
325
+ variant: e.status === "On Track" ? "default" : "secondary",
326
+ children: e.status
327
+ })]
328
+ }),
329
+ /* @__PURE__ */ u("div", {
330
+ className: "h-3 rounded bg-muted overflow-hidden",
331
+ children: /* @__PURE__ */ u("div", {
332
+ className: `h-3 rounded ${e.status === "On Track" ? "bg-emerald-500" : "bg-yellow-500"}`,
333
+ style: { width: `${t}%` }
334
+ })
335
+ }),
336
+ /* @__PURE__ */ d("div", {
337
+ className: "flex justify-between text-sm",
338
+ children: [/* @__PURE__ */ d("span", { children: [r(e.current), " saved"] }), /* @__PURE__ */ d("span", {
339
+ className: "font-medium",
340
+ children: [
341
+ t,
342
+ "% of ",
343
+ r(e.target)
344
+ ]
345
+ })]
346
+ })
347
+ ]
348
+ }) }, e.id);
349
+ })
350
+ })
351
+ ]
352
+ })]
353
+ });
354
+ }
355
+ //#endregion
356
+ export { T as FamilyPage };
357
+
358
+ //# sourceMappingURL=FamilyPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FamilyPage.js","names":[],"sources":["../../../src/brainyrich/pages/FamilyPage.tsx"],"sourcesContent":["import {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Badge,\n Button,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Users,\n UserPlus,\n Shield,\n Target,\n TrendingUp,\n CheckCircle,\n AlertTriangle,\n} from 'lucide-react';\nimport { useBrainyRichStore } from '../store/brainyrichStore';\nimport { SectionShell, KpiGrid, formatMoney } from './_shared';\n\nconst familyMembers = [\n {\n id: 'f1',\n name: 'Vikram Raghavan',\n role: 'Primary Owner',\n status: 'Active',\n permissions: 'Full Access',\n lastActive: 'Just now',\n },\n {\n id: 'f2',\n name: 'Priya Raghavan',\n role: 'Spouse',\n status: 'Active',\n permissions: 'Financial Planning, View Accounts',\n lastActive: '30 min ago',\n },\n {\n id: 'f3',\n name: 'Aditya Raghavan',\n role: 'Child',\n status: 'Active',\n permissions: 'View Goals, Education Fund',\n lastActive: '2 hrs ago',\n },\n {\n id: 'f4',\n name: 'Kavya Raghavan',\n role: 'Child',\n status: 'Pending',\n permissions: 'View Goals, Education Fund',\n lastActive: 'Invited',\n },\n];\n\nconst familyGoals = [\n {\n id: 'fg1',\n title: 'Emergency Fund',\n category: 'Safety Net',\n target: 600000,\n current: 540000,\n status: 'On Track',\n assignees: ['Vikram', 'Priya'],\n },\n {\n id: 'fg2',\n title: \"Aditya's College Fund\",\n category: 'Education',\n target: 2500000,\n current: 1180000,\n status: 'On Track',\n assignees: ['Vikram', 'Priya', 'Aditya'],\n },\n {\n id: 'fg3',\n title: 'Family Vacation - Japan',\n category: 'Lifestyle',\n target: 400000,\n current: 310000,\n status: 'On Track',\n assignees: ['Vikram', 'Priya'],\n },\n {\n id: 'fg4',\n title: 'Home Renovation',\n category: 'Home',\n target: 1200000,\n current: 380000,\n status: 'Behind',\n assignees: ['Vikram', 'Priya'],\n },\n];\n\nexport function FamilyPage() {\n const { goals } = useBrainyRichStore();\n\n return (\n <SectionShell\n title=\"Family Wealth Hub\"\n description=\"Collaborative financial planning for your family members\"\n actionLabel=\"Invite Member\"\n badges={['4 Family Members']}\n >\n <KpiGrid\n items={[\n { label: 'Active Members', value: '3/4', trend: '1 pending invite' },\n { label: 'Family Net Worth', value: formatMoney(2450000), trend: '+6.2% YTD' },\n {\n label: 'Family Goals',\n value: `${familyGoals.filter((g) => g.status === 'On Track').length}/${familyGoals.length}`,\n trend: 'On track',\n },\n { label: 'Monthly Budget', value: formatMoney(95000), trend: 'Shared allocation' },\n ]}\n />\n\n <Tabs defaultValue=\"overview\" className=\"space-y-4\">\n <TabsList className=\"grid w-full grid-cols-3\">\n <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n <TabsTrigger value=\"members\">Members</TabsTrigger>\n <TabsTrigger value=\"goals\">Family Goals</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"overview\" className=\"space-y-4\">\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <TrendingUp className=\"h-4 w-4\" />\n Recent Family Activity\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {[\n {\n member: 'Priya Raghavan',\n action: 'Updated emergency fund goal',\n time: '2 hours ago',\n },\n {\n member: 'Vikram Raghavan',\n action: 'Added $5,000 to vacation savings',\n time: '1 day ago',\n },\n {\n member: 'Aditya Raghavan',\n action: 'Checked college fund progress',\n time: '2 days ago',\n },\n {\n member: 'Priya Raghavan',\n action: 'Invited Kavya to family account',\n time: '3 days ago',\n },\n ].map((a, i) => (\n <div key={i} className=\"flex items-center gap-3 rounded-lg border p-2.5\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-blue-100 text-xs font-bold text-blue-600\">\n {a.member\n .split(' ')\n .map((n) => n[0])\n .join('')}\n </div>\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium\">{a.member}</p>\n <p className=\"text-xs text-muted-foreground\">{a.action}</p>\n </div>\n <span className=\"text-xs text-muted-foreground\">{a.time}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Target className=\"h-4 w-4\" />\n Goal Progress Summary\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {familyGoals.map((g) => {\n const pct = Math.round((g.current / g.target) * 100);\n return (\n <div key={g.id} className=\"space-y-1\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"font-medium\">{g.title}</span>\n <span>{pct}%</span>\n </div>\n <div className=\"h-2 rounded bg-muted overflow-hidden\">\n <div\n className={`h-2 rounded ${g.status === 'On Track' ? 'bg-emerald-500' : 'bg-yellow-500'}`}\n style={{ width: `${pct}%` }}\n />\n </div>\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>{formatMoney(g.current)}</span>\n <span>{formatMoney(g.target)}</span>\n </div>\n </div>\n );\n })}\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Family Financial Health</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n {[\n {\n icon: CheckCircle,\n label: 'Emergency Fund',\n detail: '90% funded',\n color: 'bg-emerald-50 text-emerald-600',\n },\n {\n icon: TrendingUp,\n label: 'Savings Rate',\n detail: '24% monthly',\n color: 'bg-blue-50 text-blue-600',\n },\n {\n icon: AlertTriangle,\n label: 'Insurance Review',\n detail: 'Due for update',\n color: 'bg-yellow-50 text-yellow-600',\n },\n ].map((item) => (\n <div\n key={item.label}\n className={`text-center p-4 rounded-lg ${item.color.split(' ')[0]}`}\n >\n <item.icon className={`h-7 w-7 mx-auto mb-2 ${item.color.split(' ')[1]}`} />\n <p className=\"font-semibold text-sm\">{item.label}</p>\n <p className=\"text-xs text-muted-foreground\">{item.detail}</p>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"members\" className=\"space-y-4\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <div>\n <CardTitle>Family Members</CardTitle>\n <CardDescription>Manage access and permissions</CardDescription>\n </div>\n <Button size=\"sm\">\n <UserPlus className=\"mr-1 h-4 w-4\" />\n Invite\n </Button>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {familyMembers.map((m) => (\n <div key={m.id} className=\"flex items-center justify-between rounded-lg border p-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-blue-100 font-bold text-sm text-blue-600\">\n {m.name\n .split(' ')\n .map((n) => n[0])\n .join('')}\n </div>\n <div>\n <p className=\"font-medium text-sm\">{m.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {m.role} &middot; {m.permissions}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Badge variant={m.status === 'Active' ? 'default' : 'secondary'}>\n {m.status}\n </Badge>\n <span className=\"text-xs text-muted-foreground\">{m.lastActive}</span>\n <Button variant=\"outline\" size=\"sm\">\n <Shield className=\"h-3 w-3\" />\n </Button>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"goals\" className=\"space-y-4\">\n {familyGoals.map((g) => {\n const pct = Math.round((g.current / g.target) * 100);\n return (\n <Card key={g.id}>\n <CardContent className=\"p-4 space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-semibold\">{g.title}</p>\n <p className=\"text-xs text-muted-foreground\">\n {g.category} &middot; Assigned to: {g.assignees.join(', ')}\n </p>\n </div>\n <Badge variant={g.status === 'On Track' ? 'default' : 'secondary'}>\n {g.status}\n </Badge>\n </div>\n <div className=\"h-3 rounded bg-muted overflow-hidden\">\n <div\n className={`h-3 rounded ${g.status === 'On Track' ? 'bg-emerald-500' : 'bg-yellow-500'}`}\n style={{ width: `${pct}%` }}\n />\n </div>\n <div className=\"flex justify-between text-sm\">\n <span>{formatMoney(g.current)} saved</span>\n <span className=\"font-medium\">\n {pct}% of {formatMoney(g.target)}\n </span>\n </div>\n </CardContent>\n </Card>\n );\n })}\n </TabsContent>\n </Tabs>\n </SectionShell>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function GoalsPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=GoalsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GoalsPage.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/pages/GoalsPage.tsx"],"names":[],"mappings":"AAiBA,wBAAgB,SAAS,4CAkKxB"}
@@ -0,0 +1,160 @@
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 } from "./_shared.js";
4
+ import { Clock as a, Plus as o, Target as s, TrendingUp as c } from "lucide-react";
5
+ import { useI18n as l } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
6
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
7
+ import { Badge as f, Button as p, Card as m, CardContent as h, CardDescription as g, CardHeader as _, CardTitle as v } from "@burdenoff/fe-libs/ui";
8
+ //#region src/brainyrich/pages/GoalsPage.tsx
9
+ var y = (/* @__PURE__ */ new Date(0)).getTime();
10
+ function b() {
11
+ let { t: b } = l(), { goals: x } = t(), S = (t, n, r) => e(b, t, n, r), C = x.reduce((e, t) => e + t.targetAmount, 0), w = x.reduce((e, t) => e + t.currentAmount, 0), T = C > 0 ? Math.round(w / C * 100) : 0, E = C - w;
12
+ return /* @__PURE__ */ d(r, {
13
+ title: S("brainyrich.goals.title", "Financial Goals"),
14
+ description: S("brainyrich.goals.description", "Track progress toward your wealth milestones and life objectives"),
15
+ actionLabel: S("brainyrich.goals.actions.createGoal", "Create Goal"),
16
+ badges: [S("brainyrich.goals.badges.activeGoals", "{count} Active Goals", { count: x.length })],
17
+ children: [/* @__PURE__ */ u(n, { items: [
18
+ {
19
+ label: S("brainyrich.goals.metrics.totalSaved", "Total Saved"),
20
+ value: i(w),
21
+ trend: S("brainyrich.goals.metrics.totalSavedTrend", "Across all goals")
22
+ },
23
+ {
24
+ label: S("brainyrich.goals.metrics.totalTarget", "Total Target"),
25
+ value: i(C)
26
+ },
27
+ {
28
+ label: S("brainyrich.goals.metrics.overallProgress", "Overall Progress"),
29
+ value: `${T}%`,
30
+ trend: S("brainyrich.goals.metrics.overallProgressTrend", "{amount} remaining", { amount: i(E) })
31
+ },
32
+ {
33
+ label: S("brainyrich.goals.metrics.activeGoals", "Active Goals"),
34
+ value: String(x.length),
35
+ trend: S("brainyrich.goals.metrics.activeGoalsTrend", "In progress")
36
+ }
37
+ ] }), /* @__PURE__ */ u("div", {
38
+ className: "space-y-4",
39
+ children: x.map((e) => {
40
+ let t = Math.round(e.currentAmount / e.targetAmount * 100), n = e.targetAmount - e.currentAmount, r = new Date(e.deadline), l = Math.max(0, Math.round((r.getTime() - y) / (1e3 * 60 * 60 * 24 * 30))), b = l > 0 ? n / l : n;
41
+ return /* @__PURE__ */ d(m, { children: [/* @__PURE__ */ u(_, {
42
+ className: "pb-3",
43
+ children: /* @__PURE__ */ d("div", {
44
+ className: "flex items-start justify-between",
45
+ children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ d(v, {
46
+ className: "flex items-center gap-2 text-lg",
47
+ children: [/* @__PURE__ */ u(s, { className: "h-5 w-5" }), e.title]
48
+ }), /* @__PURE__ */ d(g, {
49
+ className: "flex items-center gap-3 mt-1",
50
+ children: [/* @__PURE__ */ d("span", {
51
+ className: "flex items-center gap-1",
52
+ children: [
53
+ /* @__PURE__ */ u(a, { className: "h-3 w-3" }),
54
+ S("brainyrich.goals.deadlineLabel", "Deadline:"),
55
+ " ",
56
+ r.toLocaleDateString("en-US", {
57
+ month: "short",
58
+ year: "numeric"
59
+ })
60
+ ]
61
+ }), /* @__PURE__ */ u("span", { children: S("brainyrich.goals.monthsRemaining", "{count} months remaining", { count: l }) })]
62
+ })] }), /* @__PURE__ */ u(f, {
63
+ variant: t >= 75 ? "default" : t >= 40 ? "secondary" : "destructive",
64
+ children: S("brainyrich.goals.progressComplete", "{pct}% complete", { pct: t })
65
+ })]
66
+ })
67
+ }), /* @__PURE__ */ d(h, {
68
+ className: "space-y-4",
69
+ children: [
70
+ /* @__PURE__ */ d("div", { children: [
71
+ /* @__PURE__ */ d("div", {
72
+ className: "flex items-center justify-between text-sm mb-2",
73
+ children: [/* @__PURE__ */ u("span", {
74
+ className: "font-medium",
75
+ children: i(e.currentAmount)
76
+ }), /* @__PURE__ */ u("span", {
77
+ className: "text-muted-foreground",
78
+ children: i(e.targetAmount)
79
+ })]
80
+ }),
81
+ /* @__PURE__ */ u("div", {
82
+ className: "h-3 rounded-full bg-muted overflow-hidden",
83
+ children: /* @__PURE__ */ u("div", {
84
+ className: "h-3 rounded-full bg-emerald-500 transition-all",
85
+ style: { width: `${Math.min(t, 100)}%` }
86
+ })
87
+ }),
88
+ /* @__PURE__ */ d("div", {
89
+ className: "flex items-center justify-between text-xs text-muted-foreground mt-1",
90
+ children: [/* @__PURE__ */ d("span", {
91
+ className: "text-emerald-600 font-medium",
92
+ children: [t, "%"]
93
+ }), /* @__PURE__ */ u("span", { children: S("brainyrich.goals.remainingAmount", "{amount} remaining", { amount: i(n) }) })]
94
+ })
95
+ ] }),
96
+ /* @__PURE__ */ d("div", {
97
+ className: "grid grid-cols-3 gap-4 rounded-lg bg-muted/50 p-3",
98
+ children: [
99
+ /* @__PURE__ */ d("div", {
100
+ className: "text-center",
101
+ children: [/* @__PURE__ */ u("p", {
102
+ className: "text-xs text-muted-foreground",
103
+ children: S("brainyrich.goals.cards.monthlySipNeeded", "Monthly SIP Needed")
104
+ }), /* @__PURE__ */ u("p", {
105
+ className: "text-sm font-semibold",
106
+ children: i(b)
107
+ })]
108
+ }),
109
+ /* @__PURE__ */ d("div", {
110
+ className: "text-center",
111
+ children: [/* @__PURE__ */ u("p", {
112
+ className: "text-xs text-muted-foreground",
113
+ children: S("brainyrich.goals.cards.gapAmount", "Gap Amount")
114
+ }), /* @__PURE__ */ u("p", {
115
+ className: "text-sm font-semibold",
116
+ children: i(n)
117
+ })]
118
+ }),
119
+ /* @__PURE__ */ d("div", {
120
+ className: "text-center",
121
+ children: [/* @__PURE__ */ u("p", {
122
+ className: "text-xs text-muted-foreground",
123
+ children: S("brainyrich.goals.cards.onTrackStatus", "On-Track Status")
124
+ }), /* @__PURE__ */ d("p", {
125
+ className: "text-sm font-semibold flex items-center justify-center gap-1",
126
+ children: [/* @__PURE__ */ u(c, { className: "h-3 w-3 text-emerald-600" }), t >= 50 ? S("brainyrich.goals.status.onTrack", "On Track") : S("brainyrich.goals.status.behind", "Behind")]
127
+ })]
128
+ })
129
+ ]
130
+ }),
131
+ /* @__PURE__ */ d("div", {
132
+ className: "flex gap-2",
133
+ children: [
134
+ /* @__PURE__ */ u(p, {
135
+ variant: "outline",
136
+ size: "sm",
137
+ children: S("brainyrich.goals.actions.viewDetails", "View Details")
138
+ }),
139
+ /* @__PURE__ */ d(p, {
140
+ variant: "outline",
141
+ size: "sm",
142
+ children: [/* @__PURE__ */ u(o, { className: "mr-1 h-3 w-3" }), S("brainyrich.goals.actions.addFunds", "Add Funds")]
143
+ }),
144
+ /* @__PURE__ */ u(p, {
145
+ variant: "outline",
146
+ size: "sm",
147
+ children: S("brainyrich.goals.actions.editGoal", "Edit Goal")
148
+ })
149
+ ]
150
+ })
151
+ ]
152
+ })] }, e.id);
153
+ })
154
+ })]
155
+ });
156
+ }
157
+ //#endregion
158
+ export { b as GoalsPage };
159
+
160
+ //# sourceMappingURL=GoalsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GoalsPage.js","names":[],"sources":["../../../src/brainyrich/pages/GoalsPage.tsx"],"sourcesContent":["import {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Badge,\n Button,\n} from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Target, Plus, Clock, TrendingUp } from 'lucide-react';\nimport { useBrainyRichStore } from '../store/brainyrichStore';\nimport { tWithFallback } from '../utils/i18n';\nimport { SectionShell, KpiGrid, formatMoney } from './_shared';\n\nconst REFERENCE_TIME = new Date(0).getTime();\n\nexport function GoalsPage() {\n const { t } = useI18n();\n const { goals } = useBrainyRichStore();\n const translate = (key: string, fallback: string, params?: Record<string, string | number>) =>\n tWithFallback(t, key, fallback, params);\n const totalTarget = goals.reduce((s, g) => s + g.targetAmount, 0);\n const totalSaved = goals.reduce((s, g) => s + g.currentAmount, 0);\n const overallPct = totalTarget > 0 ? Math.round((totalSaved / totalTarget) * 100) : 0;\n const gap = totalTarget - totalSaved;\n\n return (\n <SectionShell\n title={translate('brainyrich.goals.title', 'Financial Goals')}\n description={translate(\n 'brainyrich.goals.description',\n 'Track progress toward your wealth milestones and life objectives'\n )}\n actionLabel={translate('brainyrich.goals.actions.createGoal', 'Create Goal')}\n badges={[\n translate('brainyrich.goals.badges.activeGoals', '{count} Active Goals', {\n count: goals.length,\n }),\n ]}\n >\n <KpiGrid\n items={[\n {\n label: translate('brainyrich.goals.metrics.totalSaved', 'Total Saved'),\n value: formatMoney(totalSaved),\n trend: translate('brainyrich.goals.metrics.totalSavedTrend', 'Across all goals'),\n },\n {\n label: translate('brainyrich.goals.metrics.totalTarget', 'Total Target'),\n value: formatMoney(totalTarget),\n },\n {\n label: translate('brainyrich.goals.metrics.overallProgress', 'Overall Progress'),\n value: `${overallPct}%`,\n trend: translate(\n 'brainyrich.goals.metrics.overallProgressTrend',\n '{amount} remaining',\n {\n amount: formatMoney(gap),\n }\n ),\n },\n {\n label: translate('brainyrich.goals.metrics.activeGoals', 'Active Goals'),\n value: String(goals.length),\n trend: translate('brainyrich.goals.metrics.activeGoalsTrend', 'In progress'),\n },\n ]}\n />\n\n <div className=\"space-y-4\">\n {goals.map((g) => {\n const pct = Math.round((g.currentAmount / g.targetAmount) * 100);\n const remaining = g.targetAmount - g.currentAmount;\n const deadlineDate = new Date(g.deadline);\n const monthsLeft = Math.max(\n 0,\n Math.round((deadlineDate.getTime() - REFERENCE_TIME) / (1000 * 60 * 60 * 24 * 30))\n );\n const monthlyNeeded = monthsLeft > 0 ? remaining / monthsLeft : remaining;\n\n return (\n <Card key={g.id}>\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-start justify-between\">\n <div>\n <CardTitle className=\"flex items-center gap-2 text-lg\">\n <Target className=\"h-5 w-5\" />\n {g.title}\n </CardTitle>\n <CardDescription className=\"flex items-center gap-3 mt-1\">\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n {translate('brainyrich.goals.deadlineLabel', 'Deadline:')}{' '}\n {deadlineDate.toLocaleDateString('en-US', {\n month: 'short',\n year: 'numeric',\n })}\n </span>\n <span>\n {translate('brainyrich.goals.monthsRemaining', '{count} months remaining', {\n count: monthsLeft,\n })}\n </span>\n </CardDescription>\n </div>\n <Badge variant={pct >= 75 ? 'default' : pct >= 40 ? 'secondary' : 'destructive'}>\n {translate('brainyrich.goals.progressComplete', '{pct}% complete', { pct })}\n </Badge>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <div className=\"flex items-center justify-between text-sm mb-2\">\n <span className=\"font-medium\">{formatMoney(g.currentAmount)}</span>\n <span className=\"text-muted-foreground\">{formatMoney(g.targetAmount)}</span>\n </div>\n <div className=\"h-3 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-3 rounded-full bg-emerald-500 transition-all\"\n style={{ width: `${Math.min(pct, 100)}%` }}\n />\n </div>\n <div className=\"flex items-center justify-between text-xs text-muted-foreground mt-1\">\n <span className=\"text-emerald-600 font-medium\">{pct}%</span>\n <span>\n {translate('brainyrich.goals.remainingAmount', '{amount} remaining', {\n amount: formatMoney(remaining),\n })}\n </span>\n </div>\n </div>\n\n <div className=\"grid grid-cols-3 gap-4 rounded-lg bg-muted/50 p-3\">\n <div className=\"text-center\">\n <p className=\"text-xs text-muted-foreground\">\n {translate('brainyrich.goals.cards.monthlySipNeeded', 'Monthly SIP Needed')}\n </p>\n <p className=\"text-sm font-semibold\">{formatMoney(monthlyNeeded)}</p>\n </div>\n <div className=\"text-center\">\n <p className=\"text-xs text-muted-foreground\">\n {translate('brainyrich.goals.cards.gapAmount', 'Gap Amount')}\n </p>\n <p className=\"text-sm font-semibold\">{formatMoney(remaining)}</p>\n </div>\n <div className=\"text-center\">\n <p className=\"text-xs text-muted-foreground\">\n {translate('brainyrich.goals.cards.onTrackStatus', 'On-Track Status')}\n </p>\n <p className=\"text-sm font-semibold flex items-center justify-center gap-1\">\n <TrendingUp className=\"h-3 w-3 text-emerald-600\" />\n {pct >= 50\n ? translate('brainyrich.goals.status.onTrack', 'On Track')\n : translate('brainyrich.goals.status.behind', 'Behind')}\n </p>\n </div>\n </div>\n\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n {translate('brainyrich.goals.actions.viewDetails', 'View Details')}\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n <Plus className=\"mr-1 h-3 w-3\" />\n {translate('brainyrich.goals.actions.addFunds', 'Add Funds')}\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n {translate('brainyrich.goals.actions.editGoal', 'Edit Goal')}\n </Button>\n </div>\n </CardContent>\n </Card>\n );\n })}\n </div>\n </SectionShell>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function InsurancePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=InsurancePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InsurancePage.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/pages/InsurancePage.tsx"],"names":[],"mappings":"AAkCA,wBAAgB,aAAa,4CAwJ5B"}