@burdenoff/microfe-hookmovies 2026.625.1 → 2026.626.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 (93) hide show
  1. package/dist/hookmovies/components/PageLayout.js +34 -27
  2. package/dist/hookmovies/components/PageLayout.js.map +1 -1
  3. package/dist/hookmovies/pages/HomePage.js +3 -1
  4. package/dist/hookmovies/pages/HomePage.js.map +1 -1
  5. package/dist/hookmovies/pages/admin/AdminAnalyticsPage.js +1 -0
  6. package/dist/hookmovies/pages/admin/AdminAnalyticsPage.js.map +1 -1
  7. package/dist/hookmovies/pages/admin/AdminDashboard.js +74 -45
  8. package/dist/hookmovies/pages/admin/AdminDashboard.js.map +1 -1
  9. package/dist/hookmovies/pages/admin/AdminFinancialPage.js +1 -0
  10. package/dist/hookmovies/pages/admin/AdminFinancialPage.js.map +1 -1
  11. package/dist/hookmovies/pages/admin/AdminOrdersPage.js +222 -221
  12. package/dist/hookmovies/pages/admin/AdminOrdersPage.js.map +1 -1
  13. package/dist/hookmovies/pages/admin/AdminProfilePage.js +59 -58
  14. package/dist/hookmovies/pages/admin/AdminProfilePage.js.map +1 -1
  15. package/dist/hookmovies/pages/admin/AdminSettingsPage.js +1 -0
  16. package/dist/hookmovies/pages/admin/AdminSettingsPage.js.map +1 -1
  17. package/dist/hookmovies/pages/admin/CartManagementPage.js +25 -25
  18. package/dist/hookmovies/pages/admin/CartManagementPage.js.map +1 -1
  19. package/dist/hookmovies/pages/admin/UserManagementPage.js +262 -262
  20. package/dist/hookmovies/pages/admin/UserManagementPage.js.map +1 -1
  21. package/dist/hookmovies/pages/cart-owner/AnalyticsDashboard.js +43 -41
  22. package/dist/hookmovies/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  23. package/dist/hookmovies/pages/cart-owner/BusinessSettingsPage.js +169 -165
  24. package/dist/hookmovies/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  25. package/dist/hookmovies/pages/cart-owner/CartOwnerDashboard.js +82 -54
  26. package/dist/hookmovies/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  27. package/dist/hookmovies/pages/cart-owner/CartOwnerProfilePage.js +94 -92
  28. package/dist/hookmovies/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  29. package/dist/hookmovies/pages/cart-owner/CartServiceConfigPage.js +111 -107
  30. package/dist/hookmovies/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  31. package/dist/hookmovies/pages/cart-owner/InventoryManagementPage.js +287 -288
  32. package/dist/hookmovies/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  33. package/dist/hookmovies/pages/cart-owner/OrderManagementPage.js +256 -224
  34. package/dist/hookmovies/pages/cart-owner/OrderManagementPage.js.map +1 -1
  35. package/dist/hookmovies/pages/cart-owner/StaffManagementPage.js +127 -128
  36. package/dist/hookmovies/pages/cart-owner/StaffManagementPage.js.map +1 -1
  37. package/dist/hookmovies/pages/common/HelpSupportPage.js +279 -283
  38. package/dist/hookmovies/pages/common/HelpSupportPage.js.map +1 -1
  39. package/dist/hookmovies/pages/common/NotificationCenterPage.js +2 -1
  40. package/dist/hookmovies/pages/common/NotificationCenterPage.js.map +1 -1
  41. package/dist/hookmovies/pages/common/SettingsPage.js +1 -0
  42. package/dist/hookmovies/pages/common/SettingsPage.js.map +1 -1
  43. package/dist/hookmovies/pages/customer/BookingDetailsPage.js +386 -357
  44. package/dist/hookmovies/pages/customer/BookingDetailsPage.js.map +1 -1
  45. package/dist/hookmovies/pages/customer/CartDetailPage.js +222 -189
  46. package/dist/hookmovies/pages/customer/CartDetailPage.js.map +1 -1
  47. package/dist/hookmovies/pages/customer/CartDiscoveryPage.js +156 -146
  48. package/dist/hookmovies/pages/customer/CartDiscoveryPage.js.map +1 -1
  49. package/dist/hookmovies/pages/customer/CheckoutPage.js +208 -214
  50. package/dist/hookmovies/pages/customer/CheckoutPage.js.map +1 -1
  51. package/dist/hookmovies/pages/customer/CustomerDashboard.js +427 -388
  52. package/dist/hookmovies/pages/customer/CustomerDashboard.js.map +1 -1
  53. package/dist/hookmovies/pages/customer/CustomerProfilePage.js +120 -118
  54. package/dist/hookmovies/pages/customer/CustomerProfilePage.js.map +1 -1
  55. package/dist/hookmovies/pages/customer/DirectServiceBookingPage.js +150 -146
  56. package/dist/hookmovies/pages/customer/DirectServiceBookingPage.js.map +1 -1
  57. package/dist/hookmovies/pages/customer/FavoritesPage.js +54 -52
  58. package/dist/hookmovies/pages/customer/FavoritesPage.js.map +1 -1
  59. package/dist/hookmovies/pages/customer/OrderHistoryPage.js +87 -83
  60. package/dist/hookmovies/pages/customer/OrderHistoryPage.js.map +1 -1
  61. package/dist/hookmovies/pages/customer/OrderTrackingPage.js +110 -108
  62. package/dist/hookmovies/pages/customer/OrderTrackingPage.js.map +1 -1
  63. package/dist/hookmovies/pages/customer/PaymentMethodsPage.js +77 -75
  64. package/dist/hookmovies/pages/customer/PaymentMethodsPage.js.map +1 -1
  65. package/dist/hookmovies/pages/customer/ReviewsPage.js +2 -1
  66. package/dist/hookmovies/pages/customer/ReviewsPage.js.map +1 -1
  67. package/dist/hookmovies/pages/customer/SavedAddressesPage.js +115 -108
  68. package/dist/hookmovies/pages/customer/SavedAddressesPage.js.map +1 -1
  69. package/dist/hookmovies/pages/investor/InvestmentDetailsPage.js +285 -254
  70. package/dist/hookmovies/pages/investor/InvestmentDetailsPage.js.map +1 -1
  71. package/dist/hookmovies/pages/investor/InvestmentOpportunitiesPage.js +2 -1
  72. package/dist/hookmovies/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  73. package/dist/hookmovies/pages/investor/InvestorAnalyticsPage.js +2 -0
  74. package/dist/hookmovies/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  75. package/dist/hookmovies/pages/investor/InvestorDashboard.js +343 -313
  76. package/dist/hookmovies/pages/investor/InvestorDashboard.js.map +1 -1
  77. package/dist/hookmovies/pages/investor/InvestorInvestmentsPage.js +102 -100
  78. package/dist/hookmovies/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  79. package/dist/hookmovies/pages/investor/InvestorPortfolioPage.js +2 -0
  80. package/dist/hookmovies/pages/investor/InvestorPortfolioPage.js.map +1 -1
  81. package/dist/hookmovies/pages/investor/InvestorProfilePage.js +383 -381
  82. package/dist/hookmovies/pages/investor/InvestorProfilePage.js.map +1 -1
  83. package/dist/hookmovies/pages/worker/TaskDetailsPage.js +352 -320
  84. package/dist/hookmovies/pages/worker/TaskDetailsPage.js.map +1 -1
  85. package/dist/hookmovies/pages/worker/WorkerDashboard.js +125 -97
  86. package/dist/hookmovies/pages/worker/WorkerDashboard.js.map +1 -1
  87. package/dist/hookmovies/pages/worker/WorkerOrdersPage.js +191 -190
  88. package/dist/hookmovies/pages/worker/WorkerOrdersPage.js.map +1 -1
  89. package/dist/hookmovies/pages/worker/WorkerProfilePage.js +76 -74
  90. package/dist/hookmovies/pages/worker/WorkerProfilePage.js.map +1 -1
  91. package/dist/hookmovies/pages/worker/WorkerSchedulePage.js +165 -164
  92. package/dist/hookmovies/pages/worker/WorkerSchedulePage.js.map +1 -1
  93. package/package.json +3 -3
@@ -1,34 +1,41 @@
1
1
  import { cn as e } from "../utils/cn.js";
2
2
  import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
- import { AuroraBackground as r } from "@burdenoff/fe-libs/ui";
3
+ import { AuroraBackground as r, PagePurpose as i } from "@burdenoff/fe-libs/ui";
4
4
  //#region src/hookmovies/components/PageLayout.tsx
5
- var i = ({ title: i, description: a, actions: o, children: s, className: c, hero: l = !1 }) => /* @__PURE__ */ n("div", {
6
- className: e("flex flex-col h-full", c),
7
- children: [/* @__PURE__ */ n("div", {
8
- className: e("relative overflow-hidden flex items-center justify-between gap-4 px-6 py-4 border-b border-border-seam", l ? "bg-hero-mesh" : "bg-bg-surface"),
9
- children: [
10
- l && /* @__PURE__ */ t(r, { intensity: "subtle" }),
11
- /* @__PURE__ */ n("div", {
12
- className: "min-w-0",
13
- children: [/* @__PURE__ */ t("h1", {
14
- className: "text-2xl font-semibold tracking-tight text-text-primary",
15
- children: i
16
- }), a && /* @__PURE__ */ t("p", {
17
- className: "mt-1 text-sm text-text-secondary",
18
- children: a
19
- })]
20
- }),
21
- o && /* @__PURE__ */ t("div", {
22
- className: "flex items-center gap-3 shrink-0",
23
- children: o
24
- })
25
- ]
26
- }), /* @__PURE__ */ t("div", {
27
- className: "flex-1 overflow-auto p-6",
28
- children: s
29
- })]
5
+ var a = ({ title: a, description: o, actions: s, children: c, className: l, hero: u = !1, purpose: d }) => /* @__PURE__ */ n("div", {
6
+ className: e("flex flex-col h-full", l),
7
+ children: [
8
+ /* @__PURE__ */ n("div", {
9
+ className: e("relative overflow-hidden flex items-center justify-between gap-4 px-6 py-4 border-b border-border-seam", u ? "bg-hero-mesh" : "bg-bg-surface"),
10
+ children: [
11
+ u && /* @__PURE__ */ t(r, { intensity: "subtle" }),
12
+ /* @__PURE__ */ n("div", {
13
+ className: "min-w-0",
14
+ children: [/* @__PURE__ */ t("h1", {
15
+ className: "text-2xl font-semibold tracking-tight text-text-primary",
16
+ children: a
17
+ }), o && /* @__PURE__ */ t("p", {
18
+ className: "mt-1 text-sm text-text-secondary",
19
+ children: o
20
+ })]
21
+ }),
22
+ s && /* @__PURE__ */ t("div", {
23
+ className: "flex items-center gap-3 shrink-0",
24
+ children: s
25
+ })
26
+ ]
27
+ }),
28
+ d && /* @__PURE__ */ t("div", {
29
+ className: "border-b border-border-seam bg-bg-surface px-6 py-3",
30
+ children: /* @__PURE__ */ t(i, { children: d })
31
+ }),
32
+ /* @__PURE__ */ t("div", {
33
+ className: "flex-1 overflow-auto p-6",
34
+ children: c
35
+ })
36
+ ]
30
37
  });
31
38
  //#endregion
32
- export { i as PageLayout };
39
+ export { a as PageLayout };
33
40
 
34
41
  //# sourceMappingURL=PageLayout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/hookmovies/components/PageLayout.tsx"],"sourcesContent":["/**\n * Page Layout Component\n * @module hookmovies/components\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { AuroraBackground } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\ninterface PageLayoutProps {\n title: ReactNode;\n description?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n /**\n * Render a subtle aurora backdrop behind the page header. Use on the MFE's\n * primary landing/hero page only (one aurora per surface).\n */\n hero?: boolean;\n}\n\nexport const PageLayout: FC<PageLayoutProps> = ({\n title,\n description,\n actions,\n children,\n className,\n hero = false,\n}) => {\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Page Header */}\n <div\n className={cn(\n 'relative overflow-hidden flex items-center justify-between gap-4 px-6 py-4 border-b border-border-seam',\n hero ? 'bg-hero-mesh' : 'bg-bg-surface'\n )}\n >\n {hero && <AuroraBackground intensity=\"subtle\" />}\n <div className=\"min-w-0\">\n <h1 className=\"text-2xl font-semibold tracking-tight text-text-primary\">{title}</h1>\n {description && <p className=\"mt-1 text-sm text-text-secondary\">{description}</p>}\n </div>\n {actions && <div className=\"flex items-center gap-3 shrink-0\">{actions}</div>}\n </div>\n\n {/* Page Content */}\n <div className=\"flex-1 overflow-auto p-6\">{children}</div>\n </div>\n );\n};\n"],"mappings":";;;;AAsBA,IAAa,KAAmC,EAC9C,UACA,gBACA,YACA,aACA,cACA,UAAO,SAGL,kBAAC,OAAD;CAAK,WAAW,EAAG,wBAAwB,EAAU;WAArD,CAEE,kBAAC,OAAD;EACE,WAAW,EACT,0GACA,IAAO,iBAAiB,gBACzB;YAJH;GAMG,KAAQ,kBAAC,GAAD,EAAkB,WAAU,UAAW,CAAA;GAChD,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAA2D;KAAW,CAAA,EACnF,KAAe,kBAAC,KAAD;KAAG,WAAU;eAAoC;KAAgB,CAAA,CAC7E;;GACL,KAAW,kBAAC,OAAD;IAAK,WAAU;cAAoC;IAAc,CAAA;GACzE;KAGN,kBAAC,OAAD;EAAK,WAAU;EAA4B;EAAe,CAAA,CACtD"}
1
+ {"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/hookmovies/components/PageLayout.tsx"],"sourcesContent":["/**\n * Page Layout Component\n * @module hookmovies/components\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { AuroraBackground, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\ninterface PageLayoutProps {\n title: ReactNode;\n description?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n /**\n * Render a subtle aurora backdrop behind the page header. Use on the MFE's\n * primary landing/hero page only (one aurora per surface).\n */\n hero?: boolean;\n /**\n * Plain-language explanation of WHAT this page/feature is for and the\n * use-case (the page \"story\"). Rendered as a calm {@link PagePurpose} band\n * directly under the header so every page is self-explanatory to a new user.\n */\n purpose?: ReactNode;\n}\n\nexport const PageLayout: FC<PageLayoutProps> = ({\n title,\n description,\n actions,\n children,\n className,\n hero = false,\n purpose,\n}) => {\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Page Header */}\n <div\n className={cn(\n 'relative overflow-hidden flex items-center justify-between gap-4 px-6 py-4 border-b border-border-seam',\n hero ? 'bg-hero-mesh' : 'bg-bg-surface'\n )}\n >\n {hero && <AuroraBackground intensity=\"subtle\" />}\n <div className=\"min-w-0\">\n <h1 className=\"text-2xl font-semibold tracking-tight text-text-primary\">{title}</h1>\n {description && <p className=\"mt-1 text-sm text-text-secondary\">{description}</p>}\n </div>\n {actions && <div className=\"flex items-center gap-3 shrink-0\">{actions}</div>}\n </div>\n\n {/* Page purpose / \"story\" band — what this page is for + the use-case */}\n {purpose && (\n <div className=\"border-b border-border-seam bg-bg-surface px-6 py-3\">\n <PagePurpose>{purpose}</PagePurpose>\n </div>\n )}\n\n {/* Page Content */}\n <div className=\"flex-1 overflow-auto p-6\">{children}</div>\n </div>\n );\n};\n"],"mappings":";;;;AA4BA,IAAa,KAAmC,EAC9C,UACA,gBACA,YACA,aACA,cACA,UAAO,IACP,iBAGE,kBAAC,OAAD;CAAK,WAAW,EAAG,wBAAwB,EAAU;WAArD;EAEE,kBAAC,OAAD;GACE,WAAW,EACT,0GACA,IAAO,iBAAiB,gBACzB;aAJH;IAMG,KAAQ,kBAAC,GAAD,EAAkB,WAAU,UAAW,CAAA;IAChD,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,MAAD;MAAI,WAAU;gBAA2D;MAAW,CAAA,EACnF,KAAe,kBAAC,KAAD;MAAG,WAAU;gBAAoC;MAAgB,CAAA,CAC7E;;IACL,KAAW,kBAAC,OAAD;KAAK,WAAU;eAAoC;KAAc,CAAA;IACzE;;EAGL,KACC,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD,EAAA,UAAc,GAAsB,CAAA;GAChC,CAAA;EAIR,kBAAC,OAAD;GAAK,WAAU;GAA4B;GAAe,CAAA;EACtD"}
@@ -502,6 +502,7 @@ function ae() {
502
502
  "!"
503
503
  ] }),
504
504
  description: F[M],
505
+ purpose: D("hookmovies.home.purpose", "Your starting point on HookMovies — the marketplace that connects you with mobile food carts and local services nearby. Discover providers, jump to your most common tasks, and pick up recent activity, all tailored to your role."),
505
506
  children: [
506
507
  U && /* @__PURE__ */ J(X, {
507
508
  className: "mb-6 p-6",
@@ -532,7 +533,8 @@ function ae() {
532
533
  })
533
534
  }),
534
535
  /* @__PURE__ */ J(Z, {
535
- treatment: "insight",
536
+ treatment: "glass",
537
+ glow: !U,
536
538
  className: "mb-6 border-border-seam p-6",
537
539
  children: /* @__PURE__ */ Y("div", {
538
540
  className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
@@ -1 +1 @@
1
- {"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/hookmovies/pages/HomePage.tsx"],"sourcesContent":["/**\n * Home Page\n * @module hookmovies/pages\n *\n * Role-based landing page with hero section, quick stats, quick actions,\n * featured carts, recent orders, how-it-works, category browsing,\n * platform stats, and welcome banner for new users.\n */\n\nimport { useState, useMemo, useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { GradientText, GlassCard, EmphasisPanel } from '@burdenoff/fe-libs/ui';\nimport {\n Search,\n ShoppingBag,\n Store,\n ClipboardList,\n TrendingUp,\n LayoutDashboard,\n Users,\n IndianRupee,\n Activity,\n ArrowRight,\n Star,\n MapPin,\n Clock,\n ChefHat,\n Scissors,\n Wrench,\n Home,\n Shirt,\n Heart,\n GraduationCap,\n Package,\n ShoppingCart,\n BarChart3,\n Wallet,\n CheckCircle2,\n Zap,\n Shield,\n Sparkles,\n HandCoins,\n UserCheck,\n Truck,\n BadgeCheck,\n FileText,\n Settings,\n Loader2,\n AlertCircle,\n} from 'lucide-react';\nimport { PageLayout } from '../components/PageLayout';\nimport { MetricsCard } from '../components/MetricsCard';\nimport { CartCard } from '../components/CartCard';\nimport { StatusBadge } from '../components/StatusBadge';\nimport { EmptyState } from '../components/EmptyState';\nimport { useHookMovies } from '../context/HookMoviesContext';\nimport { useHookMoviesApi } from '../hooks/useHookMoviesApi';\nimport { cn } from '../utils/cn';\nimport {\n formatCurrency,\n formatDate,\n formatRelativeTime,\n formatDistance,\n} from '../utils/formatters';\nimport type { UserRole, MockCart, MockOrder, DashboardStats } from '../types';\n\n// ---------------------------------------------------------------------------\n// Role-based Quick Action configs\n// ---------------------------------------------------------------------------\n\ninterface QuickAction {\n label: string;\n description: string;\n icon: React.ReactNode;\n path: string;\n color: string;\n}\n\nconst quickActionsByRole: Record<UserRole, QuickAction[]> = {\n customer: [\n {\n label: 'Discover Services',\n description: 'Browse carts near you',\n icon: <Search className=\"h-5 w-5\" />,\n path: '/customer/carts',\n color: 'bg-status-info-bg-subtle text-status-info-text',\n },\n {\n label: 'My Orders',\n description: 'Track your orders',\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n path: '/customer/orders',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Favorites',\n description: 'Your saved carts',\n icon: <Heart className=\"h-5 w-5\" />,\n path: '/customer/favorites',\n color: 'bg-[var(--color-accent-soft)] text-text-link',\n },\n {\n label: 'Settings',\n description: 'Manage preferences',\n icon: <Settings className=\"h-5 w-5\" />,\n path: '/settings',\n color: 'bg-bg-sunken text-text-secondary',\n },\n ],\n cart_owner: [\n {\n label: 'My Cart',\n description: 'Manage your cart',\n icon: <Store className=\"h-5 w-5\" />,\n path: '/owner/dashboard',\n color: 'bg-[var(--color-accent-soft)] text-text-link',\n },\n {\n label: 'Orders',\n description: 'Incoming orders',\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n path: '/owner/orders',\n color: 'bg-status-info-bg-subtle text-status-info-text',\n },\n {\n label: 'Analytics',\n description: 'Revenue & insights',\n icon: <BarChart3 className=\"h-5 w-5\" />,\n path: '/owner/analytics',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Staff',\n description: 'Manage workers',\n icon: <Users className=\"h-5 w-5\" />,\n path: '/owner/staff',\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n ],\n worker: [\n {\n label: 'My Tasks',\n description: 'View assigned tasks',\n icon: <ClipboardList className=\"h-5 w-5\" />,\n path: '/worker/dashboard',\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n {\n label: 'Schedule',\n description: 'View shifts',\n icon: <Clock className=\"h-5 w-5\" />,\n path: '/worker/schedule',\n color: 'bg-status-info-bg-subtle text-status-info-text',\n },\n {\n label: 'Earnings',\n description: 'Track pay',\n icon: <Wallet className=\"h-5 w-5\" />,\n path: '/worker/earnings',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Performance',\n description: 'Ratings & stats',\n icon: <Star className=\"h-5 w-5\" />,\n path: '/worker/performance',\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n ],\n investor: [\n {\n label: 'Portfolio',\n description: 'Your investments',\n icon: <TrendingUp className=\"h-5 w-5\" />,\n path: '/investor/dashboard',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Opportunities',\n description: 'New investments',\n icon: <HandCoins className=\"h-5 w-5\" />,\n path: '/investor/opportunities',\n color: 'bg-status-info-bg-subtle text-status-info-text',\n },\n {\n label: 'Returns',\n description: 'Earnings history',\n icon: <IndianRupee className=\"h-5 w-5\" />,\n path: '/investor/returns',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Reports',\n description: 'Performance reports',\n icon: <FileText className=\"h-5 w-5\" />,\n path: '/investor/reports',\n color: 'bg-[var(--color-accent-soft)] text-text-link',\n },\n ],\n admin: [\n {\n label: 'Dashboard',\n description: 'Platform overview',\n icon: <LayoutDashboard className=\"h-5 w-5\" />,\n path: '/admin/dashboard',\n color: 'bg-status-error-bg-subtle text-status-error-text',\n },\n {\n label: 'Users',\n description: 'Manage accounts',\n icon: <Users className=\"h-5 w-5\" />,\n path: '/admin/users',\n color: 'bg-status-info-bg-subtle text-status-info-text',\n },\n {\n label: 'Carts',\n description: 'Approve & manage',\n icon: <Store className=\"h-5 w-5\" />,\n path: '/admin/carts',\n color: 'bg-[var(--color-accent-soft)] text-text-link',\n },\n {\n label: 'Analytics',\n description: 'Revenue reports',\n icon: <BarChart3 className=\"h-5 w-5\" />,\n path: '/admin/analytics',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n ],\n};\n\n// ---------------------------------------------------------------------------\n// Role-based Quick Stats configs\n// ---------------------------------------------------------------------------\n\nfunction getStatsForRole(\n role: UserRole,\n orders: MockOrder[],\n dashboardStats: DashboardStats | undefined\n) {\n switch (role) {\n case 'customer':\n return [\n {\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n value: orders.length.toString(),\n label: 'Total Orders',\n trend: 'up' as const,\n trendValue: '+2 this week',\n },\n {\n icon: <Store className=\"h-5 w-5\" />,\n value: (dashboardStats?.activeProviders ?? 0).toString(),\n label: 'Nearby Providers',\n trend: 'up' as const,\n trendValue: '+3',\n },\n {\n icon: <Star className=\"h-5 w-5\" />,\n value: (dashboardStats?.avgRating ?? 0).toFixed(1),\n label: 'Avg. Rating',\n trend: 'up' as const,\n trendValue: '+0.1',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(\n orders.reduce((s, o) => s + o.total, 0),\n { minimumFractionDigits: 0 }\n ),\n label: 'Total Spent',\n trend: 'neutral' as const,\n trendValue: '',\n },\n ];\n case 'cart_owner':\n return [\n {\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n value: '48',\n label: 'Orders Today',\n trend: 'up' as const,\n trendValue: '+12%',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(12850, { minimumFractionDigits: 0 }),\n label: \"Today's Revenue\",\n trend: 'up' as const,\n trendValue: '+8%',\n },\n {\n icon: <Star className=\"h-5 w-5\" />,\n value: '4.6',\n label: 'Cart Rating',\n trend: 'up' as const,\n trendValue: '+0.2',\n },\n {\n icon: <Users className=\"h-5 w-5\" />,\n value: '5',\n label: 'Active Staff',\n trend: 'neutral' as const,\n trendValue: '',\n },\n ];\n case 'worker':\n return [\n {\n icon: <ClipboardList className=\"h-5 w-5\" />,\n value: '5',\n label: 'Tasks Today',\n trend: 'up' as const,\n trendValue: '+2',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(425, { minimumFractionDigits: 0 }),\n label: \"Today's Earnings\",\n trend: 'up' as const,\n trendValue: '+15%',\n },\n {\n icon: <Star className=\"h-5 w-5\" />,\n value: '4.7',\n label: 'Rating',\n trend: 'up' as const,\n trendValue: '+0.1',\n },\n {\n icon: <CheckCircle2 className=\"h-5 w-5\" />,\n value: '96.8%',\n label: 'Completion Rate',\n trend: 'up' as const,\n trendValue: '+0.5%',\n },\n ];\n case 'investor':\n return [\n {\n icon: <TrendingUp className=\"h-5 w-5\" />,\n value: '3',\n label: 'Active Investments',\n trend: 'up' as const,\n trendValue: '+1',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(450000, { minimumFractionDigits: 0 }),\n label: 'Total Invested',\n trend: 'up' as const,\n trendValue: '',\n },\n {\n icon: <HandCoins className=\"h-5 w-5\" />,\n value: '16.5%',\n label: 'Avg. Returns',\n trend: 'up' as const,\n trendValue: '+2.1%',\n },\n {\n icon: <BarChart3 className=\"h-5 w-5\" />,\n value: formatCurrency(74250, { minimumFractionDigits: 0 }),\n label: 'Total Returns',\n trend: 'up' as const,\n trendValue: '+8.5%',\n },\n ];\n case 'admin':\n default:\n return [\n {\n icon: <Users className=\"h-5 w-5\" />,\n value: (dashboardStats?.activeCustomers ?? 0).toLocaleString('en-IN'),\n label: 'Active Customers',\n trend: 'up' as const,\n trendValue: '+50',\n },\n {\n icon: <Store className=\"h-5 w-5\" />,\n value: (dashboardStats?.activeProviders ?? 0).toString(),\n label: 'Service Providers',\n trend: 'up' as const,\n trendValue: '+3',\n },\n {\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n value: (dashboardStats?.totalOrders ?? 0).toLocaleString('en-IN'),\n label: 'Total Orders',\n trend: 'up' as const,\n trendValue: '+12%',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(dashboardStats?.totalRevenue ?? 0, { minimumFractionDigits: 0 }),\n label: 'Total Revenue',\n trend: 'up' as const,\n trendValue: '+8.5%',\n },\n ];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Category data\n// ---------------------------------------------------------------------------\n\nconst categories = [\n {\n label: 'Food & Beverage',\n icon: <ChefHat className=\"h-6 w-6\" />,\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n {\n label: 'Personal Care & Beauty',\n icon: <Scissors className=\"h-6 w-6\" />,\n color: 'bg-[var(--color-accent-soft)] text-text-link',\n },\n {\n label: 'Repair & Maintenance',\n icon: <Wrench className=\"h-6 w-6\" />,\n color: 'bg-status-info-bg-subtle text-status-info-text',\n },\n {\n label: 'Home Services',\n icon: <Home className=\"h-6 w-6\" />,\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Clothing & Fashion',\n icon: <Shirt className=\"h-6 w-6\" />,\n color: 'bg-[var(--color-accent-soft)] text-text-link',\n },\n {\n label: 'Health & Wellness',\n icon: <Heart className=\"h-6 w-6\" />,\n color: 'bg-status-error-bg-subtle text-status-error-text',\n },\n {\n label: 'Education & Skills',\n icon: <GraduationCap className=\"h-6 w-6\" />,\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n {\n label: 'Retail & Merchandise',\n icon: <Package className=\"h-6 w-6\" />,\n color: 'bg-status-info-bg-subtle text-status-info-text',\n },\n {\n label: 'Grocery & Essentials',\n icon: <ShoppingCart className=\"h-6 w-6\" />,\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n];\n\n// ---------------------------------------------------------------------------\n// How It Works steps\n// ---------------------------------------------------------------------------\n\nconst howItWorks = [\n {\n step: 1,\n title: 'Browse Services',\n description: 'Discover local service providers and carts near you.',\n icon: <Search className=\"h-6 w-6\" />,\n },\n {\n step: 2,\n title: 'Place an Order',\n description: 'Select items or services and place your order seamlessly.',\n icon: <ShoppingBag className=\"h-6 w-6\" />,\n },\n {\n step: 3,\n title: 'Track in Real-time',\n description: 'Get live updates on your order from confirmation to delivery.',\n icon: <Truck className=\"h-6 w-6\" />,\n },\n {\n step: 4,\n title: 'Rate & Review',\n description: 'Share your experience and help others find great services.',\n icon: <Star className=\"h-6 w-6\" />,\n },\n];\n\n// ---------------------------------------------------------------------------\n// Recent activity mock\n// ---------------------------------------------------------------------------\n\nconst mockRecentActivity = [\n {\n id: 'ha-1',\n description: 'New order placed at Dosa Express',\n time: '2 mins ago',\n type: 'order',\n },\n {\n id: 'ha-2',\n description: 'Quick Cuts Salon received a new review',\n time: '15 mins ago',\n type: 'review',\n },\n {\n id: 'ha-3',\n description: 'Investment opportunity funded: Spotless Cleaning',\n time: '1 hour ago',\n type: 'investment',\n },\n {\n id: 'ha-4',\n description: 'New cart registered: Gadget Zone Brigade',\n time: '3 hours ago',\n type: 'cart',\n },\n {\n id: 'ha-5',\n description: 'Order delivered: Fix-It Mobile Repair',\n time: '5 hours ago',\n type: 'order',\n },\n];\n\n// ---------------------------------------------------------------------------\n// Platform Stats\n// ---------------------------------------------------------------------------\n\nconst platformStats = [\n { label: 'Service Providers', value: '21+', icon: <Store className=\"h-5 w-5\" /> },\n { label: 'Categories', value: '9', icon: <Package className=\"h-5 w-5\" /> },\n { label: 'Happy Customers', value: '534+', icon: <Users className=\"h-5 w-5\" /> },\n { label: 'Orders Completed', value: '1,247+', icon: <CheckCircle2 className=\"h-5 w-5\" /> },\n];\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function HomePage() {\n const { navigateTo, currentUser } = useHookMovies();\n const { t: translate } = useI18n();\n const [searchQuery, setSearchQuery] = useState('');\n\n const { providers, orders, dashboardStats } = useHookMoviesApi();\n\n const t = useCallback(\n (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n },\n [translate]\n );\n\n const firstName = currentUser?.firstName ?? currentUser?.name ?? 'there';\n const userRole: UserRole = (currentUser?.role as UserRole) ?? 'customer';\n\n const roleLabel: Record<UserRole, string> = {\n customer: t('hookmovies.home.role.customer', 'Customer'),\n cart_owner: t('hookmovies.home.role.cartOwner', 'Cart Owner'),\n worker: t('hookmovies.home.role.worker', 'Worker'),\n investor: t('hookmovies.home.role.investor', 'Investor'),\n admin: t('hookmovies.home.role.admin', 'Administrator'),\n };\n\n const roleGreetings: Record<UserRole, string> = {\n customer: t('hookmovies.home.greeting.customer', 'Discover amazing services near you'),\n cart_owner: t('hookmovies.home.greeting.cartOwner', 'Manage your business and grow'),\n worker: t('hookmovies.home.greeting.worker', 'Check your tasks and earnings'),\n investor: t('hookmovies.home.greeting.investor', 'Track your investments and returns'),\n admin: t('hookmovies.home.greeting.admin', 'Monitor and manage the platform'),\n };\n\n const quickActions = quickActionsByRole[userRole] ?? quickActionsByRole.customer;\n const stats = getStatsForRole(userRole, orders.data ?? [], dashboardStats.data);\n\n // Featured carts (top-rated, open)\n const featuredCarts = useMemo(() => {\n let carts = (providers.data ?? []).filter((c) => c.isOpen);\n if (searchQuery) {\n const q = searchQuery.toLowerCase();\n carts = carts.filter(\n (c) => c.name.toLowerCase().includes(q) || c.category.toLowerCase().includes(q)\n );\n }\n return carts.sort((a, b) => b.rating - a.rating).slice(0, 6);\n }, [providers.data, searchQuery]);\n\n // Recent orders\n const recentOrders = useMemo(() => {\n return [...(orders.data ?? [])]\n .sort((a, b) => new Date(b.orderDate).getTime() - new Date(a.orderDate).getTime())\n .slice(0, 3);\n }, [orders.data]);\n\n const activityIcons: Record<string, string> = {\n order: 'text-status-info-text',\n review: 'text-status-warning-text',\n investment: 'text-status-success-text',\n cart: 'text-text-link',\n };\n\n // Check if \"new user\" (no orders)\n const isNewUser = (orders.data ?? []).length === 0 && !orders.isLoading;\n\n const isLoading = providers.isLoading || orders.isLoading || dashboardStats.isLoading;\n const isError = providers.isError || orders.isError || dashboardStats.isError;\n\n if (isLoading) {\n return (\n <PageLayout title={t('hookmovies.common.loading', 'Loading...')}>\n <div className=\"flex h-[60vh] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n </PageLayout>\n );\n }\n\n if (isError) {\n return (\n <PageLayout title={t('hookmovies.common.error', 'Error')}>\n <div className=\"flex h-[60vh] flex-col items-center justify-center gap-4\">\n <AlertCircle className=\"h-12 w-12 text-status-error-text\" />\n <h2 className=\"text-xl font-semibold\">\n {t('hookmovies.common.errorLoading', 'Error loading data')}\n </h2>\n <p className=\"text-text-secondary\">\n {t('hookmovies.common.tryAgain', 'Please try again later.')}\n </p>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n hero\n title={\n <>\n <GradientText>{t('hookmovies.home.hello', 'Hello')}</GradientText>, {firstName}!\n </>\n }\n description={roleGreetings[userRole]}\n >\n {/* Welcome Banner for New Users — primary emphasis zone */}\n {isNewUser && (\n <EmphasisPanel className=\"mb-6 p-6\">\n <div className=\"flex items-start gap-4\">\n <div className=\"flex h-12 w-12 shrink-0 items-center justify-center rounded-full bg-action-primary-bg/10\">\n <Sparkles className=\"h-6 w-6 text-primary\" />\n </div>\n <div className=\"flex-1\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('hookmovies.home.welcomeTitle', 'Welcome to HookMovies!')}\n </h2>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t(\n 'hookmovies.home.welcomeDescription',\n 'Your local services marketplace. Start by exploring service providers near you or browse categories to find what you need.'\n )}\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"mt-3 inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n <Search className=\"h-4 w-4\" />\n {t('hookmovies.home.exploreServices', 'Explore Services')}\n </button>\n </div>\n </div>\n </EmphasisPanel>\n )}\n\n {/* Hero Section with Role Info */}\n <GlassCard treatment=\"insight\" className=\"mb-6 border-border-seam p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"inline-flex items-center rounded-full bg-action-primary-bg/10 px-2.5 py-0.5 text-xs font-medium text-primary\">\n <BadgeCheck className=\"mr-1 h-3 w-3\" />\n {roleLabel[userRole]}\n </span>\n </div>\n <h2 className=\"text-xl font-bold text-text-primary\">\n {t('hookmovies.home.good', 'Good')}{' '}\n {new Date().getHours() < 12\n ? t('hookmovies.home.time.morning', 'morning')\n : new Date().getHours() < 17\n ? t('hookmovies.home.time.afternoon', 'afternoon')\n : t('hookmovies.home.time.evening', 'evening')}\n , {firstName}\n </h2>\n <p className=\"mt-1 text-sm text-text-secondary\">{roleGreetings[userRole]}</p>\n </div>\n <div className=\"relative w-full sm:w-72\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n type=\"text\"\n placeholder={t('hookmovies.home.searchPlaceholder', 'Search services, carts...')}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full rounded-lg border border-border-seam bg-bg-surface py-2.5 pl-10 pr-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n </div>\n </GlassCard>\n\n {/* Quick Stats */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('hookmovies.home.quickStats', 'Quick Stats')}\n </h2>\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {stats.map((stat, index) => (\n <MetricsCard\n key={stat.label}\n icon={stat.icon}\n value={stat.value}\n label={stat.label}\n trend={stat.trend}\n trendValue={stat.trendValue}\n featured={index === 0}\n />\n ))}\n </div>\n </section>\n\n {/* Quick Actions */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('hookmovies.home.quickActions', 'Quick Actions')}\n </h2>\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {quickActions.map((action) => (\n <button\n key={action.label}\n type=\"button\"\n onClick={() => navigateTo(action.path)}\n className={cn(\n 'flex items-start gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 text-left shadow-sm transition-all',\n 'hover:border-accent-foreground/20 hover:shadow-md'\n )}\n >\n <div\n className={cn(\n 'flex h-10 w-10 shrink-0 items-center justify-center rounded-lg',\n action.color\n )}\n >\n {action.icon}\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold text-text-primary\">{action.label}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">{action.description}</p>\n </div>\n <ArrowRight className=\"h-4 w-4 text-text-secondary shrink-0 mt-1\" />\n </button>\n ))}\n </div>\n </section>\n\n {/* Featured / Nearby Carts */}\n <section className=\"mb-8\">\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {searchQuery\n ? t('hookmovies.home.searchResults', 'Search Results')\n : t('hookmovies.home.featuredCarts', 'Featured Carts')}\n </h2>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"flex items-center gap-1 text-sm font-medium text-primary hover:underline\"\n >\n {t('hookmovies.common.viewAll', 'View All')} <ArrowRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n\n {featuredCarts.length === 0 ? (\n <EmptyState\n illustration=\"empty-search\"\n title={t('hookmovies.home.noCartsFound', 'No carts found')}\n description={t(\n 'hookmovies.home.noCartsDescription',\n 'Try adjusting your search or browse all categories'\n )}\n action={\n <button\n type=\"button\"\n onClick={() => setSearchQuery('')}\n className=\"rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n {t('hookmovies.home.clearSearch', 'Clear Search')}\n </button>\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {featuredCarts.map((cart) => (\n <div\n key={cart.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => navigateTo(`/customer/cart/${cart.id}`)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateTo(`/customer/cart/${cart.id}`);\n }\n }}\n className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm overflow-hidden transition-all hover:shadow-md hover:border-accent-foreground/20 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n {/* Image */}\n <div className=\"relative h-40 bg-bg-sunken\">\n <img\n src={cart.image}\n alt={cart.name}\n className=\"h-full w-full object-cover\"\n loading=\"lazy\"\n />\n <div className=\"absolute top-2 right-2\">\n <StatusBadge status={cart.isOpen ? 'open' : 'closed'} />\n </div>\n {cart.isVerified && (\n <div className=\"absolute top-2 left-2\">\n <span className=\"inline-flex items-center gap-1 rounded-full bg-status-info-bg/90 px-2 py-0.5 text-xs font-medium text-status-info-text backdrop-blur-sm\">\n <BadgeCheck className=\"h-3 w-3\" />{' '}\n {t('hookmovies.home.verified', 'Verified')}\n </span>\n </div>\n )}\n <div className=\"absolute bottom-2 right-2\">\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-elevated/85 px-2 py-0.5 text-xs text-text-primary backdrop-blur-sm border border-border-seam\">\n <Clock className=\"h-3 w-3\" /> {cart.estimatedTime} min\n </span>\n </div>\n </div>\n\n {/* Details */}\n <div className=\"p-4\">\n <div className=\"flex items-start justify-between\">\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-base font-semibold text-text-primary truncate\">\n {cart.name}\n </h3>\n <p className=\"mt-0.5 text-sm text-text-secondary\">{cart.category}</p>\n </div>\n <div className=\"flex items-center gap-1 rounded bg-status-success-bg-subtle px-1.5 py-0.5 ml-2 shrink-0\">\n <Star className=\"h-3 w-3 fill-status-success-text text-status-success-text\" />\n <span className=\"text-xs font-bold text-status-success-text tabular-nums\">\n {cart.rating}\n </span>\n </div>\n </div>\n\n <div className=\"mt-3 flex items-center gap-4 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" /> {formatDistance(cart.distance)}\n </span>\n <span className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3\" /> {cart.totalRatings}{' '}\n {t('hookmovies.home.reviews', 'reviews')}\n </span>\n {cart.averageOrderValue && (\n <span className=\"flex items-center gap-1\">\n <IndianRupee className=\"h-3 w-3\" /> {t('hookmovies.home.average', 'Avg.')}{' '}\n {formatCurrency(cart.averageOrderValue, { minimumFractionDigits: 0 })}\n </span>\n )}\n </div>\n\n {/* Tags / service types */}\n {cart.serviceTypes && cart.serviceTypes.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {cart.serviceTypes.slice(0, 3).map((st) => (\n <span\n key={st}\n className=\"inline-flex items-center rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary\"\n >\n {st.replace(/_/g, ' ')}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </section>\n\n {/* Recent Orders */}\n {recentOrders.length > 0 && (\n <section className=\"mb-8\">\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('hookmovies.home.recentOrders', 'Recent Orders')}\n </h2>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/orders')}\n className=\"flex items-center gap-1 text-sm font-medium text-primary hover:underline\"\n >\n {t('hookmovies.common.viewAll', 'View All')} <ArrowRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface divide-y divide-border\">\n {recentOrders.map((order) => (\n <div\n key={order.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => navigateTo(`/customer/order/${order.id}`)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateTo(`/customer/order/${order.id}`);\n }\n }}\n className=\"flex items-center gap-4 px-4 py-3 hover:bg-accent/50 transition-colors cursor-pointer\"\n >\n <img\n src={order.cartImage}\n alt={order.cartName}\n className=\"h-12 w-12 rounded-lg object-cover shrink-0\"\n />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-text-primary truncate\">\n {order.cartName}\n </p>\n <StatusBadge status={order.status} />\n </div>\n <p className=\"text-xs text-text-secondary mt-0.5\">\n {order.items.map((i) => i.name).join(', ')}\n </p>\n </div>\n <div className=\"text-right shrink-0\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {formatCurrency(order.total, { minimumFractionDigits: 0 })}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {formatRelativeTime(order.orderDate)}\n </p>\n </div>\n </div>\n ))}\n </div>\n </section>\n )}\n\n {/* How It Works */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('hookmovies.home.howItWorks', 'How It Works')}\n </h2>\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {howItWorks.map((item) => (\n <div\n key={item.step}\n className=\"relative rounded-lg border border-border-subtle bg-bg-surface p-5 text-center\"\n >\n <div className=\"absolute -top-3 left-1/2 -translate-x-1/2\">\n <span className=\"inline-flex h-6 w-6 items-center justify-center rounded-full bg-action-primary-bg text-xs font-bold text-action-primary-text\">\n {item.step}\n </span>\n </div>\n <div className=\"mt-2 flex justify-center text-text-secondary mb-3\">{item.icon}</div>\n <h3 className=\"text-sm font-semibold text-text-primary\">{item.title}</h3>\n <p className=\"mt-1 text-xs text-text-secondary\">{item.description}</p>\n </div>\n ))}\n </div>\n </section>\n\n {/* Browse by Category */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('hookmovies.home.browseByCategory', 'Browse by Category')}\n </h2>\n <div className=\"grid grid-cols-3 gap-3 sm:grid-cols-4 lg:grid-cols-5\">\n {categories.map((cat) => (\n <button\n key={cat.label}\n type=\"button\"\n onClick={() =>\n navigateTo(`/customer/carts?category=${encodeURIComponent(cat.label)}`)\n }\n className=\"flex flex-col items-center gap-2 rounded-lg border border-border-subtle bg-bg-surface p-4 text-center hover:shadow-sm hover:border-accent-foreground/20 transition-all\"\n >\n <div\n className={cn('flex h-12 w-12 items-center justify-center rounded-full', cat.color)}\n >\n {cat.icon}\n </div>\n <span className=\"text-xs font-medium text-text-primary leading-tight\">\n {cat.label}\n </span>\n </button>\n ))}\n </div>\n </section>\n\n {/* Platform Stats */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('hookmovies.home.platformStats', 'Platform Stats')}\n </h2>\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {platformStats.map((stat) => (\n <div\n key={stat.label}\n className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4\"\n >\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-action-primary-bg/10 text-primary shrink-0\">\n {stat.icon}\n </div>\n <div>\n <p className=\"text-lg font-bold text-text-primary\">{stat.value}</p>\n <p className=\"text-xs text-text-secondary\">{stat.label}</p>\n </div>\n </div>\n ))}\n </div>\n </section>\n\n {/* Recent Activity */}\n <section>\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('hookmovies.home.recentActivity', 'Recent Activity')}\n </h2>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface divide-y divide-border\">\n {mockRecentActivity.map((item) => (\n <div key={item.id} className=\"flex items-center gap-3 px-4 py-3\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-bg-sunken\">\n <Activity\n className={cn('h-4 w-4', activityIcons[item.type] ?? 'text-text-secondary')}\n />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm text-text-primary truncate\">{item.description}</p>\n </div>\n <span className=\"text-xs text-text-secondary whitespace-nowrap\">{item.time}</span>\n </div>\n ))}\n </div>\n </section>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/hookmovies/pages/HomePage.tsx"],"sourcesContent":["/**\n * Home Page\n * @module hookmovies/pages\n *\n * Role-based landing page with hero section, quick stats, quick actions,\n * featured carts, recent orders, how-it-works, category browsing,\n * platform stats, and welcome banner for new users.\n */\n\nimport { useState, useMemo, useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { GradientText, GlassCard, EmphasisPanel } from '@burdenoff/fe-libs/ui';\nimport {\n Search,\n ShoppingBag,\n Store,\n ClipboardList,\n TrendingUp,\n LayoutDashboard,\n Users,\n IndianRupee,\n Activity,\n ArrowRight,\n Star,\n MapPin,\n Clock,\n ChefHat,\n Scissors,\n Wrench,\n Home,\n Shirt,\n Heart,\n GraduationCap,\n Package,\n ShoppingCart,\n BarChart3,\n Wallet,\n CheckCircle2,\n Zap,\n Shield,\n Sparkles,\n HandCoins,\n UserCheck,\n Truck,\n BadgeCheck,\n FileText,\n Settings,\n Loader2,\n AlertCircle,\n} from 'lucide-react';\nimport { PageLayout } from '../components/PageLayout';\nimport { MetricsCard } from '../components/MetricsCard';\nimport { CartCard } from '../components/CartCard';\nimport { StatusBadge } from '../components/StatusBadge';\nimport { EmptyState } from '../components/EmptyState';\nimport { useHookMovies } from '../context/HookMoviesContext';\nimport { useHookMoviesApi } from '../hooks/useHookMoviesApi';\nimport { cn } from '../utils/cn';\nimport {\n formatCurrency,\n formatDate,\n formatRelativeTime,\n formatDistance,\n} from '../utils/formatters';\nimport type { UserRole, MockCart, MockOrder, DashboardStats } from '../types';\n\n// ---------------------------------------------------------------------------\n// Role-based Quick Action configs\n// ---------------------------------------------------------------------------\n\ninterface QuickAction {\n label: string;\n description: string;\n icon: React.ReactNode;\n path: string;\n color: string;\n}\n\nconst quickActionsByRole: Record<UserRole, QuickAction[]> = {\n customer: [\n {\n label: 'Discover Services',\n description: 'Browse carts near you',\n icon: <Search className=\"h-5 w-5\" />,\n path: '/customer/carts',\n color: 'bg-status-info-bg-subtle text-status-info-text',\n },\n {\n label: 'My Orders',\n description: 'Track your orders',\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n path: '/customer/orders',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Favorites',\n description: 'Your saved carts',\n icon: <Heart className=\"h-5 w-5\" />,\n path: '/customer/favorites',\n color: 'bg-[var(--color-accent-soft)] text-text-link',\n },\n {\n label: 'Settings',\n description: 'Manage preferences',\n icon: <Settings className=\"h-5 w-5\" />,\n path: '/settings',\n color: 'bg-bg-sunken text-text-secondary',\n },\n ],\n cart_owner: [\n {\n label: 'My Cart',\n description: 'Manage your cart',\n icon: <Store className=\"h-5 w-5\" />,\n path: '/owner/dashboard',\n color: 'bg-[var(--color-accent-soft)] text-text-link',\n },\n {\n label: 'Orders',\n description: 'Incoming orders',\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n path: '/owner/orders',\n color: 'bg-status-info-bg-subtle text-status-info-text',\n },\n {\n label: 'Analytics',\n description: 'Revenue & insights',\n icon: <BarChart3 className=\"h-5 w-5\" />,\n path: '/owner/analytics',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Staff',\n description: 'Manage workers',\n icon: <Users className=\"h-5 w-5\" />,\n path: '/owner/staff',\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n ],\n worker: [\n {\n label: 'My Tasks',\n description: 'View assigned tasks',\n icon: <ClipboardList className=\"h-5 w-5\" />,\n path: '/worker/dashboard',\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n {\n label: 'Schedule',\n description: 'View shifts',\n icon: <Clock className=\"h-5 w-5\" />,\n path: '/worker/schedule',\n color: 'bg-status-info-bg-subtle text-status-info-text',\n },\n {\n label: 'Earnings',\n description: 'Track pay',\n icon: <Wallet className=\"h-5 w-5\" />,\n path: '/worker/earnings',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Performance',\n description: 'Ratings & stats',\n icon: <Star className=\"h-5 w-5\" />,\n path: '/worker/performance',\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n ],\n investor: [\n {\n label: 'Portfolio',\n description: 'Your investments',\n icon: <TrendingUp className=\"h-5 w-5\" />,\n path: '/investor/dashboard',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Opportunities',\n description: 'New investments',\n icon: <HandCoins className=\"h-5 w-5\" />,\n path: '/investor/opportunities',\n color: 'bg-status-info-bg-subtle text-status-info-text',\n },\n {\n label: 'Returns',\n description: 'Earnings history',\n icon: <IndianRupee className=\"h-5 w-5\" />,\n path: '/investor/returns',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Reports',\n description: 'Performance reports',\n icon: <FileText className=\"h-5 w-5\" />,\n path: '/investor/reports',\n color: 'bg-[var(--color-accent-soft)] text-text-link',\n },\n ],\n admin: [\n {\n label: 'Dashboard',\n description: 'Platform overview',\n icon: <LayoutDashboard className=\"h-5 w-5\" />,\n path: '/admin/dashboard',\n color: 'bg-status-error-bg-subtle text-status-error-text',\n },\n {\n label: 'Users',\n description: 'Manage accounts',\n icon: <Users className=\"h-5 w-5\" />,\n path: '/admin/users',\n color: 'bg-status-info-bg-subtle text-status-info-text',\n },\n {\n label: 'Carts',\n description: 'Approve & manage',\n icon: <Store className=\"h-5 w-5\" />,\n path: '/admin/carts',\n color: 'bg-[var(--color-accent-soft)] text-text-link',\n },\n {\n label: 'Analytics',\n description: 'Revenue reports',\n icon: <BarChart3 className=\"h-5 w-5\" />,\n path: '/admin/analytics',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n ],\n};\n\n// ---------------------------------------------------------------------------\n// Role-based Quick Stats configs\n// ---------------------------------------------------------------------------\n\nfunction getStatsForRole(\n role: UserRole,\n orders: MockOrder[],\n dashboardStats: DashboardStats | undefined\n) {\n switch (role) {\n case 'customer':\n return [\n {\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n value: orders.length.toString(),\n label: 'Total Orders',\n trend: 'up' as const,\n trendValue: '+2 this week',\n },\n {\n icon: <Store className=\"h-5 w-5\" />,\n value: (dashboardStats?.activeProviders ?? 0).toString(),\n label: 'Nearby Providers',\n trend: 'up' as const,\n trendValue: '+3',\n },\n {\n icon: <Star className=\"h-5 w-5\" />,\n value: (dashboardStats?.avgRating ?? 0).toFixed(1),\n label: 'Avg. Rating',\n trend: 'up' as const,\n trendValue: '+0.1',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(\n orders.reduce((s, o) => s + o.total, 0),\n { minimumFractionDigits: 0 }\n ),\n label: 'Total Spent',\n trend: 'neutral' as const,\n trendValue: '',\n },\n ];\n case 'cart_owner':\n return [\n {\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n value: '48',\n label: 'Orders Today',\n trend: 'up' as const,\n trendValue: '+12%',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(12850, { minimumFractionDigits: 0 }),\n label: \"Today's Revenue\",\n trend: 'up' as const,\n trendValue: '+8%',\n },\n {\n icon: <Star className=\"h-5 w-5\" />,\n value: '4.6',\n label: 'Cart Rating',\n trend: 'up' as const,\n trendValue: '+0.2',\n },\n {\n icon: <Users className=\"h-5 w-5\" />,\n value: '5',\n label: 'Active Staff',\n trend: 'neutral' as const,\n trendValue: '',\n },\n ];\n case 'worker':\n return [\n {\n icon: <ClipboardList className=\"h-5 w-5\" />,\n value: '5',\n label: 'Tasks Today',\n trend: 'up' as const,\n trendValue: '+2',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(425, { minimumFractionDigits: 0 }),\n label: \"Today's Earnings\",\n trend: 'up' as const,\n trendValue: '+15%',\n },\n {\n icon: <Star className=\"h-5 w-5\" />,\n value: '4.7',\n label: 'Rating',\n trend: 'up' as const,\n trendValue: '+0.1',\n },\n {\n icon: <CheckCircle2 className=\"h-5 w-5\" />,\n value: '96.8%',\n label: 'Completion Rate',\n trend: 'up' as const,\n trendValue: '+0.5%',\n },\n ];\n case 'investor':\n return [\n {\n icon: <TrendingUp className=\"h-5 w-5\" />,\n value: '3',\n label: 'Active Investments',\n trend: 'up' as const,\n trendValue: '+1',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(450000, { minimumFractionDigits: 0 }),\n label: 'Total Invested',\n trend: 'up' as const,\n trendValue: '',\n },\n {\n icon: <HandCoins className=\"h-5 w-5\" />,\n value: '16.5%',\n label: 'Avg. Returns',\n trend: 'up' as const,\n trendValue: '+2.1%',\n },\n {\n icon: <BarChart3 className=\"h-5 w-5\" />,\n value: formatCurrency(74250, { minimumFractionDigits: 0 }),\n label: 'Total Returns',\n trend: 'up' as const,\n trendValue: '+8.5%',\n },\n ];\n case 'admin':\n default:\n return [\n {\n icon: <Users className=\"h-5 w-5\" />,\n value: (dashboardStats?.activeCustomers ?? 0).toLocaleString('en-IN'),\n label: 'Active Customers',\n trend: 'up' as const,\n trendValue: '+50',\n },\n {\n icon: <Store className=\"h-5 w-5\" />,\n value: (dashboardStats?.activeProviders ?? 0).toString(),\n label: 'Service Providers',\n trend: 'up' as const,\n trendValue: '+3',\n },\n {\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n value: (dashboardStats?.totalOrders ?? 0).toLocaleString('en-IN'),\n label: 'Total Orders',\n trend: 'up' as const,\n trendValue: '+12%',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(dashboardStats?.totalRevenue ?? 0, { minimumFractionDigits: 0 }),\n label: 'Total Revenue',\n trend: 'up' as const,\n trendValue: '+8.5%',\n },\n ];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Category data\n// ---------------------------------------------------------------------------\n\nconst categories = [\n {\n label: 'Food & Beverage',\n icon: <ChefHat className=\"h-6 w-6\" />,\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n {\n label: 'Personal Care & Beauty',\n icon: <Scissors className=\"h-6 w-6\" />,\n color: 'bg-[var(--color-accent-soft)] text-text-link',\n },\n {\n label: 'Repair & Maintenance',\n icon: <Wrench className=\"h-6 w-6\" />,\n color: 'bg-status-info-bg-subtle text-status-info-text',\n },\n {\n label: 'Home Services',\n icon: <Home className=\"h-6 w-6\" />,\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Clothing & Fashion',\n icon: <Shirt className=\"h-6 w-6\" />,\n color: 'bg-[var(--color-accent-soft)] text-text-link',\n },\n {\n label: 'Health & Wellness',\n icon: <Heart className=\"h-6 w-6\" />,\n color: 'bg-status-error-bg-subtle text-status-error-text',\n },\n {\n label: 'Education & Skills',\n icon: <GraduationCap className=\"h-6 w-6\" />,\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n {\n label: 'Retail & Merchandise',\n icon: <Package className=\"h-6 w-6\" />,\n color: 'bg-status-info-bg-subtle text-status-info-text',\n },\n {\n label: 'Grocery & Essentials',\n icon: <ShoppingCart className=\"h-6 w-6\" />,\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n];\n\n// ---------------------------------------------------------------------------\n// How It Works steps\n// ---------------------------------------------------------------------------\n\nconst howItWorks = [\n {\n step: 1,\n title: 'Browse Services',\n description: 'Discover local service providers and carts near you.',\n icon: <Search className=\"h-6 w-6\" />,\n },\n {\n step: 2,\n title: 'Place an Order',\n description: 'Select items or services and place your order seamlessly.',\n icon: <ShoppingBag className=\"h-6 w-6\" />,\n },\n {\n step: 3,\n title: 'Track in Real-time',\n description: 'Get live updates on your order from confirmation to delivery.',\n icon: <Truck className=\"h-6 w-6\" />,\n },\n {\n step: 4,\n title: 'Rate & Review',\n description: 'Share your experience and help others find great services.',\n icon: <Star className=\"h-6 w-6\" />,\n },\n];\n\n// ---------------------------------------------------------------------------\n// Recent activity mock\n// ---------------------------------------------------------------------------\n\nconst mockRecentActivity = [\n {\n id: 'ha-1',\n description: 'New order placed at Dosa Express',\n time: '2 mins ago',\n type: 'order',\n },\n {\n id: 'ha-2',\n description: 'Quick Cuts Salon received a new review',\n time: '15 mins ago',\n type: 'review',\n },\n {\n id: 'ha-3',\n description: 'Investment opportunity funded: Spotless Cleaning',\n time: '1 hour ago',\n type: 'investment',\n },\n {\n id: 'ha-4',\n description: 'New cart registered: Gadget Zone Brigade',\n time: '3 hours ago',\n type: 'cart',\n },\n {\n id: 'ha-5',\n description: 'Order delivered: Fix-It Mobile Repair',\n time: '5 hours ago',\n type: 'order',\n },\n];\n\n// ---------------------------------------------------------------------------\n// Platform Stats\n// ---------------------------------------------------------------------------\n\nconst platformStats = [\n { label: 'Service Providers', value: '21+', icon: <Store className=\"h-5 w-5\" /> },\n { label: 'Categories', value: '9', icon: <Package className=\"h-5 w-5\" /> },\n { label: 'Happy Customers', value: '534+', icon: <Users className=\"h-5 w-5\" /> },\n { label: 'Orders Completed', value: '1,247+', icon: <CheckCircle2 className=\"h-5 w-5\" /> },\n];\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function HomePage() {\n const { navigateTo, currentUser } = useHookMovies();\n const { t: translate } = useI18n();\n const [searchQuery, setSearchQuery] = useState('');\n\n const { providers, orders, dashboardStats } = useHookMoviesApi();\n\n const t = useCallback(\n (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n },\n [translate]\n );\n\n const firstName = currentUser?.firstName ?? currentUser?.name ?? 'there';\n const userRole: UserRole = (currentUser?.role as UserRole) ?? 'customer';\n\n const roleLabel: Record<UserRole, string> = {\n customer: t('hookmovies.home.role.customer', 'Customer'),\n cart_owner: t('hookmovies.home.role.cartOwner', 'Cart Owner'),\n worker: t('hookmovies.home.role.worker', 'Worker'),\n investor: t('hookmovies.home.role.investor', 'Investor'),\n admin: t('hookmovies.home.role.admin', 'Administrator'),\n };\n\n const roleGreetings: Record<UserRole, string> = {\n customer: t('hookmovies.home.greeting.customer', 'Discover amazing services near you'),\n cart_owner: t('hookmovies.home.greeting.cartOwner', 'Manage your business and grow'),\n worker: t('hookmovies.home.greeting.worker', 'Check your tasks and earnings'),\n investor: t('hookmovies.home.greeting.investor', 'Track your investments and returns'),\n admin: t('hookmovies.home.greeting.admin', 'Monitor and manage the platform'),\n };\n\n const quickActions = quickActionsByRole[userRole] ?? quickActionsByRole.customer;\n const stats = getStatsForRole(userRole, orders.data ?? [], dashboardStats.data);\n\n // Featured carts (top-rated, open)\n const featuredCarts = useMemo(() => {\n let carts = (providers.data ?? []).filter((c) => c.isOpen);\n if (searchQuery) {\n const q = searchQuery.toLowerCase();\n carts = carts.filter(\n (c) => c.name.toLowerCase().includes(q) || c.category.toLowerCase().includes(q)\n );\n }\n return carts.sort((a, b) => b.rating - a.rating).slice(0, 6);\n }, [providers.data, searchQuery]);\n\n // Recent orders\n const recentOrders = useMemo(() => {\n return [...(orders.data ?? [])]\n .sort((a, b) => new Date(b.orderDate).getTime() - new Date(a.orderDate).getTime())\n .slice(0, 3);\n }, [orders.data]);\n\n const activityIcons: Record<string, string> = {\n order: 'text-status-info-text',\n review: 'text-status-warning-text',\n investment: 'text-status-success-text',\n cart: 'text-text-link',\n };\n\n // Check if \"new user\" (no orders)\n const isNewUser = (orders.data ?? []).length === 0 && !orders.isLoading;\n\n const isLoading = providers.isLoading || orders.isLoading || dashboardStats.isLoading;\n const isError = providers.isError || orders.isError || dashboardStats.isError;\n\n if (isLoading) {\n return (\n <PageLayout title={t('hookmovies.common.loading', 'Loading...')}>\n <div className=\"flex h-[60vh] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n </PageLayout>\n );\n }\n\n if (isError) {\n return (\n <PageLayout title={t('hookmovies.common.error', 'Error')}>\n <div className=\"flex h-[60vh] flex-col items-center justify-center gap-4\">\n <AlertCircle className=\"h-12 w-12 text-status-error-text\" />\n <h2 className=\"text-xl font-semibold\">\n {t('hookmovies.common.errorLoading', 'Error loading data')}\n </h2>\n <p className=\"text-text-secondary\">\n {t('hookmovies.common.tryAgain', 'Please try again later.')}\n </p>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n hero\n title={\n <>\n <GradientText>{t('hookmovies.home.hello', 'Hello')}</GradientText>, {firstName}!\n </>\n }\n description={roleGreetings[userRole]}\n purpose={t(\n 'hookmovies.home.purpose',\n 'Your starting point on HookMovies — the marketplace that connects you with mobile food carts and local services nearby. Discover providers, jump to your most common tasks, and pick up recent activity, all tailored to your role.'\n )}\n >\n {/* Welcome Banner for New Users — primary emphasis zone */}\n {isNewUser && (\n <EmphasisPanel className=\"mb-6 p-6\">\n <div className=\"flex items-start gap-4\">\n <div className=\"flex h-12 w-12 shrink-0 items-center justify-center rounded-full bg-action-primary-bg/10\">\n <Sparkles className=\"h-6 w-6 text-primary\" />\n </div>\n <div className=\"flex-1\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('hookmovies.home.welcomeTitle', 'Welcome to HookMovies!')}\n </h2>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t(\n 'hookmovies.home.welcomeDescription',\n 'Your local services marketplace. Start by exploring service providers near you or browse categories to find what you need.'\n )}\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"mt-3 inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n <Search className=\"h-4 w-4\" />\n {t('hookmovies.home.exploreServices', 'Explore Services')}\n </button>\n </div>\n </div>\n </EmphasisPanel>\n )}\n\n {/* Hero Section with Role Info — emphasis zone for returning users */}\n <GlassCard treatment=\"glass\" glow={!isNewUser} className=\"mb-6 border-border-seam p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"inline-flex items-center rounded-full bg-action-primary-bg/10 px-2.5 py-0.5 text-xs font-medium text-primary\">\n <BadgeCheck className=\"mr-1 h-3 w-3\" />\n {roleLabel[userRole]}\n </span>\n </div>\n <h2 className=\"text-xl font-bold text-text-primary\">\n {t('hookmovies.home.good', 'Good')}{' '}\n {new Date().getHours() < 12\n ? t('hookmovies.home.time.morning', 'morning')\n : new Date().getHours() < 17\n ? t('hookmovies.home.time.afternoon', 'afternoon')\n : t('hookmovies.home.time.evening', 'evening')}\n , {firstName}\n </h2>\n <p className=\"mt-1 text-sm text-text-secondary\">{roleGreetings[userRole]}</p>\n </div>\n <div className=\"relative w-full sm:w-72\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n type=\"text\"\n placeholder={t('hookmovies.home.searchPlaceholder', 'Search services, carts...')}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full rounded-lg border border-border-seam bg-bg-surface py-2.5 pl-10 pr-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n </div>\n </GlassCard>\n\n {/* Quick Stats */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('hookmovies.home.quickStats', 'Quick Stats')}\n </h2>\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {stats.map((stat, index) => (\n <MetricsCard\n key={stat.label}\n icon={stat.icon}\n value={stat.value}\n label={stat.label}\n trend={stat.trend}\n trendValue={stat.trendValue}\n featured={index === 0}\n />\n ))}\n </div>\n </section>\n\n {/* Quick Actions */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('hookmovies.home.quickActions', 'Quick Actions')}\n </h2>\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {quickActions.map((action) => (\n <button\n key={action.label}\n type=\"button\"\n onClick={() => navigateTo(action.path)}\n className={cn(\n 'flex items-start gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 text-left shadow-sm transition-all',\n 'hover:border-accent-foreground/20 hover:shadow-md'\n )}\n >\n <div\n className={cn(\n 'flex h-10 w-10 shrink-0 items-center justify-center rounded-lg',\n action.color\n )}\n >\n {action.icon}\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold text-text-primary\">{action.label}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">{action.description}</p>\n </div>\n <ArrowRight className=\"h-4 w-4 text-text-secondary shrink-0 mt-1\" />\n </button>\n ))}\n </div>\n </section>\n\n {/* Featured / Nearby Carts */}\n <section className=\"mb-8\">\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {searchQuery\n ? t('hookmovies.home.searchResults', 'Search Results')\n : t('hookmovies.home.featuredCarts', 'Featured Carts')}\n </h2>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"flex items-center gap-1 text-sm font-medium text-primary hover:underline\"\n >\n {t('hookmovies.common.viewAll', 'View All')} <ArrowRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n\n {featuredCarts.length === 0 ? (\n <EmptyState\n illustration=\"empty-search\"\n title={t('hookmovies.home.noCartsFound', 'No carts found')}\n description={t(\n 'hookmovies.home.noCartsDescription',\n 'Try adjusting your search or browse all categories'\n )}\n action={\n <button\n type=\"button\"\n onClick={() => setSearchQuery('')}\n className=\"rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n {t('hookmovies.home.clearSearch', 'Clear Search')}\n </button>\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {featuredCarts.map((cart) => (\n <div\n key={cart.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => navigateTo(`/customer/cart/${cart.id}`)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateTo(`/customer/cart/${cart.id}`);\n }\n }}\n className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm overflow-hidden transition-all hover:shadow-md hover:border-accent-foreground/20 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n {/* Image */}\n <div className=\"relative h-40 bg-bg-sunken\">\n <img\n src={cart.image}\n alt={cart.name}\n className=\"h-full w-full object-cover\"\n loading=\"lazy\"\n />\n <div className=\"absolute top-2 right-2\">\n <StatusBadge status={cart.isOpen ? 'open' : 'closed'} />\n </div>\n {cart.isVerified && (\n <div className=\"absolute top-2 left-2\">\n <span className=\"inline-flex items-center gap-1 rounded-full bg-status-info-bg/90 px-2 py-0.5 text-xs font-medium text-status-info-text backdrop-blur-sm\">\n <BadgeCheck className=\"h-3 w-3\" />{' '}\n {t('hookmovies.home.verified', 'Verified')}\n </span>\n </div>\n )}\n <div className=\"absolute bottom-2 right-2\">\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-elevated/85 px-2 py-0.5 text-xs text-text-primary backdrop-blur-sm border border-border-seam\">\n <Clock className=\"h-3 w-3\" /> {cart.estimatedTime} min\n </span>\n </div>\n </div>\n\n {/* Details */}\n <div className=\"p-4\">\n <div className=\"flex items-start justify-between\">\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-base font-semibold text-text-primary truncate\">\n {cart.name}\n </h3>\n <p className=\"mt-0.5 text-sm text-text-secondary\">{cart.category}</p>\n </div>\n <div className=\"flex items-center gap-1 rounded bg-status-success-bg-subtle px-1.5 py-0.5 ml-2 shrink-0\">\n <Star className=\"h-3 w-3 fill-status-success-text text-status-success-text\" />\n <span className=\"text-xs font-bold text-status-success-text tabular-nums\">\n {cart.rating}\n </span>\n </div>\n </div>\n\n <div className=\"mt-3 flex items-center gap-4 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" /> {formatDistance(cart.distance)}\n </span>\n <span className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3\" /> {cart.totalRatings}{' '}\n {t('hookmovies.home.reviews', 'reviews')}\n </span>\n {cart.averageOrderValue && (\n <span className=\"flex items-center gap-1\">\n <IndianRupee className=\"h-3 w-3\" /> {t('hookmovies.home.average', 'Avg.')}{' '}\n {formatCurrency(cart.averageOrderValue, { minimumFractionDigits: 0 })}\n </span>\n )}\n </div>\n\n {/* Tags / service types */}\n {cart.serviceTypes && cart.serviceTypes.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {cart.serviceTypes.slice(0, 3).map((st) => (\n <span\n key={st}\n className=\"inline-flex items-center rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary\"\n >\n {st.replace(/_/g, ' ')}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </section>\n\n {/* Recent Orders */}\n {recentOrders.length > 0 && (\n <section className=\"mb-8\">\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('hookmovies.home.recentOrders', 'Recent Orders')}\n </h2>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/orders')}\n className=\"flex items-center gap-1 text-sm font-medium text-primary hover:underline\"\n >\n {t('hookmovies.common.viewAll', 'View All')} <ArrowRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface divide-y divide-border\">\n {recentOrders.map((order) => (\n <div\n key={order.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => navigateTo(`/customer/order/${order.id}`)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateTo(`/customer/order/${order.id}`);\n }\n }}\n className=\"flex items-center gap-4 px-4 py-3 hover:bg-accent/50 transition-colors cursor-pointer\"\n >\n <img\n src={order.cartImage}\n alt={order.cartName}\n className=\"h-12 w-12 rounded-lg object-cover shrink-0\"\n />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-text-primary truncate\">\n {order.cartName}\n </p>\n <StatusBadge status={order.status} />\n </div>\n <p className=\"text-xs text-text-secondary mt-0.5\">\n {order.items.map((i) => i.name).join(', ')}\n </p>\n </div>\n <div className=\"text-right shrink-0\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {formatCurrency(order.total, { minimumFractionDigits: 0 })}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {formatRelativeTime(order.orderDate)}\n </p>\n </div>\n </div>\n ))}\n </div>\n </section>\n )}\n\n {/* How It Works */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('hookmovies.home.howItWorks', 'How It Works')}\n </h2>\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {howItWorks.map((item) => (\n <div\n key={item.step}\n className=\"relative rounded-lg border border-border-subtle bg-bg-surface p-5 text-center\"\n >\n <div className=\"absolute -top-3 left-1/2 -translate-x-1/2\">\n <span className=\"inline-flex h-6 w-6 items-center justify-center rounded-full bg-action-primary-bg text-xs font-bold text-action-primary-text\">\n {item.step}\n </span>\n </div>\n <div className=\"mt-2 flex justify-center text-text-secondary mb-3\">{item.icon}</div>\n <h3 className=\"text-sm font-semibold text-text-primary\">{item.title}</h3>\n <p className=\"mt-1 text-xs text-text-secondary\">{item.description}</p>\n </div>\n ))}\n </div>\n </section>\n\n {/* Browse by Category */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('hookmovies.home.browseByCategory', 'Browse by Category')}\n </h2>\n <div className=\"grid grid-cols-3 gap-3 sm:grid-cols-4 lg:grid-cols-5\">\n {categories.map((cat) => (\n <button\n key={cat.label}\n type=\"button\"\n onClick={() =>\n navigateTo(`/customer/carts?category=${encodeURIComponent(cat.label)}`)\n }\n className=\"flex flex-col items-center gap-2 rounded-lg border border-border-subtle bg-bg-surface p-4 text-center hover:shadow-sm hover:border-accent-foreground/20 transition-all\"\n >\n <div\n className={cn('flex h-12 w-12 items-center justify-center rounded-full', cat.color)}\n >\n {cat.icon}\n </div>\n <span className=\"text-xs font-medium text-text-primary leading-tight\">\n {cat.label}\n </span>\n </button>\n ))}\n </div>\n </section>\n\n {/* Platform Stats */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('hookmovies.home.platformStats', 'Platform Stats')}\n </h2>\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {platformStats.map((stat) => (\n <div\n key={stat.label}\n className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4\"\n >\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-action-primary-bg/10 text-primary shrink-0\">\n {stat.icon}\n </div>\n <div>\n <p className=\"text-lg font-bold text-text-primary\">{stat.value}</p>\n <p className=\"text-xs text-text-secondary\">{stat.label}</p>\n </div>\n </div>\n ))}\n </div>\n </section>\n\n {/* Recent Activity */}\n <section>\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('hookmovies.home.recentActivity', 'Recent Activity')}\n </h2>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface divide-y divide-border\">\n {mockRecentActivity.map((item) => (\n <div key={item.id} className=\"flex items-center gap-3 px-4 py-3\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-bg-sunken\">\n <Activity\n className={cn('h-4 w-4', activityIcons[item.type] ?? 'text-text-secondary')}\n />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm text-text-primary truncate\">{item.description}</p>\n </div>\n <span className=\"text-xs text-text-secondary whitespace-nowrap\">{item.time}</span>\n </div>\n ))}\n </div>\n </section>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -155,6 +155,7 @@ function v() {
155
155
  return /* @__PURE__ */ _(n, {
156
156
  title: "Platform Analytics",
157
157
  description: "Comprehensive platform metrics and trends",
158
+ purpose: "Understand how the whole marketplace is performing. Slice metrics by time period to spot trends in orders, revenue, users and provider performance — use this to decide where to focus and what's working.",
158
159
  children: [
159
160
  /* @__PURE__ */ _("div", {
160
161
  className: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6",