@burdenoff/microfe-adaptercloud 2026.624.1 → 2026.625.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/dist/adaptercloud/components/EmptyState.js +17 -21
  2. package/dist/adaptercloud/components/EmptyState.js.map +1 -1
  3. package/dist/adaptercloud/components/InvestmentCard.js +25 -23
  4. package/dist/adaptercloud/components/InvestmentCard.js.map +1 -1
  5. package/dist/adaptercloud/components/MetricsCard.js +18 -12
  6. package/dist/adaptercloud/components/MetricsCard.js.map +1 -1
  7. package/dist/adaptercloud/components/PageLayout.js +38 -19
  8. package/dist/adaptercloud/components/PageLayout.js.map +1 -1
  9. package/dist/adaptercloud/components/RatingDisplay.js +3 -3
  10. package/dist/adaptercloud/components/RatingDisplay.js.map +1 -1
  11. package/dist/adaptercloud/components/StatusBadge.js +36 -16
  12. package/dist/adaptercloud/components/StatusBadge.js.map +1 -1
  13. package/dist/adaptercloud/pages/HomePage.js +242 -231
  14. package/dist/adaptercloud/pages/HomePage.js.map +1 -1
  15. package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js +33 -33
  16. package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js.map +1 -1
  17. package/dist/adaptercloud/pages/admin/AdminDashboard.js +32 -32
  18. package/dist/adaptercloud/pages/admin/AdminDashboard.js.map +1 -1
  19. package/dist/adaptercloud/pages/admin/AdminFinancialPage.js +11 -11
  20. package/dist/adaptercloud/pages/admin/AdminFinancialPage.js.map +1 -1
  21. package/dist/adaptercloud/pages/admin/AdminOrdersPage.js +11 -11
  22. package/dist/adaptercloud/pages/admin/AdminOrdersPage.js.map +1 -1
  23. package/dist/adaptercloud/pages/admin/AdminProfilePage.js +3 -3
  24. package/dist/adaptercloud/pages/admin/AdminProfilePage.js.map +1 -1
  25. package/dist/adaptercloud/pages/admin/AdminSettingsPage.js +1 -1
  26. package/dist/adaptercloud/pages/admin/AdminSettingsPage.js.map +1 -1
  27. package/dist/adaptercloud/pages/admin/CartManagementPage.js +28 -28
  28. package/dist/adaptercloud/pages/admin/CartManagementPage.js.map +1 -1
  29. package/dist/adaptercloud/pages/admin/UserManagementPage.js +25 -25
  30. package/dist/adaptercloud/pages/admin/UserManagementPage.js.map +1 -1
  31. package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js +19 -19
  32. package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  33. package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js +7 -7
  34. package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  35. package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js +40 -37
  36. package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  37. package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js +21 -21
  38. package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  39. package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js +24 -24
  40. package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  41. package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js +20 -20
  42. package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  43. package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js +36 -36
  44. package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js.map +1 -1
  45. package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js +25 -25
  46. package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js.map +1 -1
  47. package/dist/adaptercloud/pages/common/HelpSupportPage.js +43 -43
  48. package/dist/adaptercloud/pages/common/HelpSupportPage.js.map +1 -1
  49. package/dist/adaptercloud/pages/common/NotificationCenterPage.js +32 -31
  50. package/dist/adaptercloud/pages/common/NotificationCenterPage.js.map +1 -1
  51. package/dist/adaptercloud/pages/common/SettingsPage.js +8 -8
  52. package/dist/adaptercloud/pages/common/SettingsPage.js.map +1 -1
  53. package/dist/adaptercloud/pages/customer/BookingDetailsPage.js +22 -21
  54. package/dist/adaptercloud/pages/customer/BookingDetailsPage.js.map +1 -1
  55. package/dist/adaptercloud/pages/customer/CartDetailPage.js +18 -17
  56. package/dist/adaptercloud/pages/customer/CartDetailPage.js.map +1 -1
  57. package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js +12 -11
  58. package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js.map +1 -1
  59. package/dist/adaptercloud/pages/customer/CheckoutPage.js +9 -9
  60. package/dist/adaptercloud/pages/customer/CheckoutPage.js.map +1 -1
  61. package/dist/adaptercloud/pages/customer/CustomerDashboard.js +30 -30
  62. package/dist/adaptercloud/pages/customer/CustomerDashboard.js.map +1 -1
  63. package/dist/adaptercloud/pages/customer/CustomerProfilePage.js +19 -19
  64. package/dist/adaptercloud/pages/customer/CustomerProfilePage.js.map +1 -1
  65. package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js +24 -23
  66. package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js.map +1 -1
  67. package/dist/adaptercloud/pages/customer/FavoritesPage.js +9 -8
  68. package/dist/adaptercloud/pages/customer/FavoritesPage.js.map +1 -1
  69. package/dist/adaptercloud/pages/customer/OrderHistoryPage.js +4 -3
  70. package/dist/adaptercloud/pages/customer/OrderHistoryPage.js.map +1 -1
  71. package/dist/adaptercloud/pages/customer/OrderTrackingPage.js +15 -14
  72. package/dist/adaptercloud/pages/customer/OrderTrackingPage.js.map +1 -1
  73. package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js +10 -9
  74. package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js.map +1 -1
  75. package/dist/adaptercloud/pages/customer/ReviewsPage.js +18 -17
  76. package/dist/adaptercloud/pages/customer/ReviewsPage.js.map +1 -1
  77. package/dist/adaptercloud/pages/customer/SavedAddressesPage.js +14 -13
  78. package/dist/adaptercloud/pages/customer/SavedAddressesPage.js.map +1 -1
  79. package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js +32 -32
  80. package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js.map +1 -1
  81. package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js +14 -13
  82. package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  83. package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js +27 -27
  84. package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  85. package/dist/adaptercloud/pages/investor/InvestorDashboard.js +16 -16
  86. package/dist/adaptercloud/pages/investor/InvestorDashboard.js.map +1 -1
  87. package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js +9 -8
  88. package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  89. package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js +12 -12
  90. package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js.map +1 -1
  91. package/dist/adaptercloud/pages/investor/InvestorProfilePage.js +19 -19
  92. package/dist/adaptercloud/pages/investor/InvestorProfilePage.js.map +1 -1
  93. package/dist/adaptercloud/pages/worker/TaskDetailsPage.js +26 -25
  94. package/dist/adaptercloud/pages/worker/TaskDetailsPage.js.map +1 -1
  95. package/dist/adaptercloud/pages/worker/WorkerDashboard.js +43 -43
  96. package/dist/adaptercloud/pages/worker/WorkerDashboard.js.map +1 -1
  97. package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js +37 -36
  98. package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js.map +1 -1
  99. package/dist/adaptercloud/pages/worker/WorkerProfilePage.js +34 -34
  100. package/dist/adaptercloud/pages/worker/WorkerProfilePage.js.map +1 -1
  101. package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js +27 -25
  102. package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js.map +1 -1
  103. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"InvestorAnalyticsPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/investor/InvestorAnalyticsPage.tsx"],"sourcesContent":["/**\n * Investor Analytics Page\n * @module adaptercloud/pages/investor\n *\n * Date range selector, export button, metrics grid, performance by cart\n * with rankings, category distribution with progress bars, monthly\n * performance table, risk analysis with scores, diversification score,\n * and recommendations list.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport {\n TrendingUp,\n PieChart,\n BarChart3,\n Calendar,\n Download,\n Target,\n Activity,\n Wallet,\n IndianRupee,\n Lightbulb,\n Shield,\n AlertTriangle,\n ArrowUp,\n ArrowDown,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatNumber } from '../../utils/formatters';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface AnalyticsData {\n portfolioMetrics: {\n totalValue: number;\n totalInvested: number;\n totalReturns: number;\n averageRoi: number;\n portfolioGrowth: number;\n bestPerforming: string;\n worstPerforming: string;\n };\n performanceByCart: Array<{\n cartName: string;\n investedAmount: number;\n currentValue: number;\n returns: number;\n roi: number;\n }>;\n performanceByCategory: Array<{\n category: string;\n investedAmount: number;\n returns: number;\n percentage: number;\n }>;\n monthlyPerformance: Array<{\n month: string;\n invested: number;\n value: number;\n returns: number;\n }>;\n riskAnalysis: {\n riskScore: number;\n diversificationScore: number;\n volatilityScore: number;\n recommendations: string[];\n };\n}\n\n// ---------------------------------------------------------------------------\n// Mock data\n// ---------------------------------------------------------------------------\n\nconst mockAnalytics: AnalyticsData = {\n portfolioMetrics: {\n totalValue: 283700,\n totalInvested: 255000,\n totalReturns: 28700,\n averageRoi: 19.6,\n portfolioGrowth: 11.3,\n bestPerforming: 'Biryani House',\n worstPerforming: 'Healthy Bites',\n },\n performanceByCart: [\n {\n cartName: 'Biryani House',\n investedAmount: 60000,\n currentValue: 72000,\n returns: 12000,\n roi: 20.0,\n },\n {\n cartName: 'South Indian Express',\n investedAmount: 50000,\n currentValue: 58500,\n returns: 8500,\n roi: 17.0,\n },\n {\n cartName: 'Pizza Corner',\n investedAmount: 75000,\n currentValue: 82000,\n returns: 7000,\n roi: 9.3,\n },\n {\n cartName: 'Healthy Bites',\n investedAmount: 30000,\n currentValue: 31200,\n returns: 1200,\n roi: 4.0,\n },\n {\n cartName: 'Street Food Junction',\n investedAmount: 40000,\n currentValue: 40000,\n returns: 0,\n roi: 0,\n },\n ],\n performanceByCategory: [\n {\n category: 'South Indian',\n investedAmount: 110000,\n returns: 20500,\n percentage: 43.1,\n },\n {\n category: 'Fast Food',\n investedAmount: 75000,\n returns: 7000,\n percentage: 29.4,\n },\n {\n category: 'Street Food',\n investedAmount: 40000,\n returns: 0,\n percentage: 15.7,\n },\n {\n category: 'Healthy Food',\n investedAmount: 30000,\n returns: 1200,\n percentage: 11.8,\n },\n ],\n monthlyPerformance: [\n { month: 'Jun 2024', invested: 195000, value: 202000, returns: 7000 },\n { month: 'Jul 2024', invested: 215000, value: 228000, returns: 13000 },\n { month: 'Aug 2024', invested: 255000, value: 265000, returns: 10000 },\n { month: 'Sep 2024', invested: 255000, value: 275000, returns: 20000 },\n { month: 'Oct 2024', invested: 255000, value: 280000, returns: 25000 },\n { month: 'Nov 2024', invested: 255000, value: 283700, returns: 28700 },\n ],\n riskAnalysis: {\n riskScore: 3.2,\n diversificationScore: 7.8,\n volatilityScore: 2.5,\n recommendations: [\n 'Consider diversifying into more food categories',\n 'Your portfolio shows good risk distribution',\n 'Consider investing in carts from different locations',\n 'Monitor underperforming investments closely',\n 'Explore premium segment opportunities for higher returns',\n ],\n },\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getRiskLevel(score: number): { label: string; color: string } {\n if (score <= 2) return { label: 'Low Risk', color: 'text-green-600 dark:text-green-400' };\n if (score <= 4) return { label: 'Moderate Risk', color: 'text-yellow-600 dark:text-yellow-400' };\n return { label: 'High Risk', color: 'text-red-600 dark:text-red-400' };\n}\n\nfunction getRiskBgColor(score: number): string {\n if (score <= 2) return 'bg-green-500';\n if (score <= 4) return 'bg-yellow-500';\n return 'bg-red-500';\n}\n\nfunction getDiversificationLevel(score: number): { label: string; color: string } {\n if (score >= 8) return { label: 'Well Diversified', color: 'text-green-600 dark:text-green-400' };\n if (score >= 6)\n return { label: 'Moderately Diversified', color: 'text-yellow-600 dark:text-yellow-400' };\n return { label: 'Poorly Diversified', color: 'text-red-600 dark:text-red-400' };\n}\n\nfunction getDiversificationBgColor(score: number): string {\n if (score >= 8) return 'bg-green-500';\n if (score >= 6) return 'bg-yellow-500';\n return 'bg-red-500';\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function InvestorAnalyticsPage() {\n const { navigateTo } = useAdapterCloud();\n const [isLoading, setIsLoading] = useState(true);\n const [dateRange, setDateRange] = useState('6m');\n const [analytics, setAnalytics] = useState<AnalyticsData | null>(null);\n const [exportStatus, setExportStatus] = useState<'idle' | 'exporting' | 'done'>('idle');\n\n useEffect(() => {\n setIsLoading(true);\n const timer = setTimeout(() => {\n setAnalytics(mockAnalytics);\n setIsLoading(false);\n }, 600);\n return () => clearTimeout(timer);\n }, [dateRange]);\n\n const handleExportReport = useCallback(() => {\n setExportStatus('exporting');\n setTimeout(() => {\n setExportStatus('done');\n setTimeout(() => setExportStatus('idle'), 2000);\n }, 1200);\n }, []);\n\n if (isLoading || !analytics) {\n return (\n <PageLayout title=\"Investment Analytics\" description=\"Loading analytics...\">\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 analytics data...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n const riskLevel = getRiskLevel(analytics.riskAnalysis.riskScore);\n const diversificationLevel = getDiversificationLevel(analytics.riskAnalysis.diversificationScore);\n\n // Sort carts by ROI for ranking\n const sortedCarts = [...analytics.performanceByCart].sort((a, b) => b.roi - a.roi);\n\n return (\n <PageLayout\n title=\"Investment Analytics\"\n description=\"Comprehensive analysis of your portfolio performance\"\n actions={\n <div className=\"flex items-center gap-3\">\n {/* Date Range Selector */}\n <select\n value={dateRange}\n onChange={(e) => setDateRange(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=\"1m\">Last Month</option>\n <option value=\"3m\">Last 3 Months</option>\n <option value=\"6m\">Last 6 Months</option>\n <option value=\"1y\">Last Year</option>\n <option value=\"all\">All Time</option>\n </select>\n\n {/* Export Button */}\n <button\n type=\"button\"\n onClick={handleExportReport}\n disabled={exportStatus === 'exporting'}\n className={cn(\n 'flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors',\n exportStatus === 'exporting'\n ? 'cursor-not-allowed bg-bg-sunken text-text-secondary'\n : exportStatus === 'done'\n ? 'bg-green-600 text-white'\n : 'bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90'\n )}\n >\n <Download className=\"h-4 w-4\" />\n {exportStatus === 'exporting'\n ? 'Exporting...'\n : exportStatus === 'done'\n ? 'Exported!'\n : 'Export Report'}\n </button>\n </div>\n }\n >\n {/* Key Metrics */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <MetricsCard\n icon={<Wallet className=\"h-5 w-5\" />}\n value={formatCurrency(analytics.portfolioMetrics.totalValue, {\n minimumFractionDigits: 0,\n })}\n label=\"Portfolio Value\"\n trend=\"up\"\n trendValue={`+${analytics.portfolioMetrics.portfolioGrowth}% total growth`}\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={formatCurrency(analytics.portfolioMetrics.totalReturns, {\n minimumFractionDigits: 0,\n })}\n label=\"Total Returns\"\n trend=\"up\"\n trendValue=\"Profit earned so far\"\n />\n <MetricsCard\n icon={<Target className=\"h-5 w-5\" />}\n value={`${analytics.portfolioMetrics.averageRoi}%`}\n label=\"Average ROI\"\n trend=\"up\"\n trendValue=\"Across all investments\"\n />\n <MetricsCard\n icon={<Activity className=\"h-5 w-5\" />}\n value={`${analytics.riskAnalysis.riskScore}/5`}\n label=\"Risk Score\"\n trend=\"neutral\"\n trendValue={riskLevel.label}\n />\n </div>\n\n {/* Best / Worst Performers */}\n <div className=\"mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-green-500/10\">\n <ArrowUp className=\"h-5 w-5 text-green-600 dark:text-green-400\" />\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Best Performing</p>\n <p className=\"text-sm font-semibold text-green-600 dark:text-green-400\">\n {analytics.portfolioMetrics.bestPerforming}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-red-500/10\">\n <ArrowDown className=\"h-5 w-5 text-red-600 dark:text-red-400\" />\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Worst Performing</p>\n <p className=\"text-sm font-semibold text-text-primary\">\n {analytics.portfolioMetrics.worstPerforming}\n </p>\n </div>\n </div>\n </div>\n\n {/* Performance by Cart & Category Distribution */}\n <div className=\"mt-6 grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Performance by Cart */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <BarChart3 className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Performance by Cart</h2>\n </div>\n\n <div className=\"space-y-3\">\n {sortedCarts.map((cart, index) => (\n <div\n key={cart.cartName}\n className=\"flex items-center justify-between rounded-lg border border-border-subtle bg-bg-surface p-3\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-xs font-bold text-action-primary-text\">\n {index + 1}\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{cart.cartName}</p>\n <p className=\"text-xs text-text-secondary\">\n {formatCurrency(cart.investedAmount, { minimumFractionDigits: 0 })} invested\n </p>\n </div>\n </div>\n <div className=\"text-right\">\n <p\n className={cn(\n 'text-sm font-semibold',\n cart.returns >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {cart.returns >= 0 ? '+' : ''}\n {formatCurrency(cart.returns, { minimumFractionDigits: 0 })}\n </p>\n <p\n className={cn(\n 'text-xs',\n cart.roi >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {cart.roi >= 0 ? '+' : ''}\n {cart.roi}% ROI\n </p>\n </div>\n </div>\n ))}\n </div>\n </section>\n\n {/* Category Distribution */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <PieChart className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Category Distribution</h2>\n </div>\n\n <div className=\"space-y-4\">\n {analytics.performanceByCategory.map((category) => (\n <div key={category.category} className=\"rounded-lg border border-border-subtle bg-bg-surface p-3\">\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm font-medium text-text-primary\">{category.category}</span>\n <span className=\"text-sm text-text-secondary\">{category.percentage}%</span>\n </div>\n <div className=\"mb-2 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: `${category.percentage}%` }}\n />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">\n {formatCurrency(category.investedAmount, { minimumFractionDigits: 0 })} invested\n </span>\n <span\n className={cn(\n 'text-xs font-semibold',\n category.returns >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {category.returns >= 0 ? '+' : ''}\n {formatCurrency(category.returns, { minimumFractionDigits: 0 })}\n </span>\n </div>\n </div>\n ))}\n </div>\n </section>\n </div>\n\n {/* Monthly Performance Table */}\n <section className=\"mt-8\">\n <div className=\"mb-4 flex items-center gap-2\">\n <Calendar className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Portfolio Growth Trend</h2>\n </div>\n\n <div className=\"overflow-hidden rounded-lg border border-border-subtle bg-bg-surface\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-subtle bg-bg-sunken/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Month\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Invested\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Portfolio Value\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Returns\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Growth %\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {analytics.monthlyPerformance.map((month) => {\n const growthPct =\n month.invested > 0\n ? (((month.value - month.invested) / month.invested) * 100).toFixed(1)\n : '0.0';\n\n return (\n <tr key={month.month} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"whitespace-nowrap px-4 py-4 text-sm font-medium text-text-primary sm:px-6\">\n {month.month}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm text-text-primary sm:px-6\">\n {formatCurrency(month.invested, { minimumFractionDigits: 0 })}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm text-text-primary sm:px-6\">\n {formatCurrency(month.value, { minimumFractionDigits: 0 })}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm sm:px-6\">\n <span\n className={cn(\n 'font-semibold',\n month.returns >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {month.returns >= 0 ? '+' : ''}\n {formatCurrency(month.returns, { minimumFractionDigits: 0 })}\n </span>\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm sm:px-6\">\n <span\n className={cn(\n 'font-medium',\n parseFloat(growthPct) >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {parseFloat(growthPct) >= 0 ? '+' : ''}\n {growthPct}%\n </span>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n </section>\n\n {/* Risk Analysis & Diversification */}\n <div className=\"mt-8 grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Risk Analysis */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <Shield className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Risk Analysis</h2>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6\">\n <div className=\"space-y-5\">\n {/* Risk Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Risk Score</span>\n <span className={cn('text-sm font-semibold', riskLevel.color)}>\n {analytics.riskAnalysis.riskScore}/5 ({riskLevel.label})\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getRiskBgColor(analytics.riskAnalysis.riskScore)\n )}\n style={{ width: `${(analytics.riskAnalysis.riskScore / 5) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Diversification Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Diversification</span>\n <span className={cn('text-sm font-semibold', diversificationLevel.color)}>\n {analytics.riskAnalysis.diversificationScore}/10 ({diversificationLevel.label})\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getDiversificationBgColor(analytics.riskAnalysis.diversificationScore)\n )}\n style={{\n width: `${(analytics.riskAnalysis.diversificationScore / 10) * 100}%`,\n }}\n />\n </div>\n </div>\n\n {/* Volatility Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Volatility</span>\n <span\n className={cn(\n 'text-sm font-semibold',\n getRiskLevel(analytics.riskAnalysis.volatilityScore).color\n )}\n >\n {analytics.riskAnalysis.volatilityScore}/5\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getRiskBgColor(analytics.riskAnalysis.volatilityScore)\n )}\n style={{ width: `${(analytics.riskAnalysis.volatilityScore / 5) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Quick Stats */}\n <div className=\"grid grid-cols-2 gap-3 border-t border-border-subtle pt-4\">\n <div className=\"rounded-lg bg-bg-sunken/50 p-3 text-center\">\n <p className=\"text-lg font-bold text-text-primary\">\n {analytics.performanceByCart.length}\n </p>\n <p className=\"text-xs text-text-secondary\">Active Investments</p>\n </div>\n <div className=\"rounded-lg bg-bg-sunken/50 p-3 text-center\">\n <p className=\"text-lg font-bold text-text-primary\">\n {analytics.performanceByCategory.length}\n </p>\n <p className=\"text-xs text-text-secondary\">Sectors Covered</p>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Recommendations */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <Lightbulb className=\"h-5 w-5 text-yellow-500\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Recommendations</h2>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6\">\n <div className=\"space-y-3\">\n {analytics.riskAnalysis.recommendations.map((recommendation, index) => (\n <div\n key={index}\n className=\"flex items-start gap-3 rounded-lg border border-border-subtle bg-bg-sunken/30 p-3\"\n >\n <div 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\">\n {index + 1}\n </div>\n <p className=\"text-sm leading-relaxed text-text-primary\">{recommendation}</p>\n </div>\n ))}\n </div>\n\n {/* Overall Assessment */}\n <div className=\"mt-5 rounded-lg border border-border-subtle bg-bg-sunken/50 p-4\">\n <h4 className=\"mb-2 text-sm font-semibold text-text-primary\">Overall Assessment</h4>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Portfolio Health</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn('h-2 w-4 rounded-sm', i <= 4 ? 'bg-green-500' : 'bg-bg-sunken')}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">4/5</span>\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Growth Potential</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn(\n 'h-2 w-4 rounded-sm',\n i <= 3 ? 'bg-yellow-500' : 'bg-bg-sunken'\n )}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">3/5</span>\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Income Stability</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn('h-2 w-4 rounded-sm', i <= 4 ? 'bg-green-500' : 'bg-bg-sunken')}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">4/5</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n </div>\n\n {/* Quick Navigation */}\n <div className=\"mt-8 flex flex-wrap gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/portfolio')}\n 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\"\n >\n <PieChart className=\"h-4 w-4\" />\n View Portfolio\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n 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\"\n >\n <Target className=\"h-4 w-4\" />\n Browse Opportunities\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/investments')}\n 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\"\n >\n <Wallet className=\"h-4 w-4\" />\n My Investments\n </button>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"InvestorAnalyticsPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/investor/InvestorAnalyticsPage.tsx"],"sourcesContent":["/**\n * Investor Analytics Page\n * @module adaptercloud/pages/investor\n *\n * Date range selector, export button, metrics grid, performance by cart\n * with rankings, category distribution with progress bars, monthly\n * performance table, risk analysis with scores, diversification score,\n * and recommendations list.\n */\n\nimport { useState, useEffect, useCallback } from'react';\nimport {\n TrendingUp,\n PieChart,\n BarChart3,\n Calendar,\n Download,\n Target,\n Activity,\n Wallet,\n IndianRupee,\n Lightbulb,\n Shield,\n AlertTriangle,\n ArrowUp,\n ArrowDown,\n} from'lucide-react';\nimport { PageLayout } from'../../components/PageLayout';\nimport { MetricsCard } from'../../components/MetricsCard';\nimport { useAdapterCloud } from'../../context/AdapterCloudContext';\nimport { cn } from'../../utils/cn';\nimport { formatCurrency, formatNumber } from'../../utils/formatters';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface AnalyticsData {\n portfolioMetrics: {\n totalValue: number;\n totalInvested: number;\n totalReturns: number;\n averageRoi: number;\n portfolioGrowth: number;\n bestPerforming: string;\n worstPerforming: string;\n };\n performanceByCart: Array<{\n cartName: string;\n investedAmount: number;\n currentValue: number;\n returns: number;\n roi: number;\n }>;\n performanceByCategory: Array<{\n category: string;\n investedAmount: number;\n returns: number;\n percentage: number;\n }>;\n monthlyPerformance: Array<{\n month: string;\n invested: number;\n value: number;\n returns: number;\n }>;\n riskAnalysis: {\n riskScore: number;\n diversificationScore: number;\n volatilityScore: number;\n recommendations: string[];\n };\n}\n\n// ---------------------------------------------------------------------------\n// Mock data\n// ---------------------------------------------------------------------------\n\nconst mockAnalytics: AnalyticsData = {\n portfolioMetrics: {\n totalValue: 283700,\n totalInvested: 255000,\n totalReturns: 28700,\n averageRoi: 19.6,\n portfolioGrowth: 11.3,\n bestPerforming: 'Biryani House',\n worstPerforming: 'Healthy Bites',\n },\n performanceByCart: [\n {\n cartName: 'Biryani House',\n investedAmount: 60000,\n currentValue: 72000,\n returns: 12000,\n roi: 20.0,\n },\n {\n cartName: 'South Indian Express',\n investedAmount: 50000,\n currentValue: 58500,\n returns: 8500,\n roi: 17.0,\n },\n {\n cartName: 'Pizza Corner',\n investedAmount: 75000,\n currentValue: 82000,\n returns: 7000,\n roi: 9.3,\n },\n {\n cartName: 'Healthy Bites',\n investedAmount: 30000,\n currentValue: 31200,\n returns: 1200,\n roi: 4.0,\n },\n {\n cartName: 'Street Food Junction',\n investedAmount: 40000,\n currentValue: 40000,\n returns: 0,\n roi: 0,\n },\n ],\n performanceByCategory: [\n {\n category: 'South Indian',\n investedAmount: 110000,\n returns: 20500,\n percentage: 43.1,\n },\n {\n category: 'Fast Food',\n investedAmount: 75000,\n returns: 7000,\n percentage: 29.4,\n },\n {\n category: 'Street Food',\n investedAmount: 40000,\n returns: 0,\n percentage: 15.7,\n },\n {\n category: 'Healthy Food',\n investedAmount: 30000,\n returns: 1200,\n percentage: 11.8,\n },\n ],\n monthlyPerformance: [\n { month: 'Jun 2024', invested: 195000, value: 202000, returns: 7000 },\n { month: 'Jul 2024', invested: 215000, value: 228000, returns: 13000 },\n { month: 'Aug 2024', invested: 255000, value: 265000, returns: 10000 },\n { month: 'Sep 2024', invested: 255000, value: 275000, returns: 20000 },\n { month: 'Oct 2024', invested: 255000, value: 280000, returns: 25000 },\n { month: 'Nov 2024', invested: 255000, value: 283700, returns: 28700 },\n ],\n riskAnalysis: {\n riskScore: 3.2,\n diversificationScore: 7.8,\n volatilityScore: 2.5,\n recommendations: [\n 'Consider diversifying into more food categories',\n 'Your portfolio shows good risk distribution',\n 'Consider investing in carts from different locations',\n 'Monitor underperforming investments closely',\n 'Explore premium segment opportunities for higher returns',\n ],\n },\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getRiskLevel(score: number): { label: string; color: string } {\n if (score <= 2) return { label: 'Low Risk', color: 'text-status-success-text' };\n if (score <= 4) return { label: 'Moderate Risk', color: 'text-status-warning-text' };\n return { label: 'High Risk', color: 'text-status-error-text' };\n}\n\nfunction getRiskBgColor(score: number): string {\n if (score <= 2) return'bg-status-success-bg-subtle';\n if (score <= 4) return'bg-status-warning-bg-subtle';\n return'bg-status-error-bg-subtle';\n}\n\nfunction getDiversificationLevel(score: number): { label: string; color: string } {\n if (score >= 8) return { label: 'Well Diversified', color: 'text-status-success-text' };\n if (score >= 6)\n return { label: 'Moderately Diversified', color: 'text-status-warning-text' };\n return { label: 'Poorly Diversified', color: 'text-status-error-text' };\n}\n\nfunction getDiversificationBgColor(score: number): string {\n if (score >= 8) return'bg-status-success-bg-subtle';\n if (score >= 6) return'bg-status-warning-bg-subtle';\n return'bg-status-error-bg-subtle';\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function InvestorAnalyticsPage() {\n const { navigateTo } = useAdapterCloud();\n const [isLoading, setIsLoading] = useState(true);\n const [dateRange, setDateRange] = useState('6m');\n const [analytics, setAnalytics] = useState<AnalyticsData | null>(null);\n const [exportStatus, setExportStatus] = useState<'idle' | 'exporting' | 'done'>('idle');\n\n useEffect(() => {\n setIsLoading(true);\n const timer = setTimeout(() => {\n setAnalytics(mockAnalytics);\n setIsLoading(false);\n }, 600);\n return () => clearTimeout(timer);\n }, [dateRange]);\n\n const handleExportReport = useCallback(() => {\n setExportStatus('exporting');\n setTimeout(() => {\n setExportStatus('done');\n setTimeout(() => setExportStatus('idle'), 2000);\n }, 1200);\n }, []);\n\n if (isLoading || !analytics) {\n return (\n <PageLayout title=\"Investment Analytics\" description=\"Loading analytics...\">\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 analytics data...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n const riskLevel = getRiskLevel(analytics.riskAnalysis.riskScore);\n const diversificationLevel = getDiversificationLevel(analytics.riskAnalysis.diversificationScore);\n\n // Sort carts by ROI for ranking\n const sortedCarts = [...analytics.performanceByCart].sort((a, b) => b.roi - a.roi);\n\n return (\n <PageLayout\n title=\"Investment Analytics\"\n description=\"Comprehensive analysis of your portfolio performance\"\n actions={\n <div className=\"flex items-center gap-3\">\n {/* Date Range Selector */}\n <select\n value={dateRange}\n onChange={(e) => setDateRange(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=\"1m\">Last Month</option>\n <option value=\"3m\">Last 3 Months</option>\n <option value=\"6m\">Last 6 Months</option>\n <option value=\"1y\">Last Year</option>\n <option value=\"all\">All Time</option>\n </select>\n\n {/* Export Button */}\n <button\n type=\"button\"\n onClick={handleExportReport}\n disabled={exportStatus === 'exporting'}\n className={cn(\n 'flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors',\n exportStatus === 'exporting'\n ? 'cursor-not-allowed bg-bg-sunken text-text-secondary'\n : exportStatus === 'done'\n ? 'bg-status-success-bg-subtle text-white'\n : 'bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90'\n )}\n >\n <Download className=\"h-4 w-4\" />\n {exportStatus === 'exporting'\n ? 'Exporting...'\n : exportStatus === 'done'\n ? 'Exported!'\n : 'Export Report'}\n </button>\n </div>\n }\n >\n {/* Key Metrics */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <MetricsCard\n icon={<Wallet className=\"h-5 w-5\" />}\n value={formatCurrency(analytics.portfolioMetrics.totalValue, {\n minimumFractionDigits: 0,\n })}\n label=\"Portfolio Value\"\n trend=\"up\"\n trendValue={`+${analytics.portfolioMetrics.portfolioGrowth}% total growth`}\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={formatCurrency(analytics.portfolioMetrics.totalReturns, {\n minimumFractionDigits: 0,\n })}\n label=\"Total Returns\"\n trend=\"up\"\n trendValue=\"Profit earned so far\"\n />\n <MetricsCard\n icon={<Target className=\"h-5 w-5\" />}\n value={`${analytics.portfolioMetrics.averageRoi}%`}\n label=\"Average ROI\"\n trend=\"up\"\n trendValue=\"Across all investments\"\n />\n <MetricsCard\n icon={<Activity className=\"h-5 w-5\" />}\n value={`${analytics.riskAnalysis.riskScore}/5`}\n label=\"Risk Score\"\n trend=\"neutral\"\n trendValue={riskLevel.label}\n />\n </div>\n\n {/* Best / Worst Performers */}\n <div className=\"mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div className=\"flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-status-success-bg-subtle/10\">\n <ArrowUp className=\"h-5 w-5 text-status-success-text\" />\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Best Performing</p>\n <p className=\"text-sm font-semibold text-status-success-text\">\n {analytics.portfolioMetrics.bestPerforming}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-status-error-bg-subtle/10\">\n <ArrowDown className=\"h-5 w-5 text-status-error-text\" />\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Worst Performing</p>\n <p className=\"text-sm font-semibold text-text-primary\">\n {analytics.portfolioMetrics.worstPerforming}\n </p>\n </div>\n </div>\n </div>\n\n {/* Performance by Cart & Category Distribution */}\n <div className=\"mt-6 grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Performance by Cart */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <BarChart3 className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Performance by Cart</h2>\n </div>\n\n <div className=\"space-y-3\">\n {sortedCarts.map((cart, index) => (\n <div\n key={cart.cartName}\n className=\"flex items-center justify-between rounded-lg border border-border-subtle bg-bg-surface p-3\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-xs font-bold text-action-primary-text\">\n {index + 1}\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{cart.cartName}</p>\n <p className=\"text-xs text-text-secondary\">\n {formatCurrency(cart.investedAmount, { minimumFractionDigits: 0 })} invested\n </p>\n </div>\n </div>\n <div className=\"text-right\">\n <p\n className={cn(\n 'text-sm font-semibold',\n cart.returns >= 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {cart.returns >= 0 ? '+' : ''}\n {formatCurrency(cart.returns, { minimumFractionDigits: 0 })}\n </p>\n <p\n className={cn(\n 'text-xs',\n cart.roi >= 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {cart.roi >= 0 ? '+' : ''}\n {cart.roi}% ROI\n </p>\n </div>\n </div>\n ))}\n </div>\n </section>\n\n {/* Category Distribution */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <PieChart className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Category Distribution</h2>\n </div>\n\n <div className=\"space-y-4\">\n {analytics.performanceByCategory.map((category) => (\n <div key={category.category} className=\"rounded-lg border border-border-subtle bg-bg-surface p-3\">\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm font-medium text-text-primary\">{category.category}</span>\n <span className=\"text-sm text-text-secondary\">{category.percentage}%</span>\n </div>\n <div className=\"mb-2 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: `${category.percentage}%` }}\n />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">\n {formatCurrency(category.investedAmount, { minimumFractionDigits: 0 })} invested\n </span>\n <span\n className={cn(\n 'text-xs font-semibold',\n category.returns >= 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {category.returns >= 0 ? '+' : ''}\n {formatCurrency(category.returns, { minimumFractionDigits: 0 })}\n </span>\n </div>\n </div>\n ))}\n </div>\n </section>\n </div>\n\n {/* Monthly Performance Table */}\n <section className=\"mt-8\">\n <div className=\"mb-4 flex items-center gap-2\">\n <Calendar className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Portfolio Growth Trend</h2>\n </div>\n\n <div className=\"overflow-hidden rounded-lg border border-border-subtle bg-bg-surface\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-subtle bg-bg-sunken/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Month\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Invested\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Portfolio Value\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Returns\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Growth %\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {analytics.monthlyPerformance.map((month) => {\n const growthPct =\n month.invested > 0\n ? (((month.value - month.invested) / month.invested) * 100).toFixed(1)\n : '0.0';\n\n return (\n <tr key={month.month} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"whitespace-nowrap px-4 py-4 text-sm font-medium text-text-primary sm:px-6\">\n {month.month}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm text-text-primary sm:px-6\">\n {formatCurrency(month.invested, { minimumFractionDigits: 0 })}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm text-text-primary sm:px-6\">\n {formatCurrency(month.value, { minimumFractionDigits: 0 })}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm sm:px-6\">\n <span\n className={cn(\n 'font-semibold',\n month.returns >= 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {month.returns >= 0 ? '+' : ''}\n {formatCurrency(month.returns, { minimumFractionDigits: 0 })}\n </span>\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm sm:px-6\">\n <span\n className={cn(\n 'font-medium',\n parseFloat(growthPct) >= 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {parseFloat(growthPct) >= 0 ? '+' : ''}\n {growthPct}%\n </span>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n </section>\n\n {/* Risk Analysis & Diversification */}\n <div className=\"mt-8 grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Risk Analysis */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <Shield className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Risk Analysis</h2>\n </div>\n\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 sm:p-6 bg-gloss-card shadow-pop\">\n <div className=\"space-y-5\">\n {/* Risk Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Risk Score</span>\n <span className={cn('text-sm font-semibold', riskLevel.color)}>\n {analytics.riskAnalysis.riskScore}/5 ({riskLevel.label})\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getRiskBgColor(analytics.riskAnalysis.riskScore)\n )}\n style={{ width: `${(analytics.riskAnalysis.riskScore / 5) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Diversification Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Diversification</span>\n <span className={cn('text-sm font-semibold', diversificationLevel.color)}>\n {analytics.riskAnalysis.diversificationScore}/10 ({diversificationLevel.label})\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getDiversificationBgColor(analytics.riskAnalysis.diversificationScore)\n )}\n style={{\n width: `${(analytics.riskAnalysis.diversificationScore / 10) * 100}%`,\n }}\n />\n </div>\n </div>\n\n {/* Volatility Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Volatility</span>\n <span\n className={cn(\n 'text-sm font-semibold',\n getRiskLevel(analytics.riskAnalysis.volatilityScore).color\n )}\n >\n {analytics.riskAnalysis.volatilityScore}/5\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getRiskBgColor(analytics.riskAnalysis.volatilityScore)\n )}\n style={{ width: `${(analytics.riskAnalysis.volatilityScore / 5) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Quick Stats */}\n <div className=\"grid grid-cols-2 gap-3 border-t border-border-subtle pt-4\">\n <div className=\"rounded-lg bg-bg-sunken/50 p-3 text-center\">\n <p className=\"text-lg font-bold text-text-primary\">\n {analytics.performanceByCart.length}\n </p>\n <p className=\"text-xs text-text-secondary\">Active Investments</p>\n </div>\n <div className=\"rounded-lg bg-bg-sunken/50 p-3 text-center\">\n <p className=\"text-lg font-bold text-text-primary\">\n {analytics.performanceByCategory.length}\n </p>\n <p className=\"text-xs text-text-secondary\">Sectors Covered</p>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Recommendations */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <Lightbulb className=\"h-5 w-5 text-status-warning-text\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Recommendations</h2>\n </div>\n\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 sm:p-6 bg-gloss-card shadow-pop\">\n <div className=\"space-y-3\">\n {analytics.riskAnalysis.recommendations.map((recommendation, index) => (\n <div\n key={index}\n className=\"flex items-start gap-3 rounded-lg border border-border-subtle bg-bg-sunken/30 p-3\"\n >\n <div 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\">\n {index + 1}\n </div>\n <p className=\"text-sm leading-relaxed text-text-primary\">{recommendation}</p>\n </div>\n ))}\n </div>\n\n {/* Overall Assessment */}\n <div className=\"mt-5 rounded-lg border border-border-subtle bg-bg-sunken/50 p-4\">\n <h4 className=\"mb-2 text-sm font-semibold text-text-primary\">Overall Assessment</h4>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Portfolio Health</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn('h-2 w-4 rounded-sm', i <= 4 ? 'bg-status-success-bg-subtle' : 'bg-bg-sunken')}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">4/5</span>\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Growth Potential</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn(\n 'h-2 w-4 rounded-sm',\n i <= 3 ? 'bg-status-warning-bg-subtle' : 'bg-bg-sunken'\n )}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">3/5</span>\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Income Stability</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn('h-2 w-4 rounded-sm', i <= 4 ? 'bg-status-success-bg-subtle' : 'bg-bg-sunken')}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">4/5</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n </div>\n\n {/* Quick Navigation */}\n <div className=\"mt-8 flex flex-wrap gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/portfolio')}\n 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\"\n >\n <PieChart className=\"h-4 w-4\" />\n View Portfolio\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n 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\"\n >\n <Target className=\"h-4 w-4\" />\n Browse Opportunities\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/investments')}\n 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\"\n >\n <Wallet className=\"h-4 w-4\" />\n My Investments\n </button>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AA8EA,IAAM,IAA+B;CACnC,kBAAkB;EAChB,YAAY;EACZ,eAAe;EACf,cAAc;EACd,YAAY;EACZ,iBAAiB;EACjB,gBAAgB;EAChB,iBAAiB;EAClB;CACD,mBAAmB;EACjB;GACE,UAAU;GACV,gBAAgB;GAChB,cAAc;GACd,SAAS;GACT,KAAK;GACN;EACD;GACE,UAAU;GACV,gBAAgB;GAChB,cAAc;GACd,SAAS;GACT,KAAK;GACN;EACD;GACE,UAAU;GACV,gBAAgB;GAChB,cAAc;GACd,SAAS;GACT,KAAK;GACN;EACD;GACE,UAAU;GACV,gBAAgB;GAChB,cAAc;GACd,SAAS;GACT,KAAK;GACN;EACD;GACE,UAAU;GACV,gBAAgB;GAChB,cAAc;GACd,SAAS;GACT,KAAK;GACN;EACF;CACD,uBAAuB;EACrB;GACE,UAAU;GACV,gBAAgB;GAChB,SAAS;GACT,YAAY;GACb;EACD;GACE,UAAU;GACV,gBAAgB;GAChB,SAAS;GACT,YAAY;GACb;EACD;GACE,UAAU;GACV,gBAAgB;GAChB,SAAS;GACT,YAAY;GACb;EACD;GACE,UAAU;GACV,gBAAgB;GAChB,SAAS;GACT,YAAY;GACb;EACF;CACD,oBAAoB;EAClB;GAAE,OAAO;GAAY,UAAU;GAAQ,OAAO;GAAQ,SAAS;GAAM;EACrE;GAAE,OAAO;GAAY,UAAU;GAAQ,OAAO;GAAQ,SAAS;GAAO;EACtE;GAAE,OAAO;GAAY,UAAU;GAAQ,OAAO;GAAQ,SAAS;GAAO;EACtE;GAAE,OAAO;GAAY,UAAU;GAAQ,OAAO;GAAQ,SAAS;GAAO;EACtE;GAAE,OAAO;GAAY,UAAU;GAAQ,OAAO;GAAQ,SAAS;GAAO;EACtE;GAAE,OAAO;GAAY,UAAU;GAAQ,OAAO;GAAQ,SAAS;GAAO;EACvE;CACD,cAAc;EACZ,WAAW;EACX,sBAAsB;EACtB,iBAAiB;EACjB,iBAAiB;GACf;GACA;GACA;GACA;GACA;GACD;EACF;CACF;AAMD,SAAS,EAAa,GAAiD;AAGrE,QAFI,KAAS,IAAU;EAAE,OAAO;EAAY,OAAO;EAA4B,GAC3E,KAAS,IAAU;EAAE,OAAO;EAAiB,OAAO;EAA4B,GAC7E;EAAE,OAAO;EAAa,OAAO;EAA0B;;AAGhE,SAAS,EAAe,GAAuB;AAG7C,QAFI,KAAS,IAAS,gCAClB,KAAS,IAAS,gCAChB;;AAGR,SAAS,EAAwB,GAAiD;AAIhF,QAHI,KAAS,IAAU;EAAE,OAAO;EAAoB,OAAO;EAA4B,GACnF,KAAS,IACJ;EAAE,OAAO;EAA0B,OAAO;EAA4B,GACxE;EAAE,OAAO;EAAsB,OAAO;EAA0B;;AAGzE,SAAS,EAA0B,GAAuB;AAGxD,QAFI,KAAS,IAAS,gCAClB,KAAS,IAAS,gCAChB;;AAOR,SAAgB,IAAwB;CACtC,IAAM,EAAE,kBAAe,GAAiB,EAClC,CAAC,GAAW,KAAgB,EAAS,GAAK,EAC1C,CAAC,GAAW,KAAgB,EAAS,KAAK,EAC1C,CAAC,GAAW,KAAgB,EAA+B,KAAK,EAChE,CAAC,GAAc,KAAmB,EAAwC,OAAO;AAEvF,SAAgB;AACd,IAAa,GAAK;EAClB,IAAM,IAAQ,iBAAiB;AAE7B,GADA,EAAa,EAAc,EAC3B,EAAa,GAAM;KAClB,IAAI;AACP,eAAa,aAAa,EAAM;IAC/B,CAAC,EAAU,CAAC;CAEf,IAAM,IAAqB,QAAkB;AAE3C,EADA,EAAgB,YAAY,EAC5B,iBAAiB;AAEf,GADA,EAAgB,OAAO,EACvB,iBAAiB,EAAgB,OAAO,EAAE,IAAK;KAC9C,KAAK;IACP,EAAE,CAAC;AAEN,KAAI,KAAa,CAAC,EAChB,QACE,kBAAC,GAAD;EAAY,OAAM;EAAuB,aAAY;YACnD,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAK,WAAU,8EAA+E,CAAA,EAC9F,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAA6B,CAAA,CACpE;;GACF,CAAA;EACK,CAAA;CAIjB,IAAM,IAAY,EAAa,EAAU,aAAa,UAAU,EAC1D,IAAuB,EAAwB,EAAU,aAAa,qBAAqB,EAG3F,IAAc,CAAC,GAAG,EAAU,kBAAkB,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,IAAI;AAElF,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CAEE,kBAAC,UAAD;IACE,OAAO;IACP,WAAW,MAAM,EAAa,EAAE,OAAO,MAAM;IAC7C,WAAU;cAHZ;KAKE,kBAAC,UAAD;MAAQ,OAAM;gBAAK;MAAmB,CAAA;KACtC,kBAAC,UAAD;MAAQ,OAAM;gBAAK;MAAsB,CAAA;KACzC,kBAAC,UAAD;MAAQ,OAAM;gBAAK;MAAsB,CAAA;KACzC,kBAAC,UAAD;MAAQ,OAAM;gBAAK;MAAkB,CAAA;KACrC,kBAAC,UAAD;MAAQ,OAAM;gBAAM;MAAiB,CAAA;KAC9B;OAGT,kBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,UAAU,MAAiB;IAC3B,WAAW,EACT,sFACA,MAAiB,cACb,wDACA,MAAiB,SACf,2CACA,8EACP;cAXH,CAaE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAC/B,MAAiB,cACd,iBACA,MAAiB,SACf,cACA,gBACC;MACL;;YAvCV;GA2CE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;MACpC,OAAO,EAAe,EAAU,iBAAiB,YAAY,EAC3D,uBAAuB,GACxB,CAAC;MACF,OAAM;MACN,OAAM;MACN,YAAY,IAAI,EAAU,iBAAiB,gBAAgB;MAC3D,CAAA;KACF,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;MACxC,OAAO,EAAe,EAAU,iBAAiB,cAAc,EAC7D,uBAAuB,GACxB,CAAC;MACF,OAAM;MACN,OAAM;MACN,YAAW;MACX,CAAA;KACF,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;MACpC,OAAO,GAAG,EAAU,iBAAiB,WAAW;MAChD,OAAM;MACN,OAAM;MACN,YAAW;MACX,CAAA;KACF,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;MACtC,OAAO,GAAG,EAAU,aAAa,UAAU;MAC3C,OAAM;MACN,OAAM;MACN,YAAY,EAAU;MACtB,CAAA;KACE;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD,EAAS,WAAU,oCAAqC,CAAA;MACpD,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAAmB,CAAA,EAC9D,kBAAC,KAAD;MAAG,WAAU;gBACV,EAAU,iBAAiB;MAC1B,CAAA,CACA,EAAA,CAAA,CACF;QACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD,EAAW,WAAU,kCAAmC,CAAA;MACpD,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAAoB,CAAA,EAC/D,kBAAC,KAAD;MAAG,WAAU;gBACV,EAAU,iBAAiB;MAC1B,CAAA,CACA,EAAA,CAAA,CACF;OACF;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf,CAEE,kBAAC,WAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAW,WAAU,+BAAgC,CAAA,EACrD,kBAAC,MAAD;MAAI,WAAU;gBAA0C;MAAwB,CAAA,CAC5E;QAEN,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAY,KAAK,GAAM,MACtB,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACZ,IAAQ;QACL,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAyC,EAAK;QAAa,CAAA,EACxE,kBAAC,KAAD;QAAG,WAAU;kBAAb,CACG,EAAe,EAAK,gBAAgB,EAAE,uBAAuB,GAAG,CAAC,EAAC,YACjE;UACA,EAAA,CAAA,CACF;UACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QACE,WAAW,EACT,yBACA,EAAK,WAAW,IACZ,6BACA,yBACL;kBANH,CAQG,EAAK,WAAW,IAAI,MAAM,IAC1B,EAAe,EAAK,SAAS,EAAE,uBAAuB,GAAG,CAAC,CACzD;WACJ,kBAAC,KAAD;QACE,WAAW,EACT,WACA,EAAK,OAAO,IACR,6BACA,yBACL;kBANH;SAQG,EAAK,OAAO,IAAI,MAAM;SACtB,EAAK;SAAI;SACR;UACA;SACF;QAtCC,EAAK,SAsCN,CACN;KACE,CAAA,CACE,EAAA,CAAA,EAGV,kBAAC,WAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAU,WAAU,+BAAgC,CAAA,EACpD,kBAAC,MAAD;MAAI,WAAU;gBAA0C;MAA0B,CAAA,CAC9E;QAEN,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAU,sBAAsB,KAAK,MACpC,kBAAC,OAAD;MAA6B,WAAU;gBAAvC;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBAAyC,EAAS;SAAgB,CAAA,EAClF,kBAAC,QAAD;SAAM,WAAU;mBAAhB,CAA+C,EAAS,YAAW,IAAQ;WACvE;;OACN,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,OAAD;SACE,WAAU;SACV,OAAO,EAAE,OAAO,GAAG,EAAS,WAAW,IAAI;SAC3C,CAAA;QACE,CAAA;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBAAhB,CACG,EAAe,EAAS,gBAAgB,EAAE,uBAAuB,GAAG,CAAC,EAAC,YAClE;YACP,kBAAC,QAAD;SACE,WAAW,EACT,yBACA,EAAS,WAAW,IAChB,6BACA,yBACL;mBANH,CAQG,EAAS,WAAW,IAAI,MAAM,IAC9B,EAAe,EAAS,SAAS,EAAE,uBAAuB,GAAG,CAAC,CAC1D;WACH;;OACF;QA3BI,EAAS,SA2Bb,CACN;KACE,CAAA,CACE,EAAA,CAAA,CACN;;GAGN,kBAAC,WAAD;IAAS,WAAU;cAAnB,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAU,WAAU,+BAAgC,CAAA,EACpD,kBAAC,MAAD;MAAI,WAAU;gBAA0C;MAA2B,CAAA,CAC/E;QAEN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;QAAI,WAAU;kBAAd;SACE,kBAAC,MAAD;UAAI,WAAU;oBAA+F;UAExG,CAAA;SACL,kBAAC,MAAD;UAAI,WAAU;oBAA+F;UAExG,CAAA;SACL,kBAAC,MAAD;UAAI,WAAU;oBAA+F;UAExG,CAAA;SACL,kBAAC,MAAD;UAAI,WAAU;oBAA+F;UAExG,CAAA;SACL,kBAAC,MAAD;UAAI,WAAU;oBAA+F;UAExG,CAAA;SACF;WACC,CAAA,EACR,kBAAC,SAAD;QAAO,WAAU;kBACd,EAAU,mBAAmB,KAAK,MAAU;SAC3C,IAAM,IACJ,EAAM,WAAW,MACV,EAAM,QAAQ,EAAM,YAAY,EAAM,WAAY,KAAK,QAAQ,EAAE,GACpE;AAEN,gBACE,kBAAC,MAAD;UAAsB,WAAU;oBAAhC;WACE,kBAAC,MAAD;YAAI,WAAU;sBACX,EAAM;YACJ,CAAA;WACL,kBAAC,MAAD;YAAI,WAAU;sBACX,EAAe,EAAM,UAAU,EAAE,uBAAuB,GAAG,CAAC;YAC1D,CAAA;WACL,kBAAC,MAAD;YAAI,WAAU;sBACX,EAAe,EAAM,OAAO,EAAE,uBAAuB,GAAG,CAAC;YACvD,CAAA;WACL,kBAAC,MAAD;YAAI,WAAU;sBACZ,kBAAC,QAAD;aACE,WAAW,EACT,iBACA,EAAM,WAAW,IACb,6BACA,yBACL;uBANH,CAQG,EAAM,WAAW,IAAI,MAAM,IAC3B,EAAe,EAAM,SAAS,EAAE,uBAAuB,GAAG,CAAC,CACvD;;YACJ,CAAA;WACL,kBAAC,MAAD;YAAI,WAAU;sBACZ,kBAAC,QAAD;aACE,WAAW,EACT,eACA,WAAW,EAAU,IAAI,IACrB,6BACA,yBACL;uBANH;cAQG,WAAW,EAAU,IAAI,IAAI,MAAM;cACnC;cAAU;cACN;;YACJ,CAAA;WACF;YApCI,EAAM,MAoCV;UAEP;QACI,CAAA,CACF;;MACJ,CAAA;KACF,CAAA,CACE;;GAGV,kBAAC,OAAD;IAAK,WAAU;cAAf,CAEE,kBAAC,WAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,+BAAgC,CAAA,EAClD,kBAAC,MAAD;MAAI,WAAU;gBAA0C;MAAkB,CAAA,CACtE;QAEN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,OAAD;MAAK,WAAU;gBAAf;OAEE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBAA4B;SAAiB,CAAA,EAC7D,kBAAC,QAAD;SAAM,WAAW,EAAG,yBAAyB,EAAU,MAAM;mBAA7D;UACG,EAAU,aAAa;UAAU;UAAK,EAAU;UAAM;UAClD;WACH;WACN,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,OAAD;SACE,WAAW,EACT,mDACA,EAAe,EAAU,aAAa,UAAU,CACjD;SACD,OAAO,EAAE,OAAO,GAAI,EAAU,aAAa,YAAY,IAAK,IAAI,IAAI;SACpE,CAAA;QACE,CAAA,CACF,EAAA,CAAA;OAGN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBAA4B;SAAsB,CAAA,EAClE,kBAAC,QAAD;SAAM,WAAW,EAAG,yBAAyB,EAAqB,MAAM;mBAAxE;UACG,EAAU,aAAa;UAAqB;UAAM,EAAqB;UAAM;UACzE;WACH;WACN,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,OAAD;SACE,WAAW,EACT,mDACA,EAA0B,EAAU,aAAa,qBAAqB,CACvE;SACD,OAAO,EACL,OAAO,GAAI,EAAU,aAAa,uBAAuB,KAAM,IAAI,IACpE;SACD,CAAA;QACE,CAAA,CACF,EAAA,CAAA;OAGN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBAA4B;SAAiB,CAAA,EAC7D,kBAAC,QAAD;SACE,WAAW,EACT,yBACA,EAAa,EAAU,aAAa,gBAAgB,CAAC,MACtD;mBAJH,CAMG,EAAU,aAAa,iBAAgB,KACnC;WACH;WACN,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,OAAD;SACE,WAAW,EACT,mDACA,EAAe,EAAU,aAAa,gBAAgB,CACvD;SACD,OAAO,EAAE,OAAO,GAAI,EAAU,aAAa,kBAAkB,IAAK,IAAI,IAAI;SAC1E,CAAA;QACE,CAAA,CACF,EAAA,CAAA;OAGN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,KAAD;UAAG,WAAU;oBACV,EAAU,kBAAkB;UAC3B,CAAA,EACJ,kBAAC,KAAD;UAAG,WAAU;oBAA8B;UAAsB,CAAA,CAC7D;YACN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,KAAD;UAAG,WAAU;oBACV,EAAU,sBAAsB;UAC/B,CAAA,EACJ,kBAAC,KAAD;UAAG,WAAU;oBAA8B;UAAmB,CAAA,CAC1D;WACF;;OACF;;KACF,CAAA,CACE,EAAA,CAAA,EAGV,kBAAC,WAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAW,WAAU,oCAAqC,CAAA,EAC1D,kBAAC,MAAD;MAAI,WAAU;gBAA0C;MAAoB,CAAA,CACxE;QAEN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAU,aAAa,gBAAgB,KAAK,GAAgB,MAC3D,kBAAC,OAAD;OAEE,WAAU;iBAFZ,CAIE,kBAAC,OAAD;QAAK,WAAU;kBACZ,IAAQ;QACL,CAAA,EACN,kBAAC,KAAD;QAAG,WAAU;kBAA6C;QAAmB,CAAA,CACzE;SAPC,EAOD,CACN;MACE,CAAA,EAGN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBAA+C;OAAuB,CAAA,EACpF,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,QAAD;UAAM,WAAU;oBAA8B;UAAuB,CAAA,EACrE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD;WAAK,WAAU;qBACZ;YAAC;YAAG;YAAG;YAAG;YAAG;YAAE,CAAC,KAAK,MACpB,kBAAC,OAAD,EAEE,WAAW,EAAG,sBAAsB,KAAK,IAAI,gCAAgC,eAAe,EAC5F,EAFK,EAEL,CACF;WACE,CAAA,EACN,kBAAC,QAAD;WAAM,WAAU;qBAAwC;WAAU,CAAA,CAC9D;YACF;;QACN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,QAAD;UAAM,WAAU;oBAA8B;UAAuB,CAAA,EACrE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD;WAAK,WAAU;qBACZ;YAAC;YAAG;YAAG;YAAG;YAAG;YAAE,CAAC,KAAK,MACpB,kBAAC,OAAD,EAEE,WAAW,EACT,sBACA,KAAK,IAAI,gCAAgC,eAC1C,EACD,EALK,EAKL,CACF;WACE,CAAA,EACN,kBAAC,QAAD;WAAM,WAAU;qBAAwC;WAAU,CAAA,CAC9D;YACF;;QACN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,QAAD;UAAM,WAAU;oBAA8B;UAAuB,CAAA,EACrE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD;WAAK,WAAU;qBACZ;YAAC;YAAG;YAAG;YAAG;YAAG;YAAE,CAAC,KAAK,MACpB,kBAAC,OAAD,EAEE,WAAW,EAAG,sBAAsB,KAAK,IAAI,gCAAgC,eAAe,EAC5F,EAFK,EAEL,CACF;WACE,CAAA,EACN,kBAAC,QAAD;WAAM,WAAU;qBAAwC;WAAU,CAAA,CAC9D;YACF;;QACF;SACF;QACF;OACE,EAAA,CAAA,CACN;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,UAAD;MACE,MAAK;MACL,eAAe,EAAW,sBAAsB;MAChD,WAAU;gBAHZ,CAKE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAAA,iBAEzB;;KACT,kBAAC,UAAD;MACE,MAAK;MACL,eAAe,EAAW,0BAA0B;MACpD,WAAU;gBAHZ,CAKE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAAA,uBAEvB;;KACT,kBAAC,UAAD;MACE,MAAK;MACL,eAAe,EAAW,wBAAwB;MAClD,WAAU;gBAHZ,CAKE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAAA,iBAEvB;;KACL;;GACK"}
@@ -63,9 +63,9 @@ var T = [
63
63
  ];
64
64
  function D(e) {
65
65
  switch (e) {
66
- case "active": return "bg-green-500/20 text-green-600 dark:text-green-400";
67
- case "pending": return "bg-yellow-500/20 text-yellow-600 dark:text-yellow-400";
68
- case "completed": return "bg-blue-500/20 text-blue-600 dark:text-blue-400";
66
+ case "active": return "bg-status-success-bg-subtle/20 text-status-success-text";
67
+ case "pending": return "bg-status-warning-bg-subtle/20 text-status-warning-text";
68
+ case "completed": return "bg-accent-blue-subtle/20 text-accent-blue";
69
69
  default: return "bg-secondary text-secondary-foreground";
70
70
  }
71
71
  }
@@ -179,7 +179,7 @@ function O() {
179
179
  })
180
180
  ]
181
181
  }) : P.map((e) => /* @__PURE__ */ w("div", {
182
- className: "rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm hover:shadow-md transition-shadow",
182
+ className: "rounded-lg border border-border-seam bg-bg-surface p-4 hover:shadow-md transition-shadow bg-gloss-card shadow-pop",
183
183
  children: [/* @__PURE__ */ w("div", {
184
184
  className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",
185
185
  children: [/* @__PURE__ */ w("div", {
@@ -220,7 +220,7 @@ function O() {
220
220
  className: "text-xs text-text-secondary",
221
221
  children: "Current Value"
222
222
  }), /* @__PURE__ */ C("p", {
223
- className: "text-sm font-semibold text-green-600 dark:text-green-400",
223
+ className: "text-sm font-semibold text-status-success-text",
224
224
  children: o(e.currentValue, { minimumFractionDigits: 0 })
225
225
  })] }),
226
226
  /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
@@ -234,7 +234,7 @@ function O() {
234
234
  className: "text-xs text-text-secondary",
235
235
  children: "Growth"
236
236
  }), /* @__PURE__ */ w("p", {
237
- className: "text-sm font-semibold text-green-600 dark:text-green-400",
237
+ className: "text-sm font-semibold text-status-success-text",
238
238
  children: [e.returnsPercentage, "%"]
239
239
  })] })
240
240
  ]
@@ -280,8 +280,8 @@ function O() {
280
280
  children: [/* @__PURE__ */ w("div", {
281
281
  className: "flex items-center gap-3",
282
282
  children: [/* @__PURE__ */ C("div", {
283
- className: t("flex h-8 w-8 items-center justify-center rounded-full", e.amount > 0 ? "bg-green-500/10" : "bg-bg-sunken"),
284
- children: /* @__PURE__ */ C(u, { className: t("h-4 w-4", e.amount > 0 ? "text-green-600 dark:text-green-400" : "text-text-secondary") })
283
+ className: t("flex h-8 w-8 items-center justify-center rounded-full", e.amount > 0 ? "bg-status-success-bg-subtle/10" : "bg-bg-sunken"),
284
+ children: /* @__PURE__ */ C(u, { className: t("h-4 w-4", e.amount > 0 ? "text-status-success-text" : "text-text-secondary") })
285
285
  }), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
286
286
  className: "text-sm font-medium text-text-primary",
287
287
  children: e.description
@@ -294,7 +294,7 @@ function O() {
294
294
  })
295
295
  })] })]
296
296
  }), /* @__PURE__ */ w("span", {
297
- className: t("text-sm font-semibold", e.amount > 0 ? "text-green-600 dark:text-green-400" : "text-text-primary"),
297
+ className: t("text-sm font-semibold", e.amount > 0 ? "text-status-success-text" : "text-text-primary"),
298
298
  children: [e.amount > 0 ? "+" : "", o(Math.abs(e.amount), { minimumFractionDigits: 0 })]
299
299
  })]
300
300
  }, e.id))
@@ -305,10 +305,10 @@ function O() {
305
305
  className: "space-y-6",
306
306
  children: [
307
307
  /* @__PURE__ */ w("div", {
308
- className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
308
+ className: "rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop",
309
309
  children: [/* @__PURE__ */ w("div", {
310
310
  className: "mb-3 flex items-center gap-2",
311
- children: [/* @__PURE__ */ C(_, { className: "h-5 w-5 text-yellow-500" }), /* @__PURE__ */ C("h3", {
311
+ children: [/* @__PURE__ */ C(_, { className: "h-5 w-5 text-status-warning-text" }), /* @__PURE__ */ C("h3", {
312
312
  className: "text-base font-semibold text-text-primary",
313
313
  children: "AI Insights"
314
314
  })]
@@ -333,7 +333,7 @@ function O() {
333
333
  })]
334
334
  }),
335
335
  /* @__PURE__ */ w("div", {
336
- className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
336
+ className: "rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop",
337
337
  children: [/* @__PURE__ */ C("h3", {
338
338
  className: "mb-3 text-base font-semibold text-text-primary",
339
339
  children: "Quick Actions"
@@ -368,7 +368,7 @@ function O() {
368
368
  })]
369
369
  }),
370
370
  /* @__PURE__ */ w("div", {
371
- className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
371
+ className: "rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop",
372
372
  children: [/* @__PURE__ */ C("h3", {
373
373
  className: "mb-3 text-base font-semibold text-text-primary",
374
374
  children: "Market Updates"
@@ -376,7 +376,7 @@ function O() {
376
376
  className: "space-y-3",
377
377
  children: [
378
378
  /* @__PURE__ */ w("div", {
379
- className: "border-l-4 border-green-500 pl-3",
379
+ className: "border-l-4 border-status-success-border pl-3",
380
380
  children: [/* @__PURE__ */ C("h4", {
381
381
  className: "text-xs font-semibold text-text-primary",
382
382
  children: "Mobile Services Market Growing"
@@ -386,7 +386,7 @@ function O() {
386
386
  })]
387
387
  }),
388
388
  /* @__PURE__ */ w("div", {
389
- className: "border-l-4 border-blue-500 pl-3",
389
+ className: "border-l-4 border-accent-blue-subtle pl-3",
390
390
  children: [/* @__PURE__ */ C("h4", {
391
391
  className: "text-xs font-semibold text-text-primary",
392
392
  children: "New Investment Tax Benefits"
@@ -396,7 +396,7 @@ function O() {
396
396
  })]
397
397
  }),
398
398
  /* @__PURE__ */ w("div", {
399
- className: "border-l-4 border-yellow-500 pl-3",
399
+ className: "border-l-4 border-status-warning-border pl-3",
400
400
  children: [/* @__PURE__ */ C("h4", {
401
401
  className: "text-xs font-semibold text-text-primary",
402
402
  children: "Home Services Demand Surge"
@@ -1 +1 @@
1
- {"version":3,"file":"InvestorDashboard.js","names":[],"sources":["../../../../src/adaptercloud/pages/investor/InvestorDashboard.tsx"],"sourcesContent":["/**\n * Investor Dashboard Page\n * @module adaptercloud/pages/investor\n *\n * Portfolio overview with metrics, tab navigation (portfolio/opportunities),\n * AI insights sidebar, quick actions, market updates, and recent activity.\n */\n\nimport { useState, useEffect, useMemo } from 'react';\nimport {\n Wallet,\n TrendingUp,\n PieChart,\n Briefcase,\n ArrowRight,\n Activity,\n IndianRupee,\n Target,\n Award,\n Filter,\n Eye,\n Plus,\n MapPin,\n Lightbulb,\n BarChart3,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { InvestmentCard } from '../../components/InvestmentCard';\nimport { RatingDisplay } from '../../components/RatingDisplay';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { useInvestmentOpportunities, useInvestments } from '../../hooks/useAdapterCloudApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface DashboardInvestment {\n id: string;\n cartName: string;\n cartOwner: string;\n investmentAmount: number;\n equityPercentage: number;\n investmentDate: string;\n currentValue: number;\n monthlyReturns: number;\n status: 'active' | 'pending' | 'completed';\n location: string;\n category: string;\n rating: number;\n riskLevel: 'low' | 'medium' | 'high';\n}\n\nconst mockAiInsights = [\n {\n id: '1',\n type: 'opportunity' as const,\n title: 'High-Potential Business Detected',\n description:\n 'Glow Beauty Services in Koramangala shows 95% growth potential based on location analytics and market demand.',\n confidence: 94,\n },\n {\n id: '2',\n type: 'suggestion' as const,\n title: 'Portfolio Diversification Recommended',\n description:\n 'Consider investing in Education & Skills to balance your services-heavy portfolio. Current allocation: 70% services, 30% retail.',\n confidence: 87,\n },\n {\n id: '3',\n type: 'trend' as const,\n title: 'Market Trend Alert',\n description:\n 'Health & Wellness businesses in tech hubs are experiencing 40% higher returns. Whitefield shows promising opportunities.',\n confidence: 91,\n },\n];\n\nconst mockRecentActivity = [\n {\n id: 'act-1',\n type: 'dividend',\n description: 'Dividend received from Quick Cuts Salon',\n amount: 4200,\n date: '2024-01-14T10:00:00Z',\n },\n {\n id: 'act-2',\n type: 'investment',\n description: 'Invested in Spotless Cleaning Services',\n amount: -40000,\n date: '2024-01-10T09:30:00Z',\n },\n {\n id: 'act-3',\n type: 'return',\n description: 'Returns from Fix-It Mobile Repair',\n amount: 6800,\n date: '2024-01-05T14:00:00Z',\n },\n {\n id: 'act-4',\n type: 'investment',\n description: 'Invested in Fix-It Mobile Repair',\n amount: -75000,\n date: '2023-12-20T11:00:00Z',\n },\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getRiskBadgeColor(risk: string): string {\n switch (risk) {\n case 'low':\n return 'bg-green-500/20 text-green-600 dark:text-green-400';\n case 'medium':\n return 'bg-yellow-500/20 text-yellow-600 dark:text-yellow-400';\n case 'high':\n return 'bg-red-500/20 text-red-600 dark:text-red-400';\n default:\n return 'bg-secondary text-secondary-foreground';\n }\n}\n\nfunction getStatusBadgeColor(status: string): string {\n switch (status) {\n case 'active':\n return 'bg-green-500/20 text-green-600 dark:text-green-400';\n case 'pending':\n return 'bg-yellow-500/20 text-yellow-600 dark:text-yellow-400';\n case 'completed':\n return 'bg-blue-500/20 text-blue-600 dark:text-blue-400';\n default:\n return 'bg-secondary text-secondary-foreground';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function InvestorDashboard() {\n const { navigateTo, currentUser } = useAdapterCloud();\n const [activeTab, setActiveTab] = useState<'portfolio' | 'opportunities'>('portfolio');\n\n const { data: opportunities = [], isLoading: opportunitiesLoading } =\n useInvestmentOpportunities();\n const { data: investments = [], isLoading: investmentsLoading } = useInvestments(\n currentUser?.id || ''\n );\n\n const firstName = currentUser?.firstName ?? currentUser?.name ?? 'Investor';\n\n const activeOpportunities = opportunities.filter((inv) => inv.status === 'active');\n\n const portfolioSummary = useMemo(() => {\n const totalInvested = investments.reduce((sum, inv) => sum + inv.investedAmount, 0);\n const currentValue = investments.reduce((sum, inv) => sum + inv.currentValue, 0);\n const totalReturns = investments.reduce((sum, inv) => sum + inv.returns, 0);\n const monthlyIncome = totalReturns / 12; // Simple mock derivation\n const roi = totalInvested > 0 ? (totalReturns / totalInvested) * 100 : 0;\n\n return {\n totalInvested,\n currentValue,\n totalReturns,\n monthlyIncome,\n roi,\n };\n }, [investments]);\n\n if (opportunitiesLoading || investmentsLoading) {\n return (\n <PageLayout title=\"Investment Dashboard\" description=\"Loading your portfolio...\">\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 your portfolio...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={`Welcome back, ${firstName}!`}\n description=\"Here's your investment portfolio overview.\"\n >\n {/* Portfolio Summary Metrics */}\n <section>\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">Portfolio Overview</h2>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <MetricsCard\n icon={<Wallet className=\"h-5 w-5\" />}\n value={formatCurrency(portfolioSummary.totalInvested, { minimumFractionDigits: 0 })}\n label=\"Total Invested\"\n trend=\"up\"\n trendValue=\"Across all businesses\"\n />\n <MetricsCard\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={formatCurrency(portfolioSummary.currentValue, { minimumFractionDigits: 0 })}\n label=\"Current Value\"\n trend=\"up\"\n trendValue={`+${portfolioSummary.roi.toFixed(1)}%`}\n />\n <MetricsCard\n icon={<Target className=\"h-5 w-5\" />}\n value={formatCurrency(portfolioSummary.totalReturns, { minimumFractionDigits: 0 })}\n label=\"Total Returns\"\n trend=\"up\"\n trendValue=\"+15.2% this month\"\n />\n <MetricsCard\n icon={<Activity className=\"h-5 w-5\" />}\n value={formatCurrency(portfolioSummary.monthlyIncome, { minimumFractionDigits: 0 })}\n label=\"Monthly Income\"\n trend=\"up\"\n trendValue=\"+8.5% vs last month\"\n />\n </div>\n </section>\n\n {/* Main Content + Sidebar */}\n <div className=\"mt-8 grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Main Content */}\n <div className=\"lg:col-span-2\">\n {/* Tab Navigation */}\n <div className=\"mb-6 flex rounded-lg bg-bg-sunken p-1\">\n <button\n type=\"button\"\n onClick={() => setActiveTab('portfolio')}\n className={cn(\n 'flex-1 rounded-md px-4 py-2 text-sm font-medium transition-colors',\n activeTab === 'portfolio'\n ? 'bg-bg-surface text-text-primary shadow-sm'\n : 'text-text-secondary hover:text-text-primary'\n )}\n >\n My Investments\n </button>\n <button\n type=\"button\"\n onClick={() => setActiveTab('opportunities')}\n className={cn(\n 'flex-1 rounded-md px-4 py-2 text-sm font-medium transition-colors',\n activeTab === 'opportunities'\n ? 'bg-bg-surface text-text-primary shadow-sm'\n : 'text-text-secondary hover:text-text-primary'\n )}\n >\n New Opportunities\n </button>\n </div>\n\n {/* Portfolio Tab */}\n {activeTab === 'portfolio' && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-base font-semibold text-text-primary\">Active Investments</h3>\n <button\n type=\"button\"\n onClick={() => alert('Filter functionality coming soon!')}\n className=\"flex items-center gap-2 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Filter className=\"h-4 w-4\" />\n Filter\n </button>\n </div>\n\n {investments.length === 0 ? (\n <div className=\"rounded-lg border border-dashed border-border-subtle p-8 text-center\">\n <Briefcase className=\"mx-auto h-12 w-12 text-text-secondary opacity-20\" />\n <p className=\"mt-2 text-sm text-text-secondary\">No active investments found.</p>\n <button\n type=\"button\"\n onClick={() => setActiveTab('opportunities')}\n className=\"mt-4 text-sm font-medium text-primary hover:underline\"\n >\n Browse opportunities\n </button>\n </div>\n ) : (\n investments.map((investment) => (\n <div\n key={investment.id}\n className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm hover:shadow-md transition-shadow\"\n >\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"flex-1\">\n <div className=\"mb-2 flex flex-wrap items-center gap-2\">\n <h4 className=\"text-base font-semibold text-text-primary\">\n {investment.cartName}\n </h4>\n <span\n className={cn(\n 'rounded-full px-2 py-0.5 text-xs font-medium',\n getStatusBadgeColor(investment.status)\n )}\n >\n {investment.status}\n </span>\n </div>\n <div className=\"mb-3 flex flex-wrap items-center gap-3 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3.5 w-3.5\" />\n {'India'}\n </span>\n <span>{'Services'}</span>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/investor/investments/${investment.id}`)}\n className=\"flex items-center gap-2 rounded-lg border border-border-subtle px-3 py-2 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\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <div>\n <p className=\"text-xs text-text-secondary\">Invested</p>\n <p className=\"text-sm font-semibold text-text-primary\">\n {formatCurrency(investment.investedAmount, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Current Value</p>\n <p className=\"text-sm font-semibold text-green-600 dark:text-green-400\">\n {formatCurrency(investment.currentValue, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Returns</p>\n <p className=\"text-sm font-semibold text-text-primary\">\n {formatCurrency(investment.returns, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Growth</p>\n <p className=\"text-sm font-semibold text-green-600 dark:text-green-400\">\n {investment.returnsPercentage}%\n </p>\n </div>\n </div>\n </div>\n ))\n )}\n </div>\n )}\n\n {/* Opportunities Tab */}\n {activeTab === 'opportunities' && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-base font-semibold text-text-primary\">\n Investment Opportunities\n </h3>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n className=\"flex items-center gap-2 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 <Plus className=\"h-4 w-4\" />\n Browse All\n </button>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {activeOpportunities.slice(0, 2).map((opp) => (\n <InvestmentCard\n key={opp.id}\n id={opp.id}\n cartName={opp.cartName}\n targetAmount={opp.targetAmount}\n raisedAmount={opp.raisedAmount}\n expectedReturns={`${opp.expectedReturns}%`}\n riskLevel={opp.riskLevel}\n status={opp.status}\n onClick={(id) => navigateTo(`/investor/opportunities/${id}`)}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Recent Activity */}\n <section className=\"mt-8\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">Recent Activity</h2>\n <div className=\"divide-y divide-border rounded-lg border border-border-subtle bg-bg-surface\">\n {mockRecentActivity.map((activity) => (\n <div key={activity.id} className=\"flex items-center justify-between px-4 py-3\">\n <div className=\"flex items-center gap-3\">\n <div\n className={cn(\n 'flex h-8 w-8 items-center justify-center rounded-full',\n activity.amount > 0 ? 'bg-green-500/10' : 'bg-bg-sunken'\n )}\n >\n <Activity\n className={cn(\n 'h-4 w-4',\n activity.amount > 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-text-secondary'\n )}\n />\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{activity.description}</p>\n <p className=\"text-xs text-text-secondary\">\n {new Date(activity.date).toLocaleDateString('en-IN', {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n })}\n </p>\n </div>\n </div>\n <span\n className={cn(\n 'text-sm font-semibold',\n activity.amount > 0 ? 'text-green-600 dark:text-green-400' : 'text-text-primary'\n )}\n >\n {activity.amount > 0 ? '+' : ''}\n {formatCurrency(Math.abs(activity.amount), { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n </section>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-6\">\n {/* AI Insights */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"mb-3 flex items-center gap-2\">\n <Lightbulb className=\"h-5 w-5 text-yellow-500\" />\n <h3 className=\"text-base font-semibold text-text-primary\">AI Insights</h3>\n </div>\n <div className=\"space-y-3\">\n {mockAiInsights.map((insight) => (\n <div key={insight.id} className=\"rounded-lg border border-border-subtle bg-bg-sunken/50 p-3\">\n <div className=\"mb-1 flex items-center justify-between\">\n <h4 className=\"text-xs font-semibold text-text-primary\">{insight.title}</h4>\n <span className=\"rounded-full bg-action-primary-bg/10 px-2 py-0.5 text-xs font-medium text-primary\">\n {insight.confidence}%\n </span>\n </div>\n <p className=\"text-xs leading-relaxed text-text-secondary\">\n {insight.description}\n </p>\n </div>\n ))}\n </div>\n </div>\n\n {/* Quick Actions */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <h3 className=\"mb-3 text-base font-semibold text-text-primary\">Quick Actions</h3>\n <div className=\"space-y-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/portfolio')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <PieChart className=\"h-4 w-4 text-text-secondary\" />\n View Full Portfolio\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Target className=\"h-4 w-4 text-text-secondary\" />\n Browse Opportunities\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/analytics')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <BarChart3 className=\"h-4 w-4 text-text-secondary\" />\n Investment Analytics\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/profile')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Award className=\"h-4 w-4 text-text-secondary\" />\n View Profile\n </button>\n </div>\n </div>\n\n {/* Market Updates */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <h3 className=\"mb-3 text-base font-semibold text-text-primary\">Market Updates</h3>\n <div className=\"space-y-3\">\n <div className=\"border-l-4 border-green-500 pl-3\">\n <h4 className=\"text-xs font-semibold text-text-primary\">\n Mobile Services Market Growing\n </h4>\n <p className=\"mt-1 text-xs leading-relaxed text-text-secondary\">\n Mobile service industry shows 35% growth in Q4 2024\n </p>\n </div>\n <div className=\"border-l-4 border-blue-500 pl-3\">\n <h4 className=\"text-xs font-semibold text-text-primary\">\n New Investment Tax Benefits\n </h4>\n <p className=\"mt-1 text-xs leading-relaxed text-text-secondary\">\n Government announces SME investment incentives\n </p>\n </div>\n <div className=\"border-l-4 border-yellow-500 pl-3\">\n <h4 className=\"text-xs font-semibold text-text-primary\">\n Home Services Demand Surge\n </h4>\n <p className=\"mt-1 text-xs leading-relaxed text-text-secondary\">\n Cleaning and maintenance businesses up 25% this quarter\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"InvestorDashboard.js","names":[],"sources":["../../../../src/adaptercloud/pages/investor/InvestorDashboard.tsx"],"sourcesContent":["/**\n * Investor Dashboard Page\n * @module adaptercloud/pages/investor\n *\n * Portfolio overview with metrics, tab navigation (portfolio/opportunities),\n * AI insights sidebar, quick actions, market updates, and recent activity.\n */\n\nimport { useState, useEffect, useMemo } from'react';\nimport {\n Wallet,\n TrendingUp,\n PieChart,\n Briefcase,\n ArrowRight,\n Activity,\n IndianRupee,\n Target,\n Award,\n Filter,\n Eye,\n Plus,\n MapPin,\n Lightbulb,\n BarChart3,\n} from'lucide-react';\nimport { PageLayout } from'../../components/PageLayout';\nimport { MetricsCard } from'../../components/MetricsCard';\nimport { InvestmentCard } from'../../components/InvestmentCard';\nimport { RatingDisplay } from'../../components/RatingDisplay';\nimport { useAdapterCloud } from'../../context/AdapterCloudContext';\nimport { useInvestmentOpportunities, useInvestments } from'../../hooks/useAdapterCloudApi';\nimport { cn } from'../../utils/cn';\nimport { formatCurrency } from'../../utils/formatters';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface DashboardInvestment {\n id: string;\n cartName: string;\n cartOwner: string;\n investmentAmount: number;\n equityPercentage: number;\n investmentDate: string;\n currentValue: number;\n monthlyReturns: number;\n status: 'active' | 'pending' | 'completed';\n location: string;\n category: string;\n rating: number;\n riskLevel: 'low' | 'medium' | 'high';\n}\n\nconst mockAiInsights = [\n {\n id: '1',\n type: 'opportunity' as const,\n title: 'High-Potential Business Detected',\n description:\n 'Glow Beauty Services in Koramangala shows 95% growth potential based on location analytics and market demand.',\n confidence: 94,\n },\n {\n id: '2',\n type: 'suggestion' as const,\n title: 'Portfolio Diversification Recommended',\n description:\n 'Consider investing in Education & Skills to balance your services-heavy portfolio. Current allocation: 70% services, 30% retail.',\n confidence: 87,\n },\n {\n id: '3',\n type: 'trend' as const,\n title: 'Market Trend Alert',\n description:\n 'Health & Wellness businesses in tech hubs are experiencing 40% higher returns. Whitefield shows promising opportunities.',\n confidence: 91,\n },\n];\n\nconst mockRecentActivity = [\n {\n id: 'act-1',\n type: 'dividend',\n description: 'Dividend received from Quick Cuts Salon',\n amount: 4200,\n date: '2024-01-14T10:00:00Z',\n },\n {\n id: 'act-2',\n type: 'investment',\n description: 'Invested in Spotless Cleaning Services',\n amount: -40000,\n date: '2024-01-10T09:30:00Z',\n },\n {\n id: 'act-3',\n type: 'return',\n description: 'Returns from Fix-It Mobile Repair',\n amount: 6800,\n date: '2024-01-05T14:00:00Z',\n },\n {\n id: 'act-4',\n type: 'investment',\n description: 'Invested in Fix-It Mobile Repair',\n amount: -75000,\n date: '2023-12-20T11:00:00Z',\n },\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 getStatusBadgeColor(status: string): string {\n switch (status) {\n case'active':\n return'bg-status-success-bg-subtle/20 text-status-success-text';\n case'pending':\n return'bg-status-warning-bg-subtle/20 text-status-warning-text';\n case'completed':\n return'bg-accent-blue-subtle/20 text-accent-blue';\n default:\n return'bg-secondary text-secondary-foreground';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function InvestorDashboard() {\n const { navigateTo, currentUser } = useAdapterCloud();\n const [activeTab, setActiveTab] = useState<'portfolio' | 'opportunities'>('portfolio');\n\n const { data: opportunities = [], isLoading: opportunitiesLoading } =\n useInvestmentOpportunities();\n const { data: investments = [], isLoading: investmentsLoading } = useInvestments(\n currentUser?.id || ''\n );\n\n const firstName = currentUser?.firstName ?? currentUser?.name ?? 'Investor';\n\n const activeOpportunities = opportunities.filter((inv) => inv.status === 'active');\n\n const portfolioSummary = useMemo(() => {\n const totalInvested = investments.reduce((sum, inv) => sum + inv.investedAmount, 0);\n const currentValue = investments.reduce((sum, inv) => sum + inv.currentValue, 0);\n const totalReturns = investments.reduce((sum, inv) => sum + inv.returns, 0);\n const monthlyIncome = totalReturns / 12; // Simple mock derivation\n const roi = totalInvested > 0 ? (totalReturns / totalInvested) * 100 : 0;\n\n return {\n totalInvested,\n currentValue,\n totalReturns,\n monthlyIncome,\n roi,\n };\n }, [investments]);\n\n if (opportunitiesLoading || investmentsLoading) {\n return (\n <PageLayout title=\"Investment Dashboard\" description=\"Loading your portfolio...\">\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 your portfolio...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={`Welcome back, ${firstName}!`}\n description=\"Here's your investment portfolio overview.\"\n >\n {/* Portfolio Summary Metrics */}\n <section>\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">Portfolio Overview</h2>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <MetricsCard\n icon={<Wallet className=\"h-5 w-5\" />}\n value={formatCurrency(portfolioSummary.totalInvested, { minimumFractionDigits: 0 })}\n label=\"Total Invested\"\n trend=\"up\"\n trendValue=\"Across all businesses\"\n />\n <MetricsCard\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={formatCurrency(portfolioSummary.currentValue, { minimumFractionDigits: 0 })}\n label=\"Current Value\"\n trend=\"up\"\n trendValue={`+${portfolioSummary.roi.toFixed(1)}%`}\n />\n <MetricsCard\n icon={<Target className=\"h-5 w-5\" />}\n value={formatCurrency(portfolioSummary.totalReturns, { minimumFractionDigits: 0 })}\n label=\"Total Returns\"\n trend=\"up\"\n trendValue=\"+15.2% this month\"\n />\n <MetricsCard\n icon={<Activity className=\"h-5 w-5\" />}\n value={formatCurrency(portfolioSummary.monthlyIncome, { minimumFractionDigits: 0 })}\n label=\"Monthly Income\"\n trend=\"up\"\n trendValue=\"+8.5% vs last month\"\n />\n </div>\n </section>\n\n {/* Main Content + Sidebar */}\n <div className=\"mt-8 grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Main Content */}\n <div className=\"lg:col-span-2\">\n {/* Tab Navigation */}\n <div className=\"mb-6 flex rounded-lg bg-bg-sunken p-1\">\n <button\n type=\"button\"\n onClick={() => setActiveTab('portfolio')}\n className={cn(\n 'flex-1 rounded-md px-4 py-2 text-sm font-medium transition-colors',\n activeTab === 'portfolio'\n ? 'bg-bg-surface text-text-primary shadow-sm'\n : 'text-text-secondary hover:text-text-primary'\n )}\n >\n My Investments\n </button>\n <button\n type=\"button\"\n onClick={() => setActiveTab('opportunities')}\n className={cn(\n 'flex-1 rounded-md px-4 py-2 text-sm font-medium transition-colors',\n activeTab === 'opportunities'\n ? 'bg-bg-surface text-text-primary shadow-sm'\n : 'text-text-secondary hover:text-text-primary'\n )}\n >\n New Opportunities\n </button>\n </div>\n\n {/* Portfolio Tab */}\n {activeTab === 'portfolio' && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-base font-semibold text-text-primary\">Active Investments</h3>\n <button\n type=\"button\"\n onClick={() => alert('Filter functionality coming soon!')}\n className=\"flex items-center gap-2 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Filter className=\"h-4 w-4\" />\n Filter\n </button>\n </div>\n\n {investments.length === 0 ? (\n <div className=\"rounded-lg border border-dashed border-border-subtle p-8 text-center\">\n <Briefcase className=\"mx-auto h-12 w-12 text-text-secondary opacity-20\" />\n <p className=\"mt-2 text-sm text-text-secondary\">No active investments found.</p>\n <button\n type=\"button\"\n onClick={() => setActiveTab('opportunities')}\n className=\"mt-4 text-sm font-medium text-primary hover:underline\"\n >\n Browse opportunities\n </button>\n </div>\n ) : (\n investments.map((investment) => (\n <div\n key={investment.id}\n className=\"rounded-lg border border-border-seam bg-bg-surface p-4 hover:shadow-md transition-shadow bg-gloss-card shadow-pop\"\n >\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"flex-1\">\n <div className=\"mb-2 flex flex-wrap items-center gap-2\">\n <h4 className=\"text-base font-semibold text-text-primary\">\n {investment.cartName}\n </h4>\n <span\n className={cn(\n 'rounded-full px-2 py-0.5 text-xs font-medium',\n getStatusBadgeColor(investment.status)\n )}\n >\n {investment.status}\n </span>\n </div>\n <div className=\"mb-3 flex flex-wrap items-center gap-3 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3.5 w-3.5\" />\n {'India'}\n </span>\n <span>{'Services'}</span>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/investor/investments/${investment.id}`)}\n className=\"flex items-center gap-2 rounded-lg border border-border-subtle px-3 py-2 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\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <div>\n <p className=\"text-xs text-text-secondary\">Invested</p>\n <p className=\"text-sm font-semibold text-text-primary\">\n {formatCurrency(investment.investedAmount, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Current Value</p>\n <p className=\"text-sm font-semibold text-status-success-text\">\n {formatCurrency(investment.currentValue, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Returns</p>\n <p className=\"text-sm font-semibold text-text-primary\">\n {formatCurrency(investment.returns, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Growth</p>\n <p className=\"text-sm font-semibold text-status-success-text\">\n {investment.returnsPercentage}%\n </p>\n </div>\n </div>\n </div>\n ))\n )}\n </div>\n )}\n\n {/* Opportunities Tab */}\n {activeTab === 'opportunities' && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-base font-semibold text-text-primary\">\n Investment Opportunities\n </h3>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n className=\"flex items-center gap-2 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 <Plus className=\"h-4 w-4\" />\n Browse All\n </button>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {activeOpportunities.slice(0, 2).map((opp) => (\n <InvestmentCard\n key={opp.id}\n id={opp.id}\n cartName={opp.cartName}\n targetAmount={opp.targetAmount}\n raisedAmount={opp.raisedAmount}\n expectedReturns={`${opp.expectedReturns}%`}\n riskLevel={opp.riskLevel}\n status={opp.status}\n onClick={(id) => navigateTo(`/investor/opportunities/${id}`)}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Recent Activity */}\n <section className=\"mt-8\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">Recent Activity</h2>\n <div className=\"divide-y divide-border rounded-lg border border-border-subtle bg-bg-surface\">\n {mockRecentActivity.map((activity) => (\n <div key={activity.id} className=\"flex items-center justify-between px-4 py-3\">\n <div className=\"flex items-center gap-3\">\n <div\n className={cn(\n 'flex h-8 w-8 items-center justify-center rounded-full',\n activity.amount > 0 ? 'bg-status-success-bg-subtle/10' : 'bg-bg-sunken'\n )}\n >\n <Activity\n className={cn(\n 'h-4 w-4',\n activity.amount > 0\n ? 'text-status-success-text'\n : 'text-text-secondary'\n )}\n />\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{activity.description}</p>\n <p className=\"text-xs text-text-secondary\">\n {new Date(activity.date).toLocaleDateString('en-IN', {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n })}\n </p>\n </div>\n </div>\n <span\n className={cn(\n 'text-sm font-semibold',\n activity.amount > 0 ? 'text-status-success-text' : 'text-text-primary'\n )}\n >\n {activity.amount > 0 ? '+' : ''}\n {formatCurrency(Math.abs(activity.amount), { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n </section>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-6\">\n {/* AI Insights */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop\">\n <div className=\"mb-3 flex items-center gap-2\">\n <Lightbulb className=\"h-5 w-5 text-status-warning-text\" />\n <h3 className=\"text-base font-semibold text-text-primary\">AI Insights</h3>\n </div>\n <div className=\"space-y-3\">\n {mockAiInsights.map((insight) => (\n <div key={insight.id} className=\"rounded-lg border border-border-subtle bg-bg-sunken/50 p-3\">\n <div className=\"mb-1 flex items-center justify-between\">\n <h4 className=\"text-xs font-semibold text-text-primary\">{insight.title}</h4>\n <span className=\"rounded-full bg-action-primary-bg/10 px-2 py-0.5 text-xs font-medium text-primary\">\n {insight.confidence}%\n </span>\n </div>\n <p className=\"text-xs leading-relaxed text-text-secondary\">\n {insight.description}\n </p>\n </div>\n ))}\n </div>\n </div>\n\n {/* Quick Actions */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop\">\n <h3 className=\"mb-3 text-base font-semibold text-text-primary\">Quick Actions</h3>\n <div className=\"space-y-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/portfolio')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <PieChart className=\"h-4 w-4 text-text-secondary\" />\n View Full Portfolio\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Target className=\"h-4 w-4 text-text-secondary\" />\n Browse Opportunities\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/analytics')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <BarChart3 className=\"h-4 w-4 text-text-secondary\" />\n Investment Analytics\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/profile')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Award className=\"h-4 w-4 text-text-secondary\" />\n View Profile\n </button>\n </div>\n </div>\n\n {/* Market Updates */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop\">\n <h3 className=\"mb-3 text-base font-semibold text-text-primary\">Market Updates</h3>\n <div className=\"space-y-3\">\n <div className=\"border-l-4 border-status-success-border pl-3\">\n <h4 className=\"text-xs font-semibold text-text-primary\">\n Mobile Services Market Growing\n </h4>\n <p className=\"mt-1 text-xs leading-relaxed text-text-secondary\">\n Mobile service industry shows 35% growth in Q4 2024\n </p>\n </div>\n <div className=\"border-l-4 border-accent-blue-subtle pl-3\">\n <h4 className=\"text-xs font-semibold text-text-primary\">\n New Investment Tax Benefits\n </h4>\n <p className=\"mt-1 text-xs leading-relaxed text-text-secondary\">\n Government announces SME investment incentives\n </p>\n </div>\n <div className=\"border-l-4 border-status-warning-border pl-3\">\n <h4 className=\"text-xs font-semibold text-text-primary\">\n Home Services Demand Surge\n </h4>\n <p className=\"mt-1 text-xs leading-relaxed text-text-secondary\">\n Cleaning and maintenance businesses up 25% this quarter\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -95,9 +95,9 @@ var x = [
95
95
  };
96
96
  function C(e) {
97
97
  switch (e) {
98
- case "active": return "bg-green-500/20 text-green-600 dark:text-green-400";
99
- case "pending": return "bg-yellow-500/20 text-yellow-600 dark:text-yellow-400";
100
- case "matured": return "bg-blue-500/20 text-blue-600 dark:text-blue-400";
98
+ case "active": return "bg-status-success-bg-subtle/20 text-status-success-text";
99
+ case "pending": return "bg-status-warning-bg-subtle/20 text-status-warning-text";
100
+ case "matured": return "bg-accent-blue-subtle/20 text-accent-blue";
101
101
  case "withdrawn": return "bg-secondary text-secondary-foreground";
102
102
  default: return "bg-secondary text-secondary-foreground";
103
103
  }
@@ -194,7 +194,7 @@ function T() {
194
194
  ]
195
195
  }),
196
196
  /* @__PURE__ */ y("div", {
197
- className: "mt-6 rounded-lg border border-border-subtle bg-bg-surface p-4",
197
+ className: "mt-6 rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop",
198
198
  children: /* @__PURE__ */ y("div", {
199
199
  className: "flex flex-wrap gap-2",
200
200
  children: k.map((e) => /* @__PURE__ */ b("button", {
@@ -211,7 +211,7 @@ function T() {
211
211
  /* @__PURE__ */ y("div", {
212
212
  className: "mt-6 space-y-4",
213
213
  children: O.length > 0 ? O.map((e) => /* @__PURE__ */ b("div", {
214
- className: "rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6",
214
+ className: "rounded-lg border border-border-seam bg-bg-surface p-4 sm:p-6 bg-gloss-card shadow-pop",
215
215
  children: [/* @__PURE__ */ b("div", {
216
216
  className: "block space-y-4 lg:hidden",
217
217
  children: [
@@ -252,7 +252,7 @@ function T() {
252
252
  className: "text-sm text-text-secondary",
253
253
  children: "P&L"
254
254
  }), /* @__PURE__ */ b("p", {
255
- className: t("font-semibold", e.profitLoss >= 0 ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400"),
255
+ className: t("font-semibold", e.profitLoss >= 0 ? "text-status-success-text" : "text-status-error-text"),
256
256
  children: [
257
257
  e.profitLoss >= 0 ? "+" : "",
258
258
  a(e.profitLoss, { minimumFractionDigits: 0 }),
@@ -335,11 +335,11 @@ function T() {
335
335
  children: "P&L"
336
336
  }),
337
337
  /* @__PURE__ */ b("p", {
338
- className: t("font-semibold", e.profitLoss >= 0 ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400"),
338
+ className: t("font-semibold", e.profitLoss >= 0 ? "text-status-success-text" : "text-status-error-text"),
339
339
  children: [e.profitLoss >= 0 ? "+" : "", a(e.profitLoss, { minimumFractionDigits: 0 })]
340
340
  }),
341
341
  /* @__PURE__ */ b("p", {
342
- className: t("text-xs", e.profitLoss >= 0 ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400"),
342
+ className: t("text-xs", e.profitLoss >= 0 ? "text-status-success-text" : "text-status-error-text"),
343
343
  children: [
344
344
  "(",
345
345
  e.profitLossPercentage >= 0 ? "+" : "",
@@ -379,6 +379,7 @@ function T() {
379
379
  })]
380
380
  })]
381
381
  }, e.id)) : /* @__PURE__ */ y(i, {
382
+ illustration: "empty-data",
382
383
  icon: /* @__PURE__ */ y(g, { className: "h-12 w-12" }),
383
384
  title: `No ${E === "all" ? "" : E} investments found`,
384
385
  description: E === "all" ? "You haven't made any investments yet. Start exploring opportunities to grow your wealth." : `You don't have any ${E} investments at the moment.`,