@burdenoff/microfe-adaptercloud 2026.624.1 → 2026.625.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/dist/adaptercloud/components/EmptyState.js +17 -21
  2. package/dist/adaptercloud/components/EmptyState.js.map +1 -1
  3. package/dist/adaptercloud/components/InvestmentCard.js +25 -23
  4. package/dist/adaptercloud/components/InvestmentCard.js.map +1 -1
  5. package/dist/adaptercloud/components/MetricsCard.js +18 -12
  6. package/dist/adaptercloud/components/MetricsCard.js.map +1 -1
  7. package/dist/adaptercloud/components/PageLayout.js +45 -19
  8. package/dist/adaptercloud/components/PageLayout.js.map +1 -1
  9. package/dist/adaptercloud/components/RatingDisplay.js +3 -3
  10. package/dist/adaptercloud/components/RatingDisplay.js.map +1 -1
  11. package/dist/adaptercloud/components/StatusBadge.js +36 -16
  12. package/dist/adaptercloud/components/StatusBadge.js.map +1 -1
  13. package/dist/adaptercloud/pages/HomePage.js +244 -231
  14. package/dist/adaptercloud/pages/HomePage.js.map +1 -1
  15. package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js +121 -113
  16. package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js.map +1 -1
  17. package/dist/adaptercloud/pages/admin/AdminDashboard.js +102 -76
  18. package/dist/adaptercloud/pages/admin/AdminDashboard.js.map +1 -1
  19. package/dist/adaptercloud/pages/admin/AdminFinancialPage.js +70 -65
  20. package/dist/adaptercloud/pages/admin/AdminFinancialPage.js.map +1 -1
  21. package/dist/adaptercloud/pages/admin/AdminOrdersPage.js +108 -103
  22. package/dist/adaptercloud/pages/admin/AdminOrdersPage.js.map +1 -1
  23. package/dist/adaptercloud/pages/admin/AdminProfilePage.js +61 -59
  24. package/dist/adaptercloud/pages/admin/AdminProfilePage.js.map +1 -1
  25. package/dist/adaptercloud/pages/admin/AdminSettingsPage.js +119 -105
  26. package/dist/adaptercloud/pages/admin/AdminSettingsPage.js.map +1 -1
  27. package/dist/adaptercloud/pages/admin/CartManagementPage.js +165 -160
  28. package/dist/adaptercloud/pages/admin/CartManagementPage.js.map +1 -1
  29. package/dist/adaptercloud/pages/admin/UserManagementPage.js +174 -169
  30. package/dist/adaptercloud/pages/admin/UserManagementPage.js.map +1 -1
  31. package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js +103 -97
  32. package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  33. package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js +186 -172
  34. package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  35. package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js +109 -81
  36. package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  37. package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js +111 -109
  38. package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  39. package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js +127 -124
  40. package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  41. package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js +310 -316
  42. package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  43. package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js +251 -257
  44. package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js.map +1 -1
  45. package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js +142 -148
  46. package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js.map +1 -1
  47. package/dist/adaptercloud/pages/common/HelpSupportPage.js +287 -283
  48. package/dist/adaptercloud/pages/common/HelpSupportPage.js.map +1 -1
  49. package/dist/adaptercloud/pages/common/NotificationCenterPage.js +120 -114
  50. package/dist/adaptercloud/pages/common/NotificationCenterPage.js.map +1 -1
  51. package/dist/adaptercloud/pages/common/SettingsPage.js +754 -736
  52. package/dist/adaptercloud/pages/common/SettingsPage.js.map +1 -1
  53. package/dist/adaptercloud/pages/customer/BookingDetailsPage.js +83 -80
  54. package/dist/adaptercloud/pages/customer/BookingDetailsPage.js.map +1 -1
  55. package/dist/adaptercloud/pages/customer/CartDetailPage.js +120 -117
  56. package/dist/adaptercloud/pages/customer/CartDetailPage.js.map +1 -1
  57. package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js +231 -226
  58. package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js.map +1 -1
  59. package/dist/adaptercloud/pages/customer/CheckoutPage.js +97 -95
  60. package/dist/adaptercloud/pages/customer/CheckoutPage.js.map +1 -1
  61. package/dist/adaptercloud/pages/customer/CustomerDashboard.js +418 -389
  62. package/dist/adaptercloud/pages/customer/CustomerDashboard.js.map +1 -1
  63. package/dist/adaptercloud/pages/customer/CustomerProfilePage.js +134 -132
  64. package/dist/adaptercloud/pages/customer/CustomerProfilePage.js.map +1 -1
  65. package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js +108 -102
  66. package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js.map +1 -1
  67. package/dist/adaptercloud/pages/customer/FavoritesPage.js +62 -59
  68. package/dist/adaptercloud/pages/customer/FavoritesPage.js.map +1 -1
  69. package/dist/adaptercloud/pages/customer/OrderHistoryPage.js +117 -111
  70. package/dist/adaptercloud/pages/customer/OrderHistoryPage.js.map +1 -1
  71. package/dist/adaptercloud/pages/customer/OrderTrackingPage.js +71 -68
  72. package/dist/adaptercloud/pages/customer/OrderTrackingPage.js.map +1 -1
  73. package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js +97 -81
  74. package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js.map +1 -1
  75. package/dist/adaptercloud/pages/customer/ReviewsPage.js +83 -80
  76. package/dist/adaptercloud/pages/customer/ReviewsPage.js.map +1 -1
  77. package/dist/adaptercloud/pages/customer/SavedAddressesPage.js +82 -66
  78. package/dist/adaptercloud/pages/customer/SavedAddressesPage.js.map +1 -1
  79. package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js +93 -91
  80. package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js.map +1 -1
  81. package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js +100 -97
  82. package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  83. package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js +83 -81
  84. package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  85. package/dist/adaptercloud/pages/investor/InvestorDashboard.js +344 -311
  86. package/dist/adaptercloud/pages/investor/InvestorDashboard.js.map +1 -1
  87. package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js +43 -40
  88. package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  89. package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js +59 -57
  90. package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js.map +1 -1
  91. package/dist/adaptercloud/pages/investor/InvestorProfilePage.js +394 -392
  92. package/dist/adaptercloud/pages/investor/InvestorProfilePage.js.map +1 -1
  93. package/dist/adaptercloud/pages/worker/TaskDetailsPage.js +354 -324
  94. package/dist/adaptercloud/pages/worker/TaskDetailsPage.js.map +1 -1
  95. package/dist/adaptercloud/pages/worker/WorkerDashboard.js +122 -97
  96. package/dist/adaptercloud/pages/worker/WorkerDashboard.js.map +1 -1
  97. package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js +107 -104
  98. package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js.map +1 -1
  99. package/dist/adaptercloud/pages/worker/WorkerProfilePage.js +109 -107
  100. package/dist/adaptercloud/pages/worker/WorkerProfilePage.js.map +1 -1
  101. package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js +94 -90
  102. package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js.map +1 -1
  103. package/package.json +3 -3
@@ -6,8 +6,9 @@ import { mockAdminAnalytics as i } from "../../mocks/data.js";
6
6
  import { useState as a } from "react";
7
7
  import { ArrowDownRight as o, ArrowUpRight as s, BarChart3 as c, CalendarDays as l, Clock as u, Download as d, IndianRupee as f, Percent as p, ShoppingCart as m, Star as h, Target as g, ThumbsUp as _, TrendingUp as v, Users as y } from "lucide-react";
8
8
  import { Fragment as b, jsx as x, jsxs as S } from "react/jsx-runtime";
9
+ import { EmphasisPanel as C } from "@burdenoff/fe-libs/ui";
9
10
  //#region src/adaptercloud/pages/cart-owner/AnalyticsDashboard.tsx
10
- var C = {
11
+ var w = {
11
12
  revenue: {
12
13
  today: 12450,
13
14
  week: 87150,
@@ -249,16 +250,17 @@ var C = {
249
250
  }
250
251
  ]
251
252
  }
252
- }, w = () => {
253
- let { navigateTo: w } = e(), [T, E] = a("week"), D = Math.max(...C.orders.popularTimes.map((e) => e.orders)), O = Math.max(...C.offerings.categories.map((e) => e.revenue)), k = Math.max(...C.performance.peakHours.map((e) => e.orders)), A = Math.max(...C.performance.peakDays.map((e) => e.orders)), j = (e) => `${e > 0 ? "+" : ""}${e}%`;
253
+ }, T = () => {
254
+ let { navigateTo: T } = e(), [E, D] = a("week"), O = Math.max(...w.orders.popularTimes.map((e) => e.orders)), k = Math.max(...w.offerings.categories.map((e) => e.revenue)), A = Math.max(...w.performance.peakHours.map((e) => e.orders)), j = Math.max(...w.performance.peakDays.map((e) => e.orders)), M = (e) => `${e > 0 ? "+" : ""}${e}%`;
254
255
  return /* @__PURE__ */ x(n, {
255
256
  title: "Analytics Dashboard",
256
257
  description: "Business performance insights and data",
258
+ purpose: "Understand how your cart is really doing — sales trends, your best-selling offerings, repeat customers, and busy hours. Use these insights to decide what to stock, when to staff up, and which offerings to promote.",
257
259
  actions: /* @__PURE__ */ S("div", {
258
260
  className: "flex items-center gap-2",
259
261
  children: [/* @__PURE__ */ S("select", {
260
- value: T,
261
- onChange: (e) => E(e.target.value),
262
+ value: E,
263
+ onChange: (e) => D(e.target.value),
262
264
  className: "rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary",
263
265
  children: [
264
266
  /* @__PURE__ */ x("option", {
@@ -288,56 +290,60 @@ var C = {
288
290
  children: /* @__PURE__ */ S("div", {
289
291
  className: "space-y-6",
290
292
  children: [
291
- /* @__PURE__ */ S("section", { children: [/* @__PURE__ */ x("h2", {
292
- className: "text-base font-semibold text-text-primary mb-3",
293
- children: "Revenue Overview"
294
- }), /* @__PURE__ */ x("div", {
295
- className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4",
296
- children: [
297
- {
298
- label: "Today's Revenue",
299
- value: C.revenue.today,
300
- growth: C.revenue.growth.daily
301
- },
302
- {
303
- label: "This Week",
304
- value: C.revenue.week,
305
- growth: C.revenue.growth.weekly
306
- },
307
- {
308
- label: "This Month",
309
- value: C.revenue.month,
310
- growth: C.revenue.growth.monthly
311
- },
312
- {
313
- label: "This Year",
314
- value: C.revenue.year,
315
- growth: null
316
- }
317
- ].map((e) => /* @__PURE__ */ S("div", {
318
- className: "rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm",
293
+ /* @__PURE__ */ S(C, {
294
+ role: "region",
295
+ "aria-label": "Revenue overview",
296
+ children: [/* @__PURE__ */ x("h2", {
297
+ className: "text-base font-semibold text-text-primary mb-3",
298
+ children: "Revenue Overview"
299
+ }), /* @__PURE__ */ x("div", {
300
+ className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4",
319
301
  children: [
320
- /* @__PURE__ */ S("div", {
321
- className: "flex items-center justify-between",
322
- children: [/* @__PURE__ */ x("div", {
323
- className: "rounded-md bg-accent p-2",
324
- children: /* @__PURE__ */ x(f, { className: "h-5 w-5 text-text-secondary" })
325
- }), e.growth !== null && /* @__PURE__ */ S("div", {
326
- className: t("flex items-center gap-1 text-xs font-medium", e.growth >= 0 ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400"),
327
- children: [e.growth >= 0 ? /* @__PURE__ */ x(s, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ x(o, { className: "h-3.5 w-3.5" }), j(e.growth)]
328
- })]
329
- }),
330
- /* @__PURE__ */ x("p", {
331
- className: "mt-3 text-2xl font-bold text-text-primary",
332
- children: r(e.value, { minimumFractionDigits: 0 })
333
- }),
334
- /* @__PURE__ */ x("p", {
335
- className: "mt-1 text-sm text-text-secondary",
336
- children: e.label
337
- })
338
- ]
339
- }, e.label))
340
- })] }),
302
+ {
303
+ label: "Today's Revenue",
304
+ value: w.revenue.today,
305
+ growth: w.revenue.growth.daily
306
+ },
307
+ {
308
+ label: "This Week",
309
+ value: w.revenue.week,
310
+ growth: w.revenue.growth.weekly
311
+ },
312
+ {
313
+ label: "This Month",
314
+ value: w.revenue.month,
315
+ growth: w.revenue.growth.monthly
316
+ },
317
+ {
318
+ label: "This Year",
319
+ value: w.revenue.year,
320
+ growth: null
321
+ }
322
+ ].map((e) => /* @__PURE__ */ S("div", {
323
+ className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
324
+ children: [
325
+ /* @__PURE__ */ S("div", {
326
+ className: "flex items-center justify-between",
327
+ children: [/* @__PURE__ */ x("div", {
328
+ className: "rounded-md bg-accent p-2",
329
+ children: /* @__PURE__ */ x(f, { className: "h-5 w-5 text-text-secondary" })
330
+ }), e.growth !== null && /* @__PURE__ */ S("div", {
331
+ className: t("flex items-center gap-1 text-xs font-medium", e.growth >= 0 ? "text-status-success-text" : "text-status-error-text"),
332
+ children: [e.growth >= 0 ? /* @__PURE__ */ x(s, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ x(o, { className: "h-3.5 w-3.5" }), M(e.growth)]
333
+ })]
334
+ }),
335
+ /* @__PURE__ */ x("p", {
336
+ className: "mt-3 text-2xl font-bold text-text-primary",
337
+ children: r(e.value, { minimumFractionDigits: 0 })
338
+ }),
339
+ /* @__PURE__ */ x("p", {
340
+ className: "mt-1 text-sm text-text-secondary",
341
+ children: e.label
342
+ })
343
+ ]
344
+ }, e.label))
345
+ })]
346
+ }),
341
347
  /* @__PURE__ */ S("div", {
342
348
  className: "grid grid-cols-1 lg:grid-cols-2 gap-6",
343
349
  children: [/* @__PURE__ */ S("div", {
@@ -358,28 +364,28 @@ var C = {
358
364
  children: "Total Orders"
359
365
  }), /* @__PURE__ */ x("p", {
360
366
  className: "text-2xl font-bold text-text-primary",
361
- children: C.orders.total
367
+ children: w.orders.total
362
368
  })] }),
363
369
  /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
364
370
  className: "text-xs text-text-secondary",
365
371
  children: "Avg. Order Value"
366
372
  }), /* @__PURE__ */ x("p", {
367
373
  className: "text-2xl font-bold text-text-primary",
368
- children: r(C.orders.averageValue, { minimumFractionDigits: 0 })
374
+ children: r(w.orders.averageValue, { minimumFractionDigits: 0 })
369
375
  })] }),
370
376
  /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
371
377
  className: "text-xs text-text-secondary",
372
378
  children: "Completed"
373
379
  }), /* @__PURE__ */ x("p", {
374
- className: "text-xl font-bold text-green-600 dark:text-green-400",
375
- children: C.orders.completed
380
+ className: "text-xl font-bold text-status-success-text",
381
+ children: w.orders.completed
376
382
  })] }),
377
383
  /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
378
384
  className: "text-xs text-text-secondary",
379
385
  children: "Cancelled"
380
386
  }), /* @__PURE__ */ x("p", {
381
- className: "text-xl font-bold text-red-600 dark:text-red-400",
382
- children: C.orders.cancelled
387
+ className: "text-xl font-bold text-status-error-text",
388
+ children: w.orders.cancelled
383
389
  })] })
384
390
  ]
385
391
  }), /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
@@ -387,7 +393,7 @@ var C = {
387
393
  children: "Avg. Preparation Time"
388
394
  }), /* @__PURE__ */ S("p", {
389
395
  className: "text-sm font-medium text-text-primary",
390
- children: [C.orders.averagePreparationTime, " minutes"]
396
+ children: [w.orders.averagePreparationTime, " minutes"]
391
397
  })] })]
392
398
  })]
393
399
  }), /* @__PURE__ */ S("div", {
@@ -400,8 +406,8 @@ var C = {
400
406
  })
401
407
  }), /* @__PURE__ */ x("div", {
402
408
  className: "p-5 space-y-2",
403
- children: C.orders.popularTimes.map((e) => {
404
- let n = e.orders / D * 100;
409
+ children: w.orders.popularTimes.map((e) => {
410
+ let n = e.orders / O * 100;
405
411
  return /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ S("div", {
406
412
  className: "flex items-center justify-between text-xs mb-0.5",
407
413
  children: [/* @__PURE__ */ x("span", {
@@ -414,7 +420,7 @@ var C = {
414
420
  }), /* @__PURE__ */ x("div", {
415
421
  className: "h-2 rounded-full bg-bg-sunken overflow-hidden",
416
422
  children: /* @__PURE__ */ x("div", {
417
- className: t("h-full rounded-full transition-all", e.orders > 25 ? "bg-red-500/60" : e.orders > 18 ? "bg-yellow-500/60" : "bg-green-500/60"),
423
+ className: t("h-full rounded-full transition-all", e.orders > 25 ? "bg-status-error-bg-subtle/60" : e.orders > 18 ? "bg-status-warning-bg-subtle/60" : "bg-status-success-bg-subtle/60"),
418
424
  style: { width: `${n}%` }
419
425
  })
420
426
  })] }, e.hour);
@@ -430,32 +436,32 @@ var C = {
430
436
  children: [
431
437
  {
432
438
  label: "Acceptance Rate",
433
- value: `${C.performance.acceptanceRate}%`,
439
+ value: `${w.performance.acceptanceRate}%`,
434
440
  icon: g,
435
- color: "text-green-600 dark:text-green-400"
441
+ color: "text-status-success-text"
436
442
  },
437
443
  {
438
444
  label: "Cancellation Rate",
439
- value: `${C.performance.cancellationRate}%`,
445
+ value: `${w.performance.cancellationRate}%`,
440
446
  icon: p,
441
- color: "text-red-600 dark:text-red-400"
447
+ color: "text-status-error-text"
442
448
  },
443
449
  {
444
450
  label: "On-Time Delivery",
445
- value: `${C.performance.onTimeDeliveryRate}%`,
451
+ value: `${w.performance.onTimeDeliveryRate}%`,
446
452
  icon: u,
447
- color: "text-blue-600 dark:text-blue-400"
453
+ color: "text-accent-blue"
448
454
  },
449
455
  {
450
456
  label: "Average Rating",
451
- value: `${C.performance.averageRating}`,
457
+ value: `${w.performance.averageRating}`,
452
458
  icon: h,
453
- color: "text-yellow-600 dark:text-yellow-400"
459
+ color: "text-status-warning-text"
454
460
  }
455
461
  ].map((e) => {
456
462
  let n = e.icon;
457
463
  return /* @__PURE__ */ S("div", {
458
- className: "rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm",
464
+ className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
459
465
  children: [/* @__PURE__ */ S("div", {
460
466
  className: "flex items-center gap-2 mb-2",
461
467
  children: [/* @__PURE__ */ x(n, { className: t("h-5 w-5", e.color) }), /* @__PURE__ */ x("span", {
@@ -483,7 +489,7 @@ var C = {
483
489
  }),
484
490
  /* @__PURE__ */ x("div", {
485
491
  className: "divide-y divide-border",
486
- children: C.offerings.topSelling.map((e, t) => /* @__PURE__ */ S("div", {
492
+ children: w.offerings.topSelling.map((e, t) => /* @__PURE__ */ S("div", {
487
493
  className: "flex items-center justify-between px-5 py-3",
488
494
  children: [/* @__PURE__ */ S("div", {
489
495
  className: "flex items-center gap-3",
@@ -513,7 +519,7 @@ var C = {
513
519
  children: [/* @__PURE__ */ x("p", {
514
520
  className: "text-xs font-medium text-text-secondary mb-2",
515
521
  children: "Least Selling"
516
- }), C.offerings.leastSelling.map((e) => /* @__PURE__ */ S("div", {
522
+ }), w.offerings.leastSelling.map((e) => /* @__PURE__ */ S("div", {
517
523
  className: "flex items-center justify-between py-1.5",
518
524
  children: [/* @__PURE__ */ x("span", {
519
525
  className: "text-xs text-text-secondary",
@@ -540,8 +546,8 @@ var C = {
540
546
  })
541
547
  }), /* @__PURE__ */ x("div", {
542
548
  className: "p-5 space-y-4",
543
- children: C.offerings.categories.map((e) => {
544
- let t = e.revenue / O * 100;
549
+ children: w.offerings.categories.map((e) => {
550
+ let t = e.revenue / k * 100;
545
551
  return /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ S("div", {
546
552
  className: "flex items-center justify-between text-sm mb-1",
547
553
  children: [/* @__PURE__ */ x("span", {
@@ -560,7 +566,7 @@ var C = {
560
566
  }), /* @__PURE__ */ x("div", {
561
567
  className: "h-2.5 rounded-full bg-bg-sunken overflow-hidden",
562
568
  children: /* @__PURE__ */ x("div", {
563
- className: "h-full rounded-full bg-blue-500/60",
569
+ className: "h-full rounded-full bg-accent-blue-subtle/60",
564
570
  style: { width: `${t}%` }
565
571
  })
566
572
  })] }, e.category);
@@ -589,28 +595,28 @@ var C = {
589
595
  children: "Total Customers"
590
596
  }), /* @__PURE__ */ x("p", {
591
597
  className: "text-xl font-bold text-text-primary",
592
- children: C.customers.total
598
+ children: w.customers.total
593
599
  })] }),
594
600
  /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
595
601
  className: "text-xs text-text-secondary",
596
602
  children: "New This Month"
597
603
  }), /* @__PURE__ */ x("p", {
598
- className: "text-xl font-bold text-blue-600 dark:text-blue-400",
599
- children: C.customers.new
604
+ className: "text-xl font-bold text-accent-blue",
605
+ children: w.customers.new
600
606
  })] }),
601
607
  /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
602
608
  className: "text-xs text-text-secondary",
603
609
  children: "Returning"
604
610
  }), /* @__PURE__ */ x("p", {
605
- className: "text-xl font-bold text-green-600 dark:text-green-400",
606
- children: C.customers.returning
611
+ className: "text-xl font-bold text-status-success-text",
612
+ children: w.customers.returning
607
613
  })] }),
608
614
  /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
609
615
  className: "text-xs text-text-secondary",
610
616
  children: "Satisfaction"
611
617
  }), /* @__PURE__ */ S("p", {
612
- className: "text-xl font-bold text-yellow-600 dark:text-yellow-400 flex items-center gap-1",
613
- children: [/* @__PURE__ */ x(h, { className: "h-4 w-4 fill-yellow-400 text-yellow-400" }), C.customers.satisfaction.rating]
618
+ className: "text-xl font-bold text-status-warning-text flex items-center gap-1",
619
+ children: [/* @__PURE__ */ x(h, { className: "h-4 w-4 fill-status-warning-text text-status-warning-text" }), w.customers.satisfaction.rating]
614
620
  })] })
615
621
  ]
616
622
  }),
@@ -642,7 +648,7 @@ var C = {
642
648
  children: "Total Spent"
643
649
  })
644
650
  ]
645
- }) }), /* @__PURE__ */ x("tbody", { children: C.customers.topCustomers.map((e, t) => /* @__PURE__ */ S("tr", {
651
+ }) }), /* @__PURE__ */ x("tbody", { children: w.customers.topCustomers.map((e, t) => /* @__PURE__ */ S("tr", {
646
652
  className: "border-b border-border-subtle last:border-0",
647
653
  children: [
648
654
  /* @__PURE__ */ x("td", {
@@ -669,12 +675,12 @@ var C = {
669
675
  className: "mt-4 flex items-center gap-4 text-sm",
670
676
  children: /* @__PURE__ */ S("div", {
671
677
  className: "flex items-center gap-1.5",
672
- children: [/* @__PURE__ */ x(_, { className: "h-4 w-4 text-green-600 dark:text-green-400" }), /* @__PURE__ */ S("span", {
678
+ children: [/* @__PURE__ */ x(_, { className: "h-4 w-4 text-status-success-text" }), /* @__PURE__ */ S("span", {
673
679
  className: "text-text-secondary",
674
680
  children: [
675
- C.customers.satisfaction.positiveReviews,
681
+ w.customers.satisfaction.positiveReviews,
676
682
  "/",
677
- C.customers.satisfaction.reviews,
683
+ w.customers.satisfaction.reviews,
678
684
  " positive reviews"
679
685
  ]
680
686
  })]
@@ -694,8 +700,8 @@ var C = {
694
700
  })
695
701
  }), /* @__PURE__ */ x("div", {
696
702
  className: "p-5 space-y-3",
697
- children: C.performance.peakHours.map((e) => {
698
- let n = e.orders / k * 100;
703
+ children: w.performance.peakHours.map((e) => {
704
+ let n = e.orders / A * 100;
699
705
  return /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ S("div", {
700
706
  className: "flex items-center justify-between text-xs mb-1",
701
707
  children: [/* @__PURE__ */ x("span", {
@@ -708,7 +714,7 @@ var C = {
708
714
  }), /* @__PURE__ */ x("div", {
709
715
  className: "h-2 rounded-full bg-bg-sunken overflow-hidden",
710
716
  children: /* @__PURE__ */ x("div", {
711
- className: t("h-full rounded-full", e.orders > 28 ? "bg-red-500/60" : e.orders > 22 ? "bg-yellow-500/60" : "bg-green-500/60"),
717
+ className: t("h-full rounded-full", e.orders > 28 ? "bg-status-error-bg-subtle/60" : e.orders > 22 ? "bg-status-warning-bg-subtle/60" : "bg-status-success-bg-subtle/60"),
712
718
  style: { width: `${n}%` }
713
719
  })
714
720
  })] }, e.hour);
@@ -724,8 +730,8 @@ var C = {
724
730
  })
725
731
  }), /* @__PURE__ */ x("div", {
726
732
  className: "p-5 space-y-3",
727
- children: C.performance.peakDays.map((e) => {
728
- let t = e.orders / A * 100;
733
+ children: w.performance.peakDays.map((e) => {
734
+ let t = e.orders / j * 100;
729
735
  return /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ S("div", {
730
736
  className: "flex items-center justify-between text-xs mb-1",
731
737
  children: [/* @__PURE__ */ x("span", {
@@ -738,7 +744,7 @@ var C = {
738
744
  }), /* @__PURE__ */ x("div", {
739
745
  className: "h-2 rounded-full bg-bg-sunken overflow-hidden",
740
746
  children: /* @__PURE__ */ x("div", {
741
- className: "h-full rounded-full bg-blue-500/60",
747
+ className: "h-full rounded-full bg-accent-blue-subtle/60",
742
748
  style: { width: `${t}%` }
743
749
  })
744
750
  })] }, e.day);
@@ -813,7 +819,7 @@ var C = {
813
819
  children: i.customerGrowth.map((e) => {
814
820
  let t = Math.max(...i.customerGrowth.map((e) => e.newCustomers));
815
821
  return /* @__PURE__ */ x("div", {
816
- className: "flex-1 rounded-t bg-blue-500/40 hover:bg-blue-500/60 transition-colors cursor-default",
822
+ className: "flex-1 rounded-t bg-accent-blue-subtle/40 hover:bg-accent-blue-subtle/60 transition-colors cursor-default",
817
823
  style: { height: `${e.newCustomers / t * 100}%` },
818
824
  title: `${e.month}: ${e.newCustomers} new customers`
819
825
  }, e.month);
@@ -829,6 +835,6 @@ var C = {
829
835
  });
830
836
  };
831
837
  //#endregion
832
- export { w as AnalyticsDashboard };
838
+ export { T as AnalyticsDashboard };
833
839
 
834
840
  //# sourceMappingURL=AnalyticsDashboard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDashboard.js","names":[],"sources":["../../../../src/adaptercloud/pages/cart-owner/AnalyticsDashboard.tsx"],"sourcesContent":["/**\n * Analytics Dashboard Page\n *\n * Revenue overview (today/week/month/year with growth), order statistics,\n * popular times progress bars, performance metrics, top selling offerings,\n * category performance, customer overview with top customers table,\n * peak hours/days, date range selector.\n *\n * @module adaptercloud/pages/cart-owner\n */\n\nimport { useState } from 'react';\nimport {\n IndianRupee,\n ShoppingCart,\n Users,\n TrendingUp,\n BarChart3,\n Clock,\n Star,\n ArrowUpRight,\n ArrowDownRight,\n Download,\n Target,\n Percent,\n ThumbsUp,\n CalendarDays,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { mockAdminAnalytics, mockDashboardStats } from '../../mocks/data';\nimport { formatCurrency, formatNumber } from '../../utils/formatters';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Mock Analytics Data (full from legacy)\n// ============================================================================\n\nconst analyticsData = {\n revenue: {\n today: 12450,\n week: 87150,\n month: 348600,\n year: 4183200,\n growth: { daily: 12.5, weekly: 8.3, monthly: 15.2 },\n },\n orders: {\n total: 156,\n pending: 3,\n completed: 145,\n cancelled: 8,\n averageValue: 285,\n averagePreparationTime: 18,\n popularTimes: [\n { hour: 8, orders: 12 },\n { hour: 9, orders: 15 },\n { hour: 10, orders: 18 },\n { hour: 11, orders: 22 },\n { hour: 12, orders: 28 },\n { hour: 13, orders: 32 },\n { hour: 14, orders: 16 },\n { hour: 15, orders: 12 },\n { hour: 16, orders: 14 },\n { hour: 17, orders: 18 },\n { hour: 18, orders: 20 },\n { hour: 19, orders: 25 },\n { hour: 20, orders: 22 },\n { hour: 21, orders: 15 },\n ],\n },\n offerings: {\n topSelling: [\n { id: '1', name: 'Masala Dosa', quantity: 245, revenue: 19600, category: 'Food & Beverage' },\n {\n id: '2',\n name: 'Haircut Service',\n quantity: 89,\n revenue: 11340,\n category: 'Personal Care & Beauty',\n },\n { id: '3', name: 'Filter Coffee', quantity: 312, revenue: 9360, category: 'Food & Beverage' },\n {\n id: '4',\n name: 'Mobile Repair',\n quantity: 67,\n revenue: 6680,\n category: 'Repair & Maintenance',\n },\n { id: '5', name: 'Pongal', quantity: 98, revenue: 5880, category: 'Food & Beverage' },\n ],\n leastSelling: [\n { id: '6', name: 'Bisi Bele Bath', quantity: 12, revenue: 1440, category: 'Food & Beverage' },\n { id: '7', name: 'Cleaning Service', quantity: 8, revenue: 640, category: 'Home Services' },\n { id: '8', name: 'Kosambari', quantity: 15, revenue: 450, category: 'Food & Beverage' },\n ],\n categories: [\n { category: 'Food & Beverage', revenue: 45000, orders: 450 },\n { category: 'Personal Care & Beauty', revenue: 25000, orders: 180 },\n { category: 'Repair & Maintenance', revenue: 15000, orders: 120 },\n { category: 'Home Services', revenue: 8000, orders: 80 },\n ],\n },\n customers: {\n total: 342,\n new: 45,\n returning: 297,\n topCustomers: [\n { id: '1', name: 'Rahul Sharma', orders: 23, totalSpent: 6555 },\n { id: '2', name: 'Priya Patel', orders: 19, totalSpent: 5415 },\n { id: '3', name: 'Amit Kumar', orders: 17, totalSpent: 4845 },\n { id: '4', name: 'Sneha Reddy', orders: 15, totalSpent: 4275 },\n { id: '5', name: 'Vijay Singh', orders: 14, totalSpent: 3990 },\n ],\n satisfaction: { rating: 4.6, reviews: 89, positiveReviews: 78 },\n },\n performance: {\n acceptanceRate: 94,\n cancellationRate: 6,\n onTimeDeliveryRate: 88,\n averageRating: 4.6,\n peakHours: [\n { hour: '12-1 PM', orders: 32 },\n { hour: '1-2 PM', orders: 28 },\n { hour: '7-8 PM', orders: 25 },\n { hour: '8-9 PM', orders: 22 },\n ],\n peakDays: [\n { day: 'Sunday', orders: 45 },\n { day: 'Saturday', orders: 42 },\n { day: 'Friday', orders: 38 },\n ],\n },\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const AnalyticsDashboard = () => {\n const { navigateTo } = useAdapterCloud();\n const [dateRange, setDateRange] = useState('week');\n\n const maxPopularTime = Math.max(...analyticsData.orders.popularTimes.map((t) => t.orders));\n const maxCategoryRevenue = Math.max(...analyticsData.offerings.categories.map((c) => c.revenue));\n const maxPeakHourOrders = Math.max(...analyticsData.performance.peakHours.map((h) => h.orders));\n const maxPeakDayOrders = Math.max(...analyticsData.performance.peakDays.map((d) => d.orders));\n\n const formatPct = (v: number) => `${v > 0 ? '+' : ''}${v}%`;\n\n return (\n <PageLayout\n title=\"Analytics Dashboard\"\n description=\"Business performance insights and data\"\n actions={\n <div className=\"flex items-center gap-2\">\n <select\n value={dateRange}\n onChange={(e) => setDateRange(e.target.value)}\n className=\"rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"today\">Today</option>\n <option value=\"week\">This Week</option>\n <option value=\"month\">This Month</option>\n <option value=\"year\">This Year</option>\n </select>\n <button\n type=\"button\"\n onClick={() => alert('Export feature coming soon!')}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <Download className=\"h-4 w-4\" />\n Export\n </button>\n </div>\n }\n >\n <div className=\"space-y-6\">\n {/* Revenue Overview */}\n <section>\n <h2 className=\"text-base font-semibold text-text-primary mb-3\">Revenue Overview</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4\">\n {[\n {\n label: \"Today's Revenue\",\n value: analyticsData.revenue.today,\n growth: analyticsData.revenue.growth.daily,\n },\n {\n label: 'This Week',\n value: analyticsData.revenue.week,\n growth: analyticsData.revenue.growth.weekly,\n },\n {\n label: 'This Month',\n value: analyticsData.revenue.month,\n growth: analyticsData.revenue.growth.monthly,\n },\n { label: 'This Year', value: analyticsData.revenue.year, growth: null },\n ].map((card) => (\n <div\n key={card.label}\n className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"rounded-md bg-accent p-2\">\n <IndianRupee className=\"h-5 w-5 text-text-secondary\" />\n </div>\n {card.growth !== null && (\n <div\n className={cn(\n 'flex items-center gap-1 text-xs font-medium',\n card.growth >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {card.growth >= 0 ? (\n <ArrowUpRight className=\"h-3.5 w-3.5\" />\n ) : (\n <ArrowDownRight className=\"h-3.5 w-3.5\" />\n )}\n {formatPct(card.growth)}\n </div>\n )}\n </div>\n <p className=\"mt-3 text-2xl font-bold text-text-primary\">\n {formatCurrency(card.value, { minimumFractionDigits: 0 })}\n </p>\n <p className=\"mt-1 text-sm text-text-secondary\">{card.label}</p>\n </div>\n ))}\n </div>\n </section>\n\n {/* Order Statistics + Popular Times */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {/* Order Statistics */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <ShoppingCart className=\"h-4 w-4 text-text-secondary\" />\n Order Statistics\n </h2>\n </div>\n <div className=\"p-5\">\n <div className=\"grid grid-cols-2 gap-4 mb-5\">\n <div>\n <p className=\"text-xs text-text-secondary\">Total Orders</p>\n <p className=\"text-2xl font-bold text-text-primary\">{analyticsData.orders.total}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Avg. Order Value</p>\n <p className=\"text-2xl font-bold text-text-primary\">\n {formatCurrency(analyticsData.orders.averageValue, {\n minimumFractionDigits: 0,\n })}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Completed</p>\n <p className=\"text-xl font-bold text-green-600 dark:text-green-400\">\n {analyticsData.orders.completed}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Cancelled</p>\n <p className=\"text-xl font-bold text-red-600 dark:text-red-400\">\n {analyticsData.orders.cancelled}\n </p>\n </div>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary mb-1\">Avg. Preparation Time</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {analyticsData.orders.averagePreparationTime} minutes\n </p>\n </div>\n </div>\n </div>\n\n {/* Popular Times */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n Popular Times\n </h2>\n </div>\n <div className=\"p-5 space-y-2\">\n {analyticsData.orders.popularTimes.map((t) => {\n const pct = (t.orders / maxPopularTime) * 100;\n const label = `${t.hour}:00`;\n return (\n <div key={t.hour}>\n <div className=\"flex items-center justify-between text-xs mb-0.5\">\n <span className=\"text-text-primary w-14\">{label}</span>\n <span className=\"text-text-secondary\">{t.orders} orders</span>\n </div>\n <div className=\"h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={cn(\n 'h-full rounded-full transition-all',\n t.orders > 25\n ? 'bg-red-500/60'\n : t.orders > 18\n ? 'bg-yellow-500/60'\n : 'bg-green-500/60'\n )}\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Performance Metrics */}\n <section>\n <h2 className=\"text-base font-semibold text-text-primary mb-3\">Performance Metrics</h2>\n <div className=\"grid grid-cols-2 lg:grid-cols-4 gap-4\">\n {[\n {\n label: 'Acceptance Rate',\n value: `${analyticsData.performance.acceptanceRate}%`,\n icon: Target,\n color: 'text-green-600 dark:text-green-400',\n },\n {\n label: 'Cancellation Rate',\n value: `${analyticsData.performance.cancellationRate}%`,\n icon: Percent,\n color: 'text-red-600 dark:text-red-400',\n },\n {\n label: 'On-Time Delivery',\n value: `${analyticsData.performance.onTimeDeliveryRate}%`,\n icon: Clock,\n color: 'text-blue-600 dark:text-blue-400',\n },\n {\n label: 'Average Rating',\n value: `${analyticsData.performance.averageRating}`,\n icon: Star,\n color: 'text-yellow-600 dark:text-yellow-400',\n },\n ].map((metric) => {\n const Icon = metric.icon;\n return (\n <div\n key={metric.label}\n className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\"\n >\n <div className=\"flex items-center gap-2 mb-2\">\n <Icon className={cn('h-5 w-5', metric.color)} />\n <span className=\"text-xs text-text-secondary\">{metric.label}</span>\n </div>\n <p className={cn('text-2xl font-bold', metric.color)}>{metric.value}</p>\n </div>\n );\n })}\n </div>\n </section>\n\n {/* Top Selling + Category Performance */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {/* Top Selling Offerings */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n Top Selling Offerings\n </h2>\n </div>\n <div className=\"divide-y divide-border\">\n {analyticsData.offerings.topSelling.map((item, i) => (\n <div key={item.id} className=\"flex items-center justify-between px-5 py-3\">\n <div className=\"flex items-center gap-3\">\n <span className=\"flex h-6 w-6 items-center justify-center rounded-full bg-bg-sunken text-xs font-medium text-text-secondary\">\n {i + 1}\n </span>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{item.name}</p>\n <p className=\"text-xs text-text-secondary\">\n {item.category} | {item.quantity} sold\n </p>\n </div>\n </div>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(item.revenue, { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n {/* Least Selling */}\n <div className=\"border-t border-border-subtle px-5 py-3\">\n <p className=\"text-xs font-medium text-text-secondary mb-2\">Least Selling</p>\n {analyticsData.offerings.leastSelling.map((item) => (\n <div key={item.id} className=\"flex items-center justify-between py-1.5\">\n <span className=\"text-xs text-text-secondary\">{item.name}</span>\n <span className=\"text-xs text-text-secondary\">\n {item.quantity} sold |{' '}\n {formatCurrency(item.revenue, { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n </div>\n\n {/* Category Performance */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <BarChart3 className=\"h-4 w-4 text-text-secondary\" />\n Category Performance\n </h2>\n </div>\n <div className=\"p-5 space-y-4\">\n {analyticsData.offerings.categories.map((cat) => {\n const pct = (cat.revenue / maxCategoryRevenue) * 100;\n return (\n <div key={cat.category}>\n <div className=\"flex items-center justify-between text-sm mb-1\">\n <span className=\"text-text-primary\">{cat.category}</span>\n <span className=\"text-text-secondary\">\n {formatCurrency(cat.revenue, { minimumFractionDigits: 0 })} ({cat.orders}{' '}\n orders)\n </span>\n </div>\n <div className=\"h-2.5 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-blue-500/60\"\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Customer Overview + Peak Hours/Days */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n {/* Customer Overview */}\n <div className=\"lg:col-span-2 rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Users className=\"h-4 w-4 text-text-secondary\" />\n Customer Overview\n </h2>\n </div>\n <div className=\"p-5\">\n {/* Customer Stats */}\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-4 mb-5\">\n <div>\n <p className=\"text-xs text-text-secondary\">Total Customers</p>\n <p className=\"text-xl font-bold text-text-primary\">\n {analyticsData.customers.total}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">New This Month</p>\n <p className=\"text-xl font-bold text-blue-600 dark:text-blue-400\">\n {analyticsData.customers.new}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Returning</p>\n <p className=\"text-xl font-bold text-green-600 dark:text-green-400\">\n {analyticsData.customers.returning}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Satisfaction</p>\n <p className=\"text-xl font-bold text-yellow-600 dark:text-yellow-400 flex items-center gap-1\">\n <Star className=\"h-4 w-4 fill-yellow-400 text-yellow-400\" />\n {analyticsData.customers.satisfaction.rating}\n </p>\n </div>\n </div>\n\n {/* Top Customers Table */}\n <p className=\"text-sm font-medium text-text-primary mb-2\">Top Customers</p>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border-subtle\">\n <th className=\"py-2 text-left font-medium text-text-secondary\">#</th>\n <th className=\"py-2 text-left font-medium text-text-secondary\">Customer</th>\n <th className=\"py-2 text-right font-medium text-text-secondary\">Orders</th>\n <th className=\"py-2 text-right font-medium text-text-secondary\">\n Total Spent\n </th>\n </tr>\n </thead>\n <tbody>\n {analyticsData.customers.topCustomers.map((cust, i) => (\n <tr key={cust.id} className=\"border-b border-border-subtle last:border-0\">\n <td className=\"py-2.5 text-text-secondary\">{i + 1}</td>\n <td className=\"py-2.5 font-medium text-text-primary\">{cust.name}</td>\n <td className=\"py-2.5 text-right text-text-primary\">{cust.orders}</td>\n <td className=\"py-2.5 text-right font-medium text-text-primary\">\n {formatCurrency(cust.totalSpent, { minimumFractionDigits: 0 })}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Reviews Summary */}\n <div className=\"mt-4 flex items-center gap-4 text-sm\">\n <div className=\"flex items-center gap-1.5\">\n <ThumbsUp className=\"h-4 w-4 text-green-600 dark:text-green-400\" />\n <span className=\"text-text-secondary\">\n {analyticsData.customers.satisfaction.positiveReviews}/\n {analyticsData.customers.satisfaction.reviews} positive reviews\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Peak Hours & Days */}\n <div className=\"space-y-6\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n Peak Hours\n </h2>\n </div>\n <div className=\"p-5 space-y-3\">\n {analyticsData.performance.peakHours.map((h) => {\n const pct = (h.orders / maxPeakHourOrders) * 100;\n return (\n <div key={h.hour}>\n <div className=\"flex items-center justify-between text-xs mb-1\">\n <span className=\"text-text-primary\">{h.hour}</span>\n <span className=\"text-text-secondary\">{h.orders} orders</span>\n </div>\n <div className=\"h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={cn(\n 'h-full rounded-full',\n h.orders > 28\n ? 'bg-red-500/60'\n : h.orders > 22\n ? 'bg-yellow-500/60'\n : 'bg-green-500/60'\n )}\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <CalendarDays className=\"h-4 w-4 text-text-secondary\" />\n Peak Days\n </h2>\n </div>\n <div className=\"p-5 space-y-3\">\n {analyticsData.performance.peakDays.map((d) => {\n const pct = (d.orders / maxPeakDayOrders) * 100;\n return (\n <div key={d.day}>\n <div className=\"flex items-center justify-between text-xs mb-1\">\n <span className=\"text-text-primary\">{d.day}</span>\n <span className=\"text-text-secondary\">{d.orders} orders</span>\n </div>\n <div className=\"h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-blue-500/60\"\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n\n {/* Order Trends Table (from mockAdminAnalytics) */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n Daily Order Trends\n </h2>\n </div>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border-subtle\">\n <th className=\"px-5 py-2.5 text-left font-medium text-text-secondary\">Date</th>\n <th className=\"px-5 py-2.5 text-right font-medium text-text-secondary\">\n Orders\n </th>\n <th className=\"px-5 py-2.5 text-right font-medium text-text-secondary\">\n Revenue\n </th>\n </tr>\n </thead>\n <tbody>\n {mockAdminAnalytics.orderTrends.map((day) => (\n <tr key={day.date} className=\"border-b border-border-subtle last:border-0\">\n <td className=\"px-5 py-2.5 text-text-primary\">\n {new Date(day.date).toLocaleDateString('en-IN', {\n day: '2-digit',\n month: 'short',\n })}\n </td>\n <td className=\"px-5 py-2.5 text-right text-text-primary\">{day.orders}</td>\n <td className=\"px-5 py-2.5 text-right font-medium text-text-primary\">\n {formatCurrency(day.revenue, { minimumFractionDigits: 0 })}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n\n {/* Customer Growth Mini Chart (from mockAdminAnalytics) */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Users className=\"h-4 w-4 text-text-secondary\" />\n Monthly Customer Growth\n </h2>\n </div>\n <div className=\"p-5\">\n <div className=\"flex items-end gap-1.5 h-20\">\n {mockAdminAnalytics.customerGrowth.map((month) => {\n const maxNew = Math.max(\n ...mockAdminAnalytics.customerGrowth.map((m) => m.newCustomers)\n );\n const height = (month.newCustomers / maxNew) * 100;\n return (\n <div\n key={month.month}\n className=\"flex-1 rounded-t bg-blue-500/40 hover:bg-blue-500/60 transition-colors cursor-default\"\n style={{ height: `${height}%` }}\n title={`${month.month}: ${month.newCustomers} new customers`}\n />\n );\n })}\n </div>\n <div className=\"flex justify-between mt-2 text-xs text-text-secondary\">\n {mockAdminAnalytics.customerGrowth.length > 0 && (\n <>\n <span>{mockAdminAnalytics.customerGrowth[0].month}</span>\n <span>\n {\n mockAdminAnalytics.customerGrowth[\n mockAdminAnalytics.customerGrowth.length - 1\n ].month\n }\n </span>\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"AnalyticsDashboard.js","names":[],"sources":["../../../../src/adaptercloud/pages/cart-owner/AnalyticsDashboard.tsx"],"sourcesContent":["/**\n * Analytics Dashboard Page\n *\n * Revenue overview (today/week/month/year with growth), order statistics,\n * popular times progress bars, performance metrics, top selling offerings,\n * category performance, customer overview with top customers table,\n * peak hours/days, date range selector.\n *\n * @module adaptercloud/pages/cart-owner\n */\n\nimport { useState } from'react';\nimport {\n IndianRupee,\n ShoppingCart,\n Users,\n TrendingUp,\n BarChart3,\n Clock,\n Star,\n ArrowUpRight,\n ArrowDownRight,\n Download,\n Target,\n Percent,\n ThumbsUp,\n CalendarDays,\n} from'lucide-react';\nimport { EmphasisPanel } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from'../../components/PageLayout';\nimport { useAdapterCloud } from'../../context/AdapterCloudContext';\nimport { mockAdminAnalytics, mockDashboardStats } from'../../mocks/data';\nimport { formatCurrency, formatNumber } from'../../utils/formatters';\nimport { cn } from'../../utils/cn';\n\n// ============================================================================\n// Mock Analytics Data (full from legacy)\n// ============================================================================\n\nconst analyticsData = {\n revenue: {\n today: 12450,\n week: 87150,\n month: 348600,\n year: 4183200,\n growth: { daily: 12.5, weekly: 8.3, monthly: 15.2 },\n },\n orders: {\n total: 156,\n pending: 3,\n completed: 145,\n cancelled: 8,\n averageValue: 285,\n averagePreparationTime: 18,\n popularTimes: [\n { hour: 8, orders: 12 },\n { hour: 9, orders: 15 },\n { hour: 10, orders: 18 },\n { hour: 11, orders: 22 },\n { hour: 12, orders: 28 },\n { hour: 13, orders: 32 },\n { hour: 14, orders: 16 },\n { hour: 15, orders: 12 },\n { hour: 16, orders: 14 },\n { hour: 17, orders: 18 },\n { hour: 18, orders: 20 },\n { hour: 19, orders: 25 },\n { hour: 20, orders: 22 },\n { hour: 21, orders: 15 },\n ],\n },\n offerings: {\n topSelling: [\n { id: '1', name: 'Masala Dosa', quantity: 245, revenue: 19600, category: 'Food & Beverage' },\n {\n id: '2',\n name: 'Haircut Service',\n quantity: 89,\n revenue: 11340,\n category: 'Personal Care & Beauty',\n },\n { id: '3', name: 'Filter Coffee', quantity: 312, revenue: 9360, category: 'Food & Beverage' },\n {\n id: '4',\n name: 'Mobile Repair',\n quantity: 67,\n revenue: 6680,\n category: 'Repair & Maintenance',\n },\n { id: '5', name: 'Pongal', quantity: 98, revenue: 5880, category: 'Food & Beverage' },\n ],\n leastSelling: [\n { id: '6', name: 'Bisi Bele Bath', quantity: 12, revenue: 1440, category: 'Food & Beverage' },\n { id: '7', name: 'Cleaning Service', quantity: 8, revenue: 640, category: 'Home Services' },\n { id: '8', name: 'Kosambari', quantity: 15, revenue: 450, category: 'Food & Beverage' },\n ],\n categories: [\n { category: 'Food & Beverage', revenue: 45000, orders: 450 },\n { category: 'Personal Care & Beauty', revenue: 25000, orders: 180 },\n { category: 'Repair & Maintenance', revenue: 15000, orders: 120 },\n { category: 'Home Services', revenue: 8000, orders: 80 },\n ],\n },\n customers: {\n total: 342,\n new: 45,\n returning: 297,\n topCustomers: [\n { id: '1', name: 'Rahul Sharma', orders: 23, totalSpent: 6555 },\n { id: '2', name: 'Priya Patel', orders: 19, totalSpent: 5415 },\n { id: '3', name: 'Amit Kumar', orders: 17, totalSpent: 4845 },\n { id: '4', name: 'Sneha Reddy', orders: 15, totalSpent: 4275 },\n { id: '5', name: 'Vijay Singh', orders: 14, totalSpent: 3990 },\n ],\n satisfaction: { rating: 4.6, reviews: 89, positiveReviews: 78 },\n },\n performance: {\n acceptanceRate: 94,\n cancellationRate: 6,\n onTimeDeliveryRate: 88,\n averageRating: 4.6,\n peakHours: [\n { hour: '12-1 PM', orders: 32 },\n { hour: '1-2 PM', orders: 28 },\n { hour: '7-8 PM', orders: 25 },\n { hour: '8-9 PM', orders: 22 },\n ],\n peakDays: [\n { day: 'Sunday', orders: 45 },\n { day: 'Saturday', orders: 42 },\n { day: 'Friday', orders: 38 },\n ],\n },\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const AnalyticsDashboard = () => {\n const { navigateTo } = useAdapterCloud();\n const [dateRange, setDateRange] = useState('week');\n\n const maxPopularTime = Math.max(...analyticsData.orders.popularTimes.map((t) => t.orders));\n const maxCategoryRevenue = Math.max(...analyticsData.offerings.categories.map((c) => c.revenue));\n const maxPeakHourOrders = Math.max(...analyticsData.performance.peakHours.map((h) => h.orders));\n const maxPeakDayOrders = Math.max(...analyticsData.performance.peakDays.map((d) => d.orders));\n\n const formatPct = (v: number) => `${v > 0 ? '+' : ''}${v}%`;\n\n return (\n <PageLayout\n title=\"Analytics Dashboard\"\n description=\"Business performance insights and data\"\n purpose=\"Understand how your cart is really doing — sales trends, your best-selling offerings, repeat customers, and busy hours. Use these insights to decide what to stock, when to staff up, and which offerings to promote.\"\n actions={\n <div className=\"flex items-center gap-2\">\n <select\n value={dateRange}\n onChange={(e) => setDateRange(e.target.value)}\n className=\"rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"today\">Today</option>\n <option value=\"week\">This Week</option>\n <option value=\"month\">This Month</option>\n <option value=\"year\">This Year</option>\n </select>\n <button\n type=\"button\"\n onClick={() => alert('Export feature coming soon!')}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <Download className=\"h-4 w-4\" />\n Export\n </button>\n </div>\n }\n >\n <div className=\"space-y-6\">\n {/* Revenue Overview (emphasis zone) */}\n <EmphasisPanel role=\"region\" aria-label=\"Revenue overview\">\n <h2 className=\"text-base font-semibold text-text-primary mb-3\">Revenue Overview</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4\">\n {[\n {\n label: \"Today's Revenue\",\n value: analyticsData.revenue.today,\n growth: analyticsData.revenue.growth.daily,\n },\n {\n label: 'This Week',\n value: analyticsData.revenue.week,\n growth: analyticsData.revenue.growth.weekly,\n },\n {\n label: 'This Month',\n value: analyticsData.revenue.month,\n growth: analyticsData.revenue.growth.monthly,\n },\n { label: 'This Year', value: analyticsData.revenue.year, growth: null },\n ].map((card) => (\n <div\n key={card.label}\n className=\"rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"rounded-md bg-accent p-2\">\n <IndianRupee className=\"h-5 w-5 text-text-secondary\" />\n </div>\n {card.growth !== null && (\n <div\n className={cn(\n 'flex items-center gap-1 text-xs font-medium',\n card.growth >= 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {card.growth >= 0 ? (\n <ArrowUpRight className=\"h-3.5 w-3.5\" />\n ) : (\n <ArrowDownRight className=\"h-3.5 w-3.5\" />\n )}\n {formatPct(card.growth)}\n </div>\n )}\n </div>\n <p className=\"mt-3 text-2xl font-bold text-text-primary\">\n {formatCurrency(card.value, { minimumFractionDigits: 0 })}\n </p>\n <p className=\"mt-1 text-sm text-text-secondary\">{card.label}</p>\n </div>\n ))}\n </div>\n </EmphasisPanel>\n\n {/* Order Statistics + Popular Times */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {/* Order Statistics */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <ShoppingCart className=\"h-4 w-4 text-text-secondary\" />\n Order Statistics\n </h2>\n </div>\n <div className=\"p-5\">\n <div className=\"grid grid-cols-2 gap-4 mb-5\">\n <div>\n <p className=\"text-xs text-text-secondary\">Total Orders</p>\n <p className=\"text-2xl font-bold text-text-primary\">{analyticsData.orders.total}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Avg. Order Value</p>\n <p className=\"text-2xl font-bold text-text-primary\">\n {formatCurrency(analyticsData.orders.averageValue, {\n minimumFractionDigits: 0,\n })}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Completed</p>\n <p className=\"text-xl font-bold text-status-success-text\">\n {analyticsData.orders.completed}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Cancelled</p>\n <p className=\"text-xl font-bold text-status-error-text\">\n {analyticsData.orders.cancelled}\n </p>\n </div>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary mb-1\">Avg. Preparation Time</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {analyticsData.orders.averagePreparationTime} minutes\n </p>\n </div>\n </div>\n </div>\n\n {/* Popular Times */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n Popular Times\n </h2>\n </div>\n <div className=\"p-5 space-y-2\">\n {analyticsData.orders.popularTimes.map((t) => {\n const pct = (t.orders / maxPopularTime) * 100;\n const label = `${t.hour}:00`;\n return (\n <div key={t.hour}>\n <div className=\"flex items-center justify-between text-xs mb-0.5\">\n <span className=\"text-text-primary w-14\">{label}</span>\n <span className=\"text-text-secondary\">{t.orders} orders</span>\n </div>\n <div className=\"h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={cn(\n 'h-full rounded-full transition-all',\n t.orders > 25\n ? 'bg-status-error-bg-subtle/60'\n : t.orders > 18\n ? 'bg-status-warning-bg-subtle/60'\n : 'bg-status-success-bg-subtle/60'\n )}\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Performance Metrics */}\n <section>\n <h2 className=\"text-base font-semibold text-text-primary mb-3\">Performance Metrics</h2>\n <div className=\"grid grid-cols-2 lg:grid-cols-4 gap-4\">\n {[\n {\n label: 'Acceptance Rate',\n value: `${analyticsData.performance.acceptanceRate}%`,\n icon: Target,\n color: 'text-status-success-text',\n },\n {\n label: 'Cancellation Rate',\n value: `${analyticsData.performance.cancellationRate}%`,\n icon: Percent,\n color: 'text-status-error-text',\n },\n {\n label: 'On-Time Delivery',\n value: `${analyticsData.performance.onTimeDeliveryRate}%`,\n icon: Clock,\n color: 'text-accent-blue',\n },\n {\n label: 'Average Rating',\n value: `${analyticsData.performance.averageRating}`,\n icon: Star,\n color: 'text-status-warning-text',\n },\n ].map((metric) => {\n const Icon = metric.icon;\n return (\n <div\n key={metric.label}\n className=\"rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop\"\n >\n <div className=\"flex items-center gap-2 mb-2\">\n <Icon className={cn('h-5 w-5', metric.color)} />\n <span className=\"text-xs text-text-secondary\">{metric.label}</span>\n </div>\n <p className={cn('text-2xl font-bold', metric.color)}>{metric.value}</p>\n </div>\n );\n })}\n </div>\n </section>\n\n {/* Top Selling + Category Performance */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {/* Top Selling Offerings */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n Top Selling Offerings\n </h2>\n </div>\n <div className=\"divide-y divide-border\">\n {analyticsData.offerings.topSelling.map((item, i) => (\n <div key={item.id} className=\"flex items-center justify-between px-5 py-3\">\n <div className=\"flex items-center gap-3\">\n <span className=\"flex h-6 w-6 items-center justify-center rounded-full bg-bg-sunken text-xs font-medium text-text-secondary\">\n {i + 1}\n </span>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{item.name}</p>\n <p className=\"text-xs text-text-secondary\">\n {item.category} | {item.quantity} sold\n </p>\n </div>\n </div>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(item.revenue, { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n {/* Least Selling */}\n <div className=\"border-t border-border-subtle px-5 py-3\">\n <p className=\"text-xs font-medium text-text-secondary mb-2\">Least Selling</p>\n {analyticsData.offerings.leastSelling.map((item) => (\n <div key={item.id} className=\"flex items-center justify-between py-1.5\">\n <span className=\"text-xs text-text-secondary\">{item.name}</span>\n <span className=\"text-xs text-text-secondary\">\n {item.quantity} sold |{' '}\n {formatCurrency(item.revenue, { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n </div>\n\n {/* Category Performance */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <BarChart3 className=\"h-4 w-4 text-text-secondary\" />\n Category Performance\n </h2>\n </div>\n <div className=\"p-5 space-y-4\">\n {analyticsData.offerings.categories.map((cat) => {\n const pct = (cat.revenue / maxCategoryRevenue) * 100;\n return (\n <div key={cat.category}>\n <div className=\"flex items-center justify-between text-sm mb-1\">\n <span className=\"text-text-primary\">{cat.category}</span>\n <span className=\"text-text-secondary\">\n {formatCurrency(cat.revenue, { minimumFractionDigits: 0 })} ({cat.orders}{' '}\n orders)\n </span>\n </div>\n <div className=\"h-2.5 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-accent-blue-subtle/60\"\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Customer Overview + Peak Hours/Days */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n {/* Customer Overview */}\n <div className=\"lg:col-span-2 rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Users className=\"h-4 w-4 text-text-secondary\" />\n Customer Overview\n </h2>\n </div>\n <div className=\"p-5\">\n {/* Customer Stats */}\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-4 mb-5\">\n <div>\n <p className=\"text-xs text-text-secondary\">Total Customers</p>\n <p className=\"text-xl font-bold text-text-primary\">\n {analyticsData.customers.total}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">New This Month</p>\n <p className=\"text-xl font-bold text-accent-blue\">\n {analyticsData.customers.new}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Returning</p>\n <p className=\"text-xl font-bold text-status-success-text\">\n {analyticsData.customers.returning}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Satisfaction</p>\n <p className=\"text-xl font-bold text-status-warning-text flex items-center gap-1\">\n <Star className=\"h-4 w-4 fill-status-warning-text text-status-warning-text\" />\n {analyticsData.customers.satisfaction.rating}\n </p>\n </div>\n </div>\n\n {/* Top Customers Table */}\n <p className=\"text-sm font-medium text-text-primary mb-2\">Top Customers</p>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border-subtle\">\n <th className=\"py-2 text-left font-medium text-text-secondary\">#</th>\n <th className=\"py-2 text-left font-medium text-text-secondary\">Customer</th>\n <th className=\"py-2 text-right font-medium text-text-secondary\">Orders</th>\n <th className=\"py-2 text-right font-medium text-text-secondary\">\n Total Spent\n </th>\n </tr>\n </thead>\n <tbody>\n {analyticsData.customers.topCustomers.map((cust, i) => (\n <tr key={cust.id} className=\"border-b border-border-subtle last:border-0\">\n <td className=\"py-2.5 text-text-secondary\">{i + 1}</td>\n <td className=\"py-2.5 font-medium text-text-primary\">{cust.name}</td>\n <td className=\"py-2.5 text-right text-text-primary\">{cust.orders}</td>\n <td className=\"py-2.5 text-right font-medium text-text-primary\">\n {formatCurrency(cust.totalSpent, { minimumFractionDigits: 0 })}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Reviews Summary */}\n <div className=\"mt-4 flex items-center gap-4 text-sm\">\n <div className=\"flex items-center gap-1.5\">\n <ThumbsUp className=\"h-4 w-4 text-status-success-text\" />\n <span className=\"text-text-secondary\">\n {analyticsData.customers.satisfaction.positiveReviews}/\n {analyticsData.customers.satisfaction.reviews} positive reviews\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Peak Hours & Days */}\n <div className=\"space-y-6\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n Peak Hours\n </h2>\n </div>\n <div className=\"p-5 space-y-3\">\n {analyticsData.performance.peakHours.map((h) => {\n const pct = (h.orders / maxPeakHourOrders) * 100;\n return (\n <div key={h.hour}>\n <div className=\"flex items-center justify-between text-xs mb-1\">\n <span className=\"text-text-primary\">{h.hour}</span>\n <span className=\"text-text-secondary\">{h.orders} orders</span>\n </div>\n <div className=\"h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={cn(\n 'h-full rounded-full',\n h.orders > 28\n ? 'bg-status-error-bg-subtle/60'\n : h.orders > 22\n ? 'bg-status-warning-bg-subtle/60'\n : 'bg-status-success-bg-subtle/60'\n )}\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <CalendarDays className=\"h-4 w-4 text-text-secondary\" />\n Peak Days\n </h2>\n </div>\n <div className=\"p-5 space-y-3\">\n {analyticsData.performance.peakDays.map((d) => {\n const pct = (d.orders / maxPeakDayOrders) * 100;\n return (\n <div key={d.day}>\n <div className=\"flex items-center justify-between text-xs mb-1\">\n <span className=\"text-text-primary\">{d.day}</span>\n <span className=\"text-text-secondary\">{d.orders} orders</span>\n </div>\n <div className=\"h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-accent-blue-subtle/60\"\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n\n {/* Order Trends Table (from mockAdminAnalytics) */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n Daily Order Trends\n </h2>\n </div>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border-subtle\">\n <th className=\"px-5 py-2.5 text-left font-medium text-text-secondary\">Date</th>\n <th className=\"px-5 py-2.5 text-right font-medium text-text-secondary\">\n Orders\n </th>\n <th className=\"px-5 py-2.5 text-right font-medium text-text-secondary\">\n Revenue\n </th>\n </tr>\n </thead>\n <tbody>\n {mockAdminAnalytics.orderTrends.map((day) => (\n <tr key={day.date} className=\"border-b border-border-subtle last:border-0\">\n <td className=\"px-5 py-2.5 text-text-primary\">\n {new Date(day.date).toLocaleDateString('en-IN', {\n day: '2-digit',\n month: 'short',\n })}\n </td>\n <td className=\"px-5 py-2.5 text-right text-text-primary\">{day.orders}</td>\n <td className=\"px-5 py-2.5 text-right font-medium text-text-primary\">\n {formatCurrency(day.revenue, { minimumFractionDigits: 0 })}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n\n {/* Customer Growth Mini Chart (from mockAdminAnalytics) */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Users className=\"h-4 w-4 text-text-secondary\" />\n Monthly Customer Growth\n </h2>\n </div>\n <div className=\"p-5\">\n <div className=\"flex items-end gap-1.5 h-20\">\n {mockAdminAnalytics.customerGrowth.map((month) => {\n const maxNew = Math.max(\n ...mockAdminAnalytics.customerGrowth.map((m) => m.newCustomers)\n );\n const height = (month.newCustomers / maxNew) * 100;\n return (\n <div\n key={month.month}\n className=\"flex-1 rounded-t bg-accent-blue-subtle/40 hover:bg-accent-blue-subtle/60 transition-colors cursor-default\"\n style={{ height: `${height}%` }}\n title={`${month.month}: ${month.newCustomers} new customers`}\n />\n );\n })}\n </div>\n <div className=\"flex justify-between mt-2 text-xs text-text-secondary\">\n {mockAdminAnalytics.customerGrowth.length > 0 && (\n <>\n <span>{mockAdminAnalytics.customerGrowth[0].month}</span>\n <span>\n {\n mockAdminAnalytics.customerGrowth[\n mockAdminAnalytics.customerGrowth.length - 1\n ].month\n }\n </span>\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}