@burdenoff/microfe-adaptercloud 2026.624.1 → 2026.625.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 (103) hide show
  1. package/dist/adaptercloud/components/EmptyState.js +17 -21
  2. package/dist/adaptercloud/components/EmptyState.js.map +1 -1
  3. package/dist/adaptercloud/components/InvestmentCard.js +25 -23
  4. package/dist/adaptercloud/components/InvestmentCard.js.map +1 -1
  5. package/dist/adaptercloud/components/MetricsCard.js +18 -12
  6. package/dist/adaptercloud/components/MetricsCard.js.map +1 -1
  7. package/dist/adaptercloud/components/PageLayout.js +38 -19
  8. package/dist/adaptercloud/components/PageLayout.js.map +1 -1
  9. package/dist/adaptercloud/components/RatingDisplay.js +3 -3
  10. package/dist/adaptercloud/components/RatingDisplay.js.map +1 -1
  11. package/dist/adaptercloud/components/StatusBadge.js +36 -16
  12. package/dist/adaptercloud/components/StatusBadge.js.map +1 -1
  13. package/dist/adaptercloud/pages/HomePage.js +242 -231
  14. package/dist/adaptercloud/pages/HomePage.js.map +1 -1
  15. package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js +33 -33
  16. package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js.map +1 -1
  17. package/dist/adaptercloud/pages/admin/AdminDashboard.js +32 -32
  18. package/dist/adaptercloud/pages/admin/AdminDashboard.js.map +1 -1
  19. package/dist/adaptercloud/pages/admin/AdminFinancialPage.js +11 -11
  20. package/dist/adaptercloud/pages/admin/AdminFinancialPage.js.map +1 -1
  21. package/dist/adaptercloud/pages/admin/AdminOrdersPage.js +11 -11
  22. package/dist/adaptercloud/pages/admin/AdminOrdersPage.js.map +1 -1
  23. package/dist/adaptercloud/pages/admin/AdminProfilePage.js +3 -3
  24. package/dist/adaptercloud/pages/admin/AdminProfilePage.js.map +1 -1
  25. package/dist/adaptercloud/pages/admin/AdminSettingsPage.js +1 -1
  26. package/dist/adaptercloud/pages/admin/AdminSettingsPage.js.map +1 -1
  27. package/dist/adaptercloud/pages/admin/CartManagementPage.js +28 -28
  28. package/dist/adaptercloud/pages/admin/CartManagementPage.js.map +1 -1
  29. package/dist/adaptercloud/pages/admin/UserManagementPage.js +25 -25
  30. package/dist/adaptercloud/pages/admin/UserManagementPage.js.map +1 -1
  31. package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js +19 -19
  32. package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  33. package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js +7 -7
  34. package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  35. package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js +40 -37
  36. package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  37. package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js +21 -21
  38. package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  39. package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js +24 -24
  40. package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  41. package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js +20 -20
  42. package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  43. package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js +36 -36
  44. package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js.map +1 -1
  45. package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js +25 -25
  46. package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js.map +1 -1
  47. package/dist/adaptercloud/pages/common/HelpSupportPage.js +43 -43
  48. package/dist/adaptercloud/pages/common/HelpSupportPage.js.map +1 -1
  49. package/dist/adaptercloud/pages/common/NotificationCenterPage.js +32 -31
  50. package/dist/adaptercloud/pages/common/NotificationCenterPage.js.map +1 -1
  51. package/dist/adaptercloud/pages/common/SettingsPage.js +8 -8
  52. package/dist/adaptercloud/pages/common/SettingsPage.js.map +1 -1
  53. package/dist/adaptercloud/pages/customer/BookingDetailsPage.js +22 -21
  54. package/dist/adaptercloud/pages/customer/BookingDetailsPage.js.map +1 -1
  55. package/dist/adaptercloud/pages/customer/CartDetailPage.js +18 -17
  56. package/dist/adaptercloud/pages/customer/CartDetailPage.js.map +1 -1
  57. package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js +12 -11
  58. package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js.map +1 -1
  59. package/dist/adaptercloud/pages/customer/CheckoutPage.js +9 -9
  60. package/dist/adaptercloud/pages/customer/CheckoutPage.js.map +1 -1
  61. package/dist/adaptercloud/pages/customer/CustomerDashboard.js +30 -30
  62. package/dist/adaptercloud/pages/customer/CustomerDashboard.js.map +1 -1
  63. package/dist/adaptercloud/pages/customer/CustomerProfilePage.js +19 -19
  64. package/dist/adaptercloud/pages/customer/CustomerProfilePage.js.map +1 -1
  65. package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js +24 -23
  66. package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js.map +1 -1
  67. package/dist/adaptercloud/pages/customer/FavoritesPage.js +9 -8
  68. package/dist/adaptercloud/pages/customer/FavoritesPage.js.map +1 -1
  69. package/dist/adaptercloud/pages/customer/OrderHistoryPage.js +4 -3
  70. package/dist/adaptercloud/pages/customer/OrderHistoryPage.js.map +1 -1
  71. package/dist/adaptercloud/pages/customer/OrderTrackingPage.js +15 -14
  72. package/dist/adaptercloud/pages/customer/OrderTrackingPage.js.map +1 -1
  73. package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js +10 -9
  74. package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js.map +1 -1
  75. package/dist/adaptercloud/pages/customer/ReviewsPage.js +18 -17
  76. package/dist/adaptercloud/pages/customer/ReviewsPage.js.map +1 -1
  77. package/dist/adaptercloud/pages/customer/SavedAddressesPage.js +14 -13
  78. package/dist/adaptercloud/pages/customer/SavedAddressesPage.js.map +1 -1
  79. package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js +32 -32
  80. package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js.map +1 -1
  81. package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js +14 -13
  82. package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  83. package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js +27 -27
  84. package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  85. package/dist/adaptercloud/pages/investor/InvestorDashboard.js +16 -16
  86. package/dist/adaptercloud/pages/investor/InvestorDashboard.js.map +1 -1
  87. package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js +9 -8
  88. package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  89. package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js +12 -12
  90. package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js.map +1 -1
  91. package/dist/adaptercloud/pages/investor/InvestorProfilePage.js +19 -19
  92. package/dist/adaptercloud/pages/investor/InvestorProfilePage.js.map +1 -1
  93. package/dist/adaptercloud/pages/worker/TaskDetailsPage.js +26 -25
  94. package/dist/adaptercloud/pages/worker/TaskDetailsPage.js.map +1 -1
  95. package/dist/adaptercloud/pages/worker/WorkerDashboard.js +43 -43
  96. package/dist/adaptercloud/pages/worker/WorkerDashboard.js.map +1 -1
  97. package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js +37 -36
  98. package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js.map +1 -1
  99. package/dist/adaptercloud/pages/worker/WorkerProfilePage.js +34 -34
  100. package/dist/adaptercloud/pages/worker/WorkerProfilePage.js.map +1 -1
  101. package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js +27 -25
  102. package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js.map +1 -1
  103. package/package.json +3 -3
@@ -1 +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-text-secondary\">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-text-secondary\">\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-subtle bg-bg-surface p-3 sm:p-4\">\n <p className=\"text-xs text-text-secondary\">Active Opportunities</p>\n <p className=\"text-lg font-bold text-text-primary sm:text-2xl\">\n {platformStats.totalOpportunities}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-3 sm:p-4\">\n <p className=\"text-xs text-text-secondary\">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-subtle bg-bg-surface p-3 sm:p-4\">\n <p className=\"text-xs text-text-secondary\">Total Funded</p>\n <p className=\"text-lg font-bold text-text-primary 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-subtle bg-bg-surface p-3 sm:p-4\">\n <p className=\"text-xs text-text-secondary\">Success Rate</p>\n <p className=\"text-lg font-bold text-text-primary 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-subtle bg-bg-surface 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-text-secondary\" />\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-subtle bg-bg-surface py-2 pl-10 pr-4 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n\n {/* Category */}\n <select\n value={filters.category}\n onChange={(e) => handleFilterChange('category', e.target.value)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-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-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-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-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-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-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-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-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-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-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n 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-subtle bg-bg-surface 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-bg-sunken 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-text-primary sm:text-xl\">\n {opportunity.cartName}\n </h3>\n <p className=\"text-xs text-text-secondary 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-text-secondary 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-text-secondary\">Expected Returns</p>\n </div>\n </div>\n\n {/* Description */}\n <p className=\"mb-4 text-sm leading-relaxed text-text-secondary 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-text-primary\">\n {formatCurrency(opportunity.raisedAmount, { minimumFractionDigits: 0 })}{' '}\n raised\n </span>\n <span className=\"text-text-secondary\">\n of {formatCurrency(opportunity.targetAmount, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"h-2 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className=\"h-full rounded-full bg-action-primary-bg transition-all duration-300\"\n style={{ width: `${fundingPct}%` }}\n />\n </div>\n <div className=\"mt-1 flex justify-between text-xs text-text-secondary\">\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-text-primary sm:text-lg\">\n {formatCurrency(opportunity.minimumInvestment, {\n minimumFractionDigits: 0,\n })}\n </p>\n <p className=\"text-xs text-text-secondary\">Min Investment</p>\n </div>\n <div>\n <p className=\"text-sm font-bold text-text-primary sm:text-lg\">\n {opportunity.paybackPeriod} mo\n </p>\n <p className=\"text-xs text-text-secondary\">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-text-primary sm:text-lg\">\n {opportunity.businessMetrics.rating}\n </p>\n </div>\n <p className=\"text-xs text-text-secondary\">Rating</p>\n </div>\n </div>\n\n {/* Business Performance */}\n <div className=\"mb-4 border-t border-border-subtle pt-3 sm:pt-4\">\n <p className=\"mb-2 text-xs font-medium text-text-secondary 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-text-secondary\">Monthly Revenue:</span>\n <span className=\"font-medium text-text-primary\">\n {formatCurrency(opportunity.businessMetrics.monthlyRevenue, {\n minimumFractionDigits: 0,\n })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Gross Margin:</span>\n <span className=\"font-medium text-text-primary\">\n {opportunity.financials.grossMargin}%\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Monthly Orders:</span>\n <span className=\"font-medium text-text-primary\">\n {formatNumber(opportunity.businessMetrics.monthlyOrders)}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Net Margin:</span>\n <span className=\"font-medium text-text-primary\">\n {opportunity.financials.netMargin}%\n </span>\n </div>\n </div>\n </div>\n\n {/* Documents */}\n <div className=\"mb-4 border-t border-border-subtle pt-3\">\n <div className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\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-text-secondary\">\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-bg-sunken text-text-secondary'\n : 'bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/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-subtle px-4 py-2.5 text-sm font-medium text-text-primary 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-subtle bg-bg-surface 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-text-secondary 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-text-primary 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-text-primary\">Investment successful!</p>\n <p className=\"mt-1 text-xs text-text-secondary\">\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-text-secondary sm:text-sm\">Investment Range</p>\n <p className=\"text-sm font-medium text-text-primary 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-text-primary 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-text-secondary\" />\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-subtle bg-bg-surface py-2 pl-10 pr-4 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n {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-subtle bg-bg-sunken/50 p-3 sm:p-4\">\n <p className=\"mb-2 text-xs text-text-secondary 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-text-primary sm:text-sm\">Investment:</span>\n <span className=\"text-xs font-medium text-text-primary 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-text-primary 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-subtle pt-2\">\n <span className=\"text-xs font-medium text-text-primary sm:text-sm\">\n Total Value:\n </span>\n <span className=\"text-xs font-bold text-text-primary 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-text-secondary 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-subtle px-4 py-2.5 text-sm font-medium text-text-primary 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-bg-sunken text-text-secondary'\n : 'bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/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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"}
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-status-success-bg-subtle/20 text-status-success-text';\n case'medium':\n return'bg-status-warning-bg-subtle/20 text-status-warning-text';\n case'high':\n return'bg-status-error-bg-subtle/20 text-status-error-text';\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-text-secondary\">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-text-secondary\">\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-subtle bg-bg-surface p-3 sm:p-4\">\n <p className=\"text-xs text-text-secondary\">Active Opportunities</p>\n <p className=\"text-lg font-bold text-text-primary sm:text-2xl\">\n {platformStats.totalOpportunities}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-3 sm:p-4\">\n <p className=\"text-xs text-text-secondary\">Average Returns</p>\n <p className=\"text-lg font-bold text-status-success-text sm:text-2xl\">\n {platformStats.averageReturns}%\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-3 sm:p-4\">\n <p className=\"text-xs text-text-secondary\">Total Funded</p>\n <p className=\"text-lg font-bold text-text-primary 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-subtle bg-bg-surface p-3 sm:p-4\">\n <p className=\"text-xs text-text-secondary\">Success Rate</p>\n <p className=\"text-lg font-bold text-text-primary 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-seam bg-bg-surface p-4 sm:p-6 bg-gloss-card shadow-pop\">\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-text-secondary\" />\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-subtle bg-bg-surface py-2 pl-10 pr-4 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n\n {/* Category */}\n <select\n value={filters.category}\n onChange={(e) => handleFilterChange('category', e.target.value)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-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-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-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-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-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-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-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-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-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 illustration=\"empty-search\"\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-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n 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-subtle bg-bg-surface 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-bg-sunken 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-status-success-bg-subtle 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-status-error-bg-subtle 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-text-primary sm:text-xl\">\n {opportunity.cartName}\n </h3>\n <p className=\"text-xs text-text-secondary 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-text-secondary 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-status-success-text sm:text-2xl\">\n {opportunity.expectedReturns}%\n </p>\n <p className=\"text-xs text-text-secondary\">Expected Returns</p>\n </div>\n </div>\n\n {/* Description */}\n <p className=\"mb-4 text-sm leading-relaxed text-text-secondary 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-text-primary\">\n {formatCurrency(opportunity.raisedAmount, { minimumFractionDigits: 0 })}{' '}\n raised\n </span>\n <span className=\"text-text-secondary\">\n of {formatCurrency(opportunity.targetAmount, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"h-2 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className=\"h-full rounded-full bg-action-primary-bg transition-all duration-300\"\n style={{ width: `${fundingPct}%` }}\n />\n </div>\n <div className=\"mt-1 flex justify-between text-xs text-text-secondary\">\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-text-primary sm:text-lg\">\n {formatCurrency(opportunity.minimumInvestment, {\n minimumFractionDigits: 0,\n })}\n </p>\n <p className=\"text-xs text-text-secondary\">Min Investment</p>\n </div>\n <div>\n <p className=\"text-sm font-bold text-text-primary sm:text-lg\">\n {opportunity.paybackPeriod} mo\n </p>\n <p className=\"text-xs text-text-secondary\">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-status-warning-text text-status-warning-text\" />\n <p className=\"text-sm font-bold text-text-primary sm:text-lg\">\n {opportunity.businessMetrics.rating}\n </p>\n </div>\n <p className=\"text-xs text-text-secondary\">Rating</p>\n </div>\n </div>\n\n {/* Business Performance */}\n <div className=\"mb-4 border-t border-border-subtle pt-3 sm:pt-4\">\n <p className=\"mb-2 text-xs font-medium text-text-secondary 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-text-secondary\">Monthly Revenue:</span>\n <span className=\"font-medium text-text-primary\">\n {formatCurrency(opportunity.businessMetrics.monthlyRevenue, {\n minimumFractionDigits: 0,\n })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Gross Margin:</span>\n <span className=\"font-medium text-text-primary\">\n {opportunity.financials.grossMargin}%\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Monthly Orders:</span>\n <span className=\"font-medium text-text-primary\">\n {formatNumber(opportunity.businessMetrics.monthlyOrders)}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Net Margin:</span>\n <span className=\"font-medium text-text-primary\">\n {opportunity.financials.netMargin}%\n </span>\n </div>\n </div>\n </div>\n\n {/* Documents */}\n <div className=\"mb-4 border-t border-border-subtle pt-3\">\n <div className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\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-text-secondary\">\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-bg-sunken text-text-secondary'\n : 'bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/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-subtle px-4 py-2.5 text-sm font-medium text-text-primary 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-seam bg-bg-surface p-4 sm:p-6 bg-gloss-card shadow-pop\">\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-text-secondary 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-text-primary 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-status-success-text\" />\n <p className=\"text-sm font-medium text-text-primary\">Investment successful!</p>\n <p className=\"mt-1 text-xs text-text-secondary\">\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-text-secondary sm:text-sm\">Investment Range</p>\n <p className=\"text-sm font-medium text-text-primary 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-text-primary 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-text-secondary\" />\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-subtle bg-bg-surface py-2 pl-10 pr-4 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n {investStatus === 'error' && (\n <p className=\"mt-1 text-xs text-status-error-text\">\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-subtle bg-bg-sunken/50 p-3 sm:p-4\">\n <p className=\"mb-2 text-xs text-text-secondary 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-text-primary sm:text-sm\">Investment:</span>\n <span className=\"text-xs font-medium text-text-primary 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-text-primary sm:text-sm\">\n Expected Return ({selectedOpportunity.expectedReturns}%):\n </span>\n <span className=\"text-xs font-medium text-status-success-text 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-subtle pt-2\">\n <span className=\"text-xs font-medium text-text-primary sm:text-sm\">\n Total Value:\n </span>\n <span className=\"text-xs font-bold text-text-primary 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-text-secondary 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-subtle px-4 py-2.5 text-sm font-medium text-text-primary 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-bg-sunken text-text-secondary'\n : 'bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/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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"}
@@ -134,32 +134,32 @@ var S = {
134
134
  function C(e) {
135
135
  return e <= 2 ? {
136
136
  label: "Low Risk",
137
- color: "text-green-600 dark:text-green-400"
137
+ color: "text-status-success-text"
138
138
  } : e <= 4 ? {
139
139
  label: "Moderate Risk",
140
- color: "text-yellow-600 dark:text-yellow-400"
140
+ color: "text-status-warning-text"
141
141
  } : {
142
142
  label: "High Risk",
143
- color: "text-red-600 dark:text-red-400"
143
+ color: "text-status-error-text"
144
144
  };
145
145
  }
146
146
  function w(e) {
147
- return e <= 2 ? "bg-green-500" : e <= 4 ? "bg-yellow-500" : "bg-red-500";
147
+ return e <= 2 ? "bg-status-success-bg-subtle" : e <= 4 ? "bg-status-warning-bg-subtle" : "bg-status-error-bg-subtle";
148
148
  }
149
149
  function T(e) {
150
150
  return e >= 8 ? {
151
151
  label: "Well Diversified",
152
- color: "text-green-600 dark:text-green-400"
152
+ color: "text-status-success-text"
153
153
  } : e >= 6 ? {
154
154
  label: "Moderately Diversified",
155
- color: "text-yellow-600 dark:text-yellow-400"
155
+ color: "text-status-warning-text"
156
156
  } : {
157
157
  label: "Poorly Diversified",
158
- color: "text-red-600 dark:text-red-400"
158
+ color: "text-status-error-text"
159
159
  };
160
160
  }
161
161
  function E(e) {
162
- return e >= 8 ? "bg-green-500" : e >= 6 ? "bg-yellow-500" : "bg-red-500";
162
+ return e >= 8 ? "bg-status-success-bg-subtle" : e >= 6 ? "bg-status-warning-bg-subtle" : "bg-status-error-bg-subtle";
163
163
  }
164
164
  function D() {
165
165
  let { navigateTo: D } = e(), [O, k] = s(!0), [A, j] = s("6m"), [M, N] = s(null), [P, F] = s("idle");
@@ -225,7 +225,7 @@ function D() {
225
225
  type: "button",
226
226
  onClick: I,
227
227
  disabled: P === "exporting",
228
- className: t("flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors", P === "exporting" ? "cursor-not-allowed bg-bg-sunken text-text-secondary" : P === "done" ? "bg-green-600 text-white" : "bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90"),
228
+ className: t("flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors", P === "exporting" ? "cursor-not-allowed bg-bg-sunken text-text-secondary" : P === "done" ? "bg-status-success-bg-subtle text-white" : "bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90"),
229
229
  children: [/* @__PURE__ */ b(p, { className: "h-4 w-4" }), P === "exporting" ? "Exporting..." : P === "done" ? "Exported!" : "Export Report"]
230
230
  })]
231
231
  }),
@@ -266,22 +266,22 @@ function D() {
266
266
  /* @__PURE__ */ x("div", {
267
267
  className: "mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2",
268
268
  children: [/* @__PURE__ */ x("div", {
269
- className: "flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4",
269
+ className: "flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop",
270
270
  children: [/* @__PURE__ */ b("div", {
271
- className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-green-500/10",
272
- children: /* @__PURE__ */ b(u, { className: "h-5 w-5 text-green-600 dark:text-green-400" })
271
+ className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-status-success-bg-subtle/10",
272
+ children: /* @__PURE__ */ b(u, { className: "h-5 w-5 text-status-success-text" })
273
273
  }), /* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("p", {
274
274
  className: "text-xs text-text-secondary",
275
275
  children: "Best Performing"
276
276
  }), /* @__PURE__ */ b("p", {
277
- className: "text-sm font-semibold text-green-600 dark:text-green-400",
277
+ className: "text-sm font-semibold text-status-success-text",
278
278
  children: M.portfolioMetrics.bestPerforming
279
279
  })] })]
280
280
  }), /* @__PURE__ */ x("div", {
281
- className: "flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4",
281
+ className: "flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop",
282
282
  children: [/* @__PURE__ */ b("div", {
283
- className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-red-500/10",
284
- children: /* @__PURE__ */ b(l, { className: "h-5 w-5 text-red-600 dark:text-red-400" })
283
+ className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-status-error-bg-subtle/10",
284
+ children: /* @__PURE__ */ b(l, { className: "h-5 w-5 text-status-error-text" })
285
285
  }), /* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("p", {
286
286
  className: "text-xs text-text-secondary",
287
287
  children: "Worst Performing"
@@ -318,10 +318,10 @@ function D() {
318
318
  }), /* @__PURE__ */ x("div", {
319
319
  className: "text-right",
320
320
  children: [/* @__PURE__ */ x("p", {
321
- className: t("text-sm font-semibold", e.returns >= 0 ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400"),
321
+ className: t("text-sm font-semibold", e.returns >= 0 ? "text-status-success-text" : "text-status-error-text"),
322
322
  children: [e.returns >= 0 ? "+" : "", i(e.returns, { minimumFractionDigits: 0 })]
323
323
  }), /* @__PURE__ */ x("p", {
324
- className: t("text-xs", e.roi >= 0 ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400"),
324
+ className: t("text-xs", e.roi >= 0 ? "text-status-success-text" : "text-status-error-text"),
325
325
  children: [
326
326
  e.roi >= 0 ? "+" : "",
327
327
  e.roi,
@@ -364,7 +364,7 @@ function D() {
364
364
  className: "text-xs text-text-secondary",
365
365
  children: [i(e.investedAmount, { minimumFractionDigits: 0 }), " invested"]
366
366
  }), /* @__PURE__ */ x("span", {
367
- className: t("text-xs font-semibold", e.returns >= 0 ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400"),
367
+ className: t("text-xs font-semibold", e.returns >= 0 ? "text-status-success-text" : "text-status-error-text"),
368
368
  children: [e.returns >= 0 ? "+" : "", i(e.returns, { minimumFractionDigits: 0 })]
369
369
  })]
370
370
  })
@@ -432,14 +432,14 @@ function D() {
432
432
  /* @__PURE__ */ b("td", {
433
433
  className: "whitespace-nowrap px-4 py-4 text-sm sm:px-6",
434
434
  children: /* @__PURE__ */ x("span", {
435
- className: t("font-semibold", e.returns >= 0 ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400"),
435
+ className: t("font-semibold", e.returns >= 0 ? "text-status-success-text" : "text-status-error-text"),
436
436
  children: [e.returns >= 0 ? "+" : "", i(e.returns, { minimumFractionDigits: 0 })]
437
437
  })
438
438
  }),
439
439
  /* @__PURE__ */ b("td", {
440
440
  className: "whitespace-nowrap px-4 py-4 text-sm sm:px-6",
441
441
  children: /* @__PURE__ */ x("span", {
442
- className: t("font-medium", parseFloat(n) >= 0 ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400"),
442
+ className: t("font-medium", parseFloat(n) >= 0 ? "text-status-success-text" : "text-status-error-text"),
443
443
  children: [
444
444
  parseFloat(n) >= 0 ? "+" : "",
445
445
  n,
@@ -464,7 +464,7 @@ function D() {
464
464
  children: "Risk Analysis"
465
465
  })]
466
466
  }), /* @__PURE__ */ b("div", {
467
- className: "rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6",
467
+ className: "rounded-lg border border-border-seam bg-bg-surface p-4 sm:p-6 bg-gloss-card shadow-pop",
468
468
  children: /* @__PURE__ */ x("div", {
469
469
  className: "space-y-5",
470
470
  children: [
@@ -552,12 +552,12 @@ function D() {
552
552
  })
553
553
  })] }), /* @__PURE__ */ x("section", { children: [/* @__PURE__ */ x("div", {
554
554
  className: "mb-4 flex items-center gap-2",
555
- children: [/* @__PURE__ */ b(m, { className: "h-5 w-5 text-yellow-500" }), /* @__PURE__ */ b("h2", {
555
+ children: [/* @__PURE__ */ b(m, { className: "h-5 w-5 text-status-warning-text" }), /* @__PURE__ */ b("h2", {
556
556
  className: "text-lg font-semibold text-text-primary",
557
557
  children: "Recommendations"
558
558
  })]
559
559
  }), /* @__PURE__ */ x("div", {
560
- className: "rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6",
560
+ className: "rounded-lg border border-border-seam bg-bg-surface p-4 sm:p-6 bg-gloss-card shadow-pop",
561
561
  children: [/* @__PURE__ */ b("div", {
562
562
  className: "space-y-3",
563
563
  children: M.riskAnalysis.recommendations.map((e, t) => /* @__PURE__ */ x("div", {
@@ -593,7 +593,7 @@ function D() {
593
593
  3,
594
594
  4,
595
595
  5
596
- ].map((e) => /* @__PURE__ */ b("div", { className: t("h-2 w-4 rounded-sm", e <= 4 ? "bg-green-500" : "bg-bg-sunken") }, e))
596
+ ].map((e) => /* @__PURE__ */ b("div", { className: t("h-2 w-4 rounded-sm", e <= 4 ? "bg-status-success-bg-subtle" : "bg-bg-sunken") }, e))
597
597
  }), /* @__PURE__ */ b("span", {
598
598
  className: "text-xs font-medium text-text-primary",
599
599
  children: "4/5"
@@ -615,7 +615,7 @@ function D() {
615
615
  3,
616
616
  4,
617
617
  5
618
- ].map((e) => /* @__PURE__ */ b("div", { className: t("h-2 w-4 rounded-sm", e <= 3 ? "bg-yellow-500" : "bg-bg-sunken") }, e))
618
+ ].map((e) => /* @__PURE__ */ b("div", { className: t("h-2 w-4 rounded-sm", e <= 3 ? "bg-status-warning-bg-subtle" : "bg-bg-sunken") }, e))
619
619
  }), /* @__PURE__ */ b("span", {
620
620
  className: "text-xs font-medium text-text-primary",
621
621
  children: "3/5"
@@ -637,7 +637,7 @@ function D() {
637
637
  3,
638
638
  4,
639
639
  5
640
- ].map((e) => /* @__PURE__ */ b("div", { className: t("h-2 w-4 rounded-sm", e <= 4 ? "bg-green-500" : "bg-bg-sunken") }, e))
640
+ ].map((e) => /* @__PURE__ */ b("div", { className: t("h-2 w-4 rounded-sm", e <= 4 ? "bg-status-success-bg-subtle" : "bg-bg-sunken") }, e))
641
641
  }), /* @__PURE__ */ b("span", {
642
642
  className: "text-xs font-medium text-text-primary",
643
643
  children: "4/5"