@burdenoff/microfe-kadaikodi 2026.704.4 → 2026.704.5

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 (126) hide show
  1. package/dist/kadaikodi/KadaikodiRoutes.js +30 -26
  2. package/dist/kadaikodi/KadaikodiRoutes.js.map +1 -1
  3. package/dist/kadaikodi/components/viz/AllocationBar.js +68 -0
  4. package/dist/kadaikodi/components/viz/AllocationBar.js.map +1 -0
  5. package/dist/kadaikodi/components/viz/AreaChart.js +102 -0
  6. package/dist/kadaikodi/components/viz/AreaChart.js.map +1 -0
  7. package/dist/kadaikodi/components/viz/AvatarStack.js +36 -0
  8. package/dist/kadaikodi/components/viz/AvatarStack.js.map +1 -0
  9. package/dist/kadaikodi/components/viz/BarChart.js +83 -0
  10. package/dist/kadaikodi/components/viz/BarChart.js.map +1 -0
  11. package/dist/kadaikodi/components/viz/CertificateCard.js +4 -0
  12. package/dist/kadaikodi/components/viz/DonutChart.js +109 -0
  13. package/dist/kadaikodi/components/viz/DonutChart.js.map +1 -0
  14. package/dist/kadaikodi/components/viz/HBarFunnel.js +54 -0
  15. package/dist/kadaikodi/components/viz/HBarFunnel.js.map +1 -0
  16. package/dist/kadaikodi/components/viz/Heatmap.js +3 -0
  17. package/dist/kadaikodi/components/viz/KanbanBoard.js +50 -0
  18. package/dist/kadaikodi/components/viz/KanbanBoard.js.map +1 -0
  19. package/dist/kadaikodi/components/viz/LineChart.js +4 -0
  20. package/dist/kadaikodi/components/viz/OrgTree.js +2 -0
  21. package/dist/kadaikodi/components/viz/PathSteps.js +3 -0
  22. package/dist/kadaikodi/components/viz/ProgressRing.js +68 -0
  23. package/dist/kadaikodi/components/viz/ProgressRing.js.map +1 -0
  24. package/dist/kadaikodi/components/viz/RatingStars.js +51 -0
  25. package/dist/kadaikodi/components/viz/RatingStars.js.map +1 -0
  26. package/dist/kadaikodi/components/viz/SegmentedTabs.js +69 -0
  27. package/dist/kadaikodi/components/viz/SegmentedTabs.js.map +1 -0
  28. package/dist/kadaikodi/components/viz/SkillBar.js +3 -0
  29. package/dist/kadaikodi/components/viz/Sparkline.js +74 -0
  30. package/dist/kadaikodi/components/viz/Sparkline.js.map +1 -0
  31. package/dist/kadaikodi/components/viz/StatCard.js +60 -0
  32. package/dist/kadaikodi/components/viz/StatCard.js.map +1 -0
  33. package/dist/kadaikodi/components/viz/StepProgress.js +64 -0
  34. package/dist/kadaikodi/components/viz/StepProgress.js.map +1 -0
  35. package/dist/kadaikodi/components/viz/Timeline.js +66 -0
  36. package/dist/kadaikodi/components/viz/Timeline.js.map +1 -0
  37. package/dist/kadaikodi/components/viz/index.js +23 -0
  38. package/dist/kadaikodi/components/viz/lib/Avatar.js +30 -0
  39. package/dist/kadaikodi/components/viz/lib/Avatar.js.map +1 -0
  40. package/dist/kadaikodi/components/viz/lib/CartesianFrame.js +119 -0
  41. package/dist/kadaikodi/components/viz/lib/CartesianFrame.js.map +1 -0
  42. package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.js +35 -0
  43. package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.js.map +1 -0
  44. package/dist/kadaikodi/components/viz/lib/format.js +21 -0
  45. package/dist/kadaikodi/components/viz/lib/format.js.map +1 -0
  46. package/dist/kadaikodi/components/viz/lib/geometry.js +61 -0
  47. package/dist/kadaikodi/components/viz/lib/geometry.js.map +1 -0
  48. package/dist/kadaikodi/components/viz/lib/hooks.js +39 -0
  49. package/dist/kadaikodi/components/viz/lib/hooks.js.map +1 -0
  50. package/dist/kadaikodi/components/viz/lib/palette.js +27 -0
  51. package/dist/kadaikodi/components/viz/lib/palette.js.map +1 -0
  52. package/dist/kadaikodi/hooks/useKadaikodiApi.js +18 -10
  53. package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
  54. package/dist/kadaikodi/pages/HomePage.js +373 -631
  55. package/dist/kadaikodi/pages/HomePage.js.map +1 -1
  56. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +304 -169
  57. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
  58. package/dist/kadaikodi/pages/admin/AdminDashboard.js +255 -271
  59. package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
  60. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +185 -125
  61. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
  62. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +141 -102
  63. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
  64. package/dist/kadaikodi/pages/admin/CartManagementPage.js +558 -718
  65. package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
  66. package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
  67. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +142 -55
  68. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  69. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +129 -164
  70. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  71. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +379 -361
  72. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  73. package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js +266 -166
  74. package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js.map +1 -1
  75. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js +373 -0
  76. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js.map +1 -0
  77. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +288 -161
  78. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
  79. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +180 -181
  80. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
  81. package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
  82. package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
  83. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js +17 -34
  84. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js.map +1 -1
  85. package/dist/kadaikodi/pages/customer/CartDetailPage.js +405 -248
  86. package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
  87. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +258 -232
  88. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
  89. package/dist/kadaikodi/pages/customer/CheckoutPage.js +254 -205
  90. package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
  91. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js +270 -230
  92. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
  93. package/dist/kadaikodi/pages/customer/FavoritesPage.js +149 -412
  94. package/dist/kadaikodi/pages/customer/FavoritesPage.js.map +1 -1
  95. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js +173 -134
  96. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
  97. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +176 -175
  98. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
  99. package/dist/kadaikodi/pages/customer/ReviewsPage.js +295 -438
  100. package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
  101. package/dist/kadaikodi/pages/customer/shared.js +181 -0
  102. package/dist/kadaikodi/pages/customer/shared.js.map +1 -0
  103. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js +438 -311
  104. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
  105. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js +320 -293
  106. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  107. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js +159 -91
  108. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  109. package/dist/kadaikodi/pages/investor/InvestorDashboard.js +137 -107
  110. package/dist/kadaikodi/pages/investor/InvestorDashboard.js.map +1 -1
  111. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js +157 -135
  112. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  113. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js +280 -206
  114. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js.map +1 -1
  115. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
  116. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +424 -448
  117. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
  118. package/dist/kadaikodi/pages/worker/WorkerDashboard.js +328 -445
  119. package/dist/kadaikodi/pages/worker/WorkerDashboard.js.map +1 -1
  120. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js +141 -164
  121. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
  122. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +300 -296
  123. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
  124. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +284 -309
  125. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
  126. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CartDiscoveryPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/customer/CartDiscoveryPage.tsx"],"sourcesContent":["/**\n * Cart Discovery Page\n * @module kadaikodi/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 { PageLayout } from '../../components/PageLayout';\nimport { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useProviders, useInvestmentOpportunities } from '../../hooks/useKadaikodiApi';\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 } = useKadaikodi();\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-4\">\n Find mobile food carts and shops near you. Search by name, dish or category, then filter by\n rating and price to land on exactly what you're craving — tap any cart to see its menu and\n order.\n </PagePurpose>\n\n {/* Search Bar — the one emphasis zone (the core discovery action) */}\n <EmphasisPanel>\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 </EmphasisPanel>\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 text-status-success-text'\n : 'bg-status-error-bg-subtle 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-[var(--color-accent-soft)] px-2 py-0.5 text-xs font-medium text-text-primary 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 {cart.distance != null && (\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {formatDistance(cart.distance)}\n </span>\n )}\n </div>\n\n {/* Scheduled Stop Info */}\n {cart.serviceTypes?.includes('appointment') && (\n <div className=\"mb-3 rounded-md bg-[var(--color-accent-soft)] border border-border-focus/20 p-2\">\n <div className=\"flex items-center gap-1 text-xs text-text-primary\">\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 border border-accent-purple/20 p-2\">\n <div className=\"flex items-center gap-1 text-xs text-text-primary\">\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={() => navigateTo(`/investor/opportunity/${investment.id}`)}\n className=\"rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle px-2 py-2 text-xs text-status-success-text hover:bg-status-success-bg-subtle 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=\"empty-search\"\n icon={<Search className=\"h-12 w-12\" />}\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 text-status-success-text'\n : 'bg-status-error-bg-subtle 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 {selectedCartInfo.distance != null\n ? formatDistance(selectedCartInfo.distance)\n : '—'}\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\">Operating Hours</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/cart/${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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"}
1
+ {"version":3,"file":"CartDiscoveryPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/customer/CartDiscoveryPage.tsx"],"sourcesContent":["/**\n * Cart Discovery Page\n * @module kadaikodi/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 Heart,\n Loader2,\n AlertCircle,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { EmptyState } from '../../components/EmptyState';\nimport { RatingStars, SegmentedTabs } from '../../components/viz';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useProviders, useInvestmentOpportunities } from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatDistance, formatCurrency } from '../../utils/formatters';\nimport { ProviderImage, useFavorites } from './shared';\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 } = useKadaikodi();\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 const favorites = useFavorites();\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-4\">\n Find mobile food carts and shops near you. Search by name, dish or category, then filter by\n rating and price to land on exactly what you're craving — tap any cart to see its menu and\n order.\n </PagePurpose>\n\n {/* Search Bar — the one emphasis zone (the core discovery action) */}\n <EmphasisPanel>\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 </EmphasisPanel>\n\n {/* Category tabs — horizontally scrollable on mobile */}\n <div className=\"mt-4 -mx-1 overflow-x-auto px-1 pb-1\">\n <SegmentedTabs\n aria-label=\"Filter carts by category\"\n className=\"w-max\"\n tabs={categories.map((category) => ({ id: category, label: category }))}\n value={selectedCategory}\n onChange={setSelectedCategory}\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 {/* Result heading */}\n <h2 className=\"mt-6 mb-3 text-lg font-semibold text-text-primary\">\n {filteredCarts.length} {filteredCarts.length === 1 ? 'cart' : 'carts'} near you\n </h2>\n\n {/* Cart Grid */}\n {visibleCarts.length > 0 ? (\n <>\n <div className=\"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 const isFav = favorites.has(cart.id);\n return (\n <div\n key={cart.id}\n className=\"group rounded-xl border border-border-subtle bg-bg-surface shadow-elevation-1 overflow-hidden hover:shadow-elevation-2 hover:-translate-y-0.5 transition-all duration-200 flex flex-col\"\n >\n {/* Image */}\n <div className=\"relative h-40 bg-bg-sunken\">\n <ProviderImage src={cart.image} alt={cart.name} seed={cart.name} />\n <div className=\"absolute top-2 left-2 flex gap-1.5\">\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium backdrop-blur-sm',\n cart.isOpen\n ? 'bg-status-success-bg-subtle text-status-success-text'\n : 'bg-status-error-bg-subtle text-status-error-text'\n )}\n >\n <Clock className=\"h-3 w-3\" />\n {cart.isOpen ? 'Open now' : 'Closed'}\n </span>\n {cart.isVerified && (\n <span className=\"inline-flex items-center gap-0.5 rounded-full bg-[var(--color-accent-soft)] px-2 py-0.5 text-xs font-medium text-text-primary backdrop-blur-sm\">\n <CheckCircle2 className=\"h-3 w-3\" />\n Verified\n </span>\n )}\n </div>\n <button\n type=\"button\"\n onClick={() => favorites.toggle(cart.id)}\n aria-pressed={isFav}\n aria-label={isFav ? 'Remove from favorites' : 'Save to favorites'}\n className=\"absolute top-2 right-2 flex h-8 w-8 items-center justify-center rounded-full bg-bg-surface/80 backdrop-blur-sm text-text-secondary hover:text-status-error-text transition-colors\"\n >\n <Heart\n className={cn(\n 'h-4 w-4 transition-colors',\n isFav && 'fill-status-error-text text-status-error-text'\n )}\n />\n </button>\n {cart.estimatedTime != null && (\n <span className=\"absolute bottom-2 right-2 rounded-full bg-black/50 px-2 py-0.5 text-xs text-white backdrop-blur-sm\">\n {cart.estimatedTime} min\n </span>\n )}\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>\n\n <span className=\"mb-2 inline-flex w-fit items-center rounded-full bg-bg-sunken px-2 py-0.5 text-[11px] font-medium text-text-secondary\">\n {cart.category}\n </span>\n\n <div className=\"mb-2 flex items-center gap-2\">\n <RatingStars value={cart.rating} size={14} />\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\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-text-secondary mb-3\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {cart.location?.address?.split(',')[0] || 'Chennai'}\n </span>\n {cart.distance != null && (\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {formatDistance(cart.distance)}\n </span>\n )}\n {cart.averageOrderValue != null && (\n <span>\n Avg {formatCurrency(cart.averageOrderValue, { minimumFractionDigits: 0 })}\n </span>\n )}\n </div>\n\n {/* Scheduled Stop Info */}\n {cart.serviceTypes?.includes('appointment') && (\n <div className=\"mb-3 rounded-md bg-[var(--color-accent-soft)] border border-border-focus/20 p-2\">\n <div className=\"flex items-center gap-1 text-xs text-text-primary\">\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 border border-accent-purple/20 p-2\">\n <div className=\"flex items-center gap-1 text-xs text-text-primary\">\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-semibold transition-colors',\n cart.isOpen\n ? 'bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg-hover'\n : 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n )}\n >\n {cart.isOpen ? 'View' : '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={() => navigateTo(`/investor/opportunity/${investment.id}`)}\n className=\"rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle px-2 py-2 text-xs text-status-success-text hover:bg-status-success-bg-subtle 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=\"empty-search\"\n icon={<Search className=\"h-12 w-12\" />}\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 <ProviderImage\n src={selectedCartInfo.image}\n alt={selectedCartInfo.name}\n seed={selectedCartInfo.name}\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 text-status-success-text'\n : 'bg-status-error-bg-subtle 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 {selectedCartInfo.distance != null\n ? formatDistance(selectedCartInfo.distance)\n : '—'}\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\">Operating Hours</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/cart/${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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"}