@burdenoff/microfe-adaptercloud 2026.614.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 (132) hide show
  1. package/README.md +12 -0
  2. package/dist/adaptercloud/AdapterCloudRoot.js +177 -0
  3. package/dist/adaptercloud/AdapterCloudRoot.js.map +1 -0
  4. package/dist/adaptercloud/AdapterCloudRoutes.js +215 -0
  5. package/dist/adaptercloud/AdapterCloudRoutes.js.map +1 -0
  6. package/dist/adaptercloud/components/EmptyState.js +28 -0
  7. package/dist/adaptercloud/components/EmptyState.js.map +1 -0
  8. package/dist/adaptercloud/components/InvestmentCard.js +96 -0
  9. package/dist/adaptercloud/components/InvestmentCard.js.map +1 -0
  10. package/dist/adaptercloud/components/MetricsCard.js +46 -0
  11. package/dist/adaptercloud/components/MetricsCard.js.map +1 -0
  12. package/dist/adaptercloud/components/PageLayout.js +26 -0
  13. package/dist/adaptercloud/components/PageLayout.js.map +1 -0
  14. package/dist/adaptercloud/components/RatingDisplay.js +35 -0
  15. package/dist/adaptercloud/components/RatingDisplay.js.map +1 -0
  16. package/dist/adaptercloud/components/StatusBadge.js +45 -0
  17. package/dist/adaptercloud/components/StatusBadge.js.map +1 -0
  18. package/dist/adaptercloud/context/AdapterCloudContext.js +93 -0
  19. package/dist/adaptercloud/context/AdapterCloudContext.js.map +1 -0
  20. package/dist/adaptercloud/context/index.js +1 -0
  21. package/dist/adaptercloud/hooks/useAdapterCloudApi.js +223 -0
  22. package/dist/adaptercloud/hooks/useAdapterCloudApi.js.map +1 -0
  23. package/dist/adaptercloud/index.js +7 -0
  24. package/dist/adaptercloud/mocks/data.js +1517 -0
  25. package/dist/adaptercloud/mocks/data.js.map +1 -0
  26. package/dist/adaptercloud/mocks/users.js +34 -0
  27. package/dist/adaptercloud/mocks/users.js.map +1 -0
  28. package/dist/adaptercloud/pages/HomePage.js +921 -0
  29. package/dist/adaptercloud/pages/HomePage.js.map +1 -0
  30. package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js +645 -0
  31. package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js.map +1 -0
  32. package/dist/adaptercloud/pages/admin/AdminDashboard.js +639 -0
  33. package/dist/adaptercloud/pages/admin/AdminDashboard.js.map +1 -0
  34. package/dist/adaptercloud/pages/admin/AdminFinancialPage.js +421 -0
  35. package/dist/adaptercloud/pages/admin/AdminFinancialPage.js.map +1 -0
  36. package/dist/adaptercloud/pages/admin/AdminOrdersPage.js +660 -0
  37. package/dist/adaptercloud/pages/admin/AdminOrdersPage.js.map +1 -0
  38. package/dist/adaptercloud/pages/admin/AdminProfilePage.js +259 -0
  39. package/dist/adaptercloud/pages/admin/AdminProfilePage.js.map +1 -0
  40. package/dist/adaptercloud/pages/admin/AdminSettingsPage.js +649 -0
  41. package/dist/adaptercloud/pages/admin/AdminSettingsPage.js.map +1 -0
  42. package/dist/adaptercloud/pages/admin/CartManagementPage.js +869 -0
  43. package/dist/adaptercloud/pages/admin/CartManagementPage.js.map +1 -0
  44. package/dist/adaptercloud/pages/admin/UserManagementPage.js +893 -0
  45. package/dist/adaptercloud/pages/admin/UserManagementPage.js.map +1 -0
  46. package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js +834 -0
  47. package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js.map +1 -0
  48. package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js +700 -0
  49. package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js.map +1 -0
  50. package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js +760 -0
  51. package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js.map +1 -0
  52. package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js +886 -0
  53. package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js.map +1 -0
  54. package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js +631 -0
  55. package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js.map +1 -0
  56. package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js +913 -0
  57. package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js.map +1 -0
  58. package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js +881 -0
  59. package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js.map +1 -0
  60. package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js +833 -0
  61. package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js.map +1 -0
  62. package/dist/adaptercloud/pages/common/HelpSupportPage.js +1325 -0
  63. package/dist/adaptercloud/pages/common/HelpSupportPage.js.map +1 -0
  64. package/dist/adaptercloud/pages/common/NotificationCenterPage.js +665 -0
  65. package/dist/adaptercloud/pages/common/NotificationCenterPage.js.map +1 -0
  66. package/dist/adaptercloud/pages/common/SettingsPage.js +964 -0
  67. package/dist/adaptercloud/pages/common/SettingsPage.js.map +1 -0
  68. package/dist/adaptercloud/pages/customer/BookingDetailsPage.js +593 -0
  69. package/dist/adaptercloud/pages/customer/BookingDetailsPage.js.map +1 -0
  70. package/dist/adaptercloud/pages/customer/CartDetailPage.js +620 -0
  71. package/dist/adaptercloud/pages/customer/CartDetailPage.js.map +1 -0
  72. package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js +547 -0
  73. package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js.map +1 -0
  74. package/dist/adaptercloud/pages/customer/CheckoutPage.js +532 -0
  75. package/dist/adaptercloud/pages/customer/CheckoutPage.js.map +1 -0
  76. package/dist/adaptercloud/pages/customer/CustomerDashboard.js +496 -0
  77. package/dist/adaptercloud/pages/customer/CustomerDashboard.js.map +1 -0
  78. package/dist/adaptercloud/pages/customer/CustomerProfilePage.js +621 -0
  79. package/dist/adaptercloud/pages/customer/CustomerProfilePage.js.map +1 -0
  80. package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js +623 -0
  81. package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js.map +1 -0
  82. package/dist/adaptercloud/pages/customer/FavoritesPage.js +477 -0
  83. package/dist/adaptercloud/pages/customer/FavoritesPage.js.map +1 -0
  84. package/dist/adaptercloud/pages/customer/OrderHistoryPage.js +438 -0
  85. package/dist/adaptercloud/pages/customer/OrderHistoryPage.js.map +1 -0
  86. package/dist/adaptercloud/pages/customer/OrderTrackingPage.js +388 -0
  87. package/dist/adaptercloud/pages/customer/OrderTrackingPage.js.map +1 -0
  88. package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js +488 -0
  89. package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js.map +1 -0
  90. package/dist/adaptercloud/pages/customer/ReviewsPage.js +606 -0
  91. package/dist/adaptercloud/pages/customer/ReviewsPage.js.map +1 -0
  92. package/dist/adaptercloud/pages/customer/SavedAddressesPage.js +443 -0
  93. package/dist/adaptercloud/pages/customer/SavedAddressesPage.js.map +1 -0
  94. package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js +849 -0
  95. package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js.map +1 -0
  96. package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js +939 -0
  97. package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js.map +1 -0
  98. package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js +681 -0
  99. package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js.map +1 -0
  100. package/dist/adaptercloud/pages/investor/InvestorDashboard.js +419 -0
  101. package/dist/adaptercloud/pages/investor/InvestorDashboard.js.map +1 -0
  102. package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js +399 -0
  103. package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js.map +1 -0
  104. package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js +569 -0
  105. package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js.map +1 -0
  106. package/dist/adaptercloud/pages/investor/InvestorProfilePage.js +1065 -0
  107. package/dist/adaptercloud/pages/investor/InvestorProfilePage.js.map +1 -0
  108. package/dist/adaptercloud/pages/worker/TaskDetailsPage.js +496 -0
  109. package/dist/adaptercloud/pages/worker/TaskDetailsPage.js.map +1 -0
  110. package/dist/adaptercloud/pages/worker/WorkerDashboard.js +634 -0
  111. package/dist/adaptercloud/pages/worker/WorkerDashboard.js.map +1 -0
  112. package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js +675 -0
  113. package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js.map +1 -0
  114. package/dist/adaptercloud/pages/worker/WorkerProfilePage.js +687 -0
  115. package/dist/adaptercloud/pages/worker/WorkerProfilePage.js.map +1 -0
  116. package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js +578 -0
  117. package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js.map +1 -0
  118. package/dist/adaptercloud/store/adaptercloudStore.js +38 -0
  119. package/dist/adaptercloud/store/adaptercloudStore.js.map +1 -0
  120. package/dist/adaptercloud/store/index.js +1 -0
  121. package/dist/adaptercloud/utils/cn.js +10 -0
  122. package/dist/adaptercloud/utils/cn.js.map +1 -0
  123. package/dist/adaptercloud/utils/formatters.js +51 -0
  124. package/dist/adaptercloud/utils/formatters.js.map +1 -0
  125. package/dist/adaptercloud/utils/navigation.js +9 -0
  126. package/dist/adaptercloud/utils/navigation.js.map +1 -0
  127. package/dist/index.js +7 -0
  128. package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js +18 -0
  129. package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +1 -0
  130. package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js +1674 -0
  131. package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  132. package/package.json +106 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvestmentOpportunitiesPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/investor/InvestmentOpportunitiesPage.tsx"],"sourcesContent":["/**\n * Investment Opportunities Page\n * @module adaptercloud/pages/investor\n *\n * Platform stats, 6 filters (search/category/risk/amount/location/sort),\n * invest modal with amount calculator, opportunity cards with images/funding\n * progress/business metrics/documents.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport {\n Search,\n SlidersHorizontal,\n MapPin,\n Star,\n Clock,\n Users,\n TrendingUp,\n FileText,\n IndianRupee,\n Eye,\n X,\n Briefcase,\n Target,\n Award,\n CheckCircle2,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatNumber } from '../../utils/formatters';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface InvestmentOpportunity {\n id: string;\n cartId: string;\n cartName: string;\n cartOwner: string;\n description: string;\n targetAmount: number;\n raisedAmount: number;\n minimumInvestment: number;\n maximumInvestment: number;\n investorCount: number;\n daysLeft: number;\n expectedReturns: number;\n paybackPeriod: number;\n riskLevel: 'low' | 'medium' | 'high';\n category: string;\n location: string;\n image: string;\n businessMetrics: {\n monthlyRevenue: number;\n monthlyOrders: number;\n averageOrderValue: number;\n rating: number;\n reviewCount: number;\n operatingSince: string;\n };\n financials: {\n grossMargin: number;\n netMargin: number;\n monthlyExpenses: number;\n breakEvenAchieved: boolean;\n };\n investmentTerms: {\n equityOffered: number;\n dividendFrequency: 'monthly' | 'quarterly' | 'yearly';\n lockInPeriod: number;\n exitOptions: string[];\n };\n documents: Array<{ name: string; type: string; uploadedOn: string }>;\n status: 'active' | 'funded' | 'closed';\n}\n\ninterface OpportunityFilters {\n searchQuery: string;\n category: string;\n riskLevel: string;\n minimumAmount: string;\n location: string;\n sortBy: string;\n}\n\n// ---------------------------------------------------------------------------\n// Mock data\n// ---------------------------------------------------------------------------\n\nconst mockOpportunities: InvestmentOpportunity[] = [\n {\n id: 'opp-001',\n cartId: 'cart-005',\n cartName: 'Organic Salad Bar',\n cartOwner: 'Sarah Johnson',\n description:\n 'Premium organic salad bar serving health-conscious customers in tech parks. Looking to expand to 3 new locations.',\n targetAmount: 500000,\n raisedAmount: 325000,\n minimumInvestment: 25000,\n maximumInvestment: 100000,\n investorCount: 8,\n daysLeft: 15,\n expectedReturns: 22,\n paybackPeriod: 36,\n riskLevel: 'low',\n category: 'Healthy Food',\n location: 'Whitefield, Bangalore',\n image: 'https://images.unsplash.com/photo-1512621776951-a57141f2eefd?w=400',\n businessMetrics: {\n monthlyRevenue: 280000,\n monthlyOrders: 1800,\n averageOrderValue: 156,\n rating: 4.9,\n reviewCount: 342,\n operatingSince: '2022-03-15',\n },\n financials: {\n grossMargin: 65,\n netMargin: 28,\n monthlyExpenses: 78000,\n breakEvenAchieved: true,\n },\n investmentTerms: {\n equityOffered: 25,\n dividendFrequency: 'monthly',\n lockInPeriod: 24,\n exitOptions: ['Buyback', 'Secondary Sale', 'IPO'],\n },\n documents: [\n { name: 'Business Plan', type: 'PDF', uploadedOn: '2024-06-01' },\n { name: 'Financial Statements', type: 'PDF', uploadedOn: '2024-06-01' },\n { name: 'Legal Documents', type: 'PDF', uploadedOn: '2024-06-01' },\n ],\n status: 'active',\n },\n {\n id: 'opp-002',\n cartId: 'cart-006',\n cartName: 'Midnight Munchies',\n cartOwner: 'Ravi Mehta',\n description:\n 'Late-night food delivery cart specializing in comfort food for night shift workers and students. Operating near IT corridors.',\n targetAmount: 300000,\n raisedAmount: 180000,\n minimumInvestment: 15000,\n maximumInvestment: 75000,\n investorCount: 12,\n daysLeft: 22,\n expectedReturns: 18,\n paybackPeriod: 30,\n riskLevel: 'medium',\n category: 'Fast Food',\n location: 'Electronic City, Bangalore',\n image: 'https://images.unsplash.com/photo-1565299624946-b28f40a0ae38?w=400',\n businessMetrics: {\n monthlyRevenue: 195000,\n monthlyOrders: 1200,\n averageOrderValue: 163,\n rating: 4.7,\n reviewCount: 256,\n operatingSince: '2023-01-10',\n },\n financials: {\n grossMargin: 58,\n netMargin: 22,\n monthlyExpenses: 65000,\n breakEvenAchieved: true,\n },\n investmentTerms: {\n equityOffered: 20,\n dividendFrequency: 'quarterly',\n lockInPeriod: 18,\n exitOptions: ['Buyback', 'Secondary Sale'],\n },\n documents: [\n { name: 'Business Plan', type: 'PDF', uploadedOn: '2024-06-05' },\n { name: 'Market Analysis', type: 'PDF', uploadedOn: '2024-06-05' },\n ],\n status: 'active',\n },\n {\n id: 'opp-003',\n cartId: 'cart-007',\n cartName: 'Fusion Street Tacos',\n cartOwner: 'Maria Rodriguez',\n description:\n 'Innovative fusion taco cart combining Mexican and Indian flavors. Winner of Street Food Awards 2023.',\n targetAmount: 400000,\n raisedAmount: 400000,\n minimumInvestment: 20000,\n maximumInvestment: 80000,\n investorCount: 15,\n daysLeft: 0,\n expectedReturns: 25,\n paybackPeriod: 24,\n riskLevel: 'low',\n category: 'Fusion Food',\n location: 'Indiranagar, Bangalore',\n image: 'https://images.unsplash.com/photo-1551504734-5ee1c4a1479b?w=400',\n businessMetrics: {\n monthlyRevenue: 320000,\n monthlyOrders: 2100,\n averageOrderValue: 152,\n rating: 4.8,\n reviewCount: 512,\n operatingSince: '2021-08-20',\n },\n financials: {\n grossMargin: 68,\n netMargin: 32,\n monthlyExpenses: 85000,\n breakEvenAchieved: true,\n },\n investmentTerms: {\n equityOffered: 30,\n dividendFrequency: 'monthly',\n lockInPeriod: 12,\n exitOptions: ['Buyback', 'Franchise Conversion'],\n },\n documents: [\n { name: 'Business Plan', type: 'PDF', uploadedOn: '2024-05-20' },\n { name: 'Awards & Recognition', type: 'PDF', uploadedOn: '2024-05-20' },\n ],\n status: 'funded',\n },\n {\n id: 'opp-004',\n cartId: 'cart-008',\n cartName: 'Bubble Tea Express',\n cartOwner: 'Chen Wei',\n description:\n 'Trendy bubble tea cart with proprietary recipes. Planning expansion through franchise model.',\n targetAmount: 600000,\n raisedAmount: 120000,\n minimumInvestment: 30000,\n maximumInvestment: 150000,\n investorCount: 4,\n daysLeft: 45,\n expectedReturns: 20,\n paybackPeriod: 36,\n riskLevel: 'high',\n category: 'Beverages',\n location: 'Koramangala, Bangalore',\n image: 'https://images.unsplash.com/photo-1558857563-b371033873b8?w=400',\n businessMetrics: {\n monthlyRevenue: 150000,\n monthlyOrders: 900,\n averageOrderValue: 167,\n rating: 4.6,\n reviewCount: 189,\n operatingSince: '2023-11-01',\n },\n financials: {\n grossMargin: 72,\n netMargin: 18,\n monthlyExpenses: 55000,\n breakEvenAchieved: false,\n },\n investmentTerms: {\n equityOffered: 35,\n dividendFrequency: 'quarterly',\n lockInPeriod: 36,\n exitOptions: ['Franchise Sale', 'Acquisition'],\n },\n documents: [\n { name: 'Franchise Plan', type: 'PDF', uploadedOn: '2024-06-10' },\n { name: 'Recipe Patents', type: 'PDF', uploadedOn: '2024-06-10' },\n ],\n status: 'active',\n },\n];\n\nconst platformStats = {\n totalOpportunities: 24,\n averageReturns: 21.5,\n totalFunded: 15600000,\n successRate: 89,\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getRiskBadgeColor(risk: string): string {\n switch (risk) {\n case 'low':\n return 'bg-green-500/20 text-green-600 dark:text-green-400';\n case 'medium':\n return 'bg-yellow-500/20 text-yellow-600 dark:text-yellow-400';\n case 'high':\n return 'bg-red-500/20 text-red-600 dark:text-red-400';\n default:\n return 'bg-secondary text-secondary-foreground';\n }\n}\n\nfunction getRiskLabel(risk: string): string {\n switch (risk) {\n case 'low':\n return 'Low Risk';\n case 'medium':\n return 'Medium Risk';\n case 'high':\n return 'High Risk';\n default:\n return risk;\n }\n}\n\nfunction getFundingPercentage(raised: number, target: number): number {\n return target > 0 ? Math.min((raised / target) * 100, 100) : 0;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function InvestmentOpportunitiesPage() {\n const { navigateTo } = useAdapterCloud();\n const [isLoading, setIsLoading] = useState(true);\n const [selectedOpportunity, setSelectedOpportunity] = useState<InvestmentOpportunity | null>(\n null\n );\n const [showInvestModal, setShowInvestModal] = useState(false);\n const [investmentAmount, setInvestmentAmount] = useState('');\n const [investStatus, setInvestStatus] = useState<'idle' | 'success' | 'error'>('idle');\n\n const [filters, setFilters] = useState<OpportunityFilters>({\n searchQuery: '',\n category: '',\n riskLevel: '',\n minimumAmount: '',\n location: '',\n sortBy: 'featured',\n });\n\n useEffect(() => {\n const timer = setTimeout(() => setIsLoading(false), 600);\n return () => clearTimeout(timer);\n }, []);\n\n const handleFilterChange = useCallback((key: keyof OpportunityFilters, value: string) => {\n setFilters((prev) => ({ ...prev, [key]: value }));\n }, []);\n\n const filteredOpportunities = useMemo(() => {\n let filtered = [...mockOpportunities];\n\n // Search\n if (filters.searchQuery.trim()) {\n const query = filters.searchQuery.toLowerCase();\n filtered = filtered.filter(\n (opp) =>\n opp.cartName.toLowerCase().includes(query) ||\n opp.description.toLowerCase().includes(query) ||\n opp.category.toLowerCase().includes(query)\n );\n }\n\n // Category\n if (filters.category) {\n filtered = filtered.filter((opp) => opp.category === filters.category);\n }\n\n // Risk level\n if (filters.riskLevel) {\n filtered = filtered.filter((opp) => opp.riskLevel === filters.riskLevel);\n }\n\n // Location\n if (filters.location) {\n filtered = filtered.filter((opp) => opp.location.includes(filters.location));\n }\n\n // Minimum amount\n if (filters.minimumAmount) {\n const minAmount = parseInt(filters.minimumAmount, 10);\n filtered = filtered.filter((opp) => opp.minimumInvestment <= minAmount);\n }\n\n // Sort\n switch (filters.sortBy) {\n case 'returns':\n filtered.sort((a, b) => b.expectedReturns - a.expectedReturns);\n break;\n case 'funding':\n filtered.sort((a, b) => b.raisedAmount / b.targetAmount - a.raisedAmount / a.targetAmount);\n break;\n case 'closing':\n filtered.sort((a, b) => a.daysLeft - b.daysLeft);\n break;\n case 'minimum':\n filtered.sort((a, b) => a.minimumInvestment - b.minimumInvestment);\n break;\n default:\n break;\n }\n\n return filtered;\n }, [filters]);\n\n const handleInvest = useCallback(() => {\n if (!selectedOpportunity || !investmentAmount) return;\n\n const amount = parseInt(investmentAmount, 10);\n if (isNaN(amount)) return;\n\n if (amount < selectedOpportunity.minimumInvestment) {\n setInvestStatus('error');\n return;\n }\n if (amount > selectedOpportunity.maximumInvestment) {\n setInvestStatus('error');\n return;\n }\n\n setInvestStatus('success');\n setTimeout(() => {\n setShowInvestModal(false);\n setInvestmentAmount('');\n setInvestStatus('idle');\n navigateTo('/investor/portfolio');\n }, 1500);\n }, [selectedOpportunity, investmentAmount, navigateTo]);\n\n const openInvestModal = useCallback((opportunity: InvestmentOpportunity) => {\n setSelectedOpportunity(opportunity);\n setInvestmentAmount('');\n setInvestStatus('idle');\n setShowInvestModal(true);\n }, []);\n\n if (isLoading) {\n return (\n <PageLayout title=\"Investment Opportunities\" description=\"Loading opportunities...\">\n <div className=\"flex items-center justify-center py-20\">\n <div className=\"text-center\">\n <div className=\"mx-auto mb-4 h-12 w-12 animate-spin rounded-full border-b-2 border-primary\" />\n <p className=\"text-sm text-muted-foreground\">Loading opportunities...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Investment Opportunities\"\n description=\"Discover and invest in growing local businesses\"\n actions={\n <span className=\"text-sm text-muted-foreground\">\n {filteredOpportunities.length} opportunities\n </span>\n }\n >\n {/* Platform Stats */}\n <div className=\"grid grid-cols-2 gap-3 sm:gap-4 lg:grid-cols-4\">\n <div className=\"rounded-lg border border-border bg-card p-3 sm:p-4\">\n <p className=\"text-xs text-muted-foreground\">Active Opportunities</p>\n <p className=\"text-lg font-bold text-foreground sm:text-2xl\">\n {platformStats.totalOpportunities}\n </p>\n </div>\n <div className=\"rounded-lg border border-border bg-card p-3 sm:p-4\">\n <p className=\"text-xs text-muted-foreground\">Average Returns</p>\n <p className=\"text-lg font-bold text-green-600 dark:text-green-400 sm:text-2xl\">\n {platformStats.averageReturns}%\n </p>\n </div>\n <div className=\"rounded-lg border border-border bg-card p-3 sm:p-4\">\n <p className=\"text-xs text-muted-foreground\">Total Funded</p>\n <p className=\"text-lg font-bold text-foreground sm:text-2xl\">\n {formatCurrency(platformStats.totalFunded, {\n minimumFractionDigits: 0,\n notation: 'compact',\n })}\n </p>\n </div>\n <div className=\"rounded-lg border border-border bg-card p-3 sm:p-4\">\n <p className=\"text-xs text-muted-foreground\">Success Rate</p>\n <p className=\"text-lg font-bold text-foreground sm:text-2xl\">\n {platformStats.successRate}%\n </p>\n </div>\n </div>\n\n {/* Filters */}\n <div className=\"mt-6 rounded-lg border border-border bg-card p-4 sm:p-6\">\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6\">\n {/* Search */}\n <div className=\"relative sm:col-span-2 lg:col-span-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <input\n type=\"text\"\n placeholder=\"Search opportunities...\"\n value={filters.searchQuery}\n onChange={(e) => handleFilterChange('searchQuery', e.target.value)}\n className=\"w-full rounded-lg border border-border bg-card py-2 pl-10 pr-4 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n\n {/* Category */}\n <select\n value={filters.category}\n onChange={(e) => handleFilterChange('category', e.target.value)}\n className=\"rounded-lg border border-border bg-card px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n >\n <option value=\"\">All Categories</option>\n <option value=\"Healthy Food\">Healthy Food</option>\n <option value=\"Fast Food\">Fast Food</option>\n <option value=\"Fusion Food\">Fusion Food</option>\n <option value=\"Beverages\">Beverages</option>\n <option value=\"Street Food\">Street Food</option>\n </select>\n\n {/* Risk Level */}\n <select\n value={filters.riskLevel}\n onChange={(e) => handleFilterChange('riskLevel', e.target.value)}\n className=\"rounded-lg border border-border bg-card px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n >\n <option value=\"\">All Risk Levels</option>\n <option value=\"low\">Low Risk</option>\n <option value=\"medium\">Medium Risk</option>\n <option value=\"high\">High Risk</option>\n </select>\n\n {/* Minimum Amount */}\n <select\n value={filters.minimumAmount}\n onChange={(e) => handleFilterChange('minimumAmount', e.target.value)}\n className=\"rounded-lg border border-border bg-card px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n >\n <option value=\"\">Any Amount</option>\n <option value=\"15000\">Under &#x20B9;15,000</option>\n <option value=\"25000\">Under &#x20B9;25,000</option>\n <option value=\"50000\">Under &#x20B9;50,000</option>\n <option value=\"100000\">Under &#x20B9;1,00,000</option>\n </select>\n\n {/* Location */}\n <select\n value={filters.location}\n onChange={(e) => handleFilterChange('location', e.target.value)}\n className=\"rounded-lg border border-border bg-card px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n >\n <option value=\"\">All Locations</option>\n <option value=\"Whitefield\">Whitefield</option>\n <option value=\"Koramangala\">Koramangala</option>\n <option value=\"Indiranagar\">Indiranagar</option>\n <option value=\"Electronic City\">Electronic City</option>\n </select>\n\n {/* Sort By */}\n <select\n value={filters.sortBy}\n onChange={(e) => handleFilterChange('sortBy', e.target.value)}\n className=\"rounded-lg border border-border bg-card px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n >\n <option value=\"featured\">Featured</option>\n <option value=\"returns\">Highest Returns</option>\n <option value=\"funding\">Most Funded</option>\n <option value=\"closing\">Closing Soon</option>\n <option value=\"minimum\">Lowest Minimum</option>\n </select>\n </div>\n </div>\n\n {/* Opportunities Grid */}\n {filteredOpportunities.length === 0 ? (\n <div className=\"mt-6\">\n <EmptyState\n icon={<Search className=\"h-10 w-10\" />}\n title=\"No opportunities found\"\n description=\"Try adjusting your filters to find more opportunities\"\n action={\n <button\n type=\"button\"\n onClick={() =>\n setFilters({\n searchQuery: '',\n category: '',\n riskLevel: '',\n minimumAmount: '',\n location: '',\n sortBy: 'featured',\n })\n }\n className=\"rounded-lg bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors\"\n >\n Clear Filters\n </button>\n }\n />\n </div>\n ) : (\n <div className=\"mt-6 grid grid-cols-1 gap-4 lg:grid-cols-2\">\n {filteredOpportunities.map((opportunity) => {\n const fundingPct = getFundingPercentage(\n opportunity.raisedAmount,\n opportunity.targetAmount\n );\n\n return (\n <div\n key={opportunity.id}\n className=\"rounded-lg border border-border bg-card shadow-sm hover:shadow-md transition-shadow\"\n >\n {/* Image */}\n <div className=\"relative\">\n <div className=\"h-40 w-full overflow-hidden rounded-t-lg bg-muted sm:h-48\">\n <img\n src={opportunity.image}\n alt={opportunity.cartName}\n className=\"h-full w-full object-cover\"\n loading=\"lazy\"\n />\n </div>\n {opportunity.status === 'funded' && (\n <div className=\"absolute right-2 top-2 rounded-full bg-green-500 px-2 py-1 text-xs font-medium text-white sm:right-4 sm:top-4 sm:px-3\">\n Fully Funded\n </div>\n )}\n {opportunity.daysLeft > 0 && opportunity.daysLeft <= 7 && (\n <div className=\"absolute left-2 top-2 rounded-full bg-red-500 px-2 py-1 text-xs font-medium text-white sm:left-4 sm:top-4 sm:px-3\">\n {opportunity.daysLeft} days left\n </div>\n )}\n </div>\n\n <div className=\"p-4 sm:p-6\">\n {/* Header */}\n <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"flex-1\">\n <h3 className=\"text-base font-semibold text-foreground sm:text-xl\">\n {opportunity.cartName}\n </h3>\n <p className=\"text-xs text-muted-foreground sm:text-sm\">\n by {opportunity.cartOwner}\n </p>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <span className=\"text-xs text-muted-foreground sm:text-sm\">\n {opportunity.category}\n </span>\n <span\n className={cn(\n 'rounded-full px-2 py-0.5 text-xs font-medium',\n getRiskBadgeColor(opportunity.riskLevel)\n )}\n >\n {getRiskLabel(opportunity.riskLevel)}\n </span>\n </div>\n </div>\n <div className=\"text-left sm:text-right\">\n <p className=\"text-xl font-bold text-green-600 dark:text-green-400 sm:text-2xl\">\n {opportunity.expectedReturns}%\n </p>\n <p className=\"text-xs text-muted-foreground\">Expected Returns</p>\n </div>\n </div>\n\n {/* Description */}\n <p className=\"mb-4 text-sm leading-relaxed text-muted-foreground line-clamp-2\">\n {opportunity.description}\n </p>\n\n {/* Funding Progress */}\n <div className=\"mb-4\">\n <div className=\"mb-1 flex justify-between text-xs sm:text-sm\">\n <span className=\"font-medium text-foreground\">\n {formatCurrency(opportunity.raisedAmount, { minimumFractionDigits: 0 })}{' '}\n raised\n </span>\n <span className=\"text-muted-foreground\">\n of {formatCurrency(opportunity.targetAmount, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"h-2 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-full rounded-full bg-primary transition-all duration-300\"\n style={{ width: `${fundingPct}%` }}\n />\n </div>\n <div className=\"mt-1 flex justify-between text-xs text-muted-foreground\">\n <span>{opportunity.investorCount} investors</span>\n <span>{fundingPct.toFixed(0)}% funded</span>\n </div>\n </div>\n\n {/* Key Metrics */}\n <div className=\"mb-4 grid grid-cols-3 gap-2 text-center sm:gap-4\">\n <div>\n <p className=\"text-sm font-bold text-foreground sm:text-lg\">\n {formatCurrency(opportunity.minimumInvestment, {\n minimumFractionDigits: 0,\n })}\n </p>\n <p className=\"text-xs text-muted-foreground\">Min Investment</p>\n </div>\n <div>\n <p className=\"text-sm font-bold text-foreground sm:text-lg\">\n {opportunity.paybackPeriod} mo\n </p>\n <p className=\"text-xs text-muted-foreground\">Payback Period</p>\n </div>\n <div>\n <div className=\"flex items-center justify-center gap-1\">\n <Star className=\"h-3.5 w-3.5 fill-yellow-400 text-yellow-400\" />\n <p className=\"text-sm font-bold text-foreground sm:text-lg\">\n {opportunity.businessMetrics.rating}\n </p>\n </div>\n <p className=\"text-xs text-muted-foreground\">Rating</p>\n </div>\n </div>\n\n {/* Business Performance */}\n <div className=\"mb-4 border-t border-border pt-3 sm:pt-4\">\n <p className=\"mb-2 text-xs font-medium text-muted-foreground sm:text-sm\">\n Business Performance\n </p>\n <div className=\"grid grid-cols-1 gap-2 text-xs sm:grid-cols-2 sm:text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Monthly Revenue:</span>\n <span className=\"font-medium text-foreground\">\n {formatCurrency(opportunity.businessMetrics.monthlyRevenue, {\n minimumFractionDigits: 0,\n })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Gross Margin:</span>\n <span className=\"font-medium text-foreground\">\n {opportunity.financials.grossMargin}%\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Monthly Orders:</span>\n <span className=\"font-medium text-foreground\">\n {formatNumber(opportunity.businessMetrics.monthlyOrders)}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Net Margin:</span>\n <span className=\"font-medium text-foreground\">\n {opportunity.financials.netMargin}%\n </span>\n </div>\n </div>\n </div>\n\n {/* Documents */}\n <div className=\"mb-4 border-t border-border pt-3\">\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <FileText className=\"h-3.5 w-3.5\" />\n <span>{opportunity.documents.length} documents available</span>\n </div>\n </div>\n\n {/* Location */}\n <div className=\"mb-4 flex items-center gap-1.5 text-xs text-muted-foreground\">\n <MapPin className=\"h-3.5 w-3.5\" />\n <span>{opportunity.location}</span>\n </div>\n\n {/* Actions */}\n <div className=\"flex flex-col gap-2 sm:flex-row sm:gap-3\">\n <button\n type=\"button\"\n onClick={() => openInvestModal(opportunity)}\n disabled={opportunity.status === 'funded'}\n className={cn(\n 'flex-1 rounded-lg px-4 py-2.5 text-sm font-medium transition-colors',\n opportunity.status === 'funded'\n ? 'cursor-not-allowed bg-muted text-muted-foreground'\n : 'bg-primary text-primary-foreground hover:bg-primary/90'\n )}\n >\n {opportunity.status === 'funded' ? 'Fully Funded' : 'Invest Now'}\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/investor/opportunities/${opportunity.id}`)}\n className=\"flex flex-1 items-center justify-center gap-2 rounded-lg border border-border px-4 py-2.5 text-sm font-medium text-foreground hover:bg-accent transition-colors\"\n >\n <Eye className=\"h-4 w-4\" />\n View Details\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {/* Investment Modal */}\n {showInvestModal && selectedOpportunity && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\n <div className=\"relative max-h-[90vh] w-full max-w-md overflow-y-auto rounded-lg border border-border bg-card p-4 sm:p-6\">\n {/* Close button */}\n <button\n type=\"button\"\n onClick={() => {\n setShowInvestModal(false);\n setInvestmentAmount('');\n setInvestStatus('idle');\n }}\n className=\"absolute right-3 top-3 rounded-lg p-1 text-muted-foreground hover:bg-accent transition-colors\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n\n <h3 className=\"mb-4 text-base font-semibold text-foreground sm:text-lg\">\n Invest in {selectedOpportunity.cartName}\n </h3>\n\n {investStatus === 'success' ? (\n <div className=\"py-8 text-center\">\n <CheckCircle2 className=\"mx-auto mb-3 h-12 w-12 text-green-600 dark:text-green-400\" />\n <p className=\"text-sm font-medium text-foreground\">Investment successful!</p>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Redirecting to your portfolio...\n </p>\n </div>\n ) : (\n <div className=\"space-y-4\">\n {/* Investment Range */}\n <div>\n <p className=\"mb-1 text-xs text-muted-foreground sm:text-sm\">Investment Range</p>\n <p className=\"text-sm font-medium text-foreground sm:text-base\">\n {formatCurrency(selectedOpportunity.minimumInvestment, {\n minimumFractionDigits: 0,\n })}{' '}\n -{' '}\n {formatCurrency(selectedOpportunity.maximumInvestment, {\n minimumFractionDigits: 0,\n })}\n </p>\n </div>\n\n {/* Amount Input */}\n <div>\n <label className=\"mb-1 block text-xs font-medium text-foreground sm:text-sm\">\n Investment Amount\n </label>\n <div className=\"relative\">\n <IndianRupee className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <input\n type=\"number\"\n value={investmentAmount}\n onChange={(e) => {\n setInvestmentAmount(e.target.value);\n setInvestStatus('idle');\n }}\n placeholder=\"Enter amount\"\n className=\"w-full rounded-lg border border-border bg-card py-2 pl-10 pr-4 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n {investStatus === 'error' && (\n <p className=\"mt-1 text-xs text-red-600 dark:text-red-400\">\n Amount must be between{' '}\n {formatCurrency(selectedOpportunity.minimumInvestment, {\n minimumFractionDigits: 0,\n })}{' '}\n and{' '}\n {formatCurrency(selectedOpportunity.maximumInvestment, {\n minimumFractionDigits: 0,\n })}\n </p>\n )}\n </div>\n\n {/* Returns Calculator */}\n {investmentAmount &&\n !isNaN(parseInt(investmentAmount, 10)) &&\n parseInt(investmentAmount, 10) > 0 && (\n <div className=\"rounded-lg border border-border bg-muted/50 p-3 sm:p-4\">\n <p className=\"mb-2 text-xs text-muted-foreground sm:text-sm\">\n Expected Returns\n </p>\n <div className=\"space-y-1.5\">\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-foreground sm:text-sm\">Investment:</span>\n <span className=\"text-xs font-medium text-foreground sm:text-sm\">\n {formatCurrency(parseInt(investmentAmount, 10), {\n minimumFractionDigits: 0,\n })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-xs text-foreground sm:text-sm\">\n Expected Return ({selectedOpportunity.expectedReturns}%):\n </span>\n <span className=\"text-xs font-medium text-green-600 dark:text-green-400 sm:text-sm\">\n +\n {formatCurrency(\n (parseInt(investmentAmount, 10) *\n selectedOpportunity.expectedReturns) /\n 100,\n { minimumFractionDigits: 0 }\n )}\n </span>\n </div>\n <div className=\"flex justify-between border-t border-border pt-2\">\n <span className=\"text-xs font-medium text-foreground sm:text-sm\">\n Total Value:\n </span>\n <span className=\"text-xs font-bold text-foreground sm:text-sm\">\n {formatCurrency(\n parseInt(investmentAmount, 10) *\n (1 + selectedOpportunity.expectedReturns / 100),\n { minimumFractionDigits: 0 }\n )}\n </span>\n </div>\n </div>\n </div>\n )}\n\n {/* Investment Terms */}\n <div className=\"space-y-1 text-xs text-muted-foreground sm:text-sm\">\n <p>\n &bull; Minimum lock-in period:{' '}\n {selectedOpportunity.investmentTerms.lockInPeriod} months\n </p>\n <p>\n &bull; Dividend frequency:{' '}\n {selectedOpportunity.investmentTerms.dividendFrequency}\n </p>\n <p>\n &bull; Your equity stake:{' '}\n {(\n ((parseInt(investmentAmount, 10) || 0) / selectedOpportunity.targetAmount) *\n selectedOpportunity.investmentTerms.equityOffered\n ).toFixed(2)}\n %\n </p>\n <p>\n &bull; Exit options:{' '}\n {selectedOpportunity.investmentTerms.exitOptions.join(', ')}\n </p>\n </div>\n\n {/* Actions */}\n <div className=\"flex flex-col gap-2 pt-2 sm:flex-row sm:gap-3\">\n <button\n type=\"button\"\n onClick={() => {\n setShowInvestModal(false);\n setInvestmentAmount('');\n setInvestStatus('idle');\n }}\n className=\"flex-1 rounded-lg border border-border px-4 py-2.5 text-sm font-medium text-foreground hover:bg-accent transition-colors\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleInvest}\n disabled={\n !investmentAmount ||\n isNaN(parseInt(investmentAmount, 10)) ||\n parseInt(investmentAmount, 10) < selectedOpportunity.minimumInvestment\n }\n className={cn(\n 'flex-1 rounded-lg px-4 py-2.5 text-sm font-medium transition-colors',\n !investmentAmount ||\n isNaN(parseInt(investmentAmount, 10)) ||\n parseInt(investmentAmount, 10) < selectedOpportunity.minimumInvestment\n ? 'cursor-not-allowed bg-muted text-muted-foreground'\n : 'bg-primary text-primary-foreground hover:bg-primary/90'\n )}\n >\n Confirm Investment\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}