@burdenoff/microfe-adaptercloud 2026.614.1 → 2026.624.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/adaptercloud/components/EmptyState.js +3 -3
- package/dist/adaptercloud/components/EmptyState.js.map +1 -1
- package/dist/adaptercloud/components/InvestmentCard.js +9 -9
- package/dist/adaptercloud/components/InvestmentCard.js.map +1 -1
- package/dist/adaptercloud/components/MetricsCard.js +5 -5
- package/dist/adaptercloud/components/MetricsCard.js.map +1 -1
- package/dist/adaptercloud/components/PageLayout.js +3 -3
- package/dist/adaptercloud/components/PageLayout.js.map +1 -1
- package/dist/adaptercloud/components/RatingDisplay.js +3 -3
- package/dist/adaptercloud/components/RatingDisplay.js.map +1 -1
- package/dist/adaptercloud/components/StatusBadge.js +2 -2
- package/dist/adaptercloud/components/StatusBadge.js.map +1 -1
- package/dist/adaptercloud/pages/HomePage.js +54 -54
- package/dist/adaptercloud/pages/HomePage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js +60 -60
- package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminDashboard.js +77 -77
- package/dist/adaptercloud/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminFinancialPage.js +43 -43
- package/dist/adaptercloud/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminOrdersPage.js +85 -85
- package/dist/adaptercloud/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminProfilePage.js +34 -34
- package/dist/adaptercloud/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminSettingsPage.js +40 -40
- package/dist/adaptercloud/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/CartManagementPage.js +86 -86
- package/dist/adaptercloud/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/UserManagementPage.js +80 -80
- package/dist/adaptercloud/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js +100 -100
- package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js +29 -29
- package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js +81 -81
- package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js +100 -100
- package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js +67 -67
- package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js +94 -94
- package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js +57 -57
- package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js +75 -75
- package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/HelpSupportPage.js +102 -102
- package/dist/adaptercloud/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/NotificationCenterPage.js +35 -35
- package/dist/adaptercloud/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/SettingsPage.js +109 -109
- package/dist/adaptercloud/pages/common/SettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/BookingDetailsPage.js +60 -60
- package/dist/adaptercloud/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CartDetailPage.js +71 -71
- package/dist/adaptercloud/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js +54 -54
- package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CheckoutPage.js +75 -75
- package/dist/adaptercloud/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CustomerDashboard.js +69 -69
- package/dist/adaptercloud/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CustomerProfilePage.js +72 -72
- package/dist/adaptercloud/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js +75 -75
- package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/FavoritesPage.js +30 -30
- package/dist/adaptercloud/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/OrderHistoryPage.js +41 -41
- package/dist/adaptercloud/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/OrderTrackingPage.js +53 -53
- package/dist/adaptercloud/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js +51 -51
- package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/ReviewsPage.js +33 -33
- package/dist/adaptercloud/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/SavedAddressesPage.js +33 -33
- package/dist/adaptercloud/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js +108 -108
- package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js +76 -76
- package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js +69 -69
- package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorDashboard.js +53 -53
- package/dist/adaptercloud/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js +32 -32
- package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js +55 -55
- package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorProfilePage.js +138 -138
- package/dist/adaptercloud/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/TaskDetailsPage.js +65 -65
- package/dist/adaptercloud/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerDashboard.js +74 -74
- package/dist/adaptercloud/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js +49 -49
- package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerProfilePage.js +92 -92
- package/dist/adaptercloud/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js +55 -55
- package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/dist/adaptercloud/utils/cn.js +2 -2
- package/dist/node_modules/{.bun/clsx@2.1.1/node_modules/clsx → clsx}/dist/clsx.js +1 -1
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/{.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge → tailwind-merge}/dist/bundle-mjs.js +212 -170
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/package.json +1 -1
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +0 -1
- package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +0 -1
|
@@ -118,14 +118,14 @@ function v() {
|
|
|
118
118
|
}, 800);
|
|
119
119
|
return () => clearTimeout(e);
|
|
120
120
|
}, [C]);
|
|
121
|
-
let D = (e) => e >= 1e7 ? `₹${(e / 1e7).toFixed(1)}Cr` : e >= 1e5 ? `₹${(e / 1e5).toFixed(1)}L` : i(e, { minimumFractionDigits: 0 }), O = (e) => e === 0 ? /* @__PURE__ */ g(s, { className: "h-5 w-5 text-yellow-500" }) : e === 1 ? /* @__PURE__ */ g(s, { className: "h-5 w-5 text-gray-400" }) : e === 2 ? /* @__PURE__ */ g(s, { className: "h-5 w-5 text-amber-700" }) : /* @__PURE__ */ g(c, { className: "h-5 w-5 text-
|
|
121
|
+
let D = (e) => e >= 1e7 ? `₹${(e / 1e7).toFixed(1)}Cr` : e >= 1e5 ? `₹${(e / 1e5).toFixed(1)}L` : i(e, { minimumFractionDigits: 0 }), O = (e) => e === 0 ? /* @__PURE__ */ g(s, { className: "h-5 w-5 text-yellow-500" }) : e === 1 ? /* @__PURE__ */ g(s, { className: "h-5 w-5 text-gray-400" }) : e === 2 ? /* @__PURE__ */ g(s, { className: "h-5 w-5 text-amber-700" }) : /* @__PURE__ */ g(c, { className: "h-5 w-5 text-text-secondary" });
|
|
122
122
|
if (x || !y) return /* @__PURE__ */ g(n, {
|
|
123
123
|
title: "Platform Analytics",
|
|
124
124
|
description: "Loading analytics...",
|
|
125
125
|
children: /* @__PURE__ */ _("div", {
|
|
126
126
|
className: "flex flex-col items-center justify-center py-20",
|
|
127
|
-
children: [/* @__PURE__ */ g(u, { className: "h-10 w-10 animate-spin text-
|
|
128
|
-
className: "text-
|
|
127
|
+
children: [/* @__PURE__ */ g(u, { className: "h-10 w-10 animate-spin text-text-secondary mb-4" }), /* @__PURE__ */ g("p", {
|
|
128
|
+
className: "text-text-secondary",
|
|
129
129
|
children: "Loading analytics..."
|
|
130
130
|
})]
|
|
131
131
|
})
|
|
@@ -161,7 +161,7 @@ function v() {
|
|
|
161
161
|
children: [/* @__PURE__ */ _("select", {
|
|
162
162
|
value: C,
|
|
163
163
|
onChange: (e) => w(e.target.value),
|
|
164
|
-
className: "rounded-lg border border-border bg-
|
|
164
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] w-fit",
|
|
165
165
|
children: [
|
|
166
166
|
/* @__PURE__ */ g("option", {
|
|
167
167
|
value: "today",
|
|
@@ -185,7 +185,7 @@ function v() {
|
|
|
185
185
|
})
|
|
186
186
|
]
|
|
187
187
|
}), /* @__PURE__ */ _("span", {
|
|
188
|
-
className: "text-sm text-
|
|
188
|
+
className: "text-sm text-text-secondary",
|
|
189
189
|
children: ["Last updated: ", (/* @__PURE__ */ new Date()).toLocaleString("en-IN")]
|
|
190
190
|
})]
|
|
191
191
|
}),
|
|
@@ -222,9 +222,9 @@ function v() {
|
|
|
222
222
|
]
|
|
223
223
|
}),
|
|
224
224
|
/* @__PURE__ */ _("div", {
|
|
225
|
-
className: "rounded-lg border border-border bg-
|
|
225
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface mb-8",
|
|
226
226
|
children: [/* @__PURE__ */ g("div", {
|
|
227
|
-
className: "border-b border-border",
|
|
227
|
+
className: "border-b border-border-subtle",
|
|
228
228
|
children: /* @__PURE__ */ g("nav", {
|
|
229
229
|
className: "flex -mb-px overflow-x-auto",
|
|
230
230
|
children: k.map((e) => {
|
|
@@ -232,7 +232,7 @@ function v() {
|
|
|
232
232
|
return /* @__PURE__ */ _("button", {
|
|
233
233
|
type: "button",
|
|
234
234
|
onClick: () => E(e.key),
|
|
235
|
-
className: t("flex items-center gap-2 py-3 px-4 sm:px-6 text-sm font-medium whitespace-nowrap border-b-2 transition-colors", T === e.key ? "border-primary text-primary" : "border-transparent text-
|
|
235
|
+
className: t("flex items-center gap-2 py-3 px-4 sm:px-6 text-sm font-medium whitespace-nowrap border-b-2 transition-colors", T === e.key ? "border-primary text-primary" : "border-transparent text-text-secondary hover:text-text-primary"),
|
|
236
236
|
children: [/* @__PURE__ */ g(n, { className: "h-4 w-4" }), /* @__PURE__ */ g("span", {
|
|
237
237
|
className: "hidden sm:inline",
|
|
238
238
|
children: e.label
|
|
@@ -246,7 +246,7 @@ function v() {
|
|
|
246
246
|
T === "overview" && /* @__PURE__ */ _("div", {
|
|
247
247
|
className: "space-y-8",
|
|
248
248
|
children: [/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("h3", {
|
|
249
|
-
className: "text-lg font-semibold text-
|
|
249
|
+
className: "text-lg font-semibold text-text-primary mb-4",
|
|
250
250
|
children: "Order Status Distribution"
|
|
251
251
|
}), /* @__PURE__ */ _("div", {
|
|
252
252
|
className: "grid grid-cols-1 sm:grid-cols-3 gap-4",
|
|
@@ -304,29 +304,29 @@ function v() {
|
|
|
304
304
|
})
|
|
305
305
|
]
|
|
306
306
|
})] }), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("h3", {
|
|
307
|
-
className: "text-lg font-semibold text-
|
|
307
|
+
className: "text-lg font-semibold text-text-primary mb-4",
|
|
308
308
|
children: "Top Performing Carts"
|
|
309
309
|
}), /* @__PURE__ */ g("div", {
|
|
310
|
-
className: "rounded-lg border border-border overflow-hidden",
|
|
310
|
+
className: "rounded-lg border border-border-subtle overflow-hidden",
|
|
311
311
|
children: /* @__PURE__ */ _("table", {
|
|
312
312
|
className: "w-full",
|
|
313
313
|
children: [/* @__PURE__ */ g("thead", { children: /* @__PURE__ */ _("tr", {
|
|
314
|
-
className: "border-b border-border bg-
|
|
314
|
+
className: "border-b border-border-subtle bg-bg-sunken/50",
|
|
315
315
|
children: [
|
|
316
316
|
/* @__PURE__ */ g("th", {
|
|
317
|
-
className: "px-4 py-3 text-left text-xs font-medium text-
|
|
317
|
+
className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase",
|
|
318
318
|
children: "Cart Name"
|
|
319
319
|
}),
|
|
320
320
|
/* @__PURE__ */ g("th", {
|
|
321
|
-
className: "px-4 py-3 text-right text-xs font-medium text-
|
|
321
|
+
className: "px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase",
|
|
322
322
|
children: "Revenue"
|
|
323
323
|
}),
|
|
324
324
|
/* @__PURE__ */ g("th", {
|
|
325
|
-
className: "px-4 py-3 text-right text-xs font-medium text-
|
|
325
|
+
className: "px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase",
|
|
326
326
|
children: "Orders"
|
|
327
327
|
}),
|
|
328
328
|
/* @__PURE__ */ g("th", {
|
|
329
|
-
className: "px-4 py-3 text-right text-xs font-medium text-
|
|
329
|
+
className: "px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase",
|
|
330
330
|
children: "Rating"
|
|
331
331
|
})
|
|
332
332
|
]
|
|
@@ -340,21 +340,21 @@ function v() {
|
|
|
340
340
|
children: /* @__PURE__ */ _("div", {
|
|
341
341
|
className: "flex items-center gap-2",
|
|
342
342
|
children: [O(t), /* @__PURE__ */ g("span", {
|
|
343
|
-
className: "text-sm font-medium text-
|
|
343
|
+
className: "text-sm font-medium text-text-primary",
|
|
344
344
|
children: e.name
|
|
345
345
|
})]
|
|
346
346
|
})
|
|
347
347
|
}),
|
|
348
348
|
/* @__PURE__ */ g("td", {
|
|
349
|
-
className: "px-4 py-3 text-sm text-right font-medium text-
|
|
349
|
+
className: "px-4 py-3 text-sm text-right font-medium text-text-primary",
|
|
350
350
|
children: D(e.revenue)
|
|
351
351
|
}),
|
|
352
352
|
/* @__PURE__ */ g("td", {
|
|
353
|
-
className: "px-4 py-3 text-sm text-right text-
|
|
353
|
+
className: "px-4 py-3 text-sm text-right text-text-primary",
|
|
354
354
|
children: e.orders.toLocaleString("en-IN")
|
|
355
355
|
}),
|
|
356
356
|
/* @__PURE__ */ g("td", {
|
|
357
|
-
className: "px-4 py-3 text-sm text-right text-
|
|
357
|
+
className: "px-4 py-3 text-sm text-right text-text-primary",
|
|
358
358
|
children: /* @__PURE__ */ _("span", {
|
|
359
359
|
className: "flex items-center justify-end gap-1",
|
|
360
360
|
children: [/* @__PURE__ */ g(f, { className: "h-3.5 w-3.5 fill-yellow-400 text-yellow-400" }), e.rating]
|
|
@@ -382,12 +382,12 @@ function v() {
|
|
|
382
382
|
})]
|
|
383
383
|
}),
|
|
384
384
|
/* @__PURE__ */ _("div", {
|
|
385
|
-
className: "rounded-lg border border-border bg-
|
|
385
|
+
className: "rounded-lg border border-border-subtle bg-bg-sunken/30 p-6",
|
|
386
386
|
children: [/* @__PURE__ */ g("h4", {
|
|
387
|
-
className: "text-sm font-medium text-
|
|
387
|
+
className: "text-sm font-medium text-text-secondary mb-2",
|
|
388
388
|
children: "Last Month"
|
|
389
389
|
}), /* @__PURE__ */ g("p", {
|
|
390
|
-
className: "text-2xl font-bold text-
|
|
390
|
+
className: "text-2xl font-bold text-text-primary",
|
|
391
391
|
children: D(y.revenue.lastMonth)
|
|
392
392
|
})]
|
|
393
393
|
}),
|
|
@@ -403,28 +403,28 @@ function v() {
|
|
|
403
403
|
})
|
|
404
404
|
]
|
|
405
405
|
}), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("h3", {
|
|
406
|
-
className: "text-lg font-semibold text-
|
|
406
|
+
className: "text-lg font-semibold text-text-primary mb-4",
|
|
407
407
|
children: "Revenue by City"
|
|
408
408
|
}), /* @__PURE__ */ g("div", {
|
|
409
409
|
className: "space-y-3",
|
|
410
410
|
children: y.geography.topCities.map((e, t) => /* @__PURE__ */ _("div", {
|
|
411
|
-
className: "flex items-center justify-between p-4 rounded-lg border border-border bg-
|
|
411
|
+
className: "flex items-center justify-between p-4 rounded-lg border border-border-subtle bg-bg-sunken/30",
|
|
412
412
|
children: [/* @__PURE__ */ _("div", {
|
|
413
413
|
className: "flex items-center gap-3",
|
|
414
414
|
children: [O(t), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
|
|
415
|
-
className: "font-medium text-
|
|
415
|
+
className: "font-medium text-text-primary",
|
|
416
416
|
children: e.city
|
|
417
417
|
}), /* @__PURE__ */ _("p", {
|
|
418
|
-
className: "text-sm text-
|
|
418
|
+
className: "text-sm text-text-secondary",
|
|
419
419
|
children: [e.orders.toLocaleString("en-IN"), " orders"]
|
|
420
420
|
})] })]
|
|
421
421
|
}), /* @__PURE__ */ _("div", {
|
|
422
422
|
className: "text-right",
|
|
423
423
|
children: [/* @__PURE__ */ g("p", {
|
|
424
|
-
className: "font-bold text-
|
|
424
|
+
className: "font-bold text-text-primary",
|
|
425
425
|
children: D(e.revenue)
|
|
426
426
|
}), /* @__PURE__ */ _("p", {
|
|
427
|
-
className: "text-sm text-
|
|
427
|
+
className: "text-sm text-text-secondary",
|
|
428
428
|
children: [(e.revenue / y.revenue.total * 100).toFixed(1), "%"]
|
|
429
429
|
})]
|
|
430
430
|
})]
|
|
@@ -474,20 +474,20 @@ function v() {
|
|
|
474
474
|
]
|
|
475
475
|
}, e.label))
|
|
476
476
|
}), /* @__PURE__ */ _("div", {
|
|
477
|
-
className: "rounded-lg border border-border bg-
|
|
477
|
+
className: "rounded-lg border border-border-subtle bg-bg-sunken/20 p-6",
|
|
478
478
|
children: [/* @__PURE__ */ g("h3", {
|
|
479
|
-
className: "text-lg font-semibold text-
|
|
479
|
+
className: "text-lg font-semibold text-text-primary mb-4",
|
|
480
480
|
children: "User Growth Insights"
|
|
481
481
|
}), /* @__PURE__ */ _("div", {
|
|
482
482
|
className: "grid grid-cols-1 md:grid-cols-2 gap-6",
|
|
483
483
|
children: [/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
|
|
484
|
-
className: "text-sm text-
|
|
484
|
+
className: "text-sm text-text-secondary mb-2",
|
|
485
485
|
children: "New Users This Month"
|
|
486
486
|
}), /* @__PURE__ */ g("p", {
|
|
487
487
|
className: "text-3xl font-bold text-blue-600 dark:text-blue-400",
|
|
488
488
|
children: y.users.newThisMonth
|
|
489
489
|
})] }), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
|
|
490
|
-
className: "text-sm text-
|
|
490
|
+
className: "text-sm text-text-secondary mb-2",
|
|
491
491
|
children: "Active Users Rate"
|
|
492
492
|
}), /* @__PURE__ */ _("p", {
|
|
493
493
|
className: "text-3xl font-bold text-green-600 dark:text-green-400",
|
|
@@ -503,61 +503,61 @@ function v() {
|
|
|
503
503
|
className: "grid grid-cols-1 md:grid-cols-3 gap-6",
|
|
504
504
|
children: [
|
|
505
505
|
/* @__PURE__ */ _("div", {
|
|
506
|
-
className: "rounded-lg border border-border bg-
|
|
506
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-6",
|
|
507
507
|
children: [
|
|
508
508
|
/* @__PURE__ */ _("div", {
|
|
509
509
|
className: "flex items-center gap-2 mb-2",
|
|
510
|
-
children: [/* @__PURE__ */ g(p, { className: "h-4 w-4 text-
|
|
511
|
-
className: "text-sm font-medium text-
|
|
510
|
+
children: [/* @__PURE__ */ g(p, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ g("h4", {
|
|
511
|
+
className: "text-sm font-medium text-text-secondary",
|
|
512
512
|
children: "Avg Delivery Time"
|
|
513
513
|
})]
|
|
514
514
|
}),
|
|
515
515
|
/* @__PURE__ */ _("p", {
|
|
516
|
-
className: "text-3xl font-bold text-
|
|
516
|
+
className: "text-3xl font-bold text-text-primary",
|
|
517
517
|
children: [y.performance.averageDeliveryTime, " min"]
|
|
518
518
|
}),
|
|
519
519
|
/* @__PURE__ */ g("p", {
|
|
520
|
-
className: "text-sm text-
|
|
520
|
+
className: "text-sm text-text-secondary mt-1",
|
|
521
521
|
children: "Target: < 30 min"
|
|
522
522
|
})
|
|
523
523
|
]
|
|
524
524
|
}),
|
|
525
525
|
/* @__PURE__ */ _("div", {
|
|
526
|
-
className: "rounded-lg border border-border bg-
|
|
526
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-6",
|
|
527
527
|
children: [
|
|
528
528
|
/* @__PURE__ */ _("div", {
|
|
529
529
|
className: "flex items-center gap-2 mb-2",
|
|
530
|
-
children: [/* @__PURE__ */ g(f, { className: "h-4 w-4 text-
|
|
531
|
-
className: "text-sm font-medium text-
|
|
530
|
+
children: [/* @__PURE__ */ g(f, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ g("h4", {
|
|
531
|
+
className: "text-sm font-medium text-text-secondary",
|
|
532
532
|
children: "Customer Satisfaction"
|
|
533
533
|
})]
|
|
534
534
|
}),
|
|
535
535
|
/* @__PURE__ */ _("p", {
|
|
536
|
-
className: "text-3xl font-bold text-
|
|
536
|
+
className: "text-3xl font-bold text-text-primary flex items-center gap-1",
|
|
537
537
|
children: [/* @__PURE__ */ g(f, { className: "h-6 w-6 fill-yellow-400 text-yellow-400" }), y.performance.customerSatisfaction]
|
|
538
538
|
}),
|
|
539
539
|
/* @__PURE__ */ g("p", {
|
|
540
|
-
className: "text-sm text-
|
|
540
|
+
className: "text-sm text-text-secondary mt-1",
|
|
541
541
|
children: "Based on ratings"
|
|
542
542
|
})
|
|
543
543
|
]
|
|
544
544
|
}),
|
|
545
545
|
/* @__PURE__ */ _("div", {
|
|
546
|
-
className: "rounded-lg border border-border bg-
|
|
546
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-6",
|
|
547
547
|
children: [
|
|
548
548
|
/* @__PURE__ */ _("div", {
|
|
549
549
|
className: "flex items-center gap-2 mb-2",
|
|
550
|
-
children: [/* @__PURE__ */ g(l, { className: "h-4 w-4 text-
|
|
551
|
-
className: "text-sm font-medium text-
|
|
550
|
+
children: [/* @__PURE__ */ g(l, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ g("h4", {
|
|
551
|
+
className: "text-sm font-medium text-text-secondary",
|
|
552
552
|
children: "Platform Fee"
|
|
553
553
|
})]
|
|
554
554
|
}),
|
|
555
555
|
/* @__PURE__ */ _("p", {
|
|
556
|
-
className: "text-3xl font-bold text-
|
|
556
|
+
className: "text-3xl font-bold text-text-primary",
|
|
557
557
|
children: [y.performance.platformFee, "%"]
|
|
558
558
|
}),
|
|
559
559
|
/* @__PURE__ */ g("p", {
|
|
560
|
-
className: "text-sm text-
|
|
560
|
+
className: "text-sm text-text-secondary mt-1",
|
|
561
561
|
children: "Per transaction"
|
|
562
562
|
})
|
|
563
563
|
]
|
|
@@ -565,31 +565,31 @@ function v() {
|
|
|
565
565
|
]
|
|
566
566
|
}),
|
|
567
567
|
/* @__PURE__ */ _("div", {
|
|
568
|
-
className: "rounded-lg border border-border bg-
|
|
568
|
+
className: "rounded-lg border border-border-subtle bg-bg-sunken/20 p-6",
|
|
569
569
|
children: [
|
|
570
570
|
/* @__PURE__ */ g("h3", {
|
|
571
|
-
className: "text-lg font-semibold text-
|
|
571
|
+
className: "text-lg font-semibold text-text-primary mb-4",
|
|
572
572
|
children: "Financial Performance"
|
|
573
573
|
}),
|
|
574
574
|
/* @__PURE__ */ _("div", {
|
|
575
575
|
className: "grid grid-cols-1 md:grid-cols-3 gap-6",
|
|
576
576
|
children: [
|
|
577
577
|
/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
|
|
578
|
-
className: "text-sm text-
|
|
578
|
+
className: "text-sm text-text-secondary mb-2",
|
|
579
579
|
children: "Operating Costs"
|
|
580
580
|
}), /* @__PURE__ */ g("p", {
|
|
581
581
|
className: "text-2xl font-bold text-red-600 dark:text-red-400",
|
|
582
582
|
children: D(y.performance.operatingCosts)
|
|
583
583
|
})] }),
|
|
584
584
|
/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
|
|
585
|
-
className: "text-sm text-
|
|
585
|
+
className: "text-sm text-text-secondary mb-2",
|
|
586
586
|
children: "Total Revenue"
|
|
587
587
|
}), /* @__PURE__ */ g("p", {
|
|
588
588
|
className: "text-2xl font-bold text-blue-600 dark:text-blue-400",
|
|
589
589
|
children: D(y.revenue.total)
|
|
590
590
|
})] }),
|
|
591
591
|
/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
|
|
592
|
-
className: "text-sm text-
|
|
592
|
+
className: "text-sm text-text-secondary mb-2",
|
|
593
593
|
children: "Net Profit"
|
|
594
594
|
}), /* @__PURE__ */ g("p", {
|
|
595
595
|
className: "text-2xl font-bold text-green-600 dark:text-green-400",
|
|
@@ -598,32 +598,32 @@ function v() {
|
|
|
598
598
|
]
|
|
599
599
|
}),
|
|
600
600
|
/* @__PURE__ */ _("div", {
|
|
601
|
-
className: "mt-4 rounded-lg border border-border bg-
|
|
601
|
+
className: "mt-4 rounded-lg border border-border-subtle bg-bg-surface p-4",
|
|
602
602
|
children: [/* @__PURE__ */ g("p", {
|
|
603
|
-
className: "text-sm text-
|
|
603
|
+
className: "text-sm text-text-secondary",
|
|
604
604
|
children: "Profit Margin"
|
|
605
605
|
}), /* @__PURE__ */ _("p", {
|
|
606
|
-
className: "text-xl font-bold text-
|
|
606
|
+
className: "text-xl font-bold text-text-primary",
|
|
607
607
|
children: [(y.performance.netProfit / y.revenue.total * 100).toFixed(1), "%"]
|
|
608
608
|
})]
|
|
609
609
|
})
|
|
610
610
|
]
|
|
611
611
|
}),
|
|
612
612
|
/* @__PURE__ */ _("div", {
|
|
613
|
-
className: "rounded-lg border border-border bg-
|
|
613
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-6",
|
|
614
614
|
children: [/* @__PURE__ */ g("h3", {
|
|
615
|
-
className: "text-lg font-semibold text-
|
|
615
|
+
className: "text-lg font-semibold text-text-primary mb-4",
|
|
616
616
|
children: "Today's Performance"
|
|
617
617
|
}), /* @__PURE__ */ _("div", {
|
|
618
618
|
className: "grid grid-cols-1 md:grid-cols-2 gap-6",
|
|
619
619
|
children: [/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
|
|
620
|
-
className: "text-sm text-
|
|
620
|
+
className: "text-sm text-text-secondary mb-2",
|
|
621
621
|
children: "Orders Today"
|
|
622
622
|
}), /* @__PURE__ */ g("p", {
|
|
623
623
|
className: "text-3xl font-bold text-blue-600 dark:text-blue-400",
|
|
624
624
|
children: y.orders.ordersToday
|
|
625
625
|
})] }), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
|
|
626
|
-
className: "text-sm text-
|
|
626
|
+
className: "text-sm text-text-secondary mb-2",
|
|
627
627
|
children: "Estimated Revenue"
|
|
628
628
|
}), /* @__PURE__ */ g("p", {
|
|
629
629
|
className: "text-3xl font-bold text-green-600 dark:text-green-400",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminAnalyticsPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/admin/AdminAnalyticsPage.tsx"],"sourcesContent":["/**\n * Admin Analytics Page\n * @module adaptercloud/pages/admin\n *\n * Full-featured analytics with 4 tabs (Overview/Revenue/Users/Performance),\n * time period filter, order status distribution, top performing carts,\n * revenue by city, user role distribution, growth insights, financial\n * performance, and today's performance metrics.\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Users,\n TrendingUp,\n TrendingDown,\n ShoppingBag,\n IndianRupee,\n BarChart3,\n Zap,\n Loader2,\n Star,\n Award,\n MapPin,\n Clock,\n Timer,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ninterface AnalyticsData {\n revenue: { total: number; growth: number; thisMonth: number; lastMonth: number };\n orders: {\n total: number;\n growth: number;\n pending: number;\n completed: number;\n cancelled: number;\n averageOrderValue: number;\n ordersToday: number;\n };\n users: {\n total: number;\n growth: number;\n active: number;\n newThisMonth: number;\n customers: number;\n cartOwners: number;\n workers: number;\n investors: number;\n };\n carts: {\n total: number;\n active: number;\n pending: number;\n topPerforming: Array<{\n id: string;\n name: string;\n revenue: number;\n orders: number;\n rating: number;\n }>;\n };\n performance: {\n averageDeliveryTime: number;\n customerSatisfaction: number;\n platformFee: number;\n operatingCosts: number;\n netProfit: number;\n };\n geography: { topCities: Array<{ city: string; orders: number; revenue: number }> };\n}\n\ntype TimePeriod = 'today' | 'week' | 'month' | 'quarter' | 'year';\ntype TabKey = 'overview' | 'revenue' | 'users' | 'performance';\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function AdminAnalyticsPage() {\n const { currentUser } = useAdapterCloud();\n\n const [analytics, setAnalytics] = useState<AnalyticsData | null>(null);\n const [loading, setLoading] = useState(true);\n const [selectedPeriod, setSelectedPeriod] = useState<TimePeriod>('month');\n const [activeTab, setActiveTab] = useState<TabKey>('overview');\n\n useEffect(() => {\n setLoading(true);\n const timer = setTimeout(() => {\n setAnalytics({\n revenue: { total: 12500000, growth: 15.2, thisMonth: 2100000, lastMonth: 1850000 },\n orders: {\n total: 45230,\n growth: 8.7,\n pending: 156,\n completed: 44890,\n cancelled: 184,\n averageOrderValue: 276,\n ordersToday: 89,\n },\n users: {\n total: 12450,\n growth: 12.3,\n active: 9870,\n newThisMonth: 456,\n customers: 9850,\n cartOwners: 1240,\n workers: 890,\n investors: 470,\n },\n carts: {\n total: 1240,\n active: 1156,\n pending: 84,\n topPerforming: [\n { id: 'c1', name: 'South Indian Express', revenue: 285000, orders: 1250, rating: 4.8 },\n { id: 'c2', name: 'Mumbai Street Chaat', revenue: 245000, orders: 980, rating: 4.7 },\n { id: 'c3', name: 'Delhi Paratha Corner', revenue: 198000, orders: 876, rating: 4.6 },\n { id: 'c4', name: 'Bangalore Dosa House', revenue: 176000, orders: 743, rating: 4.9 },\n { id: 'c5', name: 'Kolkata Fish Fry', revenue: 154000, orders: 632, rating: 4.5 },\n ],\n },\n performance: {\n averageDeliveryTime: 28,\n customerSatisfaction: 4.6,\n platformFee: 8.5,\n operatingCosts: 2100000,\n netProfit: 850000,\n },\n geography: {\n topCities: [\n { city: 'Bangalore', orders: 15670, revenue: 4250000 },\n { city: 'Mumbai', orders: 12340, revenue: 3890000 },\n { city: 'Delhi', orders: 9870, revenue: 2980000 },\n { city: 'Hyderabad', orders: 7650, revenue: 2140000 },\n { city: 'Chennai', orders: 6540, revenue: 1890000 },\n ],\n },\n });\n setLoading(false);\n }, 800);\n return () => clearTimeout(timer);\n }, [selectedPeriod]);\n\n const fmtCur = (amount: number) => {\n if (amount >= 10000000) return `₹${(amount / 10000000).toFixed(1)}Cr`;\n if (amount >= 100000) return `₹${(amount / 100000).toFixed(1)}L`;\n return formatCurrency(amount, { minimumFractionDigits: 0 });\n };\n\n const fmtGrowth = (growth: number) => {\n const isPositive = growth >= 0;\n return (\n <span\n className={cn(\n 'flex items-center gap-1 text-sm font-medium',\n isPositive ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400'\n )}\n >\n {isPositive ? (\n <TrendingUp className=\"h-3.5 w-3.5\" />\n ) : (\n <TrendingDown className=\"h-3.5 w-3.5\" />\n )}\n {Math.abs(growth).toFixed(1)}%\n </span>\n );\n };\n\n const medalIcon = (index: number) => {\n if (index === 0) return <Award className=\"h-5 w-5 text-yellow-500\" />;\n if (index === 1) return <Award className=\"h-5 w-5 text-gray-400\" />;\n if (index === 2) return <Award className=\"h-5 w-5 text-amber-700\" />;\n return <BarChart3 className=\"h-5 w-5 text-muted-foreground\" />;\n };\n\n if (loading || !analytics) {\n return (\n <PageLayout title=\"Platform Analytics\" description=\"Loading analytics...\">\n <div className=\"flex flex-col items-center justify-center py-20\">\n <Loader2 className=\"h-10 w-10 animate-spin text-muted-foreground mb-4\" />\n <p className=\"text-muted-foreground\">Loading analytics...</p>\n </div>\n </PageLayout>\n );\n }\n\n const tabs: Array<{ key: TabKey; label: string; icon: typeof BarChart3 }> = [\n { key: 'overview', label: 'Overview', icon: BarChart3 },\n { key: 'revenue', label: 'Revenue', icon: IndianRupee },\n { key: 'users', label: 'Users', icon: Users },\n { key: 'performance', label: 'Performance', icon: Zap },\n ];\n\n return (\n <PageLayout title=\"Platform Analytics\" description=\"Comprehensive platform metrics and trends\">\n {/* Time Period Filter */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6\">\n <select\n value={selectedPeriod}\n onChange={(e) => setSelectedPeriod(e.target.value as TimePeriod)}\n className=\"rounded-lg border border-border bg-card py-2 px-3 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-ring w-fit\"\n >\n <option value=\"today\">Today</option>\n <option value=\"week\">This Week</option>\n <option value=\"month\">This Month</option>\n <option value=\"quarter\">This Quarter</option>\n <option value=\"year\">This Year</option>\n </select>\n <span className=\"text-sm text-muted-foreground\">\n Last updated: {new Date().toLocaleString('en-IN')}\n </span>\n </div>\n\n {/* Key Metrics */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-8\">\n <MetricsCard\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={fmtCur(analytics.revenue.total)}\n label=\"Total Revenue\"\n trend=\"up\"\n trendValue={`+${analytics.revenue.growth}%`}\n />\n <MetricsCard\n icon={<ShoppingBag className=\"h-5 w-5\" />}\n value={analytics.orders.total.toLocaleString('en-IN')}\n label=\"Total Orders\"\n trend=\"up\"\n trendValue={`+${analytics.orders.growth}%`}\n />\n <MetricsCard\n icon={<Users className=\"h-5 w-5\" />}\n value={analytics.users.active.toLocaleString('en-IN')}\n label=\"Active Users\"\n trend=\"up\"\n trendValue={`+${analytics.users.growth}%`}\n />\n <MetricsCard\n icon={<BarChart3 className=\"h-5 w-5\" />}\n value={analytics.carts.active.toLocaleString('en-IN')}\n label=\"Active Carts\"\n trendValue={`${analytics.carts.pending} pending`}\n />\n </div>\n\n {/* Tabs */}\n <div className=\"rounded-lg border border-border bg-card mb-8\">\n <div className=\"border-b border-border\">\n <nav className=\"flex -mb-px overflow-x-auto\">\n {tabs.map((tab) => {\n const TabIcon = tab.icon;\n return (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n className={cn(\n 'flex items-center gap-2 py-3 px-4 sm:px-6 text-sm font-medium whitespace-nowrap border-b-2 transition-colors',\n activeTab === tab.key\n ? 'border-primary text-primary'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n )}\n >\n <TabIcon className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{tab.label}</span>\n </button>\n );\n })}\n </nav>\n </div>\n\n <div className=\"p-4 sm:p-6\">\n {/* Overview Tab */}\n {activeTab === 'overview' && (\n <div className=\"space-y-8\">\n <div>\n <h3 className=\"text-lg font-semibold text-foreground mb-4\">\n Order Status Distribution\n </h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\n <div className=\"rounded-lg border border-green-500/30 bg-green-500/10 p-4\">\n <p className=\"text-sm text-green-600 dark:text-green-400\">Completed Orders</p>\n <p className=\"text-2xl font-bold text-green-700 dark:text-green-300\">\n {analytics.orders.completed.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-green-600/80 dark:text-green-400/80\">\n {((analytics.orders.completed / analytics.orders.total) * 100).toFixed(1)}% of\n total\n </p>\n </div>\n <div className=\"rounded-lg border border-yellow-500/30 bg-yellow-500/10 p-4\">\n <p className=\"text-sm text-yellow-600 dark:text-yellow-400\">Pending Orders</p>\n <p className=\"text-2xl font-bold text-yellow-700 dark:text-yellow-300\">\n {analytics.orders.pending.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-yellow-600/80 dark:text-yellow-400/80\">\n {((analytics.orders.pending / analytics.orders.total) * 100).toFixed(1)}% of\n total\n </p>\n </div>\n <div className=\"rounded-lg border border-red-500/30 bg-red-500/10 p-4\">\n <p className=\"text-sm text-red-600 dark:text-red-400\">Cancelled Orders</p>\n <p className=\"text-2xl font-bold text-red-700 dark:text-red-300\">\n {analytics.orders.cancelled.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-red-600/80 dark:text-red-400/80\">\n {((analytics.orders.cancelled / analytics.orders.total) * 100).toFixed(1)}% of\n total\n </p>\n </div>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-lg font-semibold text-foreground mb-4\">Top Performing Carts</h3>\n <div className=\"rounded-lg border border-border overflow-hidden\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border bg-muted/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium text-muted-foreground uppercase\">\n Cart Name\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-muted-foreground uppercase\">\n Revenue\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-muted-foreground uppercase\">\n Orders\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-muted-foreground uppercase\">\n Rating\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {analytics.carts.topPerforming.map((cart, i) => (\n <tr key={cart.id} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n {medalIcon(i)}\n <span className=\"text-sm font-medium text-foreground\">\n {cart.name}\n </span>\n </div>\n </td>\n <td className=\"px-4 py-3 text-sm text-right font-medium text-foreground\">\n {fmtCur(cart.revenue)}\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-foreground\">\n {cart.orders.toLocaleString('en-IN')}\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-foreground\">\n <span className=\"flex items-center justify-end gap-1\">\n <Star className=\"h-3.5 w-3.5 fill-yellow-400 text-yellow-400\" />\n {cart.rating}\n </span>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n )}\n\n {/* Revenue Tab */}\n {activeTab === 'revenue' && (\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className=\"rounded-lg border border-blue-500/30 bg-blue-500/10 p-6\">\n <h4 className=\"text-sm font-medium text-blue-600 dark:text-blue-400 mb-2\">\n This Month\n </h4>\n <p className=\"text-2xl font-bold text-blue-700 dark:text-blue-300\">\n {fmtCur(analytics.revenue.thisMonth)}\n </p>\n </div>\n <div className=\"rounded-lg border border-border bg-muted/30 p-6\">\n <h4 className=\"text-sm font-medium text-muted-foreground mb-2\">Last Month</h4>\n <p className=\"text-2xl font-bold text-foreground\">\n {fmtCur(analytics.revenue.lastMonth)}\n </p>\n </div>\n <div className=\"rounded-lg border border-green-500/30 bg-green-500/10 p-6\">\n <h4 className=\"text-sm font-medium text-green-600 dark:text-green-400 mb-2\">\n Average Order Value\n </h4>\n <p className=\"text-2xl font-bold text-green-700 dark:text-green-300\">\n ₹{analytics.orders.averageOrderValue}\n </p>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-lg font-semibold text-foreground mb-4\">Revenue by City</h3>\n <div className=\"space-y-3\">\n {analytics.geography.topCities.map((city, i) => (\n <div\n key={city.city}\n className=\"flex items-center justify-between p-4 rounded-lg border border-border bg-muted/30\"\n >\n <div className=\"flex items-center gap-3\">\n {medalIcon(i)}\n <div>\n <p className=\"font-medium text-foreground\">{city.city}</p>\n <p className=\"text-sm text-muted-foreground\">\n {city.orders.toLocaleString('en-IN')} orders\n </p>\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"font-bold text-foreground\">{fmtCur(city.revenue)}</p>\n <p className=\"text-sm text-muted-foreground\">\n {((city.revenue / analytics.revenue.total) * 100).toFixed(1)}%\n </p>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Users Tab */}\n {activeTab === 'users' && (\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-4\">\n {[\n { label: 'Customers', value: analytics.users.customers, color: 'blue' },\n { label: 'Cart Owners', value: analytics.users.cartOwners, color: 'green' },\n { label: 'Workers', value: analytics.users.workers, color: 'yellow' },\n { label: 'Investors', value: analytics.users.investors, color: 'purple' },\n ].map((item) => (\n <div\n key={item.label}\n className={cn(\n 'rounded-lg border p-4',\n `border-${item.color}-500/30 bg-${item.color}-500/10`\n )}\n >\n <h4\n className={cn(\n 'text-sm font-medium',\n `text-${item.color}-600 dark:text-${item.color}-400`\n )}\n >\n {item.label}\n </h4>\n <p\n className={cn(\n 'text-2xl font-bold',\n `text-${item.color}-700 dark:text-${item.color}-300`\n )}\n >\n {item.value.toLocaleString('en-IN')}\n </p>\n <p\n className={cn(\n 'text-sm',\n `text-${item.color}-600/80 dark:text-${item.color}-400/80`\n )}\n >\n {((item.value / analytics.users.total) * 100).toFixed(1)}%\n </p>\n </div>\n ))}\n </div>\n\n <div className=\"rounded-lg border border-border bg-muted/20 p-6\">\n <h3 className=\"text-lg font-semibold text-foreground mb-4\">User Growth Insights</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div>\n <p className=\"text-sm text-muted-foreground mb-2\">New Users This Month</p>\n <p className=\"text-3xl font-bold text-blue-600 dark:text-blue-400\">\n {analytics.users.newThisMonth}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-muted-foreground mb-2\">Active Users Rate</p>\n <p className=\"text-3xl font-bold text-green-600 dark:text-green-400\">\n {((analytics.users.active / analytics.users.total) * 100).toFixed(1)}%\n </p>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Performance Tab */}\n {activeTab === 'performance' && (\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <div className=\"rounded-lg border border-border bg-card p-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Timer className=\"h-4 w-4 text-muted-foreground\" />\n <h4 className=\"text-sm font-medium text-muted-foreground\">Avg Delivery Time</h4>\n </div>\n <p className=\"text-3xl font-bold text-foreground\">\n {analytics.performance.averageDeliveryTime} min\n </p>\n <p className=\"text-sm text-muted-foreground mt-1\">Target: < 30 min</p>\n </div>\n <div className=\"rounded-lg border border-border bg-card p-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Star className=\"h-4 w-4 text-muted-foreground\" />\n <h4 className=\"text-sm font-medium text-muted-foreground\">\n Customer Satisfaction\n </h4>\n </div>\n <p className=\"text-3xl font-bold text-foreground flex items-center gap-1\">\n <Star className=\"h-6 w-6 fill-yellow-400 text-yellow-400\" />\n {analytics.performance.customerSatisfaction}\n </p>\n <p className=\"text-sm text-muted-foreground mt-1\">Based on ratings</p>\n </div>\n <div className=\"rounded-lg border border-border bg-card p-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <IndianRupee className=\"h-4 w-4 text-muted-foreground\" />\n <h4 className=\"text-sm font-medium text-muted-foreground\">Platform Fee</h4>\n </div>\n <p className=\"text-3xl font-bold text-foreground\">\n {analytics.performance.platformFee}%\n </p>\n <p className=\"text-sm text-muted-foreground mt-1\">Per transaction</p>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border bg-muted/20 p-6\">\n <h3 className=\"text-lg font-semibold text-foreground mb-4\">\n Financial Performance\n </h3>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <div>\n <p className=\"text-sm text-muted-foreground mb-2\">Operating Costs</p>\n <p className=\"text-2xl font-bold text-red-600 dark:text-red-400\">\n {fmtCur(analytics.performance.operatingCosts)}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-muted-foreground mb-2\">Total Revenue</p>\n <p className=\"text-2xl font-bold text-blue-600 dark:text-blue-400\">\n {fmtCur(analytics.revenue.total)}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-muted-foreground mb-2\">Net Profit</p>\n <p className=\"text-2xl font-bold text-green-600 dark:text-green-400\">\n {fmtCur(analytics.performance.netProfit)}\n </p>\n </div>\n </div>\n <div className=\"mt-4 rounded-lg border border-border bg-card p-4\">\n <p className=\"text-sm text-muted-foreground\">Profit Margin</p>\n <p className=\"text-xl font-bold text-foreground\">\n {((analytics.performance.netProfit / analytics.revenue.total) * 100).toFixed(1)}\n %\n </p>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border bg-card p-6\">\n <h3 className=\"text-lg font-semibold text-foreground mb-4\">\n Today's Performance\n </h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div>\n <p className=\"text-sm text-muted-foreground mb-2\">Orders Today</p>\n <p className=\"text-3xl font-bold text-blue-600 dark:text-blue-400\">\n {analytics.orders.ordersToday}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-muted-foreground mb-2\">Estimated Revenue</p>\n <p className=\"text-3xl font-bold text-green-600 dark:text-green-400\">\n {fmtCur(analytics.orders.ordersToday * analytics.orders.averageOrderValue)}\n </p>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AdminAnalyticsPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/admin/AdminAnalyticsPage.tsx"],"sourcesContent":["/**\n * Admin Analytics Page\n * @module adaptercloud/pages/admin\n *\n * Full-featured analytics with 4 tabs (Overview/Revenue/Users/Performance),\n * time period filter, order status distribution, top performing carts,\n * revenue by city, user role distribution, growth insights, financial\n * performance, and today's performance metrics.\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Users,\n TrendingUp,\n TrendingDown,\n ShoppingBag,\n IndianRupee,\n BarChart3,\n Zap,\n Loader2,\n Star,\n Award,\n MapPin,\n Clock,\n Timer,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ninterface AnalyticsData {\n revenue: { total: number; growth: number; thisMonth: number; lastMonth: number };\n orders: {\n total: number;\n growth: number;\n pending: number;\n completed: number;\n cancelled: number;\n averageOrderValue: number;\n ordersToday: number;\n };\n users: {\n total: number;\n growth: number;\n active: number;\n newThisMonth: number;\n customers: number;\n cartOwners: number;\n workers: number;\n investors: number;\n };\n carts: {\n total: number;\n active: number;\n pending: number;\n topPerforming: Array<{\n id: string;\n name: string;\n revenue: number;\n orders: number;\n rating: number;\n }>;\n };\n performance: {\n averageDeliveryTime: number;\n customerSatisfaction: number;\n platformFee: number;\n operatingCosts: number;\n netProfit: number;\n };\n geography: { topCities: Array<{ city: string; orders: number; revenue: number }> };\n}\n\ntype TimePeriod = 'today' | 'week' | 'month' | 'quarter' | 'year';\ntype TabKey = 'overview' | 'revenue' | 'users' | 'performance';\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function AdminAnalyticsPage() {\n const { currentUser } = useAdapterCloud();\n\n const [analytics, setAnalytics] = useState<AnalyticsData | null>(null);\n const [loading, setLoading] = useState(true);\n const [selectedPeriod, setSelectedPeriod] = useState<TimePeriod>('month');\n const [activeTab, setActiveTab] = useState<TabKey>('overview');\n\n useEffect(() => {\n setLoading(true);\n const timer = setTimeout(() => {\n setAnalytics({\n revenue: { total: 12500000, growth: 15.2, thisMonth: 2100000, lastMonth: 1850000 },\n orders: {\n total: 45230,\n growth: 8.7,\n pending: 156,\n completed: 44890,\n cancelled: 184,\n averageOrderValue: 276,\n ordersToday: 89,\n },\n users: {\n total: 12450,\n growth: 12.3,\n active: 9870,\n newThisMonth: 456,\n customers: 9850,\n cartOwners: 1240,\n workers: 890,\n investors: 470,\n },\n carts: {\n total: 1240,\n active: 1156,\n pending: 84,\n topPerforming: [\n { id: 'c1', name: 'South Indian Express', revenue: 285000, orders: 1250, rating: 4.8 },\n { id: 'c2', name: 'Mumbai Street Chaat', revenue: 245000, orders: 980, rating: 4.7 },\n { id: 'c3', name: 'Delhi Paratha Corner', revenue: 198000, orders: 876, rating: 4.6 },\n { id: 'c4', name: 'Bangalore Dosa House', revenue: 176000, orders: 743, rating: 4.9 },\n { id: 'c5', name: 'Kolkata Fish Fry', revenue: 154000, orders: 632, rating: 4.5 },\n ],\n },\n performance: {\n averageDeliveryTime: 28,\n customerSatisfaction: 4.6,\n platformFee: 8.5,\n operatingCosts: 2100000,\n netProfit: 850000,\n },\n geography: {\n topCities: [\n { city: 'Bangalore', orders: 15670, revenue: 4250000 },\n { city: 'Mumbai', orders: 12340, revenue: 3890000 },\n { city: 'Delhi', orders: 9870, revenue: 2980000 },\n { city: 'Hyderabad', orders: 7650, revenue: 2140000 },\n { city: 'Chennai', orders: 6540, revenue: 1890000 },\n ],\n },\n });\n setLoading(false);\n }, 800);\n return () => clearTimeout(timer);\n }, [selectedPeriod]);\n\n const fmtCur = (amount: number) => {\n if (amount >= 10000000) return `₹${(amount / 10000000).toFixed(1)}Cr`;\n if (amount >= 100000) return `₹${(amount / 100000).toFixed(1)}L`;\n return formatCurrency(amount, { minimumFractionDigits: 0 });\n };\n\n const fmtGrowth = (growth: number) => {\n const isPositive = growth >= 0;\n return (\n <span\n className={cn(\n 'flex items-center gap-1 text-sm font-medium',\n isPositive ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400'\n )}\n >\n {isPositive ? (\n <TrendingUp className=\"h-3.5 w-3.5\" />\n ) : (\n <TrendingDown className=\"h-3.5 w-3.5\" />\n )}\n {Math.abs(growth).toFixed(1)}%\n </span>\n );\n };\n\n const medalIcon = (index: number) => {\n if (index === 0) return <Award className=\"h-5 w-5 text-yellow-500\" />;\n if (index === 1) return <Award className=\"h-5 w-5 text-gray-400\" />;\n if (index === 2) return <Award className=\"h-5 w-5 text-amber-700\" />;\n return <BarChart3 className=\"h-5 w-5 text-text-secondary\" />;\n };\n\n if (loading || !analytics) {\n return (\n <PageLayout title=\"Platform Analytics\" description=\"Loading analytics...\">\n <div className=\"flex flex-col items-center justify-center py-20\">\n <Loader2 className=\"h-10 w-10 animate-spin text-text-secondary mb-4\" />\n <p className=\"text-text-secondary\">Loading analytics...</p>\n </div>\n </PageLayout>\n );\n }\n\n const tabs: Array<{ key: TabKey; label: string; icon: typeof BarChart3 }> = [\n { key: 'overview', label: 'Overview', icon: BarChart3 },\n { key: 'revenue', label: 'Revenue', icon: IndianRupee },\n { key: 'users', label: 'Users', icon: Users },\n { key: 'performance', label: 'Performance', icon: Zap },\n ];\n\n return (\n <PageLayout title=\"Platform Analytics\" description=\"Comprehensive platform metrics and trends\">\n {/* Time Period Filter */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6\">\n <select\n value={selectedPeriod}\n onChange={(e) => setSelectedPeriod(e.target.value as TimePeriod)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] w-fit\"\n >\n <option value=\"today\">Today</option>\n <option value=\"week\">This Week</option>\n <option value=\"month\">This Month</option>\n <option value=\"quarter\">This Quarter</option>\n <option value=\"year\">This Year</option>\n </select>\n <span className=\"text-sm text-text-secondary\">\n Last updated: {new Date().toLocaleString('en-IN')}\n </span>\n </div>\n\n {/* Key Metrics */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-8\">\n <MetricsCard\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={fmtCur(analytics.revenue.total)}\n label=\"Total Revenue\"\n trend=\"up\"\n trendValue={`+${analytics.revenue.growth}%`}\n />\n <MetricsCard\n icon={<ShoppingBag className=\"h-5 w-5\" />}\n value={analytics.orders.total.toLocaleString('en-IN')}\n label=\"Total Orders\"\n trend=\"up\"\n trendValue={`+${analytics.orders.growth}%`}\n />\n <MetricsCard\n icon={<Users className=\"h-5 w-5\" />}\n value={analytics.users.active.toLocaleString('en-IN')}\n label=\"Active Users\"\n trend=\"up\"\n trendValue={`+${analytics.users.growth}%`}\n />\n <MetricsCard\n icon={<BarChart3 className=\"h-5 w-5\" />}\n value={analytics.carts.active.toLocaleString('en-IN')}\n label=\"Active Carts\"\n trendValue={`${analytics.carts.pending} pending`}\n />\n </div>\n\n {/* Tabs */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface mb-8\">\n <div className=\"border-b border-border-subtle\">\n <nav className=\"flex -mb-px overflow-x-auto\">\n {tabs.map((tab) => {\n const TabIcon = tab.icon;\n return (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n className={cn(\n 'flex items-center gap-2 py-3 px-4 sm:px-6 text-sm font-medium whitespace-nowrap border-b-2 transition-colors',\n activeTab === tab.key\n ? 'border-primary text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n )}\n >\n <TabIcon className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{tab.label}</span>\n </button>\n );\n })}\n </nav>\n </div>\n\n <div className=\"p-4 sm:p-6\">\n {/* Overview Tab */}\n {activeTab === 'overview' && (\n <div className=\"space-y-8\">\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">\n Order Status Distribution\n </h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\n <div className=\"rounded-lg border border-green-500/30 bg-green-500/10 p-4\">\n <p className=\"text-sm text-green-600 dark:text-green-400\">Completed Orders</p>\n <p className=\"text-2xl font-bold text-green-700 dark:text-green-300\">\n {analytics.orders.completed.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-green-600/80 dark:text-green-400/80\">\n {((analytics.orders.completed / analytics.orders.total) * 100).toFixed(1)}% of\n total\n </p>\n </div>\n <div className=\"rounded-lg border border-yellow-500/30 bg-yellow-500/10 p-4\">\n <p className=\"text-sm text-yellow-600 dark:text-yellow-400\">Pending Orders</p>\n <p className=\"text-2xl font-bold text-yellow-700 dark:text-yellow-300\">\n {analytics.orders.pending.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-yellow-600/80 dark:text-yellow-400/80\">\n {((analytics.orders.pending / analytics.orders.total) * 100).toFixed(1)}% of\n total\n </p>\n </div>\n <div className=\"rounded-lg border border-red-500/30 bg-red-500/10 p-4\">\n <p className=\"text-sm text-red-600 dark:text-red-400\">Cancelled Orders</p>\n <p className=\"text-2xl font-bold text-red-700 dark:text-red-300\">\n {analytics.orders.cancelled.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-red-600/80 dark:text-red-400/80\">\n {((analytics.orders.cancelled / analytics.orders.total) * 100).toFixed(1)}% of\n total\n </p>\n </div>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">Top Performing Carts</h3>\n <div className=\"rounded-lg border border-border-subtle overflow-hidden\">\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 text-text-secondary uppercase\">\n Cart Name\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase\">\n Revenue\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase\">\n Orders\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase\">\n Rating\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {analytics.carts.topPerforming.map((cart, i) => (\n <tr key={cart.id} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n {medalIcon(i)}\n <span className=\"text-sm font-medium text-text-primary\">\n {cart.name}\n </span>\n </div>\n </td>\n <td className=\"px-4 py-3 text-sm text-right font-medium text-text-primary\">\n {fmtCur(cart.revenue)}\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-text-primary\">\n {cart.orders.toLocaleString('en-IN')}\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-text-primary\">\n <span className=\"flex items-center justify-end gap-1\">\n <Star className=\"h-3.5 w-3.5 fill-yellow-400 text-yellow-400\" />\n {cart.rating}\n </span>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n )}\n\n {/* Revenue Tab */}\n {activeTab === 'revenue' && (\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className=\"rounded-lg border border-blue-500/30 bg-blue-500/10 p-6\">\n <h4 className=\"text-sm font-medium text-blue-600 dark:text-blue-400 mb-2\">\n This Month\n </h4>\n <p className=\"text-2xl font-bold text-blue-700 dark:text-blue-300\">\n {fmtCur(analytics.revenue.thisMonth)}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/30 p-6\">\n <h4 className=\"text-sm font-medium text-text-secondary mb-2\">Last Month</h4>\n <p className=\"text-2xl font-bold text-text-primary\">\n {fmtCur(analytics.revenue.lastMonth)}\n </p>\n </div>\n <div className=\"rounded-lg border border-green-500/30 bg-green-500/10 p-6\">\n <h4 className=\"text-sm font-medium text-green-600 dark:text-green-400 mb-2\">\n Average Order Value\n </h4>\n <p className=\"text-2xl font-bold text-green-700 dark:text-green-300\">\n ₹{analytics.orders.averageOrderValue}\n </p>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">Revenue by City</h3>\n <div className=\"space-y-3\">\n {analytics.geography.topCities.map((city, i) => (\n <div\n key={city.city}\n className=\"flex items-center justify-between p-4 rounded-lg border border-border-subtle bg-bg-sunken/30\"\n >\n <div className=\"flex items-center gap-3\">\n {medalIcon(i)}\n <div>\n <p className=\"font-medium text-text-primary\">{city.city}</p>\n <p className=\"text-sm text-text-secondary\">\n {city.orders.toLocaleString('en-IN')} orders\n </p>\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"font-bold text-text-primary\">{fmtCur(city.revenue)}</p>\n <p className=\"text-sm text-text-secondary\">\n {((city.revenue / analytics.revenue.total) * 100).toFixed(1)}%\n </p>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Users Tab */}\n {activeTab === 'users' && (\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-4\">\n {[\n { label: 'Customers', value: analytics.users.customers, color: 'blue' },\n { label: 'Cart Owners', value: analytics.users.cartOwners, color: 'green' },\n { label: 'Workers', value: analytics.users.workers, color: 'yellow' },\n { label: 'Investors', value: analytics.users.investors, color: 'purple' },\n ].map((item) => (\n <div\n key={item.label}\n className={cn(\n 'rounded-lg border p-4',\n `border-${item.color}-500/30 bg-${item.color}-500/10`\n )}\n >\n <h4\n className={cn(\n 'text-sm font-medium',\n `text-${item.color}-600 dark:text-${item.color}-400`\n )}\n >\n {item.label}\n </h4>\n <p\n className={cn(\n 'text-2xl font-bold',\n `text-${item.color}-700 dark:text-${item.color}-300`\n )}\n >\n {item.value.toLocaleString('en-IN')}\n </p>\n <p\n className={cn(\n 'text-sm',\n `text-${item.color}-600/80 dark:text-${item.color}-400/80`\n )}\n >\n {((item.value / analytics.users.total) * 100).toFixed(1)}%\n </p>\n </div>\n ))}\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/20 p-6\">\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">User Growth Insights</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">New Users This Month</p>\n <p className=\"text-3xl font-bold text-blue-600 dark:text-blue-400\">\n {analytics.users.newThisMonth}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Active Users Rate</p>\n <p className=\"text-3xl font-bold text-green-600 dark:text-green-400\">\n {((analytics.users.active / analytics.users.total) * 100).toFixed(1)}%\n </p>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Performance Tab */}\n {activeTab === 'performance' && (\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Timer className=\"h-4 w-4 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">Avg Delivery Time</h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary\">\n {analytics.performance.averageDeliveryTime} min\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Target: < 30 min</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Star className=\"h-4 w-4 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">\n Customer Satisfaction\n </h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary flex items-center gap-1\">\n <Star className=\"h-6 w-6 fill-yellow-400 text-yellow-400\" />\n {analytics.performance.customerSatisfaction}\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Based on ratings</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <IndianRupee className=\"h-4 w-4 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">Platform Fee</h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary\">\n {analytics.performance.platformFee}%\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Per transaction</p>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/20 p-6\">\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">\n Financial Performance\n </h3>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Operating Costs</p>\n <p className=\"text-2xl font-bold text-red-600 dark:text-red-400\">\n {fmtCur(analytics.performance.operatingCosts)}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Total Revenue</p>\n <p className=\"text-2xl font-bold text-blue-600 dark:text-blue-400\">\n {fmtCur(analytics.revenue.total)}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Net Profit</p>\n <p className=\"text-2xl font-bold text-green-600 dark:text-green-400\">\n {fmtCur(analytics.performance.netProfit)}\n </p>\n </div>\n </div>\n <div className=\"mt-4 rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <p className=\"text-sm text-text-secondary\">Profit Margin</p>\n <p className=\"text-xl font-bold text-text-primary\">\n {((analytics.performance.netProfit / analytics.revenue.total) * 100).toFixed(1)}\n %\n </p>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">\n Today's Performance\n </h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Orders Today</p>\n <p className=\"text-3xl font-bold text-blue-600 dark:text-blue-400\">\n {analytics.orders.ordersToday}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Estimated Revenue</p>\n <p className=\"text-3xl font-bold text-green-600 dark:text-green-400\">\n {fmtCur(analytics.orders.ordersToday * analytics.orders.averageOrderValue)}\n </p>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|