@burdenoff/microfe-coolandlovely 2026.625.2 → 2026.628.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/dist/coolandlovely/CoolAndLovelyRoot.js +66 -122
  2. package/dist/coolandlovely/CoolAndLovelyRoot.js.map +1 -1
  3. package/dist/coolandlovely/CoolAndLovelyRoutes.js +87 -175
  4. package/dist/coolandlovely/CoolAndLovelyRoutes.js.map +1 -1
  5. package/dist/coolandlovely/components/Field.js +81 -0
  6. package/dist/coolandlovely/components/Field.js.map +1 -0
  7. package/dist/coolandlovely/components/StateViews.js +34 -0
  8. package/dist/coolandlovely/components/StateViews.js.map +1 -0
  9. package/dist/coolandlovely/components/StatusBadge.js +25 -22
  10. package/dist/coolandlovely/components/StatusBadge.js.map +1 -1
  11. package/dist/coolandlovely/components/TagList.js +21 -0
  12. package/dist/coolandlovely/components/TagList.js.map +1 -0
  13. package/dist/coolandlovely/components/Thumbnail.js +29 -0
  14. package/dist/coolandlovely/components/Thumbnail.js.map +1 -0
  15. package/dist/coolandlovely/context/CoolAndLovelyContext.js +10 -10
  16. package/dist/coolandlovely/context/CoolAndLovelyContext.js.map +1 -1
  17. package/dist/coolandlovely/hooks/index.js +1 -0
  18. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js +462 -169
  19. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js.map +1 -1
  20. package/dist/coolandlovely/pages/HomePage.js +251 -845
  21. package/dist/coolandlovely/pages/HomePage.js.map +1 -1
  22. package/dist/coolandlovely/pages/brands/BrandDetailPage.js +319 -0
  23. package/dist/coolandlovely/pages/brands/BrandDetailPage.js.map +1 -0
  24. package/dist/coolandlovely/pages/brands/BrandFormPage.js +190 -0
  25. package/dist/coolandlovely/pages/brands/BrandFormPage.js.map +1 -0
  26. package/dist/coolandlovely/pages/brands/BrandsListPage.js +158 -0
  27. package/dist/coolandlovely/pages/brands/BrandsListPage.js.map +1 -0
  28. package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.js +253 -0
  29. package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.js.map +1 -0
  30. package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.js +206 -0
  31. package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.js.map +1 -0
  32. package/dist/coolandlovely/pages/collaborations/CollaborationsListPage.js +129 -0
  33. package/dist/coolandlovely/pages/collaborations/CollaborationsListPage.js.map +1 -0
  34. package/dist/coolandlovely/pages/collections/CollectionDetailPage.js +217 -0
  35. package/dist/coolandlovely/pages/collections/CollectionDetailPage.js.map +1 -0
  36. package/dist/coolandlovely/pages/collections/CollectionFormPage.js +217 -0
  37. package/dist/coolandlovely/pages/collections/CollectionFormPage.js.map +1 -0
  38. package/dist/coolandlovely/pages/collections/CollectionsListPage.js +122 -0
  39. package/dist/coolandlovely/pages/collections/CollectionsListPage.js.map +1 -0
  40. package/dist/coolandlovely/pages/items/StyleItemDetailPage.js +230 -0
  41. package/dist/coolandlovely/pages/items/StyleItemDetailPage.js.map +1 -0
  42. package/dist/coolandlovely/pages/items/StyleItemFormPage.js +276 -0
  43. package/dist/coolandlovely/pages/items/StyleItemFormPage.js.map +1 -0
  44. package/dist/coolandlovely/pages/items/StyleItemsListPage.js +170 -0
  45. package/dist/coolandlovely/pages/items/StyleItemsListPage.js.map +1 -0
  46. package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.js +124 -0
  47. package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.js.map +1 -0
  48. package/dist/coolandlovely/pages/lookbooks/LookbooksListPage.js +156 -0
  49. package/dist/coolandlovely/pages/lookbooks/LookbooksListPage.js.map +1 -0
  50. package/dist/coolandlovely/pages/looks/LookDetailPage.js +238 -0
  51. package/dist/coolandlovely/pages/looks/LookDetailPage.js.map +1 -0
  52. package/dist/coolandlovely/pages/looks/LookFormPage.js +209 -0
  53. package/dist/coolandlovely/pages/looks/LookFormPage.js.map +1 -0
  54. package/dist/coolandlovely/pages/looks/LooksListPage.js +181 -0
  55. package/dist/coolandlovely/pages/looks/LooksListPage.js.map +1 -0
  56. package/dist/coolandlovely/pages/profile/StyleProfilePage.js +224 -0
  57. package/dist/coolandlovely/pages/profile/StyleProfilePage.js.map +1 -0
  58. package/dist/coolandlovely/pages/wardrobe/WardrobeFormPage.js +173 -0
  59. package/dist/coolandlovely/pages/wardrobe/WardrobeFormPage.js.map +1 -0
  60. package/dist/coolandlovely/pages/wardrobe/WardrobeListPage.js +172 -0
  61. package/dist/coolandlovely/pages/wardrobe/WardrobeListPage.js.map +1 -0
  62. package/dist/coolandlovely/store/coolandlovelyStore.js +2 -6
  63. package/dist/coolandlovely/store/coolandlovelyStore.js.map +1 -1
  64. package/dist/coolandlovely/utils/formatters.js +31 -23
  65. package/dist/coolandlovely/utils/formatters.js.map +1 -1
  66. package/dist/coolandlovely/utils/icons.js +34 -0
  67. package/dist/coolandlovely/utils/icons.js.map +1 -0
  68. package/dist/index.js +4 -4
  69. package/package.json +1 -1
  70. package/dist/coolandlovely/components/InvestmentCard.js +0 -98
  71. package/dist/coolandlovely/components/InvestmentCard.js.map +0 -1
  72. package/dist/coolandlovely/components/RatingDisplay.js +0 -35
  73. package/dist/coolandlovely/components/RatingDisplay.js.map +0 -1
  74. package/dist/coolandlovely/mocks/data.js +0 -1517
  75. package/dist/coolandlovely/mocks/data.js.map +0 -1
  76. package/dist/coolandlovely/mocks/users.js +0 -34
  77. package/dist/coolandlovely/mocks/users.js.map +0 -1
  78. package/dist/coolandlovely/pages/admin/AdminAnalyticsPage.js +0 -651
  79. package/dist/coolandlovely/pages/admin/AdminAnalyticsPage.js.map +0 -1
  80. package/dist/coolandlovely/pages/admin/AdminDashboard.js +0 -673
  81. package/dist/coolandlovely/pages/admin/AdminDashboard.js.map +0 -1
  82. package/dist/coolandlovely/pages/admin/AdminFinancialPage.js +0 -427
  83. package/dist/coolandlovely/pages/admin/AdminFinancialPage.js.map +0 -1
  84. package/dist/coolandlovely/pages/admin/AdminOrdersPage.js +0 -665
  85. package/dist/coolandlovely/pages/admin/AdminOrdersPage.js.map +0 -1
  86. package/dist/coolandlovely/pages/admin/AdminProfilePage.js +0 -264
  87. package/dist/coolandlovely/pages/admin/AdminProfilePage.js.map +0 -1
  88. package/dist/coolandlovely/pages/admin/AdminSettingsPage.js +0 -654
  89. package/dist/coolandlovely/pages/admin/AdminSettingsPage.js.map +0 -1
  90. package/dist/coolandlovely/pages/admin/CartManagementPage.js +0 -874
  91. package/dist/coolandlovely/pages/admin/CartManagementPage.js.map +0 -1
  92. package/dist/coolandlovely/pages/admin/UserManagementPage.js +0 -898
  93. package/dist/coolandlovely/pages/admin/UserManagementPage.js.map +0 -1
  94. package/dist/coolandlovely/pages/cart-owner/AnalyticsDashboard.js +0 -842
  95. package/dist/coolandlovely/pages/cart-owner/AnalyticsDashboard.js.map +0 -1
  96. package/dist/coolandlovely/pages/cart-owner/BusinessSettingsPage.js +0 -705
  97. package/dist/coolandlovely/pages/cart-owner/BusinessSettingsPage.js.map +0 -1
  98. package/dist/coolandlovely/pages/cart-owner/CartOwnerDashboard.js +0 -802
  99. package/dist/coolandlovely/pages/cart-owner/CartOwnerDashboard.js.map +0 -1
  100. package/dist/coolandlovely/pages/cart-owner/CartOwnerProfilePage.js +0 -891
  101. package/dist/coolandlovely/pages/cart-owner/CartOwnerProfilePage.js.map +0 -1
  102. package/dist/coolandlovely/pages/cart-owner/CartServiceConfigPage.js +0 -639
  103. package/dist/coolandlovely/pages/cart-owner/CartServiceConfigPage.js.map +0 -1
  104. package/dist/coolandlovely/pages/cart-owner/InventoryManagementPage.js +0 -914
  105. package/dist/coolandlovely/pages/cart-owner/InventoryManagementPage.js.map +0 -1
  106. package/dist/coolandlovely/pages/cart-owner/OrderManagementPage.js +0 -882
  107. package/dist/coolandlovely/pages/cart-owner/OrderManagementPage.js.map +0 -1
  108. package/dist/coolandlovely/pages/cart-owner/StaffManagementPage.js +0 -831
  109. package/dist/coolandlovely/pages/cart-owner/StaffManagementPage.js.map +0 -1
  110. package/dist/coolandlovely/pages/common/HelpSupportPage.js +0 -1325
  111. package/dist/coolandlovely/pages/common/HelpSupportPage.js.map +0 -1
  112. package/dist/coolandlovely/pages/common/NotificationCenterPage.js +0 -671
  113. package/dist/coolandlovely/pages/common/NotificationCenterPage.js.map +0 -1
  114. package/dist/coolandlovely/pages/common/SettingsPage.js +0 -973
  115. package/dist/coolandlovely/pages/common/SettingsPage.js.map +0 -1
  116. package/dist/coolandlovely/pages/customer/BookingDetailsPage.js +0 -630
  117. package/dist/coolandlovely/pages/customer/BookingDetailsPage.js.map +0 -1
  118. package/dist/coolandlovely/pages/customer/CartDetailPage.js +0 -623
  119. package/dist/coolandlovely/pages/customer/CartDetailPage.js.map +0 -1
  120. package/dist/coolandlovely/pages/customer/CartDiscoveryPage.js +0 -558
  121. package/dist/coolandlovely/pages/customer/CartDiscoveryPage.js.map +0 -1
  122. package/dist/coolandlovely/pages/customer/CheckoutPage.js +0 -529
  123. package/dist/coolandlovely/pages/customer/CheckoutPage.js.map +0 -1
  124. package/dist/coolandlovely/pages/customer/CustomerDashboard.js +0 -538
  125. package/dist/coolandlovely/pages/customer/CustomerDashboard.js.map +0 -1
  126. package/dist/coolandlovely/pages/customer/CustomerProfilePage.js +0 -658
  127. package/dist/coolandlovely/pages/customer/CustomerProfilePage.js.map +0 -1
  128. package/dist/coolandlovely/pages/customer/DirectServiceBookingPage.js +0 -632
  129. package/dist/coolandlovely/pages/customer/DirectServiceBookingPage.js.map +0 -1
  130. package/dist/coolandlovely/pages/customer/FavoritesPage.js +0 -487
  131. package/dist/coolandlovely/pages/customer/FavoritesPage.js.map +0 -1
  132. package/dist/coolandlovely/pages/customer/OrderHistoryPage.js +0 -447
  133. package/dist/coolandlovely/pages/customer/OrderHistoryPage.js.map +0 -1
  134. package/dist/coolandlovely/pages/customer/OrderTrackingPage.js +0 -425
  135. package/dist/coolandlovely/pages/customer/OrderTrackingPage.js.map +0 -1
  136. package/dist/coolandlovely/pages/customer/PaymentMethodsPage.js +0 -494
  137. package/dist/coolandlovely/pages/customer/PaymentMethodsPage.js.map +0 -1
  138. package/dist/coolandlovely/pages/customer/ReviewsPage.js +0 -616
  139. package/dist/coolandlovely/pages/customer/ReviewsPage.js.map +0 -1
  140. package/dist/coolandlovely/pages/customer/SavedAddressesPage.js +0 -449
  141. package/dist/coolandlovely/pages/customer/SavedAddressesPage.js.map +0 -1
  142. package/dist/coolandlovely/pages/investor/InvestmentDetailsPage.js +0 -887
  143. package/dist/coolandlovely/pages/investor/InvestmentDetailsPage.js.map +0 -1
  144. package/dist/coolandlovely/pages/investor/InvestmentOpportunitiesPage.js +0 -945
  145. package/dist/coolandlovely/pages/investor/InvestmentOpportunitiesPage.js.map +0 -1
  146. package/dist/coolandlovely/pages/investor/InvestorAnalyticsPage.js +0 -687
  147. package/dist/coolandlovely/pages/investor/InvestorAnalyticsPage.js.map +0 -1
  148. package/dist/coolandlovely/pages/investor/InvestorDashboard.js +0 -455
  149. package/dist/coolandlovely/pages/investor/InvestorDashboard.js.map +0 -1
  150. package/dist/coolandlovely/pages/investor/InvestorInvestmentsPage.js +0 -405
  151. package/dist/coolandlovely/pages/investor/InvestorInvestmentsPage.js.map +0 -1
  152. package/dist/coolandlovely/pages/investor/InvestorPortfolioPage.js +0 -602
  153. package/dist/coolandlovely/pages/investor/InvestorPortfolioPage.js.map +0 -1
  154. package/dist/coolandlovely/pages/investor/InvestorProfilePage.js +0 -1070
  155. package/dist/coolandlovely/pages/investor/InvestorProfilePage.js.map +0 -1
  156. package/dist/coolandlovely/pages/worker/TaskDetailsPage.js +0 -533
  157. package/dist/coolandlovely/pages/worker/TaskDetailsPage.js.map +0 -1
  158. package/dist/coolandlovely/pages/worker/WorkerDashboard.js +0 -671
  159. package/dist/coolandlovely/pages/worker/WorkerDashboard.js.map +0 -1
  160. package/dist/coolandlovely/pages/worker/WorkerOrdersPage.js +0 -680
  161. package/dist/coolandlovely/pages/worker/WorkerOrdersPage.js.map +0 -1
  162. package/dist/coolandlovely/pages/worker/WorkerProfilePage.js +0 -692
  163. package/dist/coolandlovely/pages/worker/WorkerProfilePage.js.map +0 -1
  164. package/dist/coolandlovely/pages/worker/WorkerSchedulePage.js +0 -583
  165. package/dist/coolandlovely/pages/worker/WorkerSchedulePage.js.map +0 -1
@@ -1,558 +0,0 @@
1
- import { useCoolAndLovely as e } from "../../context/CoolAndLovelyContext.js";
2
- import { cn as t } from "../../utils/cn.js";
3
- import { PageLayout as n } from "../../components/PageLayout.js";
4
- import { EmptyState as r } from "../../components/EmptyState.js";
5
- import { useInvestmentOpportunities as i, useProviders as a } from "../../hooks/useCoolAndLovelyApi.js";
6
- import { formatCurrency as o, formatDistance as s } from "../../utils/formatters.js";
7
- import { useMemo as c, useState as l } from "react";
8
- import { AlertCircle as u, Calendar as d, CheckCircle2 as f, Clock as p, Home as m, Info as h, Loader2 as g, MapPin as _, Search as v, Star as y, Tag as ee, TrendingUp as b, X as x } from "lucide-react";
9
- import { Fragment as S, jsx as C, jsxs as w } from "react/jsx-runtime";
10
- import { GlassCard as T, PagePurpose as E } from "@burdenoff/fe-libs/ui";
11
- //#region src/coolandlovely/pages/customer/CartDiscoveryPage.tsx
12
- var D = "All";
13
- function O() {
14
- let { navigateTo: O } = e(), [k, A] = l(""), [j, M] = l(D), [N, P] = l(""), [F, I] = l(""), [L, R] = l("rating"), [z, B] = l(9), [V, H] = l(!1), [U, W] = l(null), { data: G = [], isLoading: K, isError: q } = a(), { data: J = [] } = i(), Y = c(() => {
15
- let e = /* @__PURE__ */ new Set();
16
- return G.forEach((t) => {
17
- t.category && e.add(t.category);
18
- }), [D, ...Array.from(e)];
19
- }, [G]), X = c(() => {
20
- let e = [...G];
21
- if (k.trim()) {
22
- let t = k.toLowerCase();
23
- e = e.filter((e) => e.name.toLowerCase().includes(t) || e.category.toLowerCase().includes(t));
24
- }
25
- if (j !== D && (e = e.filter((e) => e.category === j)), N) {
26
- let t = parseFloat(N);
27
- e = e.filter((e) => e.rating >= t);
28
- }
29
- switch (F && (e = e.filter((e) => {
30
- let t = e.averageOrderValue ?? 0;
31
- switch (F) {
32
- case "low": return t <= 300;
33
- case "medium": return t > 300 && t <= 800;
34
- case "high": return t > 800;
35
- default: return !0;
36
- }
37
- })), L) {
38
- case "rating":
39
- e.sort((e, t) => t.rating - e.rating);
40
- break;
41
- case "popularity":
42
- e.sort((e, t) => (t.totalRatings || 0) - (e.totalRatings || 0));
43
- break;
44
- case "distance":
45
- e.sort((e, t) => (e.distance || 0) - (t.distance || 0));
46
- break;
47
- case "newest":
48
- e.sort((e, t) => new Date(t.createdAt || 0).getTime() - new Date(e.createdAt || 0).getTime());
49
- break;
50
- }
51
- return e;
52
- }, [
53
- G,
54
- k,
55
- j,
56
- N,
57
- F,
58
- L
59
- ]), Z = X.slice(0, z), Q = z < X.length, te = j !== D || N !== "" || F !== "" || k.trim() !== "", $ = () => {
60
- A(""), M(D), P(""), I(""), R("rating"), B(9);
61
- };
62
- return K ? /* @__PURE__ */ C(n, {
63
- title: "Discover Carts",
64
- description: "Finding services and shops near you...",
65
- children: /* @__PURE__ */ C("div", {
66
- className: "flex h-[60vh] items-center justify-center",
67
- children: /* @__PURE__ */ C(g, { className: "h-8 w-8 animate-spin text-primary" })
68
- })
69
- }) : q ? /* @__PURE__ */ C(n, {
70
- title: "Discover Carts",
71
- description: "Error loading carts",
72
- children: /* @__PURE__ */ w("div", {
73
- className: "flex h-[60vh] flex-col items-center justify-center gap-4",
74
- children: [
75
- /* @__PURE__ */ C(u, { className: "h-12 w-12 text-status-error-text" }),
76
- /* @__PURE__ */ C("h2", {
77
- className: "text-xl font-semibold",
78
- children: "Error loading service providers"
79
- }),
80
- /* @__PURE__ */ C("button", {
81
- type: "button",
82
- onClick: () => window.location.reload(),
83
- className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text",
84
- children: "Retry"
85
- })
86
- ]
87
- })
88
- }) : /* @__PURE__ */ w(n, {
89
- title: "Discover Carts",
90
- description: "Find services and shops near you",
91
- actions: /* @__PURE__ */ w("span", {
92
- className: "text-sm text-text-secondary",
93
- children: [X.length, " carts found"]
94
- }),
95
- children: [
96
- /* @__PURE__ */ C(E, {
97
- className: "mb-6",
98
- icon: /* @__PURE__ */ C(v, { className: "h-4 w-4" }),
99
- children: "Find the right cart or shop near you. Search by name or service, narrow down by category, rating and price, then open a cart to view its menu, book a direct service, or spot carts that are open for investment."
100
- }),
101
- /* @__PURE__ */ C(T, {
102
- treatment: "glass",
103
- glow: !0,
104
- className: "p-4",
105
- children: /* @__PURE__ */ w("div", {
106
- className: "relative",
107
- children: [
108
- /* @__PURE__ */ C(v, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary" }),
109
- /* @__PURE__ */ C("input", {
110
- type: "text",
111
- placeholder: "Search carts, services, or items...",
112
- value: k,
113
- onChange: (e) => A(e.target.value),
114
- className: t("w-full rounded-lg border border-border-subtle bg-bg-surface py-2.5 pl-10 pr-10 text-sm text-text-primary", "placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]")
115
- }),
116
- k && /* @__PURE__ */ C("button", {
117
- type: "button",
118
- onClick: () => A(""),
119
- className: "absolute right-3 top-1/2 -translate-y-1/2 text-text-secondary hover:text-text-primary",
120
- children: /* @__PURE__ */ C(x, { className: "h-4 w-4" })
121
- })
122
- ]
123
- })
124
- }),
125
- /* @__PURE__ */ C("div", {
126
- className: "mt-4 flex flex-wrap gap-2",
127
- children: Y.map((e) => /* @__PURE__ */ C("button", {
128
- type: "button",
129
- onClick: () => M(e),
130
- className: t("rounded-full px-3 py-1.5 text-xs font-medium transition-colors", j === e ? "bg-foreground text-background" : "bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary"),
131
- children: e
132
- }, e))
133
- }),
134
- /* @__PURE__ */ w("div", {
135
- className: "mt-4 flex flex-wrap items-center gap-3",
136
- children: [
137
- /* @__PURE__ */ w("select", {
138
- value: N,
139
- onChange: (e) => P(e.target.value),
140
- className: "rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]",
141
- children: [
142
- /* @__PURE__ */ C("option", {
143
- value: "",
144
- children: "Any Rating"
145
- }),
146
- /* @__PURE__ */ C("option", {
147
- value: "4.5",
148
- children: "4.5+ Stars"
149
- }),
150
- /* @__PURE__ */ C("option", {
151
- value: "4.0",
152
- children: "4.0+ Stars"
153
- }),
154
- /* @__PURE__ */ C("option", {
155
- value: "3.5",
156
- children: "3.5+ Stars"
157
- })
158
- ]
159
- }),
160
- /* @__PURE__ */ w("select", {
161
- value: F,
162
- onChange: (e) => I(e.target.value),
163
- className: "rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]",
164
- children: [
165
- /* @__PURE__ */ C("option", {
166
- value: "",
167
- children: "Any Price"
168
- }),
169
- /* @__PURE__ */ C("option", {
170
- value: "low",
171
- children: "Under ₹300"
172
- }),
173
- /* @__PURE__ */ C("option", {
174
- value: "medium",
175
- children: "₹300 - ₹800"
176
- }),
177
- /* @__PURE__ */ C("option", {
178
- value: "high",
179
- children: "₹800+"
180
- })
181
- ]
182
- }),
183
- /* @__PURE__ */ w("select", {
184
- value: L,
185
- onChange: (e) => R(e.target.value),
186
- className: "rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]",
187
- children: [
188
- /* @__PURE__ */ C("option", {
189
- value: "rating",
190
- children: "Highest Rated"
191
- }),
192
- /* @__PURE__ */ C("option", {
193
- value: "popularity",
194
- children: "Most Popular"
195
- }),
196
- /* @__PURE__ */ C("option", {
197
- value: "distance",
198
- children: "Nearest"
199
- }),
200
- /* @__PURE__ */ C("option", {
201
- value: "newest",
202
- children: "Newest"
203
- })
204
- ]
205
- }),
206
- te && /* @__PURE__ */ C("button", {
207
- type: "button",
208
- onClick: $,
209
- className: "rounded-lg border border-border-subtle px-3 py-2 text-xs font-medium text-text-secondary hover:text-text-primary transition-colors",
210
- children: "Clear All Filters"
211
- })
212
- ]
213
- }),
214
- Z.length > 0 ? /* @__PURE__ */ w(S, { children: [/* @__PURE__ */ C("div", {
215
- className: "mt-6 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
216
- children: Z.map((e) => {
217
- let n = J.find((t) => t.cartId === e.id);
218
- return /* @__PURE__ */ w("div", {
219
- className: "rounded-lg border border-border-subtle bg-bg-surface shadow-sm overflow-hidden hover:shadow-md transition-shadow flex flex-col",
220
- children: [/* @__PURE__ */ w("div", {
221
- className: "relative h-40 bg-bg-sunken",
222
- children: [
223
- /* @__PURE__ */ C("img", {
224
- src: e.image,
225
- alt: e.name,
226
- className: "h-full w-full object-cover"
227
- }),
228
- /* @__PURE__ */ w("div", {
229
- className: "absolute top-2 left-2 flex gap-1.5",
230
- children: [/* @__PURE__ */ C("span", {
231
- className: t("inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium backdrop-blur-sm", e.isOpen ? "bg-status-success-bg-subtle/20 text-status-success-text" : "bg-status-error-bg-subtle/20 text-status-error-text"),
232
- children: e.isOpen ? "Open" : "Closed"
233
- }), e.isVerified && /* @__PURE__ */ w("span", {
234
- className: "inline-flex items-center gap-0.5 rounded-full bg-accent-blue-subtle/20 px-2 py-0.5 text-xs font-medium text-accent-blue backdrop-blur-sm",
235
- children: [/* @__PURE__ */ C(f, { className: "h-3 w-3" }), "Verified"]
236
- })]
237
- }),
238
- /* @__PURE__ */ C("div", {
239
- className: "absolute top-2 right-2",
240
- children: /* @__PURE__ */ w("span", {
241
- className: "rounded-full bg-black/50 px-2 py-0.5 text-xs text-white backdrop-blur-sm",
242
- children: [e.estimatedTime, " min"]
243
- })
244
- })
245
- ]
246
- }), /* @__PURE__ */ w("div", {
247
- className: "flex flex-col flex-1 p-4",
248
- children: [
249
- /* @__PURE__ */ w("div", {
250
- className: "flex items-start justify-between gap-2 mb-1",
251
- children: [/* @__PURE__ */ C("h3", {
252
- className: "text-sm font-semibold text-text-primary truncate flex-1",
253
- children: e.name
254
- }), /* @__PURE__ */ w("div", {
255
- className: "flex items-center gap-1 shrink-0",
256
- children: [
257
- /* @__PURE__ */ C(y, { className: "h-3.5 w-3.5 fill-status-warning-text text-status-warning-text" }),
258
- /* @__PURE__ */ C("span", {
259
- className: "text-xs font-medium text-text-primary",
260
- children: e.rating
261
- }),
262
- /* @__PURE__ */ w("span", {
263
- className: "text-xs text-text-secondary",
264
- children: [
265
- "(",
266
- e.totalRatings,
267
- ")"
268
- ]
269
- })
270
- ]
271
- })]
272
- }),
273
- /* @__PURE__ */ C("p", {
274
- className: "text-xs text-text-secondary mb-2",
275
- children: e.category
276
- }),
277
- /* @__PURE__ */ C("div", {
278
- className: "flex items-center gap-3 text-xs text-text-secondary mb-2",
279
- children: /* @__PURE__ */ w("span", {
280
- className: "flex items-center gap-1",
281
- children: [/* @__PURE__ */ C(_, { className: "h-3 w-3" }), e.location?.address?.split(",")[0] || "Unknown"]
282
- })
283
- }),
284
- /* @__PURE__ */ w("div", {
285
- className: "flex items-center gap-3 text-xs text-text-secondary mb-3",
286
- children: [e.averageOrderValue && /* @__PURE__ */ w("span", { children: ["Avg ", o(e.averageOrderValue, { minimumFractionDigits: 0 })] }), /* @__PURE__ */ w("span", {
287
- className: "flex items-center gap-1",
288
- children: [/* @__PURE__ */ C(_, { className: "h-3 w-3" }), s(e.distance)]
289
- })]
290
- }),
291
- e.serviceTypes?.includes("appointment") && /* @__PURE__ */ C("div", {
292
- className: "mb-3 rounded-md bg-accent-blue-subtle/10 border border-accent-blue-subtle/20 p-2",
293
- children: /* @__PURE__ */ w("div", {
294
- className: "flex items-center gap-1 text-xs text-accent-blue",
295
- children: [/* @__PURE__ */ C(d, { className: "h-3 w-3" }), /* @__PURE__ */ C("span", {
296
- className: "font-medium",
297
- children: "Appointment available"
298
- })]
299
- })
300
- }),
301
- e.serviceTypes?.includes("direct_service") && /* @__PURE__ */ C("div", {
302
- className: "mb-3 rounded-md bg-accent-purple-subtle/10 border border-accent-purple-subtle/20 p-2",
303
- children: /* @__PURE__ */ w("div", {
304
- className: "flex items-center gap-1 text-xs text-accent-purple",
305
- children: [/* @__PURE__ */ C(m, { className: "h-3 w-3" }), /* @__PURE__ */ C("span", {
306
- className: "font-medium",
307
- children: "Direct Service Available"
308
- })]
309
- })
310
- }),
311
- e.serviceTypes && e.serviceTypes.length > 0 && /* @__PURE__ */ C("div", {
312
- className: "flex flex-wrap gap-1 mb-3",
313
- children: e.serviceTypes.slice(0, 3).map((e) => /* @__PURE__ */ C("span", {
314
- className: "rounded-full bg-bg-sunken px-2 py-0.5 text-[10px] text-text-secondary",
315
- children: e.replace(/_/g, " ")
316
- }, e))
317
- }),
318
- /* @__PURE__ */ w("div", {
319
- className: "mt-auto flex gap-2",
320
- children: [
321
- /* @__PURE__ */ C("button", {
322
- type: "button",
323
- onClick: () => O(`/customer/cart/${e.id}`),
324
- disabled: !e.isOpen,
325
- className: t("flex-1 rounded-lg py-2 text-xs font-medium transition-opacity", e.isOpen ? "bg-foreground text-background hover:opacity-90" : "bg-bg-sunken text-text-secondary cursor-not-allowed"),
326
- children: e.isOpen ? "View Services" : "Closed"
327
- }),
328
- e.serviceTypes?.includes("direct_service") && /* @__PURE__ */ C("button", {
329
- type: "button",
330
- onClick: () => O(`/customer/cart/${e.id}`),
331
- className: "rounded-lg border border-border-subtle px-2 py-2 text-xs text-text-primary hover:bg-accent transition-colors",
332
- title: "Book Direct Service",
333
- children: /* @__PURE__ */ C(m, { className: "h-3.5 w-3.5" })
334
- }),
335
- n && /* @__PURE__ */ C("button", {
336
- type: "button",
337
- onClick: () => alert("Investment opportunity available! View in Investor section."),
338
- className: "rounded-lg border border-status-success-border/30 bg-status-success-bg-subtle/10 px-2 py-2 text-xs text-status-success-text hover:bg-status-success-bg-subtle/20 transition-colors",
339
- title: "Investment Opportunity",
340
- children: /* @__PURE__ */ C(b, { className: "h-3.5 w-3.5" })
341
- }),
342
- /* @__PURE__ */ C("button", {
343
- type: "button",
344
- onClick: () => {
345
- W(e), H(!0);
346
- },
347
- className: "rounded-lg border border-border-subtle px-2 py-2 text-xs text-text-primary hover:bg-accent transition-colors",
348
- title: "Cart Info",
349
- children: /* @__PURE__ */ C(h, { className: "h-3.5 w-3.5" })
350
- })
351
- ]
352
- })
353
- ]
354
- })]
355
- }, e.id);
356
- })
357
- }), Q && /* @__PURE__ */ C("div", {
358
- className: "mt-8 text-center",
359
- children: /* @__PURE__ */ C("button", {
360
- type: "button",
361
- onClick: () => B((e) => e + 9),
362
- className: "rounded-lg border border-border-subtle px-6 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
363
- children: "Load More Carts"
364
- })
365
- })] }) : /* @__PURE__ */ C("div", {
366
- className: "mt-6",
367
- children: /* @__PURE__ */ C(r, {
368
- illustration: k ? "empty-search" : "empty-data",
369
- title: "No carts found",
370
- description: k ? `No results for"${k}". Try a different search term.` : "No carts available with these filters.",
371
- action: /* @__PURE__ */ C("button", {
372
- type: "button",
373
- onClick: $,
374
- className: "rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity",
375
- children: "Clear Filters"
376
- })
377
- })
378
- }),
379
- V && U && /* @__PURE__ */ C("div", {
380
- className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4",
381
- children: /* @__PURE__ */ C("div", {
382
- className: "w-full max-w-2xl max-h-[90vh] overflow-y-auto rounded-lg border border-border-subtle bg-bg-surface",
383
- children: /* @__PURE__ */ w("div", {
384
- className: "p-5",
385
- children: [
386
- /* @__PURE__ */ w("div", {
387
- className: "flex items-center justify-between mb-4",
388
- children: [/* @__PURE__ */ C("h3", {
389
- className: "text-lg font-semibold text-text-primary",
390
- children: "Cart Information"
391
- }), /* @__PURE__ */ C("button", {
392
- type: "button",
393
- onClick: () => H(!1),
394
- className: "rounded-md p-1 text-text-secondary hover:text-text-primary transition-colors",
395
- children: /* @__PURE__ */ C(x, { className: "h-5 w-5" })
396
- })]
397
- }),
398
- /* @__PURE__ */ C("div", {
399
- className: "h-48 rounded-lg overflow-hidden mb-4",
400
- children: /* @__PURE__ */ C("img", {
401
- src: U.image,
402
- alt: U.name,
403
- className: "h-full w-full object-cover"
404
- })
405
- }),
406
- /* @__PURE__ */ C("h4", {
407
- className: "text-xl font-semibold text-text-primary mb-1",
408
- children: U.name
409
- }),
410
- /* @__PURE__ */ w("div", {
411
- className: "flex flex-wrap items-center gap-3 mb-4",
412
- children: [/* @__PURE__ */ w("div", {
413
- className: "flex items-center gap-1",
414
- children: [
415
- /* @__PURE__ */ C(y, { className: "h-3.5 w-3.5 fill-status-warning-text text-status-warning-text" }),
416
- /* @__PURE__ */ C("span", {
417
- className: "text-sm font-medium",
418
- children: U.rating
419
- }),
420
- /* @__PURE__ */ w("span", {
421
- className: "text-xs text-text-secondary",
422
- children: [
423
- "(",
424
- U.totalRatings,
425
- " reviews)"
426
- ]
427
- })
428
- ]
429
- }), /* @__PURE__ */ C("span", {
430
- className: t("inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium", U.isOpen ? "bg-status-success-bg-subtle/20 text-status-success-text" : "bg-status-error-bg-subtle/20 text-status-error-text"),
431
- children: U.isOpen ? "Open" : "Closed"
432
- })]
433
- }),
434
- /* @__PURE__ */ w("div", {
435
- className: "grid grid-cols-1 gap-3 sm:grid-cols-2 mb-4",
436
- children: [
437
- /* @__PURE__ */ w("div", {
438
- className: "rounded-md bg-bg-sunken p-3",
439
- children: [/* @__PURE__ */ w("p", {
440
- className: "text-xs font-medium text-text-secondary flex items-center gap-1",
441
- children: [/* @__PURE__ */ C(_, { className: "h-3 w-3" }), " Location"]
442
- }), /* @__PURE__ */ C("p", {
443
- className: "mt-1 text-sm text-text-primary",
444
- children: U.location.address
445
- })]
446
- }),
447
- /* @__PURE__ */ w("div", {
448
- className: "rounded-md bg-bg-sunken p-3",
449
- children: [/* @__PURE__ */ w("p", {
450
- className: "text-xs font-medium text-text-secondary flex items-center gap-1",
451
- children: [/* @__PURE__ */ C(ee, { className: "h-3 w-3" }), " Category"]
452
- }), /* @__PURE__ */ C("p", {
453
- className: "mt-1 text-sm text-text-primary",
454
- children: U.category
455
- })]
456
- }),
457
- U.averageOrderValue && /* @__PURE__ */ w("div", {
458
- className: "rounded-md bg-bg-sunken p-3",
459
- children: [/* @__PURE__ */ C("p", {
460
- className: "text-xs font-medium text-text-secondary",
461
- children: "Average Order"
462
- }), /* @__PURE__ */ C("p", {
463
- className: "mt-1 text-sm text-text-primary",
464
- children: o(U.averageOrderValue, { minimumFractionDigits: 0 })
465
- })]
466
- }),
467
- /* @__PURE__ */ w("div", {
468
- className: "rounded-md bg-bg-sunken p-3",
469
- children: [/* @__PURE__ */ w("p", {
470
- className: "text-xs font-medium text-text-secondary flex items-center gap-1",
471
- children: [/* @__PURE__ */ C(p, { className: "h-3 w-3" }), " Estimated Time"]
472
- }), /* @__PURE__ */ w("p", {
473
- className: "mt-1 text-sm text-text-primary",
474
- children: [U.estimatedTime, " minutes"]
475
- })]
476
- }),
477
- /* @__PURE__ */ w("div", {
478
- className: "rounded-md bg-bg-sunken p-3",
479
- children: [/* @__PURE__ */ C("p", {
480
- className: "text-xs font-medium text-text-secondary",
481
- children: "Distance"
482
- }), /* @__PURE__ */ C("p", {
483
- className: "mt-1 text-sm text-text-primary",
484
- children: s(U.distance)
485
- })]
486
- }),
487
- U.isVerified && /* @__PURE__ */ w("div", {
488
- className: "rounded-md bg-bg-sunken p-3",
489
- children: [/* @__PURE__ */ w("p", {
490
- className: "text-xs font-medium text-text-secondary flex items-center gap-1",
491
- children: [/* @__PURE__ */ C(f, { className: "h-3 w-3" }), " Verification"]
492
- }), /* @__PURE__ */ C("p", {
493
- className: "mt-1 text-sm text-text-primary",
494
- children: "Verified cart"
495
- })]
496
- })
497
- ]
498
- }),
499
- U.serviceTypes && U.serviceTypes.length > 0 && /* @__PURE__ */ w("div", {
500
- className: "mb-4",
501
- children: [/* @__PURE__ */ C("p", {
502
- className: "text-xs font-medium text-text-secondary mb-2",
503
- children: "Service Types"
504
- }), /* @__PURE__ */ C("div", {
505
- className: "flex flex-wrap gap-2",
506
- children: U.serviceTypes.map((e) => /* @__PURE__ */ C("span", {
507
- className: "rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary capitalize",
508
- children: e.replace(/_/g, " ")
509
- }, e))
510
- })]
511
- }),
512
- U.businessHours && Object.keys(U.businessHours).length > 0 && /* @__PURE__ */ w("div", {
513
- className: "mb-4",
514
- children: [/* @__PURE__ */ C("p", {
515
- className: "text-xs font-medium text-text-secondary mb-2",
516
- children: "Operating Hours"
517
- }), /* @__PURE__ */ C("div", {
518
- className: "space-y-1",
519
- children: Object.entries(U.businessHours).map(([e, t]) => /* @__PURE__ */ w("div", {
520
- className: "flex justify-between text-xs",
521
- children: [/* @__PURE__ */ C("span", {
522
- className: "capitalize text-text-primary",
523
- children: e
524
- }), /* @__PURE__ */ C("span", {
525
- className: "text-text-secondary",
526
- children: t.isOpen ? `${t.open} - ${t.close}` : "Closed"
527
- })]
528
- }, e))
529
- })]
530
- }),
531
- /* @__PURE__ */ w("div", {
532
- className: "flex gap-3 mt-6",
533
- children: [/* @__PURE__ */ C("button", {
534
- type: "button",
535
- onClick: () => {
536
- H(!1), O(`/customer/carts/${U.id}`);
537
- },
538
- disabled: !U.isOpen,
539
- className: t("flex-1 rounded-lg py-2.5 text-sm font-medium transition-opacity", U.isOpen ? "bg-foreground text-background hover:opacity-90" : "bg-bg-sunken text-text-secondary cursor-not-allowed"),
540
- children: U.isOpen ? "View Menu" : "Currently Closed"
541
- }), /* @__PURE__ */ C("button", {
542
- type: "button",
543
- onClick: () => H(!1),
544
- className: "rounded-lg border border-border-subtle px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
545
- children: "Close"
546
- })]
547
- })
548
- ]
549
- })
550
- })
551
- })
552
- ]
553
- });
554
- }
555
- //#endregion
556
- export { O as CartDiscoveryPage };
557
-
558
- //# sourceMappingURL=CartDiscoveryPage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CartDiscoveryPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/customer/CartDiscoveryPage.tsx"],"sourcesContent":["/**\n * Cart Discovery Page\n * @module coolandlovely/pages/customer\n *\n * Browse and search service providers (carts) with full filtering:\n * category, rating, price range, sort, search. Grid view with\n * cart info modal, load more, investment indicators, scheduled stops,\n * direct service links, verified badges, and prep time badges.\n */\n\nimport { useState, useMemo } from'react';\nimport type { MockCart } from'../../types';\nimport {\n Search,\n X,\n Star,\n MapPin,\n Clock,\n CheckCircle2,\n Info,\n Home,\n TrendingUp,\n Calendar,\n Tag,\n Loader2,\n AlertCircle,\n} from'lucide-react';\nimport { GlassCard, PagePurpose } from'@burdenoff/fe-libs/ui';\nimport { PageLayout } from'../../components/PageLayout';\nimport { EmptyState } from'../../components/EmptyState';\nimport { useCoolAndLovely } from'../../context/CoolAndLovelyContext';\nimport { useProviders, useInvestmentOpportunities } from'../../hooks/useCoolAndLovelyApi';\nimport { cn } from'../../utils/cn';\nimport { formatDistance, formatCurrency } from'../../utils/formatters';\n\nconst ALL_CATEGORIES = 'All';\n\ntype RatingFilter = '' | '4.5' | '4.0' | '3.5';\ntype PriceFilter = '' | 'low' | 'medium' | 'high';\ntype SortBy = 'rating' | 'popularity' | 'distance' | 'newest';\n\nexport function CartDiscoveryPage() {\n const { navigateTo } = useCoolAndLovely();\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedCategory, setSelectedCategory] = useState<string>(ALL_CATEGORIES);\n const [ratingFilter, setRatingFilter] = useState<RatingFilter>('');\n const [priceFilter, setPriceFilter] = useState<PriceFilter>('');\n const [sortBy, setSortBy] = useState<SortBy>('rating');\n const [visibleCount, setVisibleCount] = useState(9);\n const [showCartInfo, setShowCartInfo] = useState(false);\n const [selectedCartInfo, setSelectedCartInfo] = useState<MockCart | null>(null);\n\n const { data: providers = [], isLoading, isError } = useProviders();\n const { data: investmentOpportunities = [] } = useInvestmentOpportunities();\n\n const categories = useMemo(() => {\n const cats = new Set<string>();\n providers.forEach((p) => {\n if (p.category) cats.add(p.category);\n });\n return [ALL_CATEGORIES, ...Array.from(cats)];\n }, [providers]);\n\n const filteredCarts = useMemo(() => {\n let carts = [...providers];\n\n // Search query\n if (searchQuery.trim()) {\n const q = searchQuery.toLowerCase();\n carts = carts.filter(\n (c) => c.name.toLowerCase().includes(q) || c.category.toLowerCase().includes(q)\n );\n }\n\n // Category filter\n if (selectedCategory !== ALL_CATEGORIES) {\n carts = carts.filter((cart) => cart.category === selectedCategory);\n }\n\n // Rating filter\n if (ratingFilter) {\n const minRating = parseFloat(ratingFilter);\n carts = carts.filter((cart) => cart.rating >= minRating);\n }\n\n // Price range filter\n if (priceFilter) {\n carts = carts.filter((cart) => {\n const avg = cart.averageOrderValue ?? 0;\n switch (priceFilter) {\n case'low':\n return avg <= 300;\n case'medium':\n return avg > 300 && avg <= 800;\n case'high':\n return avg > 800;\n default:\n return true;\n }\n });\n }\n\n // Sort\n switch (sortBy) {\n case'rating':\n carts.sort((a, b) => b.rating - a.rating);\n break;\n case'popularity':\n carts.sort((a, b) => (b.totalRatings || 0) - (a.totalRatings || 0));\n break;\n case'distance':\n carts.sort((a, b) => (a.distance || 0) - (b.distance || 0));\n break;\n case'newest':\n carts.sort(\n (a, b) => new Date(b.createdAt || 0).getTime() - new Date(a.createdAt || 0).getTime()\n );\n break;\n }\n\n return carts;\n }, [providers, searchQuery, selectedCategory, ratingFilter, priceFilter, sortBy]);\n\n const visibleCarts = filteredCarts.slice(0, visibleCount);\n const hasMore = visibleCount < filteredCarts.length;\n\n const hasActiveFilters =\n selectedCategory !== ALL_CATEGORIES ||\n ratingFilter !== '' ||\n priceFilter !== '' ||\n searchQuery.trim() !== '';\n\n const clearAllFilters = () => {\n setSearchQuery('');\n setSelectedCategory(ALL_CATEGORIES);\n setRatingFilter('');\n setPriceFilter('');\n setSortBy('rating');\n setVisibleCount(9);\n };\n\n if (isLoading) {\n return (\n <PageLayout title=\"Discover Carts\" description=\"Finding services and shops near you...\">\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=\"Discover Carts\" description=\"Error loading carts\">\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\">Error loading service providers</h2>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text\"\n >\n Retry\n </button>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Discover Carts\"\n description=\"Find services and shops near you\"\n actions={\n <span className=\"text-sm text-text-secondary\">{filteredCarts.length} carts found</span>\n }\n >\n <PagePurpose className=\"mb-6\" icon={<Search className=\"h-4 w-4\" />}>\n Find the right cart or shop near you. Search by name or service, narrow\n down by category, rating and price, then open a cart to view its menu,\n book a direct service, or spot carts that are open for investment.\n </PagePurpose>\n\n {/* Search Bar — primary emphasis zone */}\n <GlassCard treatment=\"glass\" glow className=\"p-4\">\n <div className=\"relative\">\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=\"Search carts, services, or items...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className={cn(\n 'w-full rounded-lg border border-border-subtle bg-bg-surface py-2.5 pl-10 pr-10 text-sm text-text-primary',\n 'placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]'\n )}\n />\n {searchQuery && (\n <button\n type=\"button\"\n onClick={() => setSearchQuery('')}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-text-secondary hover:text-text-primary\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </GlassCard>\n\n {/* Category Chips */}\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {categories.map((category) => (\n <button\n key={category}\n type=\"button\"\n onClick={() => setSelectedCategory(category)}\n className={cn(\n 'rounded-full px-3 py-1.5 text-xs font-medium transition-colors',\n selectedCategory === category\n ? 'bg-foreground text-background'\n : 'bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary'\n )}\n >\n {category}\n </button>\n ))}\n </div>\n\n {/* Filter Row */}\n <div className=\"mt-4 flex flex-wrap items-center gap-3\">\n <select\n value={ratingFilter}\n onChange={(e) => setRatingFilter(e.target.value as RatingFilter)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">Any Rating</option>\n <option value=\"4.5\">4.5+ Stars</option>\n <option value=\"4.0\">4.0+ Stars</option>\n <option value=\"3.5\">3.5+ Stars</option>\n </select>\n\n <select\n value={priceFilter}\n onChange={(e) => setPriceFilter(e.target.value as PriceFilter)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">Any Price</option>\n <option value=\"low\">Under ₹300</option>\n <option value=\"medium\">₹300 - ₹800</option>\n <option value=\"high\">₹800+</option>\n </select>\n\n <select\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value as SortBy)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"rating\">Highest Rated</option>\n <option value=\"popularity\">Most Popular</option>\n <option value=\"distance\">Nearest</option>\n <option value=\"newest\">Newest</option>\n </select>\n\n {hasActiveFilters && (\n <button\n type=\"button\"\n onClick={clearAllFilters}\n className=\"rounded-lg border border-border-subtle px-3 py-2 text-xs font-medium text-text-secondary hover:text-text-primary transition-colors\"\n >\n Clear All Filters\n </button>\n )}\n </div>\n\n {/* Cart Grid */}\n {visibleCarts.length > 0 ? (\n <>\n <div className=\"mt-6 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {visibleCarts.map((cart) => {\n const investment = investmentOpportunities.find((o) => o.cartId === cart.id);\n return (\n <div\n key={cart.id}\n className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm overflow-hidden hover:shadow-md transition-shadow flex flex-col\"\n >\n {/* Image */}\n <div className=\"relative h-40 bg-bg-sunken\">\n <img src={cart.image} alt={cart.name} className=\"h-full w-full object-cover\" />\n <div className=\"absolute top-2 left-2 flex gap-1.5\">\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium backdrop-blur-sm',\n cart.isOpen\n ? 'bg-status-success-bg-subtle/20 text-status-success-text'\n : 'bg-status-error-bg-subtle/20 text-status-error-text'\n )}\n >\n {cart.isOpen ? 'Open' : 'Closed'}\n </span>\n {cart.isVerified && (\n <span className=\"inline-flex items-center gap-0.5 rounded-full bg-accent-blue-subtle/20 px-2 py-0.5 text-xs font-medium text-accent-blue backdrop-blur-sm\">\n <CheckCircle2 className=\"h-3 w-3\" />\n Verified\n </span>\n )}\n </div>\n <div className=\"absolute top-2 right-2\">\n <span className=\"rounded-full bg-black/50 px-2 py-0.5 text-xs text-white backdrop-blur-sm\">\n {cart.estimatedTime} min\n </span>\n </div>\n </div>\n\n {/* Details */}\n <div className=\"flex flex-col flex-1 p-4\">\n <div className=\"flex items-start justify-between gap-2 mb-1\">\n <h3 className=\"text-sm font-semibold text-text-primary truncate flex-1\">\n {cart.name}\n </h3>\n <div className=\"flex items-center gap-1 shrink-0\">\n <Star className=\"h-3.5 w-3.5 fill-status-warning-text text-status-warning-text\" />\n <span className=\"text-xs font-medium text-text-primary\">{cart.rating}</span>\n <span className=\"text-xs text-text-secondary\">({cart.totalRatings})</span>\n </div>\n </div>\n\n <p className=\"text-xs text-text-secondary mb-2\">{cart.category}</p>\n\n <div className=\"flex items-center gap-3 text-xs text-text-secondary mb-2\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {cart.location?.address?.split(',')[0] || 'Unknown'}\n </span>\n </div>\n\n <div className=\"flex items-center gap-3 text-xs text-text-secondary mb-3\">\n {cart.averageOrderValue && (\n <span>\n Avg {formatCurrency(cart.averageOrderValue, { minimumFractionDigits: 0 })}\n </span>\n )}\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {formatDistance(cart.distance)}\n </span>\n </div>\n\n {/* Scheduled Stop Info */}\n {cart.serviceTypes?.includes('appointment') && (\n <div className=\"mb-3 rounded-md bg-accent-blue-subtle/10 border border-accent-blue-subtle/20 p-2\">\n <div className=\"flex items-center gap-1 text-xs text-accent-blue\">\n <Calendar className=\"h-3 w-3\" />\n <span className=\"font-medium\">Appointment available</span>\n </div>\n </div>\n )}\n\n {/* Direct Service Info */}\n {cart.serviceTypes?.includes('direct_service') && (\n <div className=\"mb-3 rounded-md bg-accent-purple-subtle/10 border border-accent-purple-subtle/20 p-2\">\n <div className=\"flex items-center gap-1 text-xs text-accent-purple\">\n <Home className=\"h-3 w-3\" />\n <span className=\"font-medium\">Direct Service Available</span>\n </div>\n </div>\n )}\n\n {/* Tags */}\n {cart.serviceTypes && cart.serviceTypes.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mb-3\">\n {cart.serviceTypes.slice(0, 3).map((tag: string) => (\n <span\n key={tag}\n className=\"rounded-full bg-bg-sunken px-2 py-0.5 text-[10px] text-text-secondary\"\n >\n {tag.replace(/_/g, ' ')}\n </span>\n ))}\n </div>\n )}\n\n <div className=\"mt-auto flex gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/cart/${cart.id}`)}\n disabled={!cart.isOpen}\n className={cn(\n 'flex-1 rounded-lg py-2 text-xs font-medium transition-opacity',\n cart.isOpen\n ? 'bg-foreground text-background hover:opacity-90'\n : 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n )}\n >\n {cart.isOpen ? 'View Services' : 'Closed'}\n </button>\n\n {cart.serviceTypes?.includes('direct_service') && (\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/cart/${cart.id}`)}\n className=\"rounded-lg border border-border-subtle px-2 py-2 text-xs text-text-primary hover:bg-accent transition-colors\"\n title=\"Book Direct Service\"\n >\n <Home className=\"h-3.5 w-3.5\" />\n </button>\n )}\n\n {investment && (\n <button\n type=\"button\"\n onClick={() =>\n alert('Investment opportunity available! View in Investor section.')\n }\n className=\"rounded-lg border border-status-success-border/30 bg-status-success-bg-subtle/10 px-2 py-2 text-xs text-status-success-text hover:bg-status-success-bg-subtle/20 transition-colors\"\n title=\"Investment Opportunity\"\n >\n <TrendingUp className=\"h-3.5 w-3.5\" />\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={() => {\n setSelectedCartInfo(cart);\n setShowCartInfo(true);\n }}\n className=\"rounded-lg border border-border-subtle px-2 py-2 text-xs text-text-primary hover:bg-accent transition-colors\"\n title=\"Cart Info\"\n >\n <Info className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Load More */}\n {hasMore && (\n <div className=\"mt-8 text-center\">\n <button\n type=\"button\"\n onClick={() => setVisibleCount((prev) => prev + 9)}\n className=\"rounded-lg border border-border-subtle px-6 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Load More Carts\n </button>\n </div>\n )}\n </>\n ) : (\n <div className=\"mt-6\">\n <EmptyState\n illustration={searchQuery ? 'empty-search' : 'empty-data'}\n title=\"No carts found\"\n description={\n searchQuery\n ? `No results for\"${searchQuery}\". Try a different search term.`\n : 'No carts available with these filters.'\n }\n action={\n <button\n type=\"button\"\n onClick={clearAllFilters}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Clear Filters\n </button>\n }\n />\n </div>\n )}\n\n {/* Cart Info Modal */}\n {showCartInfo && selectedCartInfo && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\n <div className=\"w-full max-w-2xl max-h-[90vh] overflow-y-auto rounded-lg border border-border-subtle bg-bg-surface\">\n <div className=\"p-5\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Cart Information</h3>\n <button\n type=\"button\"\n onClick={() => setShowCartInfo(false)}\n className=\"rounded-md p-1 text-text-secondary hover:text-text-primary transition-colors\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n {/* Image */}\n <div className=\"h-48 rounded-lg overflow-hidden mb-4\">\n <img\n src={selectedCartInfo.image}\n alt={selectedCartInfo.name}\n className=\"h-full w-full object-cover\"\n />\n </div>\n\n {/* Basic Info */}\n <h4 className=\"text-xl font-semibold text-text-primary mb-1\">\n {selectedCartInfo.name}\n </h4>\n <div className=\"flex flex-wrap items-center gap-3 mb-4\">\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-3.5 w-3.5 fill-status-warning-text text-status-warning-text\" />\n <span className=\"text-sm font-medium\">{selectedCartInfo.rating}</span>\n <span className=\"text-xs text-text-secondary\">\n ({selectedCartInfo.totalRatings} reviews)\n </span>\n </div>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium',\n selectedCartInfo.isOpen\n ? 'bg-status-success-bg-subtle/20 text-status-success-text'\n : 'bg-status-error-bg-subtle/20 text-status-error-text'\n )}\n >\n {selectedCartInfo.isOpen ? 'Open' : 'Closed'}\n </span>\n </div>\n\n {/* Details Grid */}\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 mb-4\">\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" /> Location\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {selectedCartInfo.location.address}\n </p>\n </div>\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <Tag className=\"h-3 w-3\" /> Category\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">{selectedCartInfo.category}</p>\n </div>\n {selectedCartInfo.averageOrderValue && (\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary\">Average Order</p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {formatCurrency(selectedCartInfo.averageOrderValue, {\n minimumFractionDigits: 0,\n })}\n </p>\n </div>\n )}\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" /> Estimated Time\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {selectedCartInfo.estimatedTime} minutes\n </p>\n </div>\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary\">Distance</p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {formatDistance(selectedCartInfo.distance)}\n </p>\n </div>\n {selectedCartInfo.isVerified && (\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <CheckCircle2 className=\"h-3 w-3\" /> Verification\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">Verified cart</p>\n </div>\n )}\n </div>\n\n {/* Service Types */}\n {selectedCartInfo.serviceTypes && selectedCartInfo.serviceTypes.length > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-xs font-medium text-text-secondary mb-2\">Service Types</p>\n <div className=\"flex flex-wrap gap-2\">\n {(selectedCartInfo.serviceTypes as string[]).map((type: string) => (\n <span\n key={type}\n className=\"rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary capitalize\"\n >\n {type.replace(/_/g, ' ')}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Business Hours */}\n {selectedCartInfo.businessHours &&\n Object.keys(selectedCartInfo.businessHours).length > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-xs font-medium text-text-secondary mb-2\">\n Operating Hours\n </p>\n <div className=\"space-y-1\">\n {Object.entries(selectedCartInfo.businessHours as Record<string, any>).map(\n ([day, hours]) => (\n <div key={day} className=\"flex justify-between text-xs\">\n <span className=\"capitalize text-text-primary\">{day}</span>\n <span className=\"text-text-secondary\">\n {hours.isOpen ? `${hours.open} - ${hours.close}` : 'Closed'}\n </span>\n </div>\n )\n )}\n </div>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex gap-3 mt-6\">\n <button\n type=\"button\"\n onClick={() => {\n setShowCartInfo(false);\n navigateTo(`/customer/carts/${selectedCartInfo.id}`);\n }}\n disabled={!selectedCartInfo.isOpen}\n className={cn(\n 'flex-1 rounded-lg py-2.5 text-sm font-medium transition-opacity',\n selectedCartInfo.isOpen\n ? 'bg-foreground text-background hover:opacity-90'\n : 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n )}\n >\n {selectedCartInfo.isOpen ? 'View Menu' : 'Currently Closed'}\n </button>\n <button\n type=\"button\"\n onClick={() => setShowCartInfo(false)}\n className=\"rounded-lg border border-border-subtle px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Close\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}