@burdenoff/microfe-subscriberbot 2026.624.1 → 2026.625.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/subscriberbot/components/EmptyState.js +17 -10
- package/dist/subscriberbot/components/EmptyState.js.map +1 -1
- package/dist/subscriberbot/components/InvestmentCard.js +23 -22
- package/dist/subscriberbot/components/InvestmentCard.js.map +1 -1
- package/dist/subscriberbot/components/MetricsCard.js +15 -12
- package/dist/subscriberbot/components/MetricsCard.js.map +1 -1
- package/dist/subscriberbot/components/PageLayout.js +27 -15
- package/dist/subscriberbot/components/PageLayout.js.map +1 -1
- package/dist/subscriberbot/components/RatingDisplay.js +3 -3
- package/dist/subscriberbot/components/RatingDisplay.js.map +1 -1
- package/dist/subscriberbot/components/StatusBadge.js +25 -13
- package/dist/subscriberbot/components/StatusBadge.js.map +1 -1
- package/dist/subscriberbot/context/SubscriberBotContext.js.map +1 -1
- package/dist/subscriberbot/pages/HomePage.js +67 -63
- package/dist/subscriberbot/pages/HomePage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js +42 -42
- package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminDashboard.js +42 -41
- package/dist/subscriberbot/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminFinancialPage.js +14 -14
- package/dist/subscriberbot/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminOrdersPage.js +24 -24
- package/dist/subscriberbot/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminProfilePage.js +11 -11
- package/dist/subscriberbot/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminSettingsPage.js +14 -14
- package/dist/subscriberbot/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/CartManagementPage.js +41 -41
- package/dist/subscriberbot/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/UserManagementPage.js +47 -47
- package/dist/subscriberbot/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js +44 -44
- package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js +17 -17
- package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js +94 -89
- package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js +58 -58
- package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js +51 -51
- package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js +54 -54
- package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js +54 -53
- package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js +51 -51
- package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/common/HelpSupportPage.js +65 -65
- package/dist/subscriberbot/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/subscriberbot/pages/common/NotificationCenterPage.js +46 -45
- package/dist/subscriberbot/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/subscriberbot/pages/common/SettingsPage.js +46 -46
- package/dist/subscriberbot/pages/common/SettingsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/BookingDetailsPage.js +24 -23
- package/dist/subscriberbot/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CartDetailPage.js +31 -30
- package/dist/subscriberbot/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js +25 -23
- package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CheckoutPage.js +26 -26
- package/dist/subscriberbot/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CustomerDashboard.js +39 -38
- package/dist/subscriberbot/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CustomerProfilePage.js +36 -36
- package/dist/subscriberbot/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js +37 -36
- package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/FavoritesPage.js +16 -15
- package/dist/subscriberbot/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/OrderHistoryPage.js +19 -17
- package/dist/subscriberbot/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/OrderTrackingPage.js +21 -20
- package/dist/subscriberbot/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js +22 -21
- package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/ReviewsPage.js +29 -28
- package/dist/subscriberbot/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/SavedAddressesPage.js +26 -25
- package/dist/subscriberbot/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js +46 -46
- package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js +34 -32
- package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js +38 -38
- package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorDashboard.js +26 -25
- package/dist/subscriberbot/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js +12 -11
- package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js +25 -25
- package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorProfilePage.js +58 -58
- package/dist/subscriberbot/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/TaskDetailsPage.js +26 -25
- package/dist/subscriberbot/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerDashboard.js +48 -47
- package/dist/subscriberbot/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js +41 -40
- package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerProfilePage.js +44 -44
- package/dist/subscriberbot/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js +32 -30
- package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/package.json +3 -3
|
@@ -134,32 +134,32 @@ var S = {
|
|
|
134
134
|
function C(e) {
|
|
135
135
|
return e <= 2 ? {
|
|
136
136
|
label: "Low Risk",
|
|
137
|
-
color: "text-
|
|
137
|
+
color: "text-status-success-text"
|
|
138
138
|
} : e <= 4 ? {
|
|
139
139
|
label: "Moderate Risk",
|
|
140
|
-
color: "text-
|
|
140
|
+
color: "text-status-warning-text"
|
|
141
141
|
} : {
|
|
142
142
|
label: "High Risk",
|
|
143
|
-
color: "text-
|
|
143
|
+
color: "text-status-error-text"
|
|
144
144
|
};
|
|
145
145
|
}
|
|
146
146
|
function w(e) {
|
|
147
|
-
return e <= 2 ? "bg-
|
|
147
|
+
return e <= 2 ? "bg-status-success-text" : e <= 4 ? "bg-status-warning-text" : "bg-status-error-text";
|
|
148
148
|
}
|
|
149
149
|
function T(e) {
|
|
150
150
|
return e >= 8 ? {
|
|
151
151
|
label: "Well Diversified",
|
|
152
|
-
color: "text-
|
|
152
|
+
color: "text-status-success-text"
|
|
153
153
|
} : e >= 6 ? {
|
|
154
154
|
label: "Moderately Diversified",
|
|
155
|
-
color: "text-
|
|
155
|
+
color: "text-status-warning-text"
|
|
156
156
|
} : {
|
|
157
157
|
label: "Poorly Diversified",
|
|
158
|
-
color: "text-
|
|
158
|
+
color: "text-status-error-text"
|
|
159
159
|
};
|
|
160
160
|
}
|
|
161
161
|
function E(e) {
|
|
162
|
-
return e >= 8 ? "bg-
|
|
162
|
+
return e >= 8 ? "bg-status-success-text" : e >= 6 ? "bg-status-warning-text" : "bg-status-error-text";
|
|
163
163
|
}
|
|
164
164
|
function D() {
|
|
165
165
|
let { navigateTo: D } = e(), [O, k] = s(!0), [A, j] = s("6m"), [M, N] = s(null), [P, F] = s("idle");
|
|
@@ -198,7 +198,7 @@ function D() {
|
|
|
198
198
|
children: [/* @__PURE__ */ x("select", {
|
|
199
199
|
value: A,
|
|
200
200
|
onChange: (e) => j(e.target.value),
|
|
201
|
-
className: "rounded-lg border border-border-
|
|
201
|
+
className: "rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]",
|
|
202
202
|
children: [
|
|
203
203
|
/* @__PURE__ */ b("option", {
|
|
204
204
|
value: "1m",
|
|
@@ -225,7 +225,7 @@ function D() {
|
|
|
225
225
|
type: "button",
|
|
226
226
|
onClick: I,
|
|
227
227
|
disabled: P === "exporting",
|
|
228
|
-
className: t("flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors", P === "exporting" ? "cursor-not-allowed bg-bg-sunken text-text-secondary" : P === "done" ? "bg-
|
|
228
|
+
className: t("flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors", P === "exporting" ? "cursor-not-allowed bg-bg-sunken text-text-secondary" : P === "done" ? "bg-status-success-text text-text-inverse" : "bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90"),
|
|
229
229
|
children: [/* @__PURE__ */ b(p, { className: "h-4 w-4" }), P === "exporting" ? "Exporting..." : P === "done" ? "Exported!" : "Export Report"]
|
|
230
230
|
})]
|
|
231
231
|
}),
|
|
@@ -266,22 +266,22 @@ function D() {
|
|
|
266
266
|
/* @__PURE__ */ x("div", {
|
|
267
267
|
className: "mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2",
|
|
268
268
|
children: [/* @__PURE__ */ x("div", {
|
|
269
|
-
className: "flex items-center gap-3 rounded-lg border border-border-
|
|
269
|
+
className: "flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4",
|
|
270
270
|
children: [/* @__PURE__ */ b("div", {
|
|
271
|
-
className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-
|
|
272
|
-
children: /* @__PURE__ */ b(u, { className: "h-5 w-5 text-
|
|
271
|
+
className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-status-success-bg/10",
|
|
272
|
+
children: /* @__PURE__ */ b(u, { className: "h-5 w-5 text-status-success-text" })
|
|
273
273
|
}), /* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("p", {
|
|
274
274
|
className: "text-xs text-text-secondary",
|
|
275
275
|
children: "Best Performing"
|
|
276
276
|
}), /* @__PURE__ */ b("p", {
|
|
277
|
-
className: "text-sm font-semibold text-
|
|
277
|
+
className: "text-sm font-semibold text-status-success-text",
|
|
278
278
|
children: M.portfolioMetrics.bestPerforming
|
|
279
279
|
})] })]
|
|
280
280
|
}), /* @__PURE__ */ x("div", {
|
|
281
|
-
className: "flex items-center gap-3 rounded-lg border border-border-
|
|
281
|
+
className: "flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4",
|
|
282
282
|
children: [/* @__PURE__ */ b("div", {
|
|
283
|
-
className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-
|
|
284
|
-
children: /* @__PURE__ */ b(l, { className: "h-5 w-5 text-
|
|
283
|
+
className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-status-error-bg/10",
|
|
284
|
+
children: /* @__PURE__ */ b(l, { className: "h-5 w-5 text-status-error-text" })
|
|
285
285
|
}), /* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("p", {
|
|
286
286
|
className: "text-xs text-text-secondary",
|
|
287
287
|
children: "Worst Performing"
|
|
@@ -302,7 +302,7 @@ function D() {
|
|
|
302
302
|
}), /* @__PURE__ */ b("div", {
|
|
303
303
|
className: "space-y-3",
|
|
304
304
|
children: z.map((e, n) => /* @__PURE__ */ x("div", {
|
|
305
|
-
className: "flex items-center justify-between rounded-lg border border-border-
|
|
305
|
+
className: "flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface p-3",
|
|
306
306
|
children: [/* @__PURE__ */ x("div", {
|
|
307
307
|
className: "flex items-center gap-3",
|
|
308
308
|
children: [/* @__PURE__ */ b("div", {
|
|
@@ -318,10 +318,10 @@ function D() {
|
|
|
318
318
|
}), /* @__PURE__ */ x("div", {
|
|
319
319
|
className: "text-right",
|
|
320
320
|
children: [/* @__PURE__ */ x("p", {
|
|
321
|
-
className: t("text-sm font-semibold", e.returns >= 0 ? "text-
|
|
321
|
+
className: t("text-sm font-semibold", e.returns >= 0 ? "text-status-success-text" : "text-status-error-text"),
|
|
322
322
|
children: [e.returns >= 0 ? "+" : "", i(e.returns, { minimumFractionDigits: 0 })]
|
|
323
323
|
}), /* @__PURE__ */ x("p", {
|
|
324
|
-
className: t("text-xs", e.roi >= 0 ? "text-
|
|
324
|
+
className: t("text-xs", e.roi >= 0 ? "text-status-success-text" : "text-status-error-text"),
|
|
325
325
|
children: [
|
|
326
326
|
e.roi >= 0 ? "+" : "",
|
|
327
327
|
e.roi,
|
|
@@ -339,7 +339,7 @@ function D() {
|
|
|
339
339
|
}), /* @__PURE__ */ b("div", {
|
|
340
340
|
className: "space-y-4",
|
|
341
341
|
children: M.performanceByCategory.map((e) => /* @__PURE__ */ x("div", {
|
|
342
|
-
className: "rounded-lg border border-border-
|
|
342
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-3",
|
|
343
343
|
children: [
|
|
344
344
|
/* @__PURE__ */ x("div", {
|
|
345
345
|
className: "mb-2 flex items-center justify-between",
|
|
@@ -364,7 +364,7 @@ function D() {
|
|
|
364
364
|
className: "text-xs text-text-secondary",
|
|
365
365
|
children: [i(e.investedAmount, { minimumFractionDigits: 0 }), " invested"]
|
|
366
366
|
}), /* @__PURE__ */ x("span", {
|
|
367
|
-
className: t("text-xs font-semibold", e.returns >= 0 ? "text-
|
|
367
|
+
className: t("text-xs font-semibold", e.returns >= 0 ? "text-status-success-text" : "text-status-error-text"),
|
|
368
368
|
children: [e.returns >= 0 ? "+" : "", i(e.returns, { minimumFractionDigits: 0 })]
|
|
369
369
|
})]
|
|
370
370
|
})
|
|
@@ -381,13 +381,13 @@ function D() {
|
|
|
381
381
|
children: "Portfolio Growth Trend"
|
|
382
382
|
})]
|
|
383
383
|
}), /* @__PURE__ */ b("div", {
|
|
384
|
-
className: "overflow-hidden rounded-lg border border-border-
|
|
384
|
+
className: "overflow-hidden rounded-lg border border-border-seam bg-bg-surface",
|
|
385
385
|
children: /* @__PURE__ */ b("div", {
|
|
386
386
|
className: "overflow-x-auto",
|
|
387
387
|
children: /* @__PURE__ */ x("table", {
|
|
388
388
|
className: "w-full",
|
|
389
389
|
children: [/* @__PURE__ */ b("thead", { children: /* @__PURE__ */ x("tr", {
|
|
390
|
-
className: "border-b border-border-
|
|
390
|
+
className: "border-b border-border-seam bg-bg-sunken/50",
|
|
391
391
|
children: [
|
|
392
392
|
/* @__PURE__ */ b("th", {
|
|
393
393
|
className: "px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6",
|
|
@@ -432,14 +432,14 @@ function D() {
|
|
|
432
432
|
/* @__PURE__ */ b("td", {
|
|
433
433
|
className: "whitespace-nowrap px-4 py-4 text-sm sm:px-6",
|
|
434
434
|
children: /* @__PURE__ */ x("span", {
|
|
435
|
-
className: t("font-semibold", e.returns >= 0 ? "text-
|
|
435
|
+
className: t("font-semibold", e.returns >= 0 ? "text-status-success-text" : "text-status-error-text"),
|
|
436
436
|
children: [e.returns >= 0 ? "+" : "", i(e.returns, { minimumFractionDigits: 0 })]
|
|
437
437
|
})
|
|
438
438
|
}),
|
|
439
439
|
/* @__PURE__ */ b("td", {
|
|
440
440
|
className: "whitespace-nowrap px-4 py-4 text-sm sm:px-6",
|
|
441
441
|
children: /* @__PURE__ */ x("span", {
|
|
442
|
-
className: t("font-medium", parseFloat(n) >= 0 ? "text-
|
|
442
|
+
className: t("font-medium", parseFloat(n) >= 0 ? "text-status-success-text" : "text-status-error-text"),
|
|
443
443
|
children: [
|
|
444
444
|
parseFloat(n) >= 0 ? "+" : "",
|
|
445
445
|
n,
|
|
@@ -464,7 +464,7 @@ function D() {
|
|
|
464
464
|
children: "Risk Analysis"
|
|
465
465
|
})]
|
|
466
466
|
}), /* @__PURE__ */ b("div", {
|
|
467
|
-
className: "rounded-lg border border-border-
|
|
467
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-4 sm:p-6",
|
|
468
468
|
children: /* @__PURE__ */ x("div", {
|
|
469
469
|
className: "space-y-5",
|
|
470
470
|
children: [
|
|
@@ -527,7 +527,7 @@ function D() {
|
|
|
527
527
|
})
|
|
528
528
|
})] }),
|
|
529
529
|
/* @__PURE__ */ x("div", {
|
|
530
|
-
className: "grid grid-cols-2 gap-3 border-t border-border-
|
|
530
|
+
className: "grid grid-cols-2 gap-3 border-t border-border-seam pt-4",
|
|
531
531
|
children: [/* @__PURE__ */ x("div", {
|
|
532
532
|
className: "rounded-lg bg-bg-sunken/50 p-3 text-center",
|
|
533
533
|
children: [/* @__PURE__ */ b("p", {
|
|
@@ -552,16 +552,16 @@ function D() {
|
|
|
552
552
|
})
|
|
553
553
|
})] }), /* @__PURE__ */ x("section", { children: [/* @__PURE__ */ x("div", {
|
|
554
554
|
className: "mb-4 flex items-center gap-2",
|
|
555
|
-
children: [/* @__PURE__ */ b(m, { className: "h-5 w-5 text-
|
|
555
|
+
children: [/* @__PURE__ */ b(m, { className: "h-5 w-5 text-status-warning-text" }), /* @__PURE__ */ b("h2", {
|
|
556
556
|
className: "text-lg font-semibold text-text-primary",
|
|
557
557
|
children: "Recommendations"
|
|
558
558
|
})]
|
|
559
559
|
}), /* @__PURE__ */ x("div", {
|
|
560
|
-
className: "rounded-lg border border-border-
|
|
560
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-4 sm:p-6",
|
|
561
561
|
children: [/* @__PURE__ */ b("div", {
|
|
562
562
|
className: "space-y-3",
|
|
563
563
|
children: M.riskAnalysis.recommendations.map((e, t) => /* @__PURE__ */ x("div", {
|
|
564
|
-
className: "flex items-start gap-3 rounded-lg border border-border-
|
|
564
|
+
className: "flex items-start gap-3 rounded-lg border border-border-seam bg-bg-sunken/30 p-3",
|
|
565
565
|
children: [/* @__PURE__ */ b("div", {
|
|
566
566
|
className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-xs font-bold text-action-primary-text",
|
|
567
567
|
children: t + 1
|
|
@@ -571,7 +571,7 @@ function D() {
|
|
|
571
571
|
})]
|
|
572
572
|
}, t))
|
|
573
573
|
}), /* @__PURE__ */ x("div", {
|
|
574
|
-
className: "mt-5 rounded-lg border border-border-
|
|
574
|
+
className: "mt-5 rounded-lg border border-border-seam bg-bg-sunken/50 p-4",
|
|
575
575
|
children: [/* @__PURE__ */ b("h4", {
|
|
576
576
|
className: "mb-2 text-sm font-semibold text-text-primary",
|
|
577
577
|
children: "Overall Assessment"
|
|
@@ -593,7 +593,7 @@ function D() {
|
|
|
593
593
|
3,
|
|
594
594
|
4,
|
|
595
595
|
5
|
|
596
|
-
].map((e) => /* @__PURE__ */ b("div", { className: t("h-2 w-4 rounded-sm", e <= 4 ? "bg-
|
|
596
|
+
].map((e) => /* @__PURE__ */ b("div", { className: t("h-2 w-4 rounded-sm", e <= 4 ? "bg-status-success-text" : "bg-bg-sunken") }, e))
|
|
597
597
|
}), /* @__PURE__ */ b("span", {
|
|
598
598
|
className: "text-xs font-medium text-text-primary",
|
|
599
599
|
children: "4/5"
|
|
@@ -615,7 +615,7 @@ function D() {
|
|
|
615
615
|
3,
|
|
616
616
|
4,
|
|
617
617
|
5
|
|
618
|
-
].map((e) => /* @__PURE__ */ b("div", { className: t("h-2 w-4 rounded-sm", e <= 3 ? "bg-
|
|
618
|
+
].map((e) => /* @__PURE__ */ b("div", { className: t("h-2 w-4 rounded-sm", e <= 3 ? "bg-status-warning-text" : "bg-bg-sunken") }, e))
|
|
619
619
|
}), /* @__PURE__ */ b("span", {
|
|
620
620
|
className: "text-xs font-medium text-text-primary",
|
|
621
621
|
children: "3/5"
|
|
@@ -637,7 +637,7 @@ function D() {
|
|
|
637
637
|
3,
|
|
638
638
|
4,
|
|
639
639
|
5
|
|
640
|
-
].map((e) => /* @__PURE__ */ b("div", { className: t("h-2 w-4 rounded-sm", e <= 4 ? "bg-
|
|
640
|
+
].map((e) => /* @__PURE__ */ b("div", { className: t("h-2 w-4 rounded-sm", e <= 4 ? "bg-status-success-text" : "bg-bg-sunken") }, e))
|
|
641
641
|
}), /* @__PURE__ */ b("span", {
|
|
642
642
|
className: "text-xs font-medium text-text-primary",
|
|
643
643
|
children: "4/5"
|
|
@@ -655,19 +655,19 @@ function D() {
|
|
|
655
655
|
/* @__PURE__ */ x("button", {
|
|
656
656
|
type: "button",
|
|
657
657
|
onClick: () => D("/investor/portfolio"),
|
|
658
|
-
className: "flex items-center gap-2 rounded-lg border border-border-
|
|
658
|
+
className: "flex items-center gap-2 rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
659
659
|
children: [/* @__PURE__ */ b(h, { className: "h-4 w-4" }), "View Portfolio"]
|
|
660
660
|
}),
|
|
661
661
|
/* @__PURE__ */ x("button", {
|
|
662
662
|
type: "button",
|
|
663
663
|
onClick: () => D("/investor/opportunities"),
|
|
664
|
-
className: "flex items-center gap-2 rounded-lg border border-border-
|
|
664
|
+
className: "flex items-center gap-2 rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
665
665
|
children: [/* @__PURE__ */ b(_, { className: "h-4 w-4" }), "Browse Opportunities"]
|
|
666
666
|
}),
|
|
667
667
|
/* @__PURE__ */ x("button", {
|
|
668
668
|
type: "button",
|
|
669
669
|
onClick: () => D("/investor/investments"),
|
|
670
|
-
className: "flex items-center gap-2 rounded-lg border border-border-
|
|
670
|
+
className: "flex items-center gap-2 rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
671
671
|
children: [/* @__PURE__ */ b(y, { className: "h-4 w-4" }), "My Investments"]
|
|
672
672
|
})
|
|
673
673
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InvestorAnalyticsPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/investor/InvestorAnalyticsPage.tsx"],"sourcesContent":["/**\n * Investor Analytics Page\n * @module subscriberbot/pages/investor\n *\n * Date range selector, export button, metrics grid, performance by cart\n * with rankings, category distribution with progress bars, monthly\n * performance table, risk analysis with scores, diversification score,\n * and recommendations list.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport {\n TrendingUp,\n PieChart,\n BarChart3,\n Calendar,\n Download,\n Target,\n Activity,\n Wallet,\n IndianRupee,\n Lightbulb,\n Shield,\n AlertTriangle,\n ArrowUp,\n ArrowDown,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatNumber } from '../../utils/formatters';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface AnalyticsData {\n portfolioMetrics: {\n totalValue: number;\n totalInvested: number;\n totalReturns: number;\n averageRoi: number;\n portfolioGrowth: number;\n bestPerforming: string;\n worstPerforming: string;\n };\n performanceByCart: Array<{\n cartName: string;\n investedAmount: number;\n currentValue: number;\n returns: number;\n roi: number;\n }>;\n performanceByCategory: Array<{\n category: string;\n investedAmount: number;\n returns: number;\n percentage: number;\n }>;\n monthlyPerformance: Array<{\n month: string;\n invested: number;\n value: number;\n returns: number;\n }>;\n riskAnalysis: {\n riskScore: number;\n diversificationScore: number;\n volatilityScore: number;\n recommendations: string[];\n };\n}\n\n// ---------------------------------------------------------------------------\n// Mock data\n// ---------------------------------------------------------------------------\n\nconst mockAnalytics: AnalyticsData = {\n portfolioMetrics: {\n totalValue: 283700,\n totalInvested: 255000,\n totalReturns: 28700,\n averageRoi: 19.6,\n portfolioGrowth: 11.3,\n bestPerforming: 'Biryani House',\n worstPerforming: 'Healthy Bites',\n },\n performanceByCart: [\n {\n cartName: 'Biryani House',\n investedAmount: 60000,\n currentValue: 72000,\n returns: 12000,\n roi: 20.0,\n },\n {\n cartName: 'South Indian Express',\n investedAmount: 50000,\n currentValue: 58500,\n returns: 8500,\n roi: 17.0,\n },\n {\n cartName: 'Pizza Corner',\n investedAmount: 75000,\n currentValue: 82000,\n returns: 7000,\n roi: 9.3,\n },\n {\n cartName: 'Healthy Bites',\n investedAmount: 30000,\n currentValue: 31200,\n returns: 1200,\n roi: 4.0,\n },\n {\n cartName: 'Street Food Junction',\n investedAmount: 40000,\n currentValue: 40000,\n returns: 0,\n roi: 0,\n },\n ],\n performanceByCategory: [\n {\n category: 'South Indian',\n investedAmount: 110000,\n returns: 20500,\n percentage: 43.1,\n },\n {\n category: 'Fast Food',\n investedAmount: 75000,\n returns: 7000,\n percentage: 29.4,\n },\n {\n category: 'Street Food',\n investedAmount: 40000,\n returns: 0,\n percentage: 15.7,\n },\n {\n category: 'Healthy Food',\n investedAmount: 30000,\n returns: 1200,\n percentage: 11.8,\n },\n ],\n monthlyPerformance: [\n { month: 'Jun 2024', invested: 195000, value: 202000, returns: 7000 },\n { month: 'Jul 2024', invested: 215000, value: 228000, returns: 13000 },\n { month: 'Aug 2024', invested: 255000, value: 265000, returns: 10000 },\n { month: 'Sep 2024', invested: 255000, value: 275000, returns: 20000 },\n { month: 'Oct 2024', invested: 255000, value: 280000, returns: 25000 },\n { month: 'Nov 2024', invested: 255000, value: 283700, returns: 28700 },\n ],\n riskAnalysis: {\n riskScore: 3.2,\n diversificationScore: 7.8,\n volatilityScore: 2.5,\n recommendations: [\n 'Consider diversifying into more food categories',\n 'Your portfolio shows good risk distribution',\n 'Consider investing in carts from different locations',\n 'Monitor underperforming investments closely',\n 'Explore premium segment opportunities for higher returns',\n ],\n },\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getRiskLevel(score: number): { label: string; color: string } {\n if (score <= 2) return { label: 'Low Risk', color: 'text-green-600 dark:text-green-400' };\n if (score <= 4) return { label: 'Moderate Risk', color: 'text-yellow-600 dark:text-yellow-400' };\n return { label: 'High Risk', color: 'text-red-600 dark:text-red-400' };\n}\n\nfunction getRiskBgColor(score: number): string {\n if (score <= 2) return 'bg-green-500';\n if (score <= 4) return 'bg-yellow-500';\n return 'bg-red-500';\n}\n\nfunction getDiversificationLevel(score: number): { label: string; color: string } {\n if (score >= 8) return { label: 'Well Diversified', color: 'text-green-600 dark:text-green-400' };\n if (score >= 6)\n return { label: 'Moderately Diversified', color: 'text-yellow-600 dark:text-yellow-400' };\n return { label: 'Poorly Diversified', color: 'text-red-600 dark:text-red-400' };\n}\n\nfunction getDiversificationBgColor(score: number): string {\n if (score >= 8) return 'bg-green-500';\n if (score >= 6) return 'bg-yellow-500';\n return 'bg-red-500';\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function InvestorAnalyticsPage() {\n const { navigateTo } = useSubscriberBot();\n const [isLoading, setIsLoading] = useState(true);\n const [dateRange, setDateRange] = useState('6m');\n const [analytics, setAnalytics] = useState<AnalyticsData | null>(null);\n const [exportStatus, setExportStatus] = useState<'idle' | 'exporting' | 'done'>('idle');\n\n useEffect(() => {\n setIsLoading(true);\n const timer = setTimeout(() => {\n setAnalytics(mockAnalytics);\n setIsLoading(false);\n }, 600);\n return () => clearTimeout(timer);\n }, [dateRange]);\n\n const handleExportReport = useCallback(() => {\n setExportStatus('exporting');\n setTimeout(() => {\n setExportStatus('done');\n setTimeout(() => setExportStatus('idle'), 2000);\n }, 1200);\n }, []);\n\n if (isLoading || !analytics) {\n return (\n <PageLayout title=\"Investment Analytics\" description=\"Loading analytics...\">\n <div className=\"flex items-center justify-center py-20\">\n <div className=\"text-center\">\n <div className=\"mx-auto mb-4 h-12 w-12 animate-spin rounded-full border-b-2 border-primary\" />\n <p className=\"text-sm text-text-secondary\">Loading analytics data...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n const riskLevel = getRiskLevel(analytics.riskAnalysis.riskScore);\n const diversificationLevel = getDiversificationLevel(analytics.riskAnalysis.diversificationScore);\n\n // Sort carts by ROI for ranking\n const sortedCarts = [...analytics.performanceByCart].sort((a, b) => b.roi - a.roi);\n\n return (\n <PageLayout\n title=\"Investment Analytics\"\n description=\"Comprehensive analysis of your portfolio performance\"\n actions={\n <div className=\"flex items-center gap-3\">\n {/* Date Range Selector */}\n <select\n value={dateRange}\n onChange={(e) => setDateRange(e.target.value)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"1m\">Last Month</option>\n <option value=\"3m\">Last 3 Months</option>\n <option value=\"6m\">Last 6 Months</option>\n <option value=\"1y\">Last Year</option>\n <option value=\"all\">All Time</option>\n </select>\n\n {/* Export Button */}\n <button\n type=\"button\"\n onClick={handleExportReport}\n disabled={exportStatus === 'exporting'}\n className={cn(\n 'flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors',\n exportStatus === 'exporting'\n ? 'cursor-not-allowed bg-bg-sunken text-text-secondary'\n : exportStatus === 'done'\n ? 'bg-green-600 text-white'\n : 'bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90'\n )}\n >\n <Download className=\"h-4 w-4\" />\n {exportStatus === 'exporting'\n ? 'Exporting...'\n : exportStatus === 'done'\n ? 'Exported!'\n : 'Export Report'}\n </button>\n </div>\n }\n >\n {/* Key Metrics */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <MetricsCard\n icon={<Wallet className=\"h-5 w-5\" />}\n value={formatCurrency(analytics.portfolioMetrics.totalValue, {\n minimumFractionDigits: 0,\n })}\n label=\"Portfolio Value\"\n trend=\"up\"\n trendValue={`+${analytics.portfolioMetrics.portfolioGrowth}% total growth`}\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={formatCurrency(analytics.portfolioMetrics.totalReturns, {\n minimumFractionDigits: 0,\n })}\n label=\"Total Returns\"\n trend=\"up\"\n trendValue=\"Profit earned so far\"\n />\n <MetricsCard\n icon={<Target className=\"h-5 w-5\" />}\n value={`${analytics.portfolioMetrics.averageRoi}%`}\n label=\"Average ROI\"\n trend=\"up\"\n trendValue=\"Across all investments\"\n />\n <MetricsCard\n icon={<Activity className=\"h-5 w-5\" />}\n value={`${analytics.riskAnalysis.riskScore}/5`}\n label=\"Risk Score\"\n trend=\"neutral\"\n trendValue={riskLevel.label}\n />\n </div>\n\n {/* Best / Worst Performers */}\n <div className=\"mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-green-500/10\">\n <ArrowUp className=\"h-5 w-5 text-green-600 dark:text-green-400\" />\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Best Performing</p>\n <p className=\"text-sm font-semibold text-green-600 dark:text-green-400\">\n {analytics.portfolioMetrics.bestPerforming}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-red-500/10\">\n <ArrowDown className=\"h-5 w-5 text-red-600 dark:text-red-400\" />\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Worst Performing</p>\n <p className=\"text-sm font-semibold text-text-primary\">\n {analytics.portfolioMetrics.worstPerforming}\n </p>\n </div>\n </div>\n </div>\n\n {/* Performance by Cart & Category Distribution */}\n <div className=\"mt-6 grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Performance by Cart */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <BarChart3 className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Performance by Cart</h2>\n </div>\n\n <div className=\"space-y-3\">\n {sortedCarts.map((cart, index) => (\n <div\n key={cart.cartName}\n className=\"flex items-center justify-between rounded-lg border border-border-subtle bg-bg-surface p-3\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-xs font-bold text-action-primary-text\">\n {index + 1}\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{cart.cartName}</p>\n <p className=\"text-xs text-text-secondary\">\n {formatCurrency(cart.investedAmount, { minimumFractionDigits: 0 })} invested\n </p>\n </div>\n </div>\n <div className=\"text-right\">\n <p\n className={cn(\n 'text-sm font-semibold',\n cart.returns >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {cart.returns >= 0 ? '+' : ''}\n {formatCurrency(cart.returns, { minimumFractionDigits: 0 })}\n </p>\n <p\n className={cn(\n 'text-xs',\n cart.roi >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {cart.roi >= 0 ? '+' : ''}\n {cart.roi}% ROI\n </p>\n </div>\n </div>\n ))}\n </div>\n </section>\n\n {/* Category Distribution */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <PieChart className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Category Distribution</h2>\n </div>\n\n <div className=\"space-y-4\">\n {analytics.performanceByCategory.map((category) => (\n <div key={category.category} className=\"rounded-lg border border-border-subtle bg-bg-surface p-3\">\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm font-medium text-text-primary\">{category.category}</span>\n <span className=\"text-sm text-text-secondary\">{category.percentage}%</span>\n </div>\n <div className=\"mb-2 h-2 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className=\"h-full rounded-full bg-action-primary-bg transition-all duration-300\"\n style={{ width: `${category.percentage}%` }}\n />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">\n {formatCurrency(category.investedAmount, { minimumFractionDigits: 0 })} invested\n </span>\n <span\n className={cn(\n 'text-xs font-semibold',\n category.returns >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {category.returns >= 0 ? '+' : ''}\n {formatCurrency(category.returns, { minimumFractionDigits: 0 })}\n </span>\n </div>\n </div>\n ))}\n </div>\n </section>\n </div>\n\n {/* Monthly Performance Table */}\n <section className=\"mt-8\">\n <div className=\"mb-4 flex items-center gap-2\">\n <Calendar className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Portfolio Growth Trend</h2>\n </div>\n\n <div className=\"overflow-hidden rounded-lg border border-border-subtle bg-bg-surface\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-subtle bg-bg-sunken/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Month\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Invested\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Portfolio Value\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Returns\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Growth %\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {analytics.monthlyPerformance.map((month) => {\n const growthPct =\n month.invested > 0\n ? (((month.value - month.invested) / month.invested) * 100).toFixed(1)\n : '0.0';\n\n return (\n <tr key={month.month} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"whitespace-nowrap px-4 py-4 text-sm font-medium text-text-primary sm:px-6\">\n {month.month}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm text-text-primary sm:px-6\">\n {formatCurrency(month.invested, { minimumFractionDigits: 0 })}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm text-text-primary sm:px-6\">\n {formatCurrency(month.value, { minimumFractionDigits: 0 })}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm sm:px-6\">\n <span\n className={cn(\n 'font-semibold',\n month.returns >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {month.returns >= 0 ? '+' : ''}\n {formatCurrency(month.returns, { minimumFractionDigits: 0 })}\n </span>\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm sm:px-6\">\n <span\n className={cn(\n 'font-medium',\n parseFloat(growthPct) >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {parseFloat(growthPct) >= 0 ? '+' : ''}\n {growthPct}%\n </span>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n </section>\n\n {/* Risk Analysis & Diversification */}\n <div className=\"mt-8 grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Risk Analysis */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <Shield className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Risk Analysis</h2>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6\">\n <div className=\"space-y-5\">\n {/* Risk Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Risk Score</span>\n <span className={cn('text-sm font-semibold', riskLevel.color)}>\n {analytics.riskAnalysis.riskScore}/5 ({riskLevel.label})\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getRiskBgColor(analytics.riskAnalysis.riskScore)\n )}\n style={{ width: `${(analytics.riskAnalysis.riskScore / 5) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Diversification Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Diversification</span>\n <span className={cn('text-sm font-semibold', diversificationLevel.color)}>\n {analytics.riskAnalysis.diversificationScore}/10 ({diversificationLevel.label})\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getDiversificationBgColor(analytics.riskAnalysis.diversificationScore)\n )}\n style={{\n width: `${(analytics.riskAnalysis.diversificationScore / 10) * 100}%`,\n }}\n />\n </div>\n </div>\n\n {/* Volatility Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Volatility</span>\n <span\n className={cn(\n 'text-sm font-semibold',\n getRiskLevel(analytics.riskAnalysis.volatilityScore).color\n )}\n >\n {analytics.riskAnalysis.volatilityScore}/5\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getRiskBgColor(analytics.riskAnalysis.volatilityScore)\n )}\n style={{ width: `${(analytics.riskAnalysis.volatilityScore / 5) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Quick Stats */}\n <div className=\"grid grid-cols-2 gap-3 border-t border-border-subtle pt-4\">\n <div className=\"rounded-lg bg-bg-sunken/50 p-3 text-center\">\n <p className=\"text-lg font-bold text-text-primary\">\n {analytics.performanceByCart.length}\n </p>\n <p className=\"text-xs text-text-secondary\">Active Investments</p>\n </div>\n <div className=\"rounded-lg bg-bg-sunken/50 p-3 text-center\">\n <p className=\"text-lg font-bold text-text-primary\">\n {analytics.performanceByCategory.length}\n </p>\n <p className=\"text-xs text-text-secondary\">Sectors Covered</p>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Recommendations */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <Lightbulb className=\"h-5 w-5 text-yellow-500\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Recommendations</h2>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6\">\n <div className=\"space-y-3\">\n {analytics.riskAnalysis.recommendations.map((recommendation, index) => (\n <div\n key={index}\n className=\"flex items-start gap-3 rounded-lg border border-border-subtle bg-bg-sunken/30 p-3\"\n >\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-xs font-bold text-action-primary-text\">\n {index + 1}\n </div>\n <p className=\"text-sm leading-relaxed text-text-primary\">{recommendation}</p>\n </div>\n ))}\n </div>\n\n {/* Overall Assessment */}\n <div className=\"mt-5 rounded-lg border border-border-subtle bg-bg-sunken/50 p-4\">\n <h4 className=\"mb-2 text-sm font-semibold text-text-primary\">Overall Assessment</h4>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Portfolio Health</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn('h-2 w-4 rounded-sm', i <= 4 ? 'bg-green-500' : 'bg-bg-sunken')}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">4/5</span>\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Growth Potential</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn(\n 'h-2 w-4 rounded-sm',\n i <= 3 ? 'bg-yellow-500' : 'bg-bg-sunken'\n )}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">3/5</span>\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Income Stability</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn('h-2 w-4 rounded-sm', i <= 4 ? 'bg-green-500' : 'bg-bg-sunken')}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">4/5</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n </div>\n\n {/* Quick Navigation */}\n <div className=\"mt-8 flex flex-wrap gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/portfolio')}\n className=\"flex items-center gap-2 rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <PieChart className=\"h-4 w-4\" />\n View Portfolio\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n className=\"flex items-center gap-2 rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Target className=\"h-4 w-4\" />\n Browse Opportunities\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/investments')}\n className=\"flex items-center gap-2 rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Wallet className=\"h-4 w-4\" />\n My Investments\n </button>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InvestorAnalyticsPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/investor/InvestorAnalyticsPage.tsx"],"sourcesContent":["/**\n * Investor Analytics Page\n * @module subscriberbot/pages/investor\n *\n * Date range selector, export button, metrics grid, performance by cart\n * with rankings, category distribution with progress bars, monthly\n * performance table, risk analysis with scores, diversification score,\n * and recommendations list.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport {\n TrendingUp,\n PieChart,\n BarChart3,\n Calendar,\n Download,\n Target,\n Activity,\n Wallet,\n IndianRupee,\n Lightbulb,\n Shield,\n AlertTriangle,\n ArrowUp,\n ArrowDown,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatNumber } from '../../utils/formatters';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface AnalyticsData {\n portfolioMetrics: {\n totalValue: number;\n totalInvested: number;\n totalReturns: number;\n averageRoi: number;\n portfolioGrowth: number;\n bestPerforming: string;\n worstPerforming: string;\n };\n performanceByCart: Array<{\n cartName: string;\n investedAmount: number;\n currentValue: number;\n returns: number;\n roi: number;\n }>;\n performanceByCategory: Array<{\n category: string;\n investedAmount: number;\n returns: number;\n percentage: number;\n }>;\n monthlyPerformance: Array<{\n month: string;\n invested: number;\n value: number;\n returns: number;\n }>;\n riskAnalysis: {\n riskScore: number;\n diversificationScore: number;\n volatilityScore: number;\n recommendations: string[];\n };\n}\n\n// ---------------------------------------------------------------------------\n// Mock data\n// ---------------------------------------------------------------------------\n\nconst mockAnalytics: AnalyticsData = {\n portfolioMetrics: {\n totalValue: 283700,\n totalInvested: 255000,\n totalReturns: 28700,\n averageRoi: 19.6,\n portfolioGrowth: 11.3,\n bestPerforming: 'Biryani House',\n worstPerforming: 'Healthy Bites',\n },\n performanceByCart: [\n {\n cartName: 'Biryani House',\n investedAmount: 60000,\n currentValue: 72000,\n returns: 12000,\n roi: 20.0,\n },\n {\n cartName: 'South Indian Express',\n investedAmount: 50000,\n currentValue: 58500,\n returns: 8500,\n roi: 17.0,\n },\n {\n cartName: 'Pizza Corner',\n investedAmount: 75000,\n currentValue: 82000,\n returns: 7000,\n roi: 9.3,\n },\n {\n cartName: 'Healthy Bites',\n investedAmount: 30000,\n currentValue: 31200,\n returns: 1200,\n roi: 4.0,\n },\n {\n cartName: 'Street Food Junction',\n investedAmount: 40000,\n currentValue: 40000,\n returns: 0,\n roi: 0,\n },\n ],\n performanceByCategory: [\n {\n category: 'South Indian',\n investedAmount: 110000,\n returns: 20500,\n percentage: 43.1,\n },\n {\n category: 'Fast Food',\n investedAmount: 75000,\n returns: 7000,\n percentage: 29.4,\n },\n {\n category: 'Street Food',\n investedAmount: 40000,\n returns: 0,\n percentage: 15.7,\n },\n {\n category: 'Healthy Food',\n investedAmount: 30000,\n returns: 1200,\n percentage: 11.8,\n },\n ],\n monthlyPerformance: [\n { month: 'Jun 2024', invested: 195000, value: 202000, returns: 7000 },\n { month: 'Jul 2024', invested: 215000, value: 228000, returns: 13000 },\n { month: 'Aug 2024', invested: 255000, value: 265000, returns: 10000 },\n { month: 'Sep 2024', invested: 255000, value: 275000, returns: 20000 },\n { month: 'Oct 2024', invested: 255000, value: 280000, returns: 25000 },\n { month: 'Nov 2024', invested: 255000, value: 283700, returns: 28700 },\n ],\n riskAnalysis: {\n riskScore: 3.2,\n diversificationScore: 7.8,\n volatilityScore: 2.5,\n recommendations: [\n 'Consider diversifying into more food categories',\n 'Your portfolio shows good risk distribution',\n 'Consider investing in carts from different locations',\n 'Monitor underperforming investments closely',\n 'Explore premium segment opportunities for higher returns',\n ],\n },\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getRiskLevel(score: number): { label: string; color: string } {\n if (score <= 2) return { label: 'Low Risk', color: 'text-status-success-text' };\n if (score <= 4) return { label: 'Moderate Risk', color: 'text-status-warning-text' };\n return { label: 'High Risk', color: 'text-status-error-text' };\n}\n\nfunction getRiskBgColor(score: number): string {\n if (score <= 2) return 'bg-status-success-text';\n if (score <= 4) return 'bg-status-warning-text';\n return 'bg-status-error-text';\n}\n\nfunction getDiversificationLevel(score: number): { label: string; color: string } {\n if (score >= 8) return { label: 'Well Diversified', color: 'text-status-success-text' };\n if (score >= 6) return { label: 'Moderately Diversified', color: 'text-status-warning-text' };\n return { label: 'Poorly Diversified', color: 'text-status-error-text' };\n}\n\nfunction getDiversificationBgColor(score: number): string {\n if (score >= 8) return 'bg-status-success-text';\n if (score >= 6) return 'bg-status-warning-text';\n return 'bg-status-error-text';\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function InvestorAnalyticsPage() {\n const { navigateTo } = useSubscriberBot();\n const [isLoading, setIsLoading] = useState(true);\n const [dateRange, setDateRange] = useState('6m');\n const [analytics, setAnalytics] = useState<AnalyticsData | null>(null);\n const [exportStatus, setExportStatus] = useState<'idle' | 'exporting' | 'done'>('idle');\n\n useEffect(() => {\n setIsLoading(true);\n const timer = setTimeout(() => {\n setAnalytics(mockAnalytics);\n setIsLoading(false);\n }, 600);\n return () => clearTimeout(timer);\n }, [dateRange]);\n\n const handleExportReport = useCallback(() => {\n setExportStatus('exporting');\n setTimeout(() => {\n setExportStatus('done');\n setTimeout(() => setExportStatus('idle'), 2000);\n }, 1200);\n }, []);\n\n if (isLoading || !analytics) {\n return (\n <PageLayout title=\"Investment Analytics\" description=\"Loading analytics...\">\n <div className=\"flex items-center justify-center py-20\">\n <div className=\"text-center\">\n <div className=\"mx-auto mb-4 h-12 w-12 animate-spin rounded-full border-b-2 border-primary\" />\n <p className=\"text-sm text-text-secondary\">Loading analytics data...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n const riskLevel = getRiskLevel(analytics.riskAnalysis.riskScore);\n const diversificationLevel = getDiversificationLevel(analytics.riskAnalysis.diversificationScore);\n\n // Sort carts by ROI for ranking\n const sortedCarts = [...analytics.performanceByCart].sort((a, b) => b.roi - a.roi);\n\n return (\n <PageLayout\n title=\"Investment Analytics\"\n description=\"Comprehensive analysis of your portfolio performance\"\n actions={\n <div className=\"flex items-center gap-3\">\n {/* Date Range Selector */}\n <select\n value={dateRange}\n onChange={(e) => setDateRange(e.target.value)}\n className=\"rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"1m\">Last Month</option>\n <option value=\"3m\">Last 3 Months</option>\n <option value=\"6m\">Last 6 Months</option>\n <option value=\"1y\">Last Year</option>\n <option value=\"all\">All Time</option>\n </select>\n\n {/* Export Button */}\n <button\n type=\"button\"\n onClick={handleExportReport}\n disabled={exportStatus === 'exporting'}\n className={cn(\n 'flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors',\n exportStatus === 'exporting'\n ? 'cursor-not-allowed bg-bg-sunken text-text-secondary'\n : exportStatus === 'done'\n ? 'bg-status-success-text text-text-inverse'\n : 'bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90'\n )}\n >\n <Download className=\"h-4 w-4\" />\n {exportStatus === 'exporting'\n ? 'Exporting...'\n : exportStatus === 'done'\n ? 'Exported!'\n : 'Export Report'}\n </button>\n </div>\n }\n >\n {/* Key Metrics */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <MetricsCard\n icon={<Wallet className=\"h-5 w-5\" />}\n value={formatCurrency(analytics.portfolioMetrics.totalValue, {\n minimumFractionDigits: 0,\n })}\n label=\"Portfolio Value\"\n trend=\"up\"\n trendValue={`+${analytics.portfolioMetrics.portfolioGrowth}% total growth`}\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={formatCurrency(analytics.portfolioMetrics.totalReturns, {\n minimumFractionDigits: 0,\n })}\n label=\"Total Returns\"\n trend=\"up\"\n trendValue=\"Profit earned so far\"\n />\n <MetricsCard\n icon={<Target className=\"h-5 w-5\" />}\n value={`${analytics.portfolioMetrics.averageRoi}%`}\n label=\"Average ROI\"\n trend=\"up\"\n trendValue=\"Across all investments\"\n />\n <MetricsCard\n icon={<Activity className=\"h-5 w-5\" />}\n value={`${analytics.riskAnalysis.riskScore}/5`}\n label=\"Risk Score\"\n trend=\"neutral\"\n trendValue={riskLevel.label}\n />\n </div>\n\n {/* Best / Worst Performers */}\n <div className=\"mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div className=\"flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-status-success-bg/10\">\n <ArrowUp className=\"h-5 w-5 text-status-success-text\" />\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Best Performing</p>\n <p className=\"text-sm font-semibold text-status-success-text\">\n {analytics.portfolioMetrics.bestPerforming}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-status-error-bg/10\">\n <ArrowDown className=\"h-5 w-5 text-status-error-text\" />\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Worst Performing</p>\n <p className=\"text-sm font-semibold text-text-primary\">\n {analytics.portfolioMetrics.worstPerforming}\n </p>\n </div>\n </div>\n </div>\n\n {/* Performance by Cart & Category Distribution */}\n <div className=\"mt-6 grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Performance by Cart */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <BarChart3 className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Performance by Cart</h2>\n </div>\n\n <div className=\"space-y-3\">\n {sortedCarts.map((cart, index) => (\n <div\n key={cart.cartName}\n className=\"flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface p-3\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-xs font-bold text-action-primary-text\">\n {index + 1}\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{cart.cartName}</p>\n <p className=\"text-xs text-text-secondary\">\n {formatCurrency(cart.investedAmount, { minimumFractionDigits: 0 })} invested\n </p>\n </div>\n </div>\n <div className=\"text-right\">\n <p\n className={cn(\n 'text-sm font-semibold',\n cart.returns >= 0 ? 'text-status-success-text' : 'text-status-error-text'\n )}\n >\n {cart.returns >= 0 ? '+' : ''}\n {formatCurrency(cart.returns, { minimumFractionDigits: 0 })}\n </p>\n <p\n className={cn(\n 'text-xs',\n cart.roi >= 0 ? 'text-status-success-text' : 'text-status-error-text'\n )}\n >\n {cart.roi >= 0 ? '+' : ''}\n {cart.roi}% ROI\n </p>\n </div>\n </div>\n ))}\n </div>\n </section>\n\n {/* Category Distribution */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <PieChart className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Category Distribution</h2>\n </div>\n\n <div className=\"space-y-4\">\n {analytics.performanceByCategory.map((category) => (\n <div\n key={category.category}\n className=\"rounded-lg border border-border-seam bg-bg-surface p-3\"\n >\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm font-medium text-text-primary\">{category.category}</span>\n <span className=\"text-sm text-text-secondary\">{category.percentage}%</span>\n </div>\n <div className=\"mb-2 h-2 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className=\"h-full rounded-full bg-action-primary-bg transition-all duration-300\"\n style={{ width: `${category.percentage}%` }}\n />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">\n {formatCurrency(category.investedAmount, { minimumFractionDigits: 0 })} invested\n </span>\n <span\n className={cn(\n 'text-xs font-semibold',\n category.returns >= 0 ? 'text-status-success-text' : 'text-status-error-text'\n )}\n >\n {category.returns >= 0 ? '+' : ''}\n {formatCurrency(category.returns, { minimumFractionDigits: 0 })}\n </span>\n </div>\n </div>\n ))}\n </div>\n </section>\n </div>\n\n {/* Monthly Performance Table */}\n <section className=\"mt-8\">\n <div className=\"mb-4 flex items-center gap-2\">\n <Calendar className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Portfolio Growth Trend</h2>\n </div>\n\n <div className=\"overflow-hidden rounded-lg border border-border-seam bg-bg-surface\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-seam bg-bg-sunken/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Month\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Invested\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Portfolio Value\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Returns\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Growth %\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {analytics.monthlyPerformance.map((month) => {\n const growthPct =\n month.invested > 0\n ? (((month.value - month.invested) / month.invested) * 100).toFixed(1)\n : '0.0';\n\n return (\n <tr key={month.month} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"whitespace-nowrap px-4 py-4 text-sm font-medium text-text-primary sm:px-6\">\n {month.month}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm text-text-primary sm:px-6\">\n {formatCurrency(month.invested, { minimumFractionDigits: 0 })}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm text-text-primary sm:px-6\">\n {formatCurrency(month.value, { minimumFractionDigits: 0 })}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm sm:px-6\">\n <span\n className={cn(\n 'font-semibold',\n month.returns >= 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {month.returns >= 0 ? '+' : ''}\n {formatCurrency(month.returns, { minimumFractionDigits: 0 })}\n </span>\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm sm:px-6\">\n <span\n className={cn(\n 'font-medium',\n parseFloat(growthPct) >= 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {parseFloat(growthPct) >= 0 ? '+' : ''}\n {growthPct}%\n </span>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n </section>\n\n {/* Risk Analysis & Diversification */}\n <div className=\"mt-8 grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Risk Analysis */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <Shield className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Risk Analysis</h2>\n </div>\n\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 sm:p-6\">\n <div className=\"space-y-5\">\n {/* Risk Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Risk Score</span>\n <span className={cn('text-sm font-semibold', riskLevel.color)}>\n {analytics.riskAnalysis.riskScore}/5 ({riskLevel.label})\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getRiskBgColor(analytics.riskAnalysis.riskScore)\n )}\n style={{ width: `${(analytics.riskAnalysis.riskScore / 5) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Diversification Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Diversification</span>\n <span className={cn('text-sm font-semibold', diversificationLevel.color)}>\n {analytics.riskAnalysis.diversificationScore}/10 ({diversificationLevel.label})\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getDiversificationBgColor(analytics.riskAnalysis.diversificationScore)\n )}\n style={{\n width: `${(analytics.riskAnalysis.diversificationScore / 10) * 100}%`,\n }}\n />\n </div>\n </div>\n\n {/* Volatility Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Volatility</span>\n <span\n className={cn(\n 'text-sm font-semibold',\n getRiskLevel(analytics.riskAnalysis.volatilityScore).color\n )}\n >\n {analytics.riskAnalysis.volatilityScore}/5\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getRiskBgColor(analytics.riskAnalysis.volatilityScore)\n )}\n style={{ width: `${(analytics.riskAnalysis.volatilityScore / 5) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Quick Stats */}\n <div className=\"grid grid-cols-2 gap-3 border-t border-border-seam pt-4\">\n <div className=\"rounded-lg bg-bg-sunken/50 p-3 text-center\">\n <p className=\"text-lg font-bold text-text-primary\">\n {analytics.performanceByCart.length}\n </p>\n <p className=\"text-xs text-text-secondary\">Active Investments</p>\n </div>\n <div className=\"rounded-lg bg-bg-sunken/50 p-3 text-center\">\n <p className=\"text-lg font-bold text-text-primary\">\n {analytics.performanceByCategory.length}\n </p>\n <p className=\"text-xs text-text-secondary\">Sectors Covered</p>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Recommendations */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <Lightbulb className=\"h-5 w-5 text-status-warning-text\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Recommendations</h2>\n </div>\n\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 sm:p-6\">\n <div className=\"space-y-3\">\n {analytics.riskAnalysis.recommendations.map((recommendation, index) => (\n <div\n key={index}\n className=\"flex items-start gap-3 rounded-lg border border-border-seam bg-bg-sunken/30 p-3\"\n >\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-xs font-bold text-action-primary-text\">\n {index + 1}\n </div>\n <p className=\"text-sm leading-relaxed text-text-primary\">{recommendation}</p>\n </div>\n ))}\n </div>\n\n {/* Overall Assessment */}\n <div className=\"mt-5 rounded-lg border border-border-seam bg-bg-sunken/50 p-4\">\n <h4 className=\"mb-2 text-sm font-semibold text-text-primary\">Overall Assessment</h4>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Portfolio Health</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn(\n 'h-2 w-4 rounded-sm',\n i <= 4 ? 'bg-status-success-text' : 'bg-bg-sunken'\n )}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">4/5</span>\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Growth Potential</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn(\n 'h-2 w-4 rounded-sm',\n i <= 3 ? 'bg-status-warning-text' : 'bg-bg-sunken'\n )}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">3/5</span>\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Income Stability</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn(\n 'h-2 w-4 rounded-sm',\n i <= 4 ? 'bg-status-success-text' : 'bg-bg-sunken'\n )}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">4/5</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n </div>\n\n {/* Quick Navigation */}\n <div className=\"mt-8 flex flex-wrap gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/portfolio')}\n className=\"flex items-center gap-2 rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <PieChart className=\"h-4 w-4\" />\n View Portfolio\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n className=\"flex items-center gap-2 rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Target className=\"h-4 w-4\" />\n Browse Opportunities\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/investments')}\n className=\"flex items-center gap-2 rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Wallet className=\"h-4 w-4\" />\n My Investments\n </button>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|