@burdenoff/microfe-coolandlovely 2026.625.1 → 2026.625.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/coolandlovely/pages/HomePage.js +263 -258
  2. package/dist/coolandlovely/pages/HomePage.js.map +1 -1
  3. package/dist/coolandlovely/pages/admin/AdminAnalyticsPage.js +67 -61
  4. package/dist/coolandlovely/pages/admin/AdminAnalyticsPage.js.map +1 -1
  5. package/dist/coolandlovely/pages/admin/AdminDashboard.js +79 -45
  6. package/dist/coolandlovely/pages/admin/AdminDashboard.js.map +1 -1
  7. package/dist/coolandlovely/pages/admin/AdminFinancialPage.js +39 -33
  8. package/dist/coolandlovely/pages/admin/AdminFinancialPage.js.map +1 -1
  9. package/dist/coolandlovely/pages/admin/AdminOrdersPage.js +227 -222
  10. package/dist/coolandlovely/pages/admin/AdminOrdersPage.js.map +1 -1
  11. package/dist/coolandlovely/pages/admin/AdminProfilePage.js +65 -60
  12. package/dist/coolandlovely/pages/admin/AdminProfilePage.js.map +1 -1
  13. package/dist/coolandlovely/pages/admin/AdminSettingsPage.js +235 -230
  14. package/dist/coolandlovely/pages/admin/AdminSettingsPage.js.map +1 -1
  15. package/dist/coolandlovely/pages/admin/CartManagementPage.js +268 -263
  16. package/dist/coolandlovely/pages/admin/CartManagementPage.js.map +1 -1
  17. package/dist/coolandlovely/pages/admin/UserManagementPage.js +268 -263
  18. package/dist/coolandlovely/pages/admin/UserManagementPage.js.map +1 -1
  19. package/dist/coolandlovely/pages/cart-owner/AnalyticsDashboard.js +92 -84
  20. package/dist/coolandlovely/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  21. package/dist/coolandlovely/pages/cart-owner/BusinessSettingsPage.js +257 -252
  22. package/dist/coolandlovely/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  23. package/dist/coolandlovely/pages/cart-owner/CartOwnerDashboard.js +587 -548
  24. package/dist/coolandlovely/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  25. package/dist/coolandlovely/pages/cart-owner/CartOwnerProfilePage.js +171 -166
  26. package/dist/coolandlovely/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  27. package/dist/coolandlovely/pages/cart-owner/CartServiceConfigPage.js +219 -211
  28. package/dist/coolandlovely/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  29. package/dist/coolandlovely/pages/cart-owner/InventoryManagementPage.js +671 -670
  30. package/dist/coolandlovely/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  31. package/dist/coolandlovely/pages/cart-owner/OrderManagementPage.js +515 -514
  32. package/dist/coolandlovely/pages/cart-owner/OrderManagementPage.js.map +1 -1
  33. package/dist/coolandlovely/pages/cart-owner/StaffManagementPage.js +244 -246
  34. package/dist/coolandlovely/pages/cart-owner/StaffManagementPage.js.map +1 -1
  35. package/dist/coolandlovely/pages/common/HelpSupportPage.js +96 -96
  36. package/dist/coolandlovely/pages/common/HelpSupportPage.js.map +1 -1
  37. package/dist/coolandlovely/pages/common/NotificationCenterPage.js +50 -44
  38. package/dist/coolandlovely/pages/common/NotificationCenterPage.js.map +1 -1
  39. package/dist/coolandlovely/pages/common/SettingsPage.js +745 -736
  40. package/dist/coolandlovely/pages/common/SettingsPage.js.map +1 -1
  41. package/dist/coolandlovely/pages/customer/BookingDetailsPage.js +394 -357
  42. package/dist/coolandlovely/pages/customer/BookingDetailsPage.js.map +1 -1
  43. package/dist/coolandlovely/pages/customer/CartDetailPage.js +179 -176
  44. package/dist/coolandlovely/pages/customer/CartDetailPage.js.map +1 -1
  45. package/dist/coolandlovely/pages/customer/CartDiscoveryPage.js +215 -204
  46. package/dist/coolandlovely/pages/customer/CartDiscoveryPage.js.map +1 -1
  47. package/dist/coolandlovely/pages/customer/CheckoutPage.js +212 -215
  48. package/dist/coolandlovely/pages/customer/CheckoutPage.js.map +1 -1
  49. package/dist/coolandlovely/pages/customer/CustomerDashboard.js +438 -396
  50. package/dist/coolandlovely/pages/customer/CustomerDashboard.js.map +1 -1
  51. package/dist/coolandlovely/pages/customer/CustomerProfilePage.js +525 -488
  52. package/dist/coolandlovely/pages/customer/CustomerProfilePage.js.map +1 -1
  53. package/dist/coolandlovely/pages/customer/DirectServiceBookingPage.js +522 -513
  54. package/dist/coolandlovely/pages/customer/DirectServiceBookingPage.js.map +1 -1
  55. package/dist/coolandlovely/pages/customer/FavoritesPage.js +86 -76
  56. package/dist/coolandlovely/pages/customer/FavoritesPage.js.map +1 -1
  57. package/dist/coolandlovely/pages/customer/OrderHistoryPage.js +118 -109
  58. package/dist/coolandlovely/pages/customer/OrderHistoryPage.js.map +1 -1
  59. package/dist/coolandlovely/pages/customer/OrderTrackingPage.js +312 -275
  60. package/dist/coolandlovely/pages/customer/OrderTrackingPage.js.map +1 -1
  61. package/dist/coolandlovely/pages/customer/PaymentMethodsPage.js +82 -76
  62. package/dist/coolandlovely/pages/customer/PaymentMethodsPage.js.map +1 -1
  63. package/dist/coolandlovely/pages/customer/ReviewsPage.js +83 -73
  64. package/dist/coolandlovely/pages/customer/ReviewsPage.js.map +1 -1
  65. package/dist/coolandlovely/pages/customer/SavedAddressesPage.js +61 -55
  66. package/dist/coolandlovely/pages/customer/SavedAddressesPage.js.map +1 -1
  67. package/dist/coolandlovely/pages/investor/InvestmentDetailsPage.js +293 -255
  68. package/dist/coolandlovely/pages/investor/InvestmentDetailsPage.js.map +1 -1
  69. package/dist/coolandlovely/pages/investor/InvestmentOpportunitiesPage.js +238 -232
  70. package/dist/coolandlovely/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  71. package/dist/coolandlovely/pages/investor/InvestorAnalyticsPage.js +61 -55
  72. package/dist/coolandlovely/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  73. package/dist/coolandlovely/pages/investor/InvestorDashboard.js +356 -320
  74. package/dist/coolandlovely/pages/investor/InvestorDashboard.js.map +1 -1
  75. package/dist/coolandlovely/pages/investor/InvestorInvestmentsPage.js +107 -101
  76. package/dist/coolandlovely/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  77. package/dist/coolandlovely/pages/investor/InvestorPortfolioPage.js +170 -137
  78. package/dist/coolandlovely/pages/investor/InvestorPortfolioPage.js.map +1 -1
  79. package/dist/coolandlovely/pages/investor/InvestorProfilePage.js +386 -381
  80. package/dist/coolandlovely/pages/investor/InvestorProfilePage.js.map +1 -1
  81. package/dist/coolandlovely/pages/worker/TaskDetailsPage.js +359 -322
  82. package/dist/coolandlovely/pages/worker/TaskDetailsPage.js.map +1 -1
  83. package/dist/coolandlovely/pages/worker/WorkerDashboard.js +574 -537
  84. package/dist/coolandlovely/pages/worker/WorkerDashboard.js.map +1 -1
  85. package/dist/coolandlovely/pages/worker/WorkerOrdersPage.js +81 -76
  86. package/dist/coolandlovely/pages/worker/WorkerOrdersPage.js.map +1 -1
  87. package/dist/coolandlovely/pages/worker/WorkerProfilePage.js +82 -77
  88. package/dist/coolandlovely/pages/worker/WorkerProfilePage.js.map +1 -1
  89. package/dist/coolandlovely/pages/worker/WorkerSchedulePage.js +78 -73
  90. package/dist/coolandlovely/pages/worker/WorkerSchedulePage.js.map +1 -1
  91. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"InvestmentOpportunitiesPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/investor/InvestmentOpportunitiesPage.tsx"],"sourcesContent":["/**\n * Investment Opportunities Page\n * @module coolandlovely/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 { useCoolAndLovely } from'../../context/CoolAndLovelyContext';\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 } = useCoolAndLovely();\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 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":";;;;;;;;;AA4FA,IAAM,IAA6C;CACjD;EACE,IAAI;EACJ,QAAQ;EACR,UAAU;EACV,WAAW;EACX,aACE;EACF,cAAc;EACd,cAAc;EACd,mBAAmB;EACnB,mBAAmB;EACnB,eAAe;EACf,UAAU;EACV,iBAAiB;EACjB,eAAe;EACf,WAAW;EACX,UAAU;EACV,UAAU;EACV,OAAO;EACP,iBAAiB;GACf,gBAAgB;GAChB,eAAe;GACf,mBAAmB;GACnB,QAAQ;GACR,aAAa;GACb,gBAAgB;GACjB;EACD,YAAY;GACV,aAAa;GACb,WAAW;GACX,iBAAiB;GACjB,mBAAmB;GACpB;EACD,iBAAiB;GACf,eAAe;GACf,mBAAmB;GACnB,cAAc;GACd,aAAa;IAAC;IAAW;IAAkB;IAAM;GAClD;EACD,WAAW;GACT;IAAE,MAAM;IAAiB,MAAM;IAAO,YAAY;IAAc;GAChE;IAAE,MAAM;IAAwB,MAAM;IAAO,YAAY;IAAc;GACvE;IAAE,MAAM;IAAmB,MAAM;IAAO,YAAY;IAAc;GACnE;EACD,QAAQ;EACT;CACD;EACE,IAAI;EACJ,QAAQ;EACR,UAAU;EACV,WAAW;EACX,aACE;EACF,cAAc;EACd,cAAc;EACd,mBAAmB;EACnB,mBAAmB;EACnB,eAAe;EACf,UAAU;EACV,iBAAiB;EACjB,eAAe;EACf,WAAW;EACX,UAAU;EACV,UAAU;EACV,OAAO;EACP,iBAAiB;GACf,gBAAgB;GAChB,eAAe;GACf,mBAAmB;GACnB,QAAQ;GACR,aAAa;GACb,gBAAgB;GACjB;EACD,YAAY;GACV,aAAa;GACb,WAAW;GACX,iBAAiB;GACjB,mBAAmB;GACpB;EACD,iBAAiB;GACf,eAAe;GACf,mBAAmB;GACnB,cAAc;GACd,aAAa,CAAC,WAAW,iBAAiB;GAC3C;EACD,WAAW,CACT;GAAE,MAAM;GAAiB,MAAM;GAAO,YAAY;GAAc,EAChE;GAAE,MAAM;GAAmB,MAAM;GAAO,YAAY;GAAc,CACnE;EACD,QAAQ;EACT;CACD;EACE,IAAI;EACJ,QAAQ;EACR,UAAU;EACV,WAAW;EACX,aACE;EACF,cAAc;EACd,cAAc;EACd,mBAAmB;EACnB,mBAAmB;EACnB,eAAe;EACf,UAAU;EACV,iBAAiB;EACjB,eAAe;EACf,WAAW;EACX,UAAU;EACV,UAAU;EACV,OAAO;EACP,iBAAiB;GACf,gBAAgB;GAChB,eAAe;GACf,mBAAmB;GACnB,QAAQ;GACR,aAAa;GACb,gBAAgB;GACjB;EACD,YAAY;GACV,aAAa;GACb,WAAW;GACX,iBAAiB;GACjB,mBAAmB;GACpB;EACD,iBAAiB;GACf,eAAe;GACf,mBAAmB;GACnB,cAAc;GACd,aAAa,CAAC,WAAW,uBAAuB;GACjD;EACD,WAAW,CACT;GAAE,MAAM;GAAiB,MAAM;GAAO,YAAY;GAAc,EAChE;GAAE,MAAM;GAAwB,MAAM;GAAO,YAAY;GAAc,CACxE;EACD,QAAQ;EACT;CACD;EACE,IAAI;EACJ,QAAQ;EACR,UAAU;EACV,WAAW;EACX,aACE;EACF,cAAc;EACd,cAAc;EACd,mBAAmB;EACnB,mBAAmB;EACnB,eAAe;EACf,UAAU;EACV,iBAAiB;EACjB,eAAe;EACf,WAAW;EACX,UAAU;EACV,UAAU;EACV,OAAO;EACP,iBAAiB;GACf,gBAAgB;GAChB,eAAe;GACf,mBAAmB;GACnB,QAAQ;GACR,aAAa;GACb,gBAAgB;GACjB;EACD,YAAY;GACV,aAAa;GACb,WAAW;GACX,iBAAiB;GACjB,mBAAmB;GACpB;EACD,iBAAiB;GACf,eAAe;GACf,mBAAmB;GACnB,cAAc;GACd,aAAa,CAAC,kBAAkB,cAAc;GAC/C;EACD,WAAW,CACT;GAAE,MAAM;GAAkB,MAAM;GAAO,YAAY;GAAc,EACjE;GAAE,MAAM;GAAkB,MAAM;GAAO,YAAY;GAAc,CAClE;EACD,QAAQ;EACT;CACF,EAEK,IAAgB;CACpB,oBAAoB;CACpB,gBAAgB;CAChB,aAAa;CACb,aAAa;CACd;AAMD,SAAS,EAAkB,GAAsB;AAC/C,SAAQ,GAAR;EACE,KAAI,MACF,QAAM;EACR,KAAI,SACF,QAAM;EACR,KAAI,OACF,QAAM;EACR,QACE,QAAM;;;AAIZ,SAAS,EAAa,GAAsB;AAC1C,SAAQ,GAAR;EACE,KAAI,MACF,QAAM;EACR,KAAI,SACF,QAAM;EACR,KAAI,OACF,QAAM;EACR,QACE,QAAO;;;AAIb,SAAS,EAAqB,GAAgB,GAAwB;AACpE,QAAO,IAAS,IAAI,KAAK,IAAK,IAAS,IAAU,KAAK,IAAI,GAAG;;AAO/D,SAAgB,IAA8B;CAC5C,IAAM,EAAE,kBAAe,GAAkB,EACnC,CAAC,GAAW,KAAgB,EAAS,GAAK,EAC1C,CAAC,GAAqB,KAA0B,EACpD,KACD,EACK,CAAC,GAAiB,KAAsB,EAAS,GAAM,EACvD,CAAC,GAAkB,KAAuB,EAAS,GAAG,EACtD,CAAC,GAAc,KAAmB,EAAuC,OAAO,EAEhF,CAAC,GAAS,KAAc,EAA6B;EACzD,aAAa;EACb,UAAU;EACV,WAAW;EACX,eAAe;EACf,UAAU;EACV,QAAQ;EACT,CAAC;AAEF,SAAgB;EACd,IAAM,IAAQ,iBAAiB,EAAa,GAAM,EAAE,IAAI;AACxD,eAAa,aAAa,EAAM;IAC/B,EAAE,CAAC;CAEN,IAAM,IAAqB,GAAa,GAA+B,MAAkB;AACvF,KAAY,OAAU;GAAE,GAAG;IAAO,IAAM;GAAO,EAAE;IAChD,EAAE,CAAC,EAEA,IAAwB,QAAc;EAC1C,IAAI,IAAW,CAAC,GAAG,EAAkB;AAGrC,MAAI,EAAQ,YAAY,MAAM,EAAE;GAC9B,IAAM,IAAQ,EAAQ,YAAY,aAAa;AAC/C,OAAW,EAAS,QACjB,MACC,EAAI,SAAS,aAAa,CAAC,SAAS,EAAM,IAC1C,EAAI,YAAY,aAAa,CAAC,SAAS,EAAM,IAC7C,EAAI,SAAS,aAAa,CAAC,SAAS,EAAM,CAC7C;;AAmBH,MAfI,EAAQ,aACV,IAAW,EAAS,QAAQ,MAAQ,EAAI,aAAa,EAAQ,SAAS,GAIpE,EAAQ,cACV,IAAW,EAAS,QAAQ,MAAQ,EAAI,cAAc,EAAQ,UAAU,GAItE,EAAQ,aACV,IAAW,EAAS,QAAQ,MAAQ,EAAI,SAAS,SAAS,EAAQ,SAAS,CAAC,GAI1E,EAAQ,eAAe;GACzB,IAAM,IAAY,SAAS,EAAQ,eAAe,GAAG;AACrD,OAAW,EAAS,QAAQ,MAAQ,EAAI,qBAAqB,EAAU;;AAIzE,UAAQ,EAAQ,QAAhB;GACE,KAAI;AACF,MAAS,MAAM,GAAG,MAAM,EAAE,kBAAkB,EAAE,gBAAgB;AAC9D;GACF,KAAI;AACF,MAAS,MAAM,GAAG,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa;AAC1F;GACF,KAAI;AACF,MAAS,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,SAAS;AAChD;GACF,KAAI;AACF,MAAS,MAAM,GAAG,MAAM,EAAE,oBAAoB,EAAE,kBAAkB;AAClE;GACF,QACE;;AAGJ,SAAO;IACN,CAAC,EAAQ,CAAC,EAEP,IAAe,QAAkB;AACrC,MAAI,CAAC,KAAuB,CAAC,EAAkB;EAE/C,IAAM,IAAS,SAAS,GAAkB,GAAG;AACzC,aAAM,EAAO,EAEjB;OAAI,IAAS,EAAoB,mBAAmB;AAClD,MAAgB,QAAQ;AACxB;;AAEF,OAAI,IAAS,EAAoB,mBAAmB;AAClD,MAAgB,QAAQ;AACxB;;AAIF,GADA,EAAgB,UAAU,EAC1B,iBAAiB;AAIf,IAHA,EAAmB,GAAM,EACzB,EAAoB,GAAG,EACvB,EAAgB,OAAO,EACvB,EAAW,sBAAsB;MAChC,KAAK;;IACP;EAAC;EAAqB;EAAkB;EAAW,CAAC,EAEjD,IAAkB,GAAa,MAAuC;AAI1E,EAHA,EAAuB,EAAY,EACnC,EAAoB,GAAG,EACvB,EAAgB,OAAO,EACvB,EAAmB,GAAK;IACvB,EAAE,CAAC;AAeN,QAbI,IAEA,kBAAC,GAAD;EAAY,OAAM;EAA2B,aAAY;YACvD,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAK,WAAU,8EAA+E,CAAA,EAC9F,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAA4B,CAAA,CACnE;;GACF,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,QAAD;GAAM,WAAU;aAAhB,CACG,EAAsB,QAAO,iBACzB;;YANX;GAUE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAwB,CAAA,EACnE,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAc;OACb,CAAA,CACA;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAmB,CAAA,EAC9D,kBAAC,KAAD;OAAG,WAAU;iBAAb,CACG,EAAc,gBAAe,IAC5B;SACA;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAgB,CAAA,EAC3D,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAe,EAAc,aAAa;QACzC,uBAAuB;QACvB,UAAU;QACX,CAAC;OACA,CAAA,CACA;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAgB,CAAA,EAC3D,kBAAC,KAAD;OAAG,WAAU;iBAAb,CACG,EAAc,aAAY,IACzB;SACA;;KACF;;GAGN,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,OAAD;KAAK,WAAU;eAAf;MAEE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,wEAAyE,CAAA,EAC3F,kBAAC,SAAD;QACE,MAAK;QACL,aAAY;QACZ,OAAO,EAAQ;QACf,WAAW,MAAM,EAAmB,eAAe,EAAE,OAAO,MAAM;QAClE,WAAU;QACV,CAAA,CACE;;MAGN,kBAAC,UAAD;OACE,OAAO,EAAQ;OACf,WAAW,MAAM,EAAmB,YAAY,EAAE,OAAO,MAAM;OAC/D,WAAU;iBAHZ;QAKE,kBAAC,UAAD;SAAQ,OAAM;mBAAG;SAAuB,CAAA;QACxC,kBAAC,UAAD;SAAQ,OAAM;mBAAe;SAAqB,CAAA;QAClD,kBAAC,UAAD;SAAQ,OAAM;mBAAY;SAAkB,CAAA;QAC5C,kBAAC,UAAD;SAAQ,OAAM;mBAAc;SAAoB,CAAA;QAChD,kBAAC,UAAD;SAAQ,OAAM;mBAAY;SAAkB,CAAA;QAC5C,kBAAC,UAAD;SAAQ,OAAM;mBAAc;SAAoB,CAAA;QACzC;;MAGT,kBAAC,UAAD;OACE,OAAO,EAAQ;OACf,WAAW,MAAM,EAAmB,aAAa,EAAE,OAAO,MAAM;OAChE,WAAU;iBAHZ;QAKE,kBAAC,UAAD;SAAQ,OAAM;mBAAG;SAAwB,CAAA;QACzC,kBAAC,UAAD;SAAQ,OAAM;mBAAM;SAAiB,CAAA;QACrC,kBAAC,UAAD;SAAQ,OAAM;mBAAS;SAAoB,CAAA;QAC3C,kBAAC,UAAD;SAAQ,OAAM;mBAAO;SAAkB,CAAA;QAChC;;MAGT,kBAAC,UAAD;OACE,OAAO,EAAQ;OACf,WAAW,MAAM,EAAmB,iBAAiB,EAAE,OAAO,MAAM;OACpE,WAAU;iBAHZ;QAKE,kBAAC,UAAD;SAAQ,OAAM;mBAAG;SAAmB,CAAA;QACpC,kBAAC,UAAD;SAAQ,OAAM;mBAAQ;SAA6B,CAAA;QACnD,kBAAC,UAAD;SAAQ,OAAM;mBAAQ;SAA6B,CAAA;QACnD,kBAAC,UAAD;SAAQ,OAAM;mBAAQ;SAA6B,CAAA;QACnD,kBAAC,UAAD;SAAQ,OAAM;mBAAS;SAA+B,CAAA;QAC/C;;MAGT,kBAAC,UAAD;OACE,OAAO,EAAQ;OACf,WAAW,MAAM,EAAmB,YAAY,EAAE,OAAO,MAAM;OAC/D,WAAU;iBAHZ;QAKE,kBAAC,UAAD;SAAQ,OAAM;mBAAG;SAAsB,CAAA;QACvC,kBAAC,UAAD;SAAQ,OAAM;mBAAa;SAAmB,CAAA;QAC9C,kBAAC,UAAD;SAAQ,OAAM;mBAAc;SAAoB,CAAA;QAChD,kBAAC,UAAD;SAAQ,OAAM;mBAAc;SAAoB,CAAA;QAChD,kBAAC,UAAD;SAAQ,OAAM;mBAAkB;SAAwB,CAAA;QACjD;;MAGT,kBAAC,UAAD;OACE,OAAO,EAAQ;OACf,WAAW,MAAM,EAAmB,UAAU,EAAE,OAAO,MAAM;OAC7D,WAAU;iBAHZ;QAKE,kBAAC,UAAD;SAAQ,OAAM;mBAAW;SAAiB,CAAA;QAC1C,kBAAC,UAAD;SAAQ,OAAM;mBAAU;SAAwB,CAAA;QAChD,kBAAC,UAAD;SAAQ,OAAM;mBAAU;SAAoB,CAAA;QAC5C,kBAAC,UAAD;SAAQ,OAAM;mBAAU;SAAqB,CAAA;QAC7C,kBAAC,UAAD;SAAQ,OAAM;mBAAU;SAAuB,CAAA;QACxC;;MACL;;IACF,CAAA;GAGL,EAAsB,WAAW,IAChC,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD;KACE,MAAM,kBAAC,GAAD,EAAQ,WAAU,aAAc,CAAA;KACtC,OAAM;KACN,aAAY;KACZ,QACE,kBAAC,UAAD;MACE,MAAK;MACL,eACE,EAAW;OACT,aAAa;OACb,UAAU;OACV,WAAW;OACX,eAAe;OACf,UAAU;OACV,QAAQ;OACT,CAAC;MAEJ,WAAU;gBACX;MAEQ,CAAA;KAEX,CAAA;IACE,CAAA,GAEN,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAsB,KAAK,MAAgB;KAC1C,IAAM,IAAa,EACjB,EAAY,cACZ,EAAY,aACb;AAED,YACE,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAKE,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,OAAD;SAAK,WAAU;mBACb,kBAAC,OAAD;UACE,KAAK,EAAY;UACjB,KAAK,EAAY;UACjB,WAAU;UACV,SAAQ;UACR,CAAA;SACE,CAAA;QACL,EAAY,WAAW,YACtB,kBAAC,OAAD;SAAK,WAAU;mBAAuI;SAEhJ,CAAA;QAEP,EAAY,WAAW,KAAK,EAAY,YAAY,KACnD,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACG,EAAY,UAAS,aAClB;;QAEJ;UAEN,kBAAC,OAAD;OAAK,WAAU;iBAAf;QAEE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,MAAD;YAAI,WAAU;sBACX,EAAY;YACV,CAAA;WACL,kBAAC,KAAD;YAAG,WAAU;sBAAb,CAAsD,OAChD,EAAY,UACd;;WACJ,kBAAC,OAAD;YAAK,WAAU;sBAAf,CACE,kBAAC,QAAD;aAAM,WAAU;uBACb,EAAY;aACR,CAAA,EACP,kBAAC,QAAD;aACE,WAAW,EACT,gDACA,EAAkB,EAAY,UAAU,CACzC;uBAEA,EAAa,EAAY,UAAU;aAC/B,CAAA,CACH;;WACF;aACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAb,CACG,EAAY,iBAAgB,IAC3B;cACJ,kBAAC,KAAD;WAAG,WAAU;qBAA8B;WAAoB,CAAA,CAC3D;YACF;;QAGN,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAY;SACX,CAAA;QAGJ,kBAAC,OAAD;SAAK,WAAU;mBAAf;UACE,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,QAAD;YAAM,WAAU;sBAAhB;aACG,EAAe,EAAY,cAAc,EAAE,uBAAuB,GAAG,CAAC;aAAE;aAAI;aAExE;eACP,kBAAC,QAAD;YAAM,WAAU;sBAAhB,CAAsC,OAChC,EAAe,EAAY,cAAc,EAAE,uBAAuB,GAAG,CAAC,CACrE;cACH;;UACN,kBAAC,OAAD;WAAK,WAAU;qBACb,kBAAC,OAAD;YACE,WAAU;YACV,OAAO,EAAE,OAAO,GAAG,EAAW,IAAI;YAClC,CAAA;WACE,CAAA;UACN,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,QAAD,EAAA,UAAA,CAAO,EAAY,eAAc,aAAiB,EAAA,CAAA,EAClD,kBAAC,QAAD,EAAA,UAAA,CAAO,EAAW,QAAQ,EAAE,EAAC,WAAe,EAAA,CAAA,CACxC;;UACF;;QAGN,kBAAC,OAAD;SAAK,WAAU;mBAAf;UACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAe,EAAY,mBAAmB,EAC7C,uBAAuB,GACxB,CAAC;WACA,CAAA,EACJ,kBAAC,KAAD;WAAG,WAAU;qBAA8B;WAAkB,CAAA,CACzD,EAAA,CAAA;UACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAb,CACG,EAAY,eAAc,MACzB;cACJ,kBAAC,KAAD;WAAG,WAAU;qBAA8B;WAAkB,CAAA,CACzD,EAAA,CAAA;UACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,iEAAkE,CAAA,EAClF,kBAAC,KAAD;YAAG,WAAU;sBACV,EAAY,gBAAgB;YAC3B,CAAA,CACA;cACN,kBAAC,KAAD;WAAG,WAAU;qBAA8B;WAAU,CAAA,CACjD,EAAA,CAAA;UACF;;QAGN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,KAAD;UAAG,WAAU;oBAA0D;UAEnE,CAAA,EACJ,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,OAAD;YAAK,WAAU;sBAAf,CACE,kBAAC,QAAD;aAAM,WAAU;uBAAsB;aAAuB,CAAA,EAC7D,kBAAC,QAAD;aAAM,WAAU;uBACb,EAAe,EAAY,gBAAgB,gBAAgB,EAC1D,uBAAuB,GACxB,CAAC;aACG,CAAA,CACH;;WACN,kBAAC,OAAD;YAAK,WAAU;sBAAf,CACE,kBAAC,QAAD;aAAM,WAAU;uBAAsB;aAAoB,CAAA,EAC1D,kBAAC,QAAD;aAAM,WAAU;uBAAhB,CACG,EAAY,WAAW,aAAY,IAC/B;eACH;;WACN,kBAAC,OAAD;YAAK,WAAU;sBAAf,CACE,kBAAC,QAAD;aAAM,WAAU;uBAAsB;aAAsB,CAAA,EAC5D,kBAAC,QAAD;aAAM,WAAU;uBACb,EAAa,EAAY,gBAAgB,cAAc;aACnD,CAAA,CACH;;WACN,kBAAC,OAAD;YAAK,WAAU;sBAAf,CACE,kBAAC,QAAD;aAAM,WAAU;uBAAsB;aAAkB,CAAA,EACxD,kBAAC,QAAD;aAAM,WAAU;uBAAhB,CACG,EAAY,WAAW,WAAU,IAC7B;eACH;;WACF;YACF;;QAGN,kBAAC,OAAD;SAAK,WAAU;mBACb,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,eAAgB,CAAA,EACpC,kBAAC,QAAD,EAAA,UAAA,CAAO,EAAY,UAAU,QAAO,uBAA2B,EAAA,CAAA,CAC3D;;SACF,CAAA;QAGN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,eAAgB,CAAA,EAClC,kBAAC,QAAD,EAAA,UAAO,EAAY,UAAgB,CAAA,CAC/B;;QAGN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,UAAD;UACE,MAAK;UACL,eAAe,EAAgB,EAAY;UAC3C,UAAU,EAAY,WAAW;UACjC,WAAW,EACT,uEACA,EAAY,WAAW,WACnB,wDACA,8EACL;oBAEA,EAAY,WAAW,WAAW,iBAAiB;UAC7C,CAAA,EACT,kBAAC,UAAD;UACE,MAAK;UACL,eAAe,EAAW,2BAA2B,EAAY,KAAK;UACtE,WAAU;oBAHZ,CAKE,kBAAC,GAAD,EAAK,WAAU,WAAY,CAAA,EAAA,eAEpB;YACL;;QACF;SACF;QA1LC,EAAY,GA0Lb;MAER;IACE,CAAA;GAIP,KAAmB,KAClB,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,OAAD;KAAK,WAAU;eAAf;MAEE,kBAAC,UAAD;OACE,MAAK;OACL,eAAe;AAGb,QAFA,EAAmB,GAAM,EACzB,EAAoB,GAAG,EACvB,EAAgB,OAAO;;OAEzB,WAAU;iBAEV,kBAAC,GAAD,EAAG,WAAU,WAAY,CAAA;OAClB,CAAA;MAET,kBAAC,MAAD;OAAI,WAAU;iBAAd,CAA0E,cAC7D,EAAoB,SAC5B;;MAEJ,MAAiB,YAChB,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,GAAD,EAAc,WAAU,mDAAoD,CAAA;QAC5E,kBAAC,KAAD;SAAG,WAAU;mBAAwC;SAA0B,CAAA;QAC/E,kBAAC,KAAD;SAAG,WAAU;mBAAmC;SAE5C,CAAA;QACA;WAEN,kBAAC,OAAD;OAAK,WAAU;iBAAf;QAEE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;mBAA8C;SAAoB,CAAA,EAC/E,kBAAC,KAAD;SAAG,WAAU;mBAAb;UACG,EAAe,EAAoB,mBAAmB,EACrD,uBAAuB,GACxB,CAAC;UAAE;UAAI;UACN;UACD,EAAe,EAAoB,mBAAmB,EACrD,uBAAuB,GACxB,CAAC;UACA;WACA,EAAA,CAAA;QAGN,kBAAC,OAAD,EAAA,UAAA;SACE,kBAAC,SAAD;UAAO,WAAU;oBAA8D;UAEvE,CAAA;SACR,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD,EAAa,WAAU,wEAAyE,CAAA,EAChG,kBAAC,SAAD;WACE,MAAK;WACL,OAAO;WACP,WAAW,MAAM;AAEf,YADA,EAAoB,EAAE,OAAO,MAAM,EACnC,EAAgB,OAAO;;WAEzB,aAAY;WACZ,WAAU;WACV,CAAA,CACE;;SACL,MAAiB,WAChB,kBAAC,KAAD;UAAG,WAAU;oBAAb;WAAmD;WAC1B;WACtB,EAAe,EAAoB,mBAAmB,EACrD,uBAAuB,GACxB,CAAC;WAAE;WAAI;WACJ;WACH,EAAe,EAAoB,mBAAmB,EACrD,uBAAuB,GACxB,CAAC;WACA;;SAEF,EAAA,CAAA;QAGL,KACC,CAAC,MAAM,SAAS,GAAkB,GAAG,CAAC,IACtC,SAAS,GAAkB,GAAG,GAAG,KAC/B,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,KAAD;UAAG,WAAU;oBAA8C;UAEvD,CAAA,EACJ,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,OAAD;YAAK,WAAU;sBAAf,CACE,kBAAC,QAAD;aAAM,WAAU;uBAAuC;aAAkB,CAAA,EACzE,kBAAC,QAAD;aAAM,WAAU;uBACb,EAAe,SAAS,GAAkB,GAAG,EAAE,EAC9C,uBAAuB,GACxB,CAAC;aACG,CAAA,CACH;;WACN,kBAAC,OAAD;YAAK,WAAU;sBAAf,CACE,kBAAC,QAAD;aAAM,WAAU;uBAAhB;cAAuD;cACnC,EAAoB;cAAgB;cACjD;gBACP,kBAAC,QAAD;aAAM,WAAU;uBAAhB,CAA0E,KAEvE,EACE,SAAS,GAAkB,GAAG,GAC7B,EAAoB,kBACpB,KACF,EAAE,uBAAuB,GAAG,CAC7B,CACI;eACH;;WACN,kBAAC,OAAD;YAAK,WAAU;sBAAf,CACE,kBAAC,QAAD;aAAM,WAAU;uBAAmD;aAE5D,CAAA,EACP,kBAAC,QAAD;aAAM,WAAU;uBACb,EACC,SAAS,GAAkB,GAAG,IAC3B,IAAI,EAAoB,kBAAkB,MAC7C,EAAE,uBAAuB,GAAG,CAC7B;aACI,CAAA,CACH;;WACF;YACF;;QAIV,kBAAC,OAAD;SAAK,WAAU;mBAAf;UACE,kBAAC,KAAD,EAAA,UAAA;WAAG;WAC8B;WAC9B,EAAoB,gBAAgB;WAAa;WAChD,EAAA,CAAA;UACJ,kBAAC,KAAD,EAAA,UAAA;WAAG;WAC0B;WAC1B,EAAoB,gBAAgB;WACnC,EAAA,CAAA;UACJ,kBAAC,KAAD,EAAA,UAAA;WAAG;WACyB;aAEtB,SAAS,GAAkB,GAAG,IAAI,KAAK,EAAoB,eAC7D,EAAoB,gBAAgB,eACpC,QAAQ,EAAE;WAAC;WAEX,EAAA,CAAA;UACJ,kBAAC,KAAD,EAAA,UAAA;WAAG;WACoB;WACpB,EAAoB,gBAAgB,YAAY,KAAK,KAAK;WACzD,EAAA,CAAA;UACA;;QAGN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,UAAD;UACE,MAAK;UACL,eAAe;AAGb,WAFA,EAAmB,GAAM,EACzB,EAAoB,GAAG,EACvB,EAAgB,OAAO;;UAEzB,WAAU;oBACX;UAEQ,CAAA,EACT,kBAAC,UAAD;UACE,MAAK;UACL,SAAS;UACT,UACE,CAAC,KACD,MAAM,SAAS,GAAkB,GAAG,CAAC,IACrC,SAAS,GAAkB,GAAG,GAAG,EAAoB;UAEvD,WAAW,EACT,uEACA,CAAC,KACC,MAAM,SAAS,GAAkB,GAAG,CAAC,IACrC,SAAS,GAAkB,GAAG,GAAG,EAAoB,oBACnD,wDACA,8EACL;oBACF;UAEQ,CAAA,CACL;;QACF;;MAEJ;;IACF,CAAA;GAEG"}
1
+ {"version":3,"file":"InvestmentOpportunitiesPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/investor/InvestmentOpportunitiesPage.tsx"],"sourcesContent":["/**\n * Investment Opportunities Page\n * @module coolandlovely/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 { EmphasisPanel, PagePurpose } from'@burdenoff/fe-libs/ui';\nimport { PageLayout } from'../../components/PageLayout';\nimport { EmptyState } from'../../components/EmptyState';\nimport { useCoolAndLovely } from'../../context/CoolAndLovelyContext';\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 } = useCoolAndLovely();\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 <PagePurpose className=\"mb-6\" icon={<Target className=\"h-4 w-4\" />}>\n Discover local businesses raising capital and back the ones you believe\n in. Compare expected returns, risk and funding progress, filter to match\n your strategy, and open any opportunity to review the full pitch before\n you invest.\n </PagePurpose>\n\n {/* Platform Stats — primary emphasis zone */}\n <EmphasisPanel className=\"grid grid-cols-2 gap-3 sm:gap-4 lg:grid-cols-4 p-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 </EmphasisPanel>\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 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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"}
@@ -6,8 +6,9 @@ import { formatCurrency as i } from "../../utils/formatters.js";
6
6
  import { useCallback as a, useEffect as o, useState as s } from "react";
7
7
  import { Activity as c, ArrowDown as l, ArrowUp as u, BarChart3 as d, Calendar as f, Download as p, Lightbulb as m, PieChart as h, Shield as g, Target as _, TrendingUp as v, Wallet as y } from "lucide-react";
8
8
  import { jsx as b, jsxs as x } from "react/jsx-runtime";
9
+ import { EmphasisPanel as S, PagePurpose as C } from "@burdenoff/fe-libs/ui";
9
10
  //#region src/coolandlovely/pages/investor/InvestorAnalyticsPage.tsx
10
- var S = {
11
+ var w = {
11
12
  portfolioMetrics: {
12
13
  totalValue: 283700,
13
14
  totalInvested: 255e3,
@@ -131,7 +132,7 @@ var S = {
131
132
  ]
132
133
  }
133
134
  };
134
- function C(e) {
135
+ function T(e) {
135
136
  return e <= 2 ? {
136
137
  label: "Low Risk",
137
138
  color: "text-status-success-text"
@@ -143,10 +144,10 @@ function C(e) {
143
144
  color: "text-status-error-text"
144
145
  };
145
146
  }
146
- function w(e) {
147
+ function E(e) {
147
148
  return e <= 2 ? "bg-status-success-bg-subtle" : e <= 4 ? "bg-status-warning-bg-subtle" : "bg-status-error-bg-subtle";
148
149
  }
149
- function T(e) {
150
+ function D(e) {
150
151
  return e >= 8 ? {
151
152
  label: "Well Diversified",
152
153
  color: "text-status-success-text"
@@ -158,24 +159,24 @@ function T(e) {
158
159
  color: "text-status-error-text"
159
160
  };
160
161
  }
161
- function E(e) {
162
+ function O(e) {
162
163
  return e >= 8 ? "bg-status-success-bg-subtle" : e >= 6 ? "bg-status-warning-bg-subtle" : "bg-status-error-bg-subtle";
163
164
  }
164
- function D() {
165
- let { navigateTo: D } = e(), [O, k] = s(!0), [A, j] = s("6m"), [M, N] = s(null), [P, F] = s("idle");
165
+ function k() {
166
+ let { navigateTo: k } = e(), [A, j] = s(!0), [M, N] = s("6m"), [P, F] = s(null), [I, L] = s("idle");
166
167
  o(() => {
167
- k(!0);
168
+ j(!0);
168
169
  let e = setTimeout(() => {
169
- N(S), k(!1);
170
+ F(w), j(!1);
170
171
  }, 600);
171
172
  return () => clearTimeout(e);
172
- }, [A]);
173
- let I = a(() => {
174
- F("exporting"), setTimeout(() => {
175
- F("done"), setTimeout(() => F("idle"), 2e3);
173
+ }, [M]);
174
+ let R = a(() => {
175
+ L("exporting"), setTimeout(() => {
176
+ L("done"), setTimeout(() => L("idle"), 2e3);
176
177
  }, 1200);
177
178
  }, []);
178
- if (O || !M) return /* @__PURE__ */ b(n, {
179
+ if (A || !P) return /* @__PURE__ */ b(n, {
179
180
  title: "Investment Analytics",
180
181
  description: "Loading analytics...",
181
182
  children: /* @__PURE__ */ b("div", {
@@ -189,15 +190,15 @@ function D() {
189
190
  })
190
191
  })
191
192
  });
192
- let L = C(M.riskAnalysis.riskScore), R = T(M.riskAnalysis.diversificationScore), z = [...M.performanceByCart].sort((e, t) => t.roi - e.roi);
193
+ let z = T(P.riskAnalysis.riskScore), B = D(P.riskAnalysis.diversificationScore), V = [...P.performanceByCart].sort((e, t) => t.roi - e.roi);
193
194
  return /* @__PURE__ */ x(n, {
194
195
  title: "Investment Analytics",
195
196
  description: "Comprehensive analysis of your portfolio performance",
196
197
  actions: /* @__PURE__ */ x("div", {
197
198
  className: "flex items-center gap-3",
198
199
  children: [/* @__PURE__ */ x("select", {
199
- value: A,
200
- onChange: (e) => j(e.target.value),
200
+ value: M,
201
+ onChange: (e) => N(e.target.value),
201
202
  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)]",
202
203
  children: [
203
204
  /* @__PURE__ */ b("option", {
@@ -223,43 +224,48 @@ function D() {
223
224
  ]
224
225
  }), /* @__PURE__ */ x("button", {
225
226
  type: "button",
226
- onClick: I,
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-status-success-bg-subtle text-white" : "bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90"),
229
- children: [/* @__PURE__ */ b(p, { className: "h-4 w-4" }), P === "exporting" ? "Exporting..." : P === "done" ? "Exported!" : "Export Report"]
227
+ onClick: R,
228
+ disabled: I === "exporting",
229
+ className: t("flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors", I === "exporting" ? "cursor-not-allowed bg-bg-sunken text-text-secondary" : I === "done" ? "bg-status-success-bg-subtle text-white" : "bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90"),
230
+ children: [/* @__PURE__ */ b(p, { className: "h-4 w-4" }), I === "exporting" ? "Exporting..." : I === "done" ? "Exported!" : "Export Report"]
230
231
  })]
231
232
  }),
232
233
  children: [
233
- /* @__PURE__ */ x("div", {
234
- className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
234
+ /* @__PURE__ */ b(C, {
235
+ className: "mb-6",
236
+ icon: /* @__PURE__ */ b(d, { className: "h-4 w-4" }),
237
+ children: "Understand how your portfolio is really performing. See total value, returns, ROI and risk at a glance, spot your best and worst performers, adjust the time range, and export a report — turning raw numbers into decisions about where to invest next."
238
+ }),
239
+ /* @__PURE__ */ x(S, {
240
+ className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4 p-4",
235
241
  children: [
236
242
  /* @__PURE__ */ b(r, {
237
243
  icon: /* @__PURE__ */ b(y, { className: "h-5 w-5" }),
238
- value: i(M.portfolioMetrics.totalValue, { minimumFractionDigits: 0 }),
244
+ value: i(P.portfolioMetrics.totalValue, { minimumFractionDigits: 0 }),
239
245
  label: "Portfolio Value",
240
246
  trend: "up",
241
- trendValue: `+${M.portfolioMetrics.portfolioGrowth}% total growth`
247
+ trendValue: `+${P.portfolioMetrics.portfolioGrowth}% total growth`
242
248
  }),
243
249
  /* @__PURE__ */ b(r, {
244
250
  icon: /* @__PURE__ */ b(v, { className: "h-5 w-5" }),
245
- value: i(M.portfolioMetrics.totalReturns, { minimumFractionDigits: 0 }),
251
+ value: i(P.portfolioMetrics.totalReturns, { minimumFractionDigits: 0 }),
246
252
  label: "Total Returns",
247
253
  trend: "up",
248
254
  trendValue: "Profit earned so far"
249
255
  }),
250
256
  /* @__PURE__ */ b(r, {
251
257
  icon: /* @__PURE__ */ b(_, { className: "h-5 w-5" }),
252
- value: `${M.portfolioMetrics.averageRoi}%`,
258
+ value: `${P.portfolioMetrics.averageRoi}%`,
253
259
  label: "Average ROI",
254
260
  trend: "up",
255
261
  trendValue: "Across all investments"
256
262
  }),
257
263
  /* @__PURE__ */ b(r, {
258
264
  icon: /* @__PURE__ */ b(c, { className: "h-5 w-5" }),
259
- value: `${M.riskAnalysis.riskScore}/5`,
265
+ value: `${P.riskAnalysis.riskScore}/5`,
260
266
  label: "Risk Score",
261
267
  trend: "neutral",
262
- trendValue: L.label
268
+ trendValue: z.label
263
269
  })
264
270
  ]
265
271
  }),
@@ -275,7 +281,7 @@ function D() {
275
281
  children: "Best Performing"
276
282
  }), /* @__PURE__ */ b("p", {
277
283
  className: "text-sm font-semibold text-status-success-text",
278
- children: M.portfolioMetrics.bestPerforming
284
+ children: P.portfolioMetrics.bestPerforming
279
285
  })] })]
280
286
  }), /* @__PURE__ */ x("div", {
281
287
  className: "flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop",
@@ -287,7 +293,7 @@ function D() {
287
293
  children: "Worst Performing"
288
294
  }), /* @__PURE__ */ b("p", {
289
295
  className: "text-sm font-semibold text-text-primary",
290
- children: M.portfolioMetrics.worstPerforming
296
+ children: P.portfolioMetrics.worstPerforming
291
297
  })] })]
292
298
  })]
293
299
  }),
@@ -301,7 +307,7 @@ function D() {
301
307
  })]
302
308
  }), /* @__PURE__ */ b("div", {
303
309
  className: "space-y-3",
304
- children: z.map((e, n) => /* @__PURE__ */ x("div", {
310
+ children: V.map((e, n) => /* @__PURE__ */ x("div", {
305
311
  className: "flex items-center justify-between rounded-lg border border-border-subtle bg-bg-surface p-3",
306
312
  children: [/* @__PURE__ */ x("div", {
307
313
  className: "flex items-center gap-3",
@@ -338,7 +344,7 @@ function D() {
338
344
  })]
339
345
  }), /* @__PURE__ */ b("div", {
340
346
  className: "space-y-4",
341
- children: M.performanceByCategory.map((e) => /* @__PURE__ */ x("div", {
347
+ children: P.performanceByCategory.map((e) => /* @__PURE__ */ x("div", {
342
348
  className: "rounded-lg border border-border-subtle bg-bg-surface p-3",
343
349
  children: [
344
350
  /* @__PURE__ */ x("div", {
@@ -412,7 +418,7 @@ function D() {
412
418
  ]
413
419
  }) }), /* @__PURE__ */ b("tbody", {
414
420
  className: "divide-y divide-border",
415
- children: M.monthlyPerformance.map((e) => {
421
+ children: P.monthlyPerformance.map((e) => {
416
422
  let n = e.invested > 0 ? ((e.value - e.invested) / e.invested * 100).toFixed(1) : "0.0";
417
423
  return /* @__PURE__ */ x("tr", {
418
424
  className: "hover:bg-accent/50 transition-colors",
@@ -474,19 +480,19 @@ function D() {
474
480
  className: "text-sm text-text-primary",
475
481
  children: "Risk Score"
476
482
  }), /* @__PURE__ */ x("span", {
477
- className: t("text-sm font-semibold", L.color),
483
+ className: t("text-sm font-semibold", z.color),
478
484
  children: [
479
- M.riskAnalysis.riskScore,
485
+ P.riskAnalysis.riskScore,
480
486
  "/5 (",
481
- L.label,
487
+ z.label,
482
488
  ")"
483
489
  ]
484
490
  })]
485
491
  }), /* @__PURE__ */ b("div", {
486
492
  className: "h-3 w-full overflow-hidden rounded-full bg-bg-sunken",
487
493
  children: /* @__PURE__ */ b("div", {
488
- className: t("h-full rounded-full transition-all duration-300", w(M.riskAnalysis.riskScore)),
489
- style: { width: `${M.riskAnalysis.riskScore / 5 * 100}%` }
494
+ className: t("h-full rounded-full transition-all duration-300", E(P.riskAnalysis.riskScore)),
495
+ style: { width: `${P.riskAnalysis.riskScore / 5 * 100}%` }
490
496
  })
491
497
  })] }),
492
498
  /* @__PURE__ */ x("div", { children: [/* @__PURE__ */ x("div", {
@@ -495,19 +501,19 @@ function D() {
495
501
  className: "text-sm text-text-primary",
496
502
  children: "Diversification"
497
503
  }), /* @__PURE__ */ x("span", {
498
- className: t("text-sm font-semibold", R.color),
504
+ className: t("text-sm font-semibold", B.color),
499
505
  children: [
500
- M.riskAnalysis.diversificationScore,
506
+ P.riskAnalysis.diversificationScore,
501
507
  "/10 (",
502
- R.label,
508
+ B.label,
503
509
  ")"
504
510
  ]
505
511
  })]
506
512
  }), /* @__PURE__ */ b("div", {
507
513
  className: "h-3 w-full overflow-hidden rounded-full bg-bg-sunken",
508
514
  children: /* @__PURE__ */ b("div", {
509
- className: t("h-full rounded-full transition-all duration-300", E(M.riskAnalysis.diversificationScore)),
510
- style: { width: `${M.riskAnalysis.diversificationScore / 10 * 100}%` }
515
+ className: t("h-full rounded-full transition-all duration-300", O(P.riskAnalysis.diversificationScore)),
516
+ style: { width: `${P.riskAnalysis.diversificationScore / 10 * 100}%` }
511
517
  })
512
518
  })] }),
513
519
  /* @__PURE__ */ x("div", { children: [/* @__PURE__ */ x("div", {
@@ -516,14 +522,14 @@ function D() {
516
522
  className: "text-sm text-text-primary",
517
523
  children: "Volatility"
518
524
  }), /* @__PURE__ */ x("span", {
519
- className: t("text-sm font-semibold", C(M.riskAnalysis.volatilityScore).color),
520
- children: [M.riskAnalysis.volatilityScore, "/5"]
525
+ className: t("text-sm font-semibold", T(P.riskAnalysis.volatilityScore).color),
526
+ children: [P.riskAnalysis.volatilityScore, "/5"]
521
527
  })]
522
528
  }), /* @__PURE__ */ b("div", {
523
529
  className: "h-3 w-full overflow-hidden rounded-full bg-bg-sunken",
524
530
  children: /* @__PURE__ */ b("div", {
525
- className: t("h-full rounded-full transition-all duration-300", w(M.riskAnalysis.volatilityScore)),
526
- style: { width: `${M.riskAnalysis.volatilityScore / 5 * 100}%` }
531
+ className: t("h-full rounded-full transition-all duration-300", E(P.riskAnalysis.volatilityScore)),
532
+ style: { width: `${P.riskAnalysis.volatilityScore / 5 * 100}%` }
527
533
  })
528
534
  })] }),
529
535
  /* @__PURE__ */ x("div", {
@@ -532,7 +538,7 @@ function D() {
532
538
  className: "rounded-lg bg-bg-sunken/50 p-3 text-center",
533
539
  children: [/* @__PURE__ */ b("p", {
534
540
  className: "text-lg font-bold text-text-primary",
535
- children: M.performanceByCart.length
541
+ children: P.performanceByCart.length
536
542
  }), /* @__PURE__ */ b("p", {
537
543
  className: "text-xs text-text-secondary",
538
544
  children: "Active Investments"
@@ -541,7 +547,7 @@ function D() {
541
547
  className: "rounded-lg bg-bg-sunken/50 p-3 text-center",
542
548
  children: [/* @__PURE__ */ b("p", {
543
549
  className: "text-lg font-bold text-text-primary",
544
- children: M.performanceByCategory.length
550
+ children: P.performanceByCategory.length
545
551
  }), /* @__PURE__ */ b("p", {
546
552
  className: "text-xs text-text-secondary",
547
553
  children: "Sectors Covered"
@@ -560,7 +566,7 @@ function D() {
560
566
  className: "rounded-lg border border-border-seam bg-bg-surface p-4 sm:p-6 bg-gloss-card shadow-pop",
561
567
  children: [/* @__PURE__ */ b("div", {
562
568
  className: "space-y-3",
563
- children: M.riskAnalysis.recommendations.map((e, t) => /* @__PURE__ */ x("div", {
569
+ children: P.riskAnalysis.recommendations.map((e, t) => /* @__PURE__ */ x("div", {
564
570
  className: "flex items-start gap-3 rounded-lg border border-border-subtle bg-bg-sunken/30 p-3",
565
571
  children: [/* @__PURE__ */ b("div", {
566
572
  className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-xs font-bold text-action-primary-text",
@@ -654,19 +660,19 @@ function D() {
654
660
  children: [
655
661
  /* @__PURE__ */ x("button", {
656
662
  type: "button",
657
- onClick: () => D("/investor/portfolio"),
663
+ onClick: () => k("/investor/portfolio"),
658
664
  className: "flex items-center gap-2 rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
659
665
  children: [/* @__PURE__ */ b(h, { className: "h-4 w-4" }), "View Portfolio"]
660
666
  }),
661
667
  /* @__PURE__ */ x("button", {
662
668
  type: "button",
663
- onClick: () => D("/investor/opportunities"),
669
+ onClick: () => k("/investor/opportunities"),
664
670
  className: "flex items-center gap-2 rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
665
671
  children: [/* @__PURE__ */ b(_, { className: "h-4 w-4" }), "Browse Opportunities"]
666
672
  }),
667
673
  /* @__PURE__ */ x("button", {
668
674
  type: "button",
669
- onClick: () => D("/investor/investments"),
675
+ onClick: () => k("/investor/investments"),
670
676
  className: "flex items-center gap-2 rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
671
677
  children: [/* @__PURE__ */ b(y, { className: "h-4 w-4" }), "My Investments"]
672
678
  })
@@ -676,6 +682,6 @@ function D() {
676
682
  });
677
683
  }
678
684
  //#endregion
679
- export { D as InvestorAnalyticsPage };
685
+ export { k as InvestorAnalyticsPage };
680
686
 
681
687
  //# sourceMappingURL=InvestorAnalyticsPage.js.map