@burdenoff/microfe-coolandlovely 2026.625.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 (91) hide show
  1. package/dist/coolandlovely/pages/HomePage.js +263 -258
  2. package/dist/coolandlovely/pages/HomePage.js.map +1 -1
  3. package/dist/coolandlovely/pages/admin/AdminAnalyticsPage.js +67 -61
  4. package/dist/coolandlovely/pages/admin/AdminAnalyticsPage.js.map +1 -1
  5. package/dist/coolandlovely/pages/admin/AdminDashboard.js +79 -45
  6. package/dist/coolandlovely/pages/admin/AdminDashboard.js.map +1 -1
  7. package/dist/coolandlovely/pages/admin/AdminFinancialPage.js +39 -33
  8. package/dist/coolandlovely/pages/admin/AdminFinancialPage.js.map +1 -1
  9. package/dist/coolandlovely/pages/admin/AdminOrdersPage.js +227 -222
  10. package/dist/coolandlovely/pages/admin/AdminOrdersPage.js.map +1 -1
  11. package/dist/coolandlovely/pages/admin/AdminProfilePage.js +65 -60
  12. package/dist/coolandlovely/pages/admin/AdminProfilePage.js.map +1 -1
  13. package/dist/coolandlovely/pages/admin/AdminSettingsPage.js +235 -230
  14. package/dist/coolandlovely/pages/admin/AdminSettingsPage.js.map +1 -1
  15. package/dist/coolandlovely/pages/admin/CartManagementPage.js +268 -263
  16. package/dist/coolandlovely/pages/admin/CartManagementPage.js.map +1 -1
  17. package/dist/coolandlovely/pages/admin/UserManagementPage.js +268 -263
  18. package/dist/coolandlovely/pages/admin/UserManagementPage.js.map +1 -1
  19. package/dist/coolandlovely/pages/cart-owner/AnalyticsDashboard.js +92 -84
  20. package/dist/coolandlovely/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  21. package/dist/coolandlovely/pages/cart-owner/BusinessSettingsPage.js +257 -252
  22. package/dist/coolandlovely/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  23. package/dist/coolandlovely/pages/cart-owner/CartOwnerDashboard.js +587 -548
  24. package/dist/coolandlovely/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  25. package/dist/coolandlovely/pages/cart-owner/CartOwnerProfilePage.js +171 -166
  26. package/dist/coolandlovely/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  27. package/dist/coolandlovely/pages/cart-owner/CartServiceConfigPage.js +219 -211
  28. package/dist/coolandlovely/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  29. package/dist/coolandlovely/pages/cart-owner/InventoryManagementPage.js +671 -670
  30. package/dist/coolandlovely/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  31. package/dist/coolandlovely/pages/cart-owner/OrderManagementPage.js +515 -514
  32. package/dist/coolandlovely/pages/cart-owner/OrderManagementPage.js.map +1 -1
  33. package/dist/coolandlovely/pages/cart-owner/StaffManagementPage.js +244 -246
  34. package/dist/coolandlovely/pages/cart-owner/StaffManagementPage.js.map +1 -1
  35. package/dist/coolandlovely/pages/common/HelpSupportPage.js +96 -96
  36. package/dist/coolandlovely/pages/common/HelpSupportPage.js.map +1 -1
  37. package/dist/coolandlovely/pages/common/NotificationCenterPage.js +50 -44
  38. package/dist/coolandlovely/pages/common/NotificationCenterPage.js.map +1 -1
  39. package/dist/coolandlovely/pages/common/SettingsPage.js +745 -736
  40. package/dist/coolandlovely/pages/common/SettingsPage.js.map +1 -1
  41. package/dist/coolandlovely/pages/customer/BookingDetailsPage.js +394 -357
  42. package/dist/coolandlovely/pages/customer/BookingDetailsPage.js.map +1 -1
  43. package/dist/coolandlovely/pages/customer/CartDetailPage.js +179 -176
  44. package/dist/coolandlovely/pages/customer/CartDetailPage.js.map +1 -1
  45. package/dist/coolandlovely/pages/customer/CartDiscoveryPage.js +215 -204
  46. package/dist/coolandlovely/pages/customer/CartDiscoveryPage.js.map +1 -1
  47. package/dist/coolandlovely/pages/customer/CheckoutPage.js +212 -215
  48. package/dist/coolandlovely/pages/customer/CheckoutPage.js.map +1 -1
  49. package/dist/coolandlovely/pages/customer/CustomerDashboard.js +438 -396
  50. package/dist/coolandlovely/pages/customer/CustomerDashboard.js.map +1 -1
  51. package/dist/coolandlovely/pages/customer/CustomerProfilePage.js +525 -488
  52. package/dist/coolandlovely/pages/customer/CustomerProfilePage.js.map +1 -1
  53. package/dist/coolandlovely/pages/customer/DirectServiceBookingPage.js +522 -513
  54. package/dist/coolandlovely/pages/customer/DirectServiceBookingPage.js.map +1 -1
  55. package/dist/coolandlovely/pages/customer/FavoritesPage.js +86 -76
  56. package/dist/coolandlovely/pages/customer/FavoritesPage.js.map +1 -1
  57. package/dist/coolandlovely/pages/customer/OrderHistoryPage.js +118 -109
  58. package/dist/coolandlovely/pages/customer/OrderHistoryPage.js.map +1 -1
  59. package/dist/coolandlovely/pages/customer/OrderTrackingPage.js +312 -275
  60. package/dist/coolandlovely/pages/customer/OrderTrackingPage.js.map +1 -1
  61. package/dist/coolandlovely/pages/customer/PaymentMethodsPage.js +82 -76
  62. package/dist/coolandlovely/pages/customer/PaymentMethodsPage.js.map +1 -1
  63. package/dist/coolandlovely/pages/customer/ReviewsPage.js +83 -73
  64. package/dist/coolandlovely/pages/customer/ReviewsPage.js.map +1 -1
  65. package/dist/coolandlovely/pages/customer/SavedAddressesPage.js +61 -55
  66. package/dist/coolandlovely/pages/customer/SavedAddressesPage.js.map +1 -1
  67. package/dist/coolandlovely/pages/investor/InvestmentDetailsPage.js +293 -255
  68. package/dist/coolandlovely/pages/investor/InvestmentDetailsPage.js.map +1 -1
  69. package/dist/coolandlovely/pages/investor/InvestmentOpportunitiesPage.js +238 -232
  70. package/dist/coolandlovely/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  71. package/dist/coolandlovely/pages/investor/InvestorAnalyticsPage.js +61 -55
  72. package/dist/coolandlovely/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  73. package/dist/coolandlovely/pages/investor/InvestorDashboard.js +356 -320
  74. package/dist/coolandlovely/pages/investor/InvestorDashboard.js.map +1 -1
  75. package/dist/coolandlovely/pages/investor/InvestorInvestmentsPage.js +107 -101
  76. package/dist/coolandlovely/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  77. package/dist/coolandlovely/pages/investor/InvestorPortfolioPage.js +170 -137
  78. package/dist/coolandlovely/pages/investor/InvestorPortfolioPage.js.map +1 -1
  79. package/dist/coolandlovely/pages/investor/InvestorProfilePage.js +386 -381
  80. package/dist/coolandlovely/pages/investor/InvestorProfilePage.js.map +1 -1
  81. package/dist/coolandlovely/pages/worker/TaskDetailsPage.js +359 -322
  82. package/dist/coolandlovely/pages/worker/TaskDetailsPage.js.map +1 -1
  83. package/dist/coolandlovely/pages/worker/WorkerDashboard.js +574 -537
  84. package/dist/coolandlovely/pages/worker/WorkerDashboard.js.map +1 -1
  85. package/dist/coolandlovely/pages/worker/WorkerOrdersPage.js +81 -76
  86. package/dist/coolandlovely/pages/worker/WorkerOrdersPage.js.map +1 -1
  87. package/dist/coolandlovely/pages/worker/WorkerProfilePage.js +82 -77
  88. package/dist/coolandlovely/pages/worker/WorkerProfilePage.js.map +1 -1
  89. package/dist/coolandlovely/pages/worker/WorkerSchedulePage.js +78 -73
  90. package/dist/coolandlovely/pages/worker/WorkerSchedulePage.js.map +1 -1
  91. 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, PagePurpose as w } from "@burdenoff/fe-libs/ui";
9
10
  //#region src/coolandlovely/pages/cart-owner/AnalyticsDashboard.tsx
10
- var C = {
11
+ var T = {
11
12
  revenue: {
12
13
  today: 12450,
13
14
  week: 87150,
@@ -249,16 +250,16 @@ 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}%`;
254
- return /* @__PURE__ */ x(n, {
253
+ }, E = () => {
254
+ let { navigateTo: E } = e(), [D, O] = a("week"), k = Math.max(...T.orders.popularTimes.map((e) => e.orders)), A = Math.max(...T.offerings.categories.map((e) => e.revenue)), j = Math.max(...T.performance.peakHours.map((e) => e.orders)), M = Math.max(...T.performance.peakDays.map((e) => e.orders)), N = (e) => `${e > 0 ? "+" : ""}${e}%`;
255
+ return /* @__PURE__ */ S(n, {
255
256
  title: "Analytics Dashboard",
256
257
  description: "Business performance insights and data",
257
258
  actions: /* @__PURE__ */ S("div", {
258
259
  className: "flex items-center gap-2",
259
260
  children: [/* @__PURE__ */ S("select", {
260
- value: T,
261
- onChange: (e) => E(e.target.value),
261
+ value: D,
262
+ onChange: (e) => O(e.target.value),
262
263
  className: "rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary",
263
264
  children: [
264
265
  /* @__PURE__ */ x("option", {
@@ -285,59 +286,66 @@ var C = {
285
286
  children: [/* @__PURE__ */ x(d, { className: "h-4 w-4" }), "Export"]
286
287
  })]
287
288
  }),
288
- children: /* @__PURE__ */ S("div", {
289
+ children: [/* @__PURE__ */ x(w, {
290
+ className: "mb-6",
291
+ icon: /* @__PURE__ */ x(c, { className: "h-4 w-4" }),
292
+ children: "See how your business is actually doing. Track revenue across day, week, month and year, understand your order patterns and busiest times, and export the numbers — turning raw sales into decisions about staffing, stock and hours."
293
+ }), /* @__PURE__ */ S("div", {
289
294
  className: "space-y-6",
290
295
  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-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
296
+ /* @__PURE__ */ S(C, {
297
+ className: "p-5",
298
+ children: [/* @__PURE__ */ x("h2", {
299
+ className: "text-base font-semibold text-text-primary mb-3",
300
+ children: "Revenue Overview"
301
+ }), /* @__PURE__ */ x("div", {
302
+ className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4",
319
303
  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-status-success-text" : "text-status-error-text"),
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
- })] }),
304
+ {
305
+ label: "Today's Revenue",
306
+ value: T.revenue.today,
307
+ growth: T.revenue.growth.daily
308
+ },
309
+ {
310
+ label: "This Week",
311
+ value: T.revenue.week,
312
+ growth: T.revenue.growth.weekly
313
+ },
314
+ {
315
+ label: "This Month",
316
+ value: T.revenue.month,
317
+ growth: T.revenue.growth.monthly
318
+ },
319
+ {
320
+ label: "This Year",
321
+ value: T.revenue.year,
322
+ growth: null
323
+ }
324
+ ].map((e) => /* @__PURE__ */ S("div", {
325
+ className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
326
+ children: [
327
+ /* @__PURE__ */ S("div", {
328
+ className: "flex items-center justify-between",
329
+ children: [/* @__PURE__ */ x("div", {
330
+ className: "rounded-md bg-accent p-2",
331
+ children: /* @__PURE__ */ x(f, { className: "h-5 w-5 text-text-secondary" })
332
+ }), e.growth !== null && /* @__PURE__ */ S("div", {
333
+ className: t("flex items-center gap-1 text-xs font-medium", e.growth >= 0 ? "text-status-success-text" : "text-status-error-text"),
334
+ children: [e.growth >= 0 ? /* @__PURE__ */ x(s, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ x(o, { className: "h-3.5 w-3.5" }), N(e.growth)]
335
+ })]
336
+ }),
337
+ /* @__PURE__ */ x("p", {
338
+ className: "mt-3 text-2xl font-bold text-text-primary",
339
+ children: r(e.value, { minimumFractionDigits: 0 })
340
+ }),
341
+ /* @__PURE__ */ x("p", {
342
+ className: "mt-1 text-sm text-text-secondary",
343
+ children: e.label
344
+ })
345
+ ]
346
+ }, e.label))
347
+ })]
348
+ }),
341
349
  /* @__PURE__ */ S("div", {
342
350
  className: "grid grid-cols-1 lg:grid-cols-2 gap-6",
343
351
  children: [/* @__PURE__ */ S("div", {
@@ -358,28 +366,28 @@ var C = {
358
366
  children: "Total Orders"
359
367
  }), /* @__PURE__ */ x("p", {
360
368
  className: "text-2xl font-bold text-text-primary",
361
- children: C.orders.total
369
+ children: T.orders.total
362
370
  })] }),
363
371
  /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
364
372
  className: "text-xs text-text-secondary",
365
373
  children: "Avg. Order Value"
366
374
  }), /* @__PURE__ */ x("p", {
367
375
  className: "text-2xl font-bold text-text-primary",
368
- children: r(C.orders.averageValue, { minimumFractionDigits: 0 })
376
+ children: r(T.orders.averageValue, { minimumFractionDigits: 0 })
369
377
  })] }),
370
378
  /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
371
379
  className: "text-xs text-text-secondary",
372
380
  children: "Completed"
373
381
  }), /* @__PURE__ */ x("p", {
374
382
  className: "text-xl font-bold text-status-success-text",
375
- children: C.orders.completed
383
+ children: T.orders.completed
376
384
  })] }),
377
385
  /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
378
386
  className: "text-xs text-text-secondary",
379
387
  children: "Cancelled"
380
388
  }), /* @__PURE__ */ x("p", {
381
389
  className: "text-xl font-bold text-status-error-text",
382
- children: C.orders.cancelled
390
+ children: T.orders.cancelled
383
391
  })] })
384
392
  ]
385
393
  }), /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
@@ -387,7 +395,7 @@ var C = {
387
395
  children: "Avg. Preparation Time"
388
396
  }), /* @__PURE__ */ S("p", {
389
397
  className: "text-sm font-medium text-text-primary",
390
- children: [C.orders.averagePreparationTime, " minutes"]
398
+ children: [T.orders.averagePreparationTime, " minutes"]
391
399
  })] })]
392
400
  })]
393
401
  }), /* @__PURE__ */ S("div", {
@@ -400,8 +408,8 @@ var C = {
400
408
  })
401
409
  }), /* @__PURE__ */ x("div", {
402
410
  className: "p-5 space-y-2",
403
- children: C.orders.popularTimes.map((e) => {
404
- let n = e.orders / D * 100;
411
+ children: T.orders.popularTimes.map((e) => {
412
+ let n = e.orders / k * 100;
405
413
  return /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ S("div", {
406
414
  className: "flex items-center justify-between text-xs mb-0.5",
407
415
  children: [/* @__PURE__ */ x("span", {
@@ -430,25 +438,25 @@ var C = {
430
438
  children: [
431
439
  {
432
440
  label: "Acceptance Rate",
433
- value: `${C.performance.acceptanceRate}%`,
441
+ value: `${T.performance.acceptanceRate}%`,
434
442
  icon: g,
435
443
  color: "text-status-success-text"
436
444
  },
437
445
  {
438
446
  label: "Cancellation Rate",
439
- value: `${C.performance.cancellationRate}%`,
447
+ value: `${T.performance.cancellationRate}%`,
440
448
  icon: p,
441
449
  color: "text-status-error-text"
442
450
  },
443
451
  {
444
452
  label: "On-Time Delivery",
445
- value: `${C.performance.onTimeDeliveryRate}%`,
453
+ value: `${T.performance.onTimeDeliveryRate}%`,
446
454
  icon: u,
447
455
  color: "text-accent-blue"
448
456
  },
449
457
  {
450
458
  label: "Average Rating",
451
- value: `${C.performance.averageRating}`,
459
+ value: `${T.performance.averageRating}`,
452
460
  icon: h,
453
461
  color: "text-status-warning-text"
454
462
  }
@@ -483,7 +491,7 @@ var C = {
483
491
  }),
484
492
  /* @__PURE__ */ x("div", {
485
493
  className: "divide-y divide-border",
486
- children: C.offerings.topSelling.map((e, t) => /* @__PURE__ */ S("div", {
494
+ children: T.offerings.topSelling.map((e, t) => /* @__PURE__ */ S("div", {
487
495
  className: "flex items-center justify-between px-5 py-3",
488
496
  children: [/* @__PURE__ */ S("div", {
489
497
  className: "flex items-center gap-3",
@@ -513,7 +521,7 @@ var C = {
513
521
  children: [/* @__PURE__ */ x("p", {
514
522
  className: "text-xs font-medium text-text-secondary mb-2",
515
523
  children: "Least Selling"
516
- }), C.offerings.leastSelling.map((e) => /* @__PURE__ */ S("div", {
524
+ }), T.offerings.leastSelling.map((e) => /* @__PURE__ */ S("div", {
517
525
  className: "flex items-center justify-between py-1.5",
518
526
  children: [/* @__PURE__ */ x("span", {
519
527
  className: "text-xs text-text-secondary",
@@ -540,8 +548,8 @@ var C = {
540
548
  })
541
549
  }), /* @__PURE__ */ x("div", {
542
550
  className: "p-5 space-y-4",
543
- children: C.offerings.categories.map((e) => {
544
- let t = e.revenue / O * 100;
551
+ children: T.offerings.categories.map((e) => {
552
+ let t = e.revenue / A * 100;
545
553
  return /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ S("div", {
546
554
  className: "flex items-center justify-between text-sm mb-1",
547
555
  children: [/* @__PURE__ */ x("span", {
@@ -589,28 +597,28 @@ var C = {
589
597
  children: "Total Customers"
590
598
  }), /* @__PURE__ */ x("p", {
591
599
  className: "text-xl font-bold text-text-primary",
592
- children: C.customers.total
600
+ children: T.customers.total
593
601
  })] }),
594
602
  /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
595
603
  className: "text-xs text-text-secondary",
596
604
  children: "New This Month"
597
605
  }), /* @__PURE__ */ x("p", {
598
606
  className: "text-xl font-bold text-accent-blue",
599
- children: C.customers.new
607
+ children: T.customers.new
600
608
  })] }),
601
609
  /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
602
610
  className: "text-xs text-text-secondary",
603
611
  children: "Returning"
604
612
  }), /* @__PURE__ */ x("p", {
605
613
  className: "text-xl font-bold text-status-success-text",
606
- children: C.customers.returning
614
+ children: T.customers.returning
607
615
  })] }),
608
616
  /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
609
617
  className: "text-xs text-text-secondary",
610
618
  children: "Satisfaction"
611
619
  }), /* @__PURE__ */ S("p", {
612
620
  className: "text-xl font-bold text-status-warning-text flex items-center gap-1",
613
- children: [/* @__PURE__ */ x(h, { className: "h-4 w-4 fill-status-warning-text text-status-warning-text" }), C.customers.satisfaction.rating]
621
+ children: [/* @__PURE__ */ x(h, { className: "h-4 w-4 fill-status-warning-text text-status-warning-text" }), T.customers.satisfaction.rating]
614
622
  })] })
615
623
  ]
616
624
  }),
@@ -642,7 +650,7 @@ var C = {
642
650
  children: "Total Spent"
643
651
  })
644
652
  ]
645
- }) }), /* @__PURE__ */ x("tbody", { children: C.customers.topCustomers.map((e, t) => /* @__PURE__ */ S("tr", {
653
+ }) }), /* @__PURE__ */ x("tbody", { children: T.customers.topCustomers.map((e, t) => /* @__PURE__ */ S("tr", {
646
654
  className: "border-b border-border-subtle last:border-0",
647
655
  children: [
648
656
  /* @__PURE__ */ x("td", {
@@ -672,9 +680,9 @@ var C = {
672
680
  children: [/* @__PURE__ */ x(_, { className: "h-4 w-4 text-status-success-text" }), /* @__PURE__ */ S("span", {
673
681
  className: "text-text-secondary",
674
682
  children: [
675
- C.customers.satisfaction.positiveReviews,
683
+ T.customers.satisfaction.positiveReviews,
676
684
  "/",
677
- C.customers.satisfaction.reviews,
685
+ T.customers.satisfaction.reviews,
678
686
  " positive reviews"
679
687
  ]
680
688
  })]
@@ -694,8 +702,8 @@ var C = {
694
702
  })
695
703
  }), /* @__PURE__ */ x("div", {
696
704
  className: "p-5 space-y-3",
697
- children: C.performance.peakHours.map((e) => {
698
- let n = e.orders / k * 100;
705
+ children: T.performance.peakHours.map((e) => {
706
+ let n = e.orders / j * 100;
699
707
  return /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ S("div", {
700
708
  className: "flex items-center justify-between text-xs mb-1",
701
709
  children: [/* @__PURE__ */ x("span", {
@@ -724,8 +732,8 @@ var C = {
724
732
  })
725
733
  }), /* @__PURE__ */ x("div", {
726
734
  className: "p-5 space-y-3",
727
- children: C.performance.peakDays.map((e) => {
728
- let t = e.orders / A * 100;
735
+ children: T.performance.peakDays.map((e) => {
736
+ let t = e.orders / M * 100;
729
737
  return /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ S("div", {
730
738
  className: "flex items-center justify-between text-xs mb-1",
731
739
  children: [/* @__PURE__ */ x("span", {
@@ -825,10 +833,10 @@ var C = {
825
833
  })]
826
834
  })
827
835
  ]
828
- })
836
+ })]
829
837
  });
830
838
  };
831
839
  //#endregion
832
- export { w as AnalyticsDashboard };
840
+ export { E as AnalyticsDashboard };
833
841
 
834
842
  //# sourceMappingURL=AnalyticsDashboard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDashboard.js","names":[],"sources":["../../../../src/coolandlovely/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 coolandlovely/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 { useCoolAndLovely } from'../../context/CoolAndLovelyContext';\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 } = useCoolAndLovely();\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-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 </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-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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"}
1
+ {"version":3,"file":"AnalyticsDashboard.js","names":[],"sources":["../../../../src/coolandlovely/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 coolandlovely/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, PagePurpose } from'@burdenoff/fe-libs/ui';\nimport { PageLayout } from'../../components/PageLayout';\nimport { useCoolAndLovely } from'../../context/CoolAndLovelyContext';\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 } = useCoolAndLovely();\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 <PagePurpose className=\"mb-6\" icon={<BarChart3 className=\"h-4 w-4\" />}>\n See how your business is actually doing. Track revenue across day, week,\n month and year, understand your order patterns and busiest times, and\n export the numbers — turning raw sales into decisions about staffing,\n stock and hours.\n </PagePurpose>\n\n <div className=\"space-y-6\">\n {/* Revenue Overview — primary emphasis zone */}\n <EmphasisPanel className=\"p-5\">\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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"}