@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":"InvestorInvestmentsPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/investor/InvestorInvestmentsPage.tsx"],"sourcesContent":["/**\n * Investor Investments Page\n * @module adaptercloud/pages/investor\n *\n * MetricsGrid summary cards, filter tabs (all/active/pending/matured) with counts,\n * responsive mobile/desktop layouts, P&L display, ROI display, status icons,\n * empty state.\n */\n\nimport { useState, useEffect, useMemo } from 'react';\nimport {\n TrendingUp,\n TrendingDown,\n Briefcase,\n Eye,\n BarChart3,\n AlertCircle,\n CheckCircle2,\n Clock,\n Wallet,\n IndianRupee,\n Plus,\n Target,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatDate } from '../../utils/formatters';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface Investment {\n id: string;\n cartName: string;\n cartOwner: string;\n investmentAmount: number;\n currentValue: number;\n profitLoss: number;\n profitLossPercentage: number;\n investmentDate: string;\n status: 'active' | 'pending' | 'matured' | 'withdrawn';\n roiAnnual: number;\n duration: string;\n nextPayout: string;\n totalReturns: number;\n}\n\ninterface InvestmentSummary {\n totalInvested: number;\n currentValue: number;\n totalReturns: number;\n activeInvestments: number;\n averageRoi: number;\n profitLoss: number;\n profitLossPercentage: number;\n}\n\ntype FilterKey = 'all' | 'active' | 'pending' | 'matured';\n\n// ---------------------------------------------------------------------------\n// Mock data\n// ---------------------------------------------------------------------------\n\nconst mockInvestments: Investment[] = [\n {\n id: 'inv-001',\n cartName: 'South Indian Express',\n cartOwner: 'Raj Kumar',\n investmentAmount: 50000,\n currentValue: 58500,\n profitLoss: 8500,\n profitLossPercentage: 17.0,\n investmentDate: '2024-01-15',\n status: 'active',\n roiAnnual: 22.5,\n duration: '18 months',\n nextPayout: '2024-12-15',\n totalReturns: 8500,\n },\n {\n id: 'inv-002',\n cartName: 'Pizza Corner',\n cartOwner: 'Priya Singh',\n investmentAmount: 75000,\n currentValue: 82000,\n profitLoss: 7000,\n profitLossPercentage: 9.3,\n investmentDate: '2024-03-10',\n status: 'active',\n roiAnnual: 18.0,\n duration: '24 months',\n nextPayout: '2024-12-10',\n totalReturns: 7000,\n },\n {\n id: 'inv-003',\n cartName: 'Healthy Bites',\n cartOwner: 'Amit Patel',\n investmentAmount: 30000,\n currentValue: 31200,\n profitLoss: 1200,\n profitLossPercentage: 4.0,\n investmentDate: '2024-06-01',\n status: 'active',\n roiAnnual: 15.0,\n duration: '12 months',\n nextPayout: '2024-12-01',\n totalReturns: 1200,\n },\n {\n id: 'inv-004',\n cartName: 'Street Food Junction',\n cartOwner: 'Neha Sharma',\n investmentAmount: 40000,\n currentValue: 40000,\n profitLoss: 0,\n profitLossPercentage: 0,\n investmentDate: '2024-08-15',\n status: 'pending',\n roiAnnual: 20.0,\n duration: '15 months',\n nextPayout: '2025-01-15',\n totalReturns: 0,\n },\n {\n id: 'inv-005',\n cartName: 'Biryani House',\n cartOwner: 'Suresh Reddy',\n investmentAmount: 60000,\n currentValue: 72000,\n profitLoss: 12000,\n profitLossPercentage: 20.0,\n investmentDate: '2023-12-01',\n status: 'matured',\n roiAnnual: 25.0,\n duration: '12 months',\n nextPayout: '-',\n totalReturns: 12000,\n },\n];\n\nconst mockSummary: InvestmentSummary = {\n totalInvested: 255000,\n currentValue: 283700,\n totalReturns: 28700,\n activeInvestments: 3,\n averageRoi: 19.6,\n profitLoss: 28700,\n profitLossPercentage: 11.3,\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getStatusColor(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 'matured':\n return 'bg-blue-500/20 text-blue-600 dark:text-blue-400';\n case 'withdrawn':\n return 'bg-secondary text-secondary-foreground';\n default:\n return 'bg-secondary text-secondary-foreground';\n }\n}\n\nfunction getStatusIcon(status: string) {\n switch (status) {\n case 'active':\n return <CheckCircle2 className=\"h-4 w-4\" />;\n case 'pending':\n return <Clock className=\"h-4 w-4\" />;\n case 'matured':\n return <CheckCircle2 className=\"h-4 w-4\" />;\n default:\n return <AlertCircle className=\"h-4 w-4\" />;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function InvestorInvestmentsPage() {\n const { navigateTo } = useAdapterCloud();\n const [isLoading, setIsLoading] = useState(true);\n const [filter, setFilter] = useState<FilterKey>('all');\n\n useEffect(() => {\n const timer = setTimeout(() => setIsLoading(false), 600);\n return () => clearTimeout(timer);\n }, []);\n\n const filteredInvestments = useMemo(() => {\n if (filter === 'all') return mockInvestments;\n return mockInvestments.filter((inv) => inv.status === filter);\n }, [filter]);\n\n const filterTabs: Array<{ key: FilterKey; label: string }> = [\n { key: 'all', label: 'All Investments' },\n { key: 'active', label: 'Active' },\n { key: 'pending', label: 'Pending' },\n { key: 'matured', label: 'Matured' },\n ];\n\n function getCount(key: FilterKey): number {\n if (key === 'all') return mockInvestments.length;\n return mockInvestments.filter((inv) => inv.status === key).length;\n }\n\n if (isLoading) {\n return (\n <PageLayout title=\"My Investments\" description=\"Loading your investments...\">\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 investments...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"My Investments\"\n description=\"Track and manage your investment portfolio\"\n actions={\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 New Investment\n </button>\n }\n >\n {/* Investment Summary */}\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(mockSummary.totalInvested, { minimumFractionDigits: 0 })}\n label=\"Total Invested\"\n trend=\"up\"\n trendValue=\"Total amount invested\"\n />\n <MetricsCard\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={formatCurrency(mockSummary.currentValue, { minimumFractionDigits: 0 })}\n label=\"Current Value\"\n trend={mockSummary.profitLoss > 0 ? 'up' : 'down'}\n trendValue={`${mockSummary.profitLossPercentage > 0 ? '+' : ''}${mockSummary.profitLossPercentage}% total returns`}\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={formatCurrency(mockSummary.totalReturns, { minimumFractionDigits: 0 })}\n label=\"Total Returns\"\n trend=\"up\"\n trendValue=\"Total profit earned\"\n />\n <MetricsCard\n icon={<CheckCircle2 className=\"h-5 w-5\" />}\n value={String(mockSummary.activeInvestments)}\n label=\"Active Investments\"\n trend=\"neutral\"\n trendValue={`${mockSummary.averageRoi}% avg ROI`}\n />\n </div>\n\n {/* Filter Tabs */}\n <div className=\"mt-6 rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex flex-wrap gap-2\">\n {filterTabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setFilter(tab.key)}\n className={cn(\n 'flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors',\n filter === tab.key\n ? 'bg-action-primary-bg text-action-primary-text'\n : 'bg-bg-sunken text-text-primary hover:bg-bg-sunken/80'\n )}\n >\n {tab.label}\n <span\n className={cn(\n 'rounded-full px-2 py-0.5 text-xs',\n filter === tab.key\n ? 'bg-primary-foreground/20 text-action-primary-text'\n : 'bg-action-primary-bg/10 text-primary'\n )}\n >\n {getCount(tab.key)}\n </span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Investments List */}\n <div className=\"mt-6 space-y-4\">\n {filteredInvestments.length > 0 ? (\n filteredInvestments.map((investment) => (\n <div key={investment.id} className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6\">\n {/* Mobile Layout */}\n <div className=\"block space-y-4 lg:hidden\">\n <div className=\"flex items-start justify-between\">\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary\">{investment.cartName}</h3>\n <p className=\"text-sm text-text-secondary\">by {investment.cartOwner}</p>\n </div>\n <span\n className={cn(\n 'flex items-center gap-1 rounded-full px-3 py-1 text-sm font-medium',\n getStatusColor(investment.status)\n )}\n >\n {getStatusIcon(investment.status)}\n <span className=\"capitalize\">{investment.status}</span>\n </span>\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Invested</p>\n <p className=\"font-semibold text-text-primary\">\n {formatCurrency(investment.investmentAmount, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Current Value</p>\n <p className=\"font-semibold text-text-primary\">\n {formatCurrency(investment.currentValue, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">P&L</p>\n <p\n className={cn(\n 'font-semibold',\n investment.profitLoss >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {investment.profitLoss >= 0 ? '+' : ''}\n {formatCurrency(investment.profitLoss, { minimumFractionDigits: 0 })} (\n {investment.profitLossPercentage >= 0 ? '+' : ''}\n {investment.profitLossPercentage}%)\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">ROI</p>\n <p className=\"font-semibold text-text-primary\">{investment.roiAnnual}% p.a.</p>\n </div>\n </div>\n\n <div className=\"flex items-center justify-between border-t border-border-subtle pt-2\">\n <div>\n <p className=\"text-xs text-text-secondary\">Invested on</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {formatDate(investment.investmentDate, {\n hour: undefined,\n minute: undefined,\n })}\n </p>\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 </div>\n\n {/* Desktop Layout */}\n <div className=\"hidden lg:flex lg:items-center lg:justify-between\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"mb-2 flex items-center justify-between\">\n <h3 className=\"text-lg font-semibold text-text-primary\">{investment.cartName}</h3>\n <span\n className={cn(\n 'flex items-center gap-1 rounded-full px-3 py-1 text-sm font-medium',\n getStatusColor(investment.status)\n )}\n >\n {getStatusIcon(investment.status)}\n <span className=\"capitalize\">{investment.status}</span>\n </span>\n </div>\n <p className=\"mb-4 text-sm text-text-secondary\">by {investment.cartOwner}</p>\n\n <div className=\"grid grid-cols-5 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary\">Invested</p>\n <p className=\"font-semibold text-text-primary\">\n {formatCurrency(investment.investmentAmount, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Current Value</p>\n <p className=\"font-semibold text-text-primary\">\n {formatCurrency(investment.currentValue, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">P&L</p>\n <p\n className={cn(\n 'font-semibold',\n investment.profitLoss >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {investment.profitLoss >= 0 ? '+' : ''}\n {formatCurrency(investment.profitLoss, { minimumFractionDigits: 0 })}\n </p>\n <p\n className={cn(\n 'text-xs',\n investment.profitLoss >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n ({investment.profitLossPercentage >= 0 ? '+' : ''}\n {investment.profitLossPercentage}%)\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">ROI</p>\n <p className=\"font-semibold text-text-primary\">{investment.roiAnnual}% p.a.</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Invested on</p>\n <p className=\"font-semibold text-text-primary\">\n {formatDate(investment.investmentDate, {\n hour: undefined,\n minute: undefined,\n })}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"ml-6\">\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 </div>\n </div>\n ))\n ) : (\n <EmptyState\n icon={<TrendingDown className=\"h-12 w-12\" />}\n title={`No ${filter !== 'all' ? filter : ''} investments found`}\n description={\n filter === 'all'\n ? \"You haven't made any investments yet. Start exploring opportunities to grow your wealth.\"\n : `You don't have any ${filter} investments at the moment.`\n }\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n className=\"rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n Explore Investment Opportunities\n </button>\n }\n />\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"InvestorInvestmentsPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/investor/InvestorInvestmentsPage.tsx"],"sourcesContent":["/**\n * Investor Investments Page\n * @module adaptercloud/pages/investor\n *\n * MetricsGrid summary cards, filter tabs (all/active/pending/matured) with counts,\n * responsive mobile/desktop layouts, P&L display, ROI display, status icons,\n * empty state.\n */\n\nimport { useState, useEffect, useMemo } from'react';\nimport {\n TrendingUp,\n TrendingDown,\n Briefcase,\n Eye,\n BarChart3,\n AlertCircle,\n CheckCircle2,\n Clock,\n Wallet,\n IndianRupee,\n Plus,\n Target,\n} from'lucide-react';\nimport { PageLayout } from'../../components/PageLayout';\nimport { MetricsCard } from'../../components/MetricsCard';\nimport { EmptyState } from'../../components/EmptyState';\nimport { useAdapterCloud } from'../../context/AdapterCloudContext';\nimport { cn } from'../../utils/cn';\nimport { formatCurrency, formatDate } from'../../utils/formatters';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface Investment {\n id: string;\n cartName: string;\n cartOwner: string;\n investmentAmount: number;\n currentValue: number;\n profitLoss: number;\n profitLossPercentage: number;\n investmentDate: string;\n status: 'active' | 'pending' | 'matured' | 'withdrawn';\n roiAnnual: number;\n duration: string;\n nextPayout: string;\n totalReturns: number;\n}\n\ninterface InvestmentSummary {\n totalInvested: number;\n currentValue: number;\n totalReturns: number;\n activeInvestments: number;\n averageRoi: number;\n profitLoss: number;\n profitLossPercentage: number;\n}\n\ntype FilterKey = 'all' | 'active' | 'pending' | 'matured';\n\n// ---------------------------------------------------------------------------\n// Mock data\n// ---------------------------------------------------------------------------\n\nconst mockInvestments: Investment[] = [\n {\n id: 'inv-001',\n cartName: 'South Indian Express',\n cartOwner: 'Raj Kumar',\n investmentAmount: 50000,\n currentValue: 58500,\n profitLoss: 8500,\n profitLossPercentage: 17.0,\n investmentDate: '2024-01-15',\n status: 'active',\n roiAnnual: 22.5,\n duration: '18 months',\n nextPayout: '2024-12-15',\n totalReturns: 8500,\n },\n {\n id: 'inv-002',\n cartName: 'Pizza Corner',\n cartOwner: 'Priya Singh',\n investmentAmount: 75000,\n currentValue: 82000,\n profitLoss: 7000,\n profitLossPercentage: 9.3,\n investmentDate: '2024-03-10',\n status: 'active',\n roiAnnual: 18.0,\n duration: '24 months',\n nextPayout: '2024-12-10',\n totalReturns: 7000,\n },\n {\n id: 'inv-003',\n cartName: 'Healthy Bites',\n cartOwner: 'Amit Patel',\n investmentAmount: 30000,\n currentValue: 31200,\n profitLoss: 1200,\n profitLossPercentage: 4.0,\n investmentDate: '2024-06-01',\n status: 'active',\n roiAnnual: 15.0,\n duration: '12 months',\n nextPayout: '2024-12-01',\n totalReturns: 1200,\n },\n {\n id: 'inv-004',\n cartName: 'Street Food Junction',\n cartOwner: 'Neha Sharma',\n investmentAmount: 40000,\n currentValue: 40000,\n profitLoss: 0,\n profitLossPercentage: 0,\n investmentDate: '2024-08-15',\n status: 'pending',\n roiAnnual: 20.0,\n duration: '15 months',\n nextPayout: '2025-01-15',\n totalReturns: 0,\n },\n {\n id: 'inv-005',\n cartName: 'Biryani House',\n cartOwner: 'Suresh Reddy',\n investmentAmount: 60000,\n currentValue: 72000,\n profitLoss: 12000,\n profitLossPercentage: 20.0,\n investmentDate: '2023-12-01',\n status: 'matured',\n roiAnnual: 25.0,\n duration: '12 months',\n nextPayout: '-',\n totalReturns: 12000,\n },\n];\n\nconst mockSummary: InvestmentSummary = {\n totalInvested: 255000,\n currentValue: 283700,\n totalReturns: 28700,\n activeInvestments: 3,\n averageRoi: 19.6,\n profitLoss: 28700,\n profitLossPercentage: 11.3,\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getStatusColor(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'matured':\n return'bg-accent-blue-subtle/20 text-accent-blue';\n case'withdrawn':\n return'bg-secondary text-secondary-foreground';\n default:\n return'bg-secondary text-secondary-foreground';\n }\n}\n\nfunction getStatusIcon(status: string) {\n switch (status) {\n case'active':\n return <CheckCircle2 className=\"h-4 w-4\" />;\n case'pending':\n return <Clock className=\"h-4 w-4\" />;\n case'matured':\n return <CheckCircle2 className=\"h-4 w-4\" />;\n default:\n return <AlertCircle className=\"h-4 w-4\" />;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function InvestorInvestmentsPage() {\n const { navigateTo } = useAdapterCloud();\n const [isLoading, setIsLoading] = useState(true);\n const [filter, setFilter] = useState<FilterKey>('all');\n\n useEffect(() => {\n const timer = setTimeout(() => setIsLoading(false), 600);\n return () => clearTimeout(timer);\n }, []);\n\n const filteredInvestments = useMemo(() => {\n if (filter === 'all') return mockInvestments;\n return mockInvestments.filter((inv) => inv.status === filter);\n }, [filter]);\n\n const filterTabs: Array<{ key: FilterKey; label: string }> = [\n { key: 'all', label: 'All Investments' },\n { key: 'active', label: 'Active' },\n { key: 'pending', label: 'Pending' },\n { key: 'matured', label: 'Matured' },\n ];\n\n function getCount(key: FilterKey): number {\n if (key === 'all') return mockInvestments.length;\n return mockInvestments.filter((inv) => inv.status === key).length;\n }\n\n if (isLoading) {\n return (\n <PageLayout title=\"My Investments\" description=\"Loading your investments...\">\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 investments...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"My Investments\"\n description=\"Track and manage your investment portfolio\"\n actions={\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 New Investment\n </button>\n }\n >\n {/* Investment Summary */}\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(mockSummary.totalInvested, { minimumFractionDigits: 0 })}\n label=\"Total Invested\"\n trend=\"up\"\n trendValue=\"Total amount invested\"\n />\n <MetricsCard\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={formatCurrency(mockSummary.currentValue, { minimumFractionDigits: 0 })}\n label=\"Current Value\"\n trend={mockSummary.profitLoss > 0 ? 'up' : 'down'}\n trendValue={`${mockSummary.profitLossPercentage > 0 ? '+' : ''}${mockSummary.profitLossPercentage}% total returns`}\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={formatCurrency(mockSummary.totalReturns, { minimumFractionDigits: 0 })}\n label=\"Total Returns\"\n trend=\"up\"\n trendValue=\"Total profit earned\"\n />\n <MetricsCard\n icon={<CheckCircle2 className=\"h-5 w-5\" />}\n value={String(mockSummary.activeInvestments)}\n label=\"Active Investments\"\n trend=\"neutral\"\n trendValue={`${mockSummary.averageRoi}% avg ROI`}\n />\n </div>\n\n {/* Filter Tabs */}\n <div className=\"mt-6 rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop\">\n <div className=\"flex flex-wrap gap-2\">\n {filterTabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setFilter(tab.key)}\n className={cn(\n 'flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors',\n filter === tab.key\n ? 'bg-action-primary-bg text-action-primary-text'\n : 'bg-bg-sunken text-text-primary hover:bg-bg-sunken/80'\n )}\n >\n {tab.label}\n <span\n className={cn(\n 'rounded-full px-2 py-0.5 text-xs',\n filter === tab.key\n ? 'bg-primary-foreground/20 text-action-primary-text'\n : 'bg-action-primary-bg/10 text-primary'\n )}\n >\n {getCount(tab.key)}\n </span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Investments List */}\n <div className=\"mt-6 space-y-4\">\n {filteredInvestments.length > 0 ? (\n filteredInvestments.map((investment) => (\n <div key={investment.id} className=\"rounded-lg border border-border-seam bg-bg-surface p-4 sm:p-6 bg-gloss-card shadow-pop\">\n {/* Mobile Layout */}\n <div className=\"block space-y-4 lg:hidden\">\n <div className=\"flex items-start justify-between\">\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary\">{investment.cartName}</h3>\n <p className=\"text-sm text-text-secondary\">by {investment.cartOwner}</p>\n </div>\n <span\n className={cn(\n 'flex items-center gap-1 rounded-full px-3 py-1 text-sm font-medium',\n getStatusColor(investment.status)\n )}\n >\n {getStatusIcon(investment.status)}\n <span className=\"capitalize\">{investment.status}</span>\n </span>\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Invested</p>\n <p className=\"font-semibold text-text-primary\">\n {formatCurrency(investment.investmentAmount, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Current Value</p>\n <p className=\"font-semibold text-text-primary\">\n {formatCurrency(investment.currentValue, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">P&L</p>\n <p\n className={cn(\n 'font-semibold',\n investment.profitLoss >= 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {investment.profitLoss >= 0 ? '+' : ''}\n {formatCurrency(investment.profitLoss, { minimumFractionDigits: 0 })} (\n {investment.profitLossPercentage >= 0 ? '+' : ''}\n {investment.profitLossPercentage}%)\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">ROI</p>\n <p className=\"font-semibold text-text-primary\">{investment.roiAnnual}% p.a.</p>\n </div>\n </div>\n\n <div className=\"flex items-center justify-between border-t border-border-subtle pt-2\">\n <div>\n <p className=\"text-xs text-text-secondary\">Invested on</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {formatDate(investment.investmentDate, {\n hour: undefined,\n minute: undefined,\n })}\n </p>\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 </div>\n\n {/* Desktop Layout */}\n <div className=\"hidden lg:flex lg:items-center lg:justify-between\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"mb-2 flex items-center justify-between\">\n <h3 className=\"text-lg font-semibold text-text-primary\">{investment.cartName}</h3>\n <span\n className={cn(\n 'flex items-center gap-1 rounded-full px-3 py-1 text-sm font-medium',\n getStatusColor(investment.status)\n )}\n >\n {getStatusIcon(investment.status)}\n <span className=\"capitalize\">{investment.status}</span>\n </span>\n </div>\n <p className=\"mb-4 text-sm text-text-secondary\">by {investment.cartOwner}</p>\n\n <div className=\"grid grid-cols-5 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary\">Invested</p>\n <p className=\"font-semibold text-text-primary\">\n {formatCurrency(investment.investmentAmount, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Current Value</p>\n <p className=\"font-semibold text-text-primary\">\n {formatCurrency(investment.currentValue, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">P&L</p>\n <p\n className={cn(\n 'font-semibold',\n investment.profitLoss >= 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {investment.profitLoss >= 0 ? '+' : ''}\n {formatCurrency(investment.profitLoss, { minimumFractionDigits: 0 })}\n </p>\n <p\n className={cn(\n 'text-xs',\n investment.profitLoss >= 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n ({investment.profitLossPercentage >= 0 ? '+' : ''}\n {investment.profitLossPercentage}%)\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">ROI</p>\n <p className=\"font-semibold text-text-primary\">{investment.roiAnnual}% p.a.</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Invested on</p>\n <p className=\"font-semibold text-text-primary\">\n {formatDate(investment.investmentDate, {\n hour: undefined,\n minute: undefined,\n })}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"ml-6\">\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 </div>\n </div>\n ))\n ) : (\n <EmptyState\n illustration=\"empty-data\"\n icon={<TrendingDown className=\"h-12 w-12\" />}\n title={`No ${filter !== 'all' ? filter : ''} investments found`}\n description={\n filter === 'all'\n ? \"You haven't made any investments yet. Start exploring opportunities to grow your wealth.\"\n : `You don't have any ${filter} investments at the moment.`\n }\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n className=\"rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n Explore Investment Opportunities\n </button>\n }\n />\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -155,15 +155,15 @@ var x = [
155
155
  function w(e) {
156
156
  let { color: n, label: r } = {
157
157
  low: {
158
- color: "bg-green-500/20 text-green-600 dark:text-green-400",
158
+ color: "bg-status-success-bg-subtle/20 text-status-success-text",
159
159
  label: "Low Risk"
160
160
  },
161
161
  medium: {
162
- color: "bg-yellow-500/20 text-yellow-600 dark:text-yellow-400",
162
+ color: "bg-status-warning-bg-subtle/20 text-status-warning-text",
163
163
  label: "Medium Risk"
164
164
  },
165
165
  high: {
166
- color: "bg-red-500/20 text-red-600 dark:text-red-400",
166
+ color: "bg-status-error-bg-subtle/20 text-status-error-text",
167
167
  label: "High Risk"
168
168
  }
169
169
  }[e];
@@ -246,7 +246,7 @@ function E() {
246
246
  children: [/* @__PURE__ */ y("div", {
247
247
  className: "h-2 flex-1 rounded-full bg-bg-sunken overflow-hidden",
248
248
  children: /* @__PURE__ */ y("div", {
249
- className: t("h-full rounded-full", z <= 1.5 ? "bg-green-500" : z <= 2.5 ? "bg-yellow-500" : "bg-red-500"),
249
+ className: t("h-full rounded-full", z <= 1.5 ? "bg-status-success-bg-subtle" : z <= 2.5 ? "bg-status-warning-bg-subtle" : "bg-status-error-bg-subtle"),
250
250
  style: { width: `${z / 3 * 100}%` }
251
251
  })
252
252
  }), /* @__PURE__ */ b("span", {
@@ -267,7 +267,7 @@ function E() {
267
267
  children: B.cartName
268
268
  }),
269
269
  /* @__PURE__ */ y("p", {
270
- className: "text-xs text-green-600 dark:text-green-400",
270
+ className: "text-xs text-status-success-text",
271
271
  children: T(B.returnsPercentage)
272
272
  })
273
273
  ]
@@ -420,7 +420,7 @@ function E() {
420
420
  className: "text-xl font-bold text-text-primary",
421
421
  children: i(e.currentValue, { minimumFractionDigits: 0 })
422
422
  }), /* @__PURE__ */ b("p", {
423
- className: t("text-sm", e.returns > 0 ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400"),
423
+ className: t("text-sm", e.returns > 0 ? "text-status-success-text" : "text-status-error-text"),
424
424
  children: [
425
425
  i(Math.abs(e.returns), { minimumFractionDigits: 0 }),
426
426
  " (",
@@ -483,7 +483,7 @@ function E() {
483
483
  })] }),
484
484
  /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("div", {
485
485
  className: "flex items-center justify-center gap-1",
486
- children: [/* @__PURE__ */ y(h, { className: "h-4 w-4 fill-yellow-400 text-yellow-400" }), /* @__PURE__ */ y("p", {
486
+ children: [/* @__PURE__ */ y(h, { className: "h-4 w-4 fill-status-warning-text text-status-warning-text" }), /* @__PURE__ */ y("p", {
487
487
  className: "text-lg font-bold text-text-primary",
488
488
  children: e.performanceMetrics.averageRating
489
489
  })]
@@ -492,7 +492,7 @@ function E() {
492
492
  children: "Rating"
493
493
  })] }),
494
494
  /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("p", {
495
- className: "text-lg font-bold text-green-600 dark:text-green-400",
495
+ className: "text-lg font-bold text-status-success-text",
496
496
  children: [
497
497
  "+",
498
498
  e.performanceMetrics.growthRate,
@@ -529,8 +529,8 @@ function E() {
529
529
  children: [/* @__PURE__ */ b("div", {
530
530
  className: "flex items-center gap-3",
531
531
  children: [/* @__PURE__ */ y("div", {
532
- className: t("flex h-10 w-10 shrink-0 items-center justify-center rounded-full", e.type === "investment" ? "bg-blue-500/10" : e.type === "dividend" ? "bg-green-500/10" : "bg-red-500/10"),
533
- children: e.type === "investment" ? /* @__PURE__ */ y(v, { className: "h-5 w-5 text-blue-600 dark:text-blue-400" }) : e.type === "dividend" ? /* @__PURE__ */ y(_, { className: "h-5 w-5 text-green-600 dark:text-green-400" }) : /* @__PURE__ */ y(g, { className: "h-5 w-5 text-red-600 dark:text-red-400" })
532
+ className: t("flex h-10 w-10 shrink-0 items-center justify-center rounded-full", e.type === "investment" ? "bg-accent-blue-subtle/10" : e.type === "dividend" ? "bg-status-success-bg-subtle/10" : "bg-status-error-bg-subtle/10"),
533
+ children: e.type === "investment" ? /* @__PURE__ */ y(v, { className: "h-5 w-5 text-accent-blue" }) : e.type === "dividend" ? /* @__PURE__ */ y(_, { className: "h-5 w-5 text-status-success-text" }) : /* @__PURE__ */ y(g, { className: "h-5 w-5 text-status-error-text" })
534
534
  }), /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("p", {
535
535
  className: "text-sm font-medium text-text-primary",
536
536
  children: [
@@ -548,10 +548,10 @@ function E() {
548
548
  }), /* @__PURE__ */ b("div", {
549
549
  className: "flex items-center justify-between sm:gap-4",
550
550
  children: [/* @__PURE__ */ b("p", {
551
- className: t("text-sm font-bold", e.type === "dividend" ? "text-green-600 dark:text-green-400" : "text-text-primary"),
551
+ className: t("text-sm font-bold", e.type === "dividend" ? "text-status-success-text" : "text-text-primary"),
552
552
  children: [e.type === "dividend" ? "+" : "-", i(e.amount, { minimumFractionDigits: 0 })]
553
553
  }), /* @__PURE__ */ y("span", {
554
- className: t("rounded-full px-2.5 py-0.5 text-xs font-medium", e.status === "completed" ? "bg-green-500/20 text-green-600 dark:text-green-400" : e.status === "pending" ? "bg-yellow-500/20 text-yellow-600 dark:text-yellow-400" : "bg-red-500/20 text-red-600 dark:text-red-400"),
554
+ className: t("rounded-full px-2.5 py-0.5 text-xs font-medium", e.status === "completed" ? "bg-status-success-bg-subtle/20 text-status-success-text" : e.status === "pending" ? "bg-status-warning-bg-subtle/20 text-status-warning-text" : "bg-status-error-bg-subtle/20 text-status-error-text"),
555
555
  children: e.status
556
556
  })]
557
557
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"InvestorPortfolioPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/investor/InvestorPortfolioPage.tsx"],"sourcesContent":["/**\n * Investor Portfolio Page\n * @module adaptercloud/pages/investor\n *\n * Portfolio summary cards, 3-tab UI (overview/investments/transactions),\n * asset allocation bars, category filter, transactions list, withdrawal action,\n * and performance metrics per investment.\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport {\n Wallet,\n TrendingUp,\n TrendingDown,\n Briefcase,\n IndianRupee,\n Star,\n Eye,\n ArrowDownCircle,\n BarChart3,\n CreditCard,\n LayoutList,\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, formatDate } from '../../utils/formatters';\n\n// ---------------------------------------------------------------------------\n// Types & mock data\n// ---------------------------------------------------------------------------\n\ninterface Investment {\n id: string;\n cartId: string;\n cartName: string;\n cartOwner: string;\n investmentDate: string;\n amount: number;\n currentValue: number;\n returns: number;\n returnsPercentage: number;\n ownership: number;\n status: 'active' | 'matured' | 'exited';\n monthlyRevenue: number;\n monthlyDividend: number;\n nextPayoutDate: string;\n riskLevel: 'low' | 'medium' | 'high';\n category: string;\n location: string;\n performanceMetrics: {\n monthlyOrders: number;\n averageRating: number;\n growthRate: number;\n };\n}\n\ninterface Transaction {\n id: string;\n type: 'investment' | 'dividend' | 'withdrawal';\n cartName: string;\n amount: number;\n date: string;\n status: 'completed' | 'pending' | 'failed';\n}\n\nconst mockInvestments: Investment[] = [\n {\n id: 'inv-001',\n cartId: 'SERV-001',\n cartName: 'Quick Cuts Salon',\n cartOwner: 'Ravi Kumar',\n investmentDate: '2023-06-15',\n amount: 50000,\n currentValue: 62500,\n returns: 12500,\n returnsPercentage: 25,\n ownership: 15,\n status: 'active',\n monthlyRevenue: 185000,\n monthlyDividend: 2775,\n nextPayoutDate: '2024-07-01',\n riskLevel: 'low',\n category: 'Personal Care & Beauty',\n location: 'Indiranagar, Bangalore',\n performanceMetrics: { monthlyOrders: 1250, averageRating: 4.8, growthRate: 12 },\n },\n {\n id: 'inv-002',\n cartId: 'SERV-003',\n cartName: 'Fix-It Mobile Repair',\n cartOwner: 'Amit Sharma',\n investmentDate: '2023-08-20',\n amount: 30000,\n currentValue: 35400,\n returns: 5400,\n returnsPercentage: 18,\n ownership: 10,\n status: 'active',\n monthlyRevenue: 120000,\n monthlyDividend: 1200,\n nextPayoutDate: '2024-07-01',\n riskLevel: 'medium',\n category: 'Repair & Maintenance',\n location: 'Jayanagar, Bangalore',\n performanceMetrics: { monthlyOrders: 890, averageRating: 4.6, growthRate: 8 },\n },\n {\n id: 'inv-003',\n cartId: 'SERV-005',\n cartName: 'Spotless Cleaning Services',\n cartOwner: 'Priya Cleaning',\n investmentDate: '2023-04-10',\n amount: 40000,\n currentValue: 52000,\n returns: 12000,\n returnsPercentage: 30,\n ownership: 20,\n status: 'active',\n monthlyRevenue: 95000,\n monthlyDividend: 1900,\n nextPayoutDate: '2024-07-01',\n riskLevel: 'low',\n category: 'Home Services',\n location: 'HSR Layout, Bangalore',\n performanceMetrics: { monthlyOrders: 1450, averageRating: 4.7, growthRate: 15 },\n },\n {\n id: 'inv-004',\n cartId: 'FOOD-001',\n cartName: 'Dosa Express',\n cartOwner: 'Rajesh Kumar',\n investmentDate: '2023-10-05',\n amount: 25000,\n currentValue: 27500,\n returns: 2500,\n returnsPercentage: 10,\n ownership: 5,\n status: 'active',\n monthlyRevenue: 150000,\n monthlyDividend: 750,\n nextPayoutDate: '2024-07-01',\n riskLevel: 'high',\n category: 'Food & Beverage',\n location: 'Koramangala, Bangalore',\n performanceMetrics: { monthlyOrders: 780, averageRating: 4.5, growthRate: 5 },\n },\n];\n\nconst mockTransactions: Transaction[] = [\n {\n id: 'txn-001',\n type: 'investment',\n cartName: 'Quick Cuts Salon',\n amount: 50000,\n date: '2023-06-15',\n status: 'completed',\n },\n {\n id: 'txn-002',\n type: 'dividend',\n cartName: 'Quick Cuts Salon',\n amount: 2775,\n date: '2024-06-01',\n status: 'completed',\n },\n {\n id: 'txn-003',\n type: 'dividend',\n cartName: 'Fix-It Mobile Repair',\n amount: 1200,\n date: '2024-06-01',\n status: 'completed',\n },\n {\n id: 'txn-004',\n type: 'investment',\n cartName: 'Spotless Cleaning Services',\n amount: 40000,\n date: '2023-04-10',\n status: 'completed',\n },\n {\n id: 'txn-005',\n type: 'dividend',\n cartName: 'Spotless Cleaning Services',\n amount: 1900,\n date: '2024-06-01',\n status: 'pending',\n },\n];\n\nconst categories = [\n '',\n 'Personal Care & Beauty',\n 'Repair & Maintenance',\n 'Home Services',\n 'Food & Beverage',\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getRiskBadge(risk: Investment['riskLevel']) {\n const map = {\n low: { color: 'bg-green-500/20 text-green-600 dark:text-green-400', label: 'Low Risk' },\n medium: {\n color: 'bg-yellow-500/20 text-yellow-600 dark:text-yellow-400',\n label: 'Medium Risk',\n },\n high: { color: 'bg-red-500/20 text-red-600 dark:text-red-400', label: 'High Risk' },\n };\n const { color, label } = map[risk];\n return <span className={cn('rounded-full px-2 py-0.5 text-xs font-medium', color)}>{label}</span>;\n}\n\nfunction fmtPct(value: number) {\n return `${value > 0 ? '+' : ''}${value.toFixed(1)}%`;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function InvestorPortfolioPage() {\n const { navigateTo } = useAdapterCloud();\n const [activeTab, setActiveTab] = useState<'overview' | 'investments' | 'transactions'>(\n 'overview'\n );\n const [filterCategory, setFilterCategory] = useState('');\n\n const filteredInvestments = useMemo(() => {\n if (!filterCategory) return mockInvestments;\n return mockInvestments.filter((inv) => inv.category === filterCategory);\n }, [filterCategory]);\n\n const totalInvested = filteredInvestments.reduce((s, i) => s + i.amount, 0);\n const currentValue = filteredInvestments.reduce((s, i) => s + i.currentValue, 0);\n const totalReturns = currentValue - totalInvested;\n const returnsPercentage = totalInvested > 0 ? (totalReturns / totalInvested) * 100 : 0;\n const monthlyDividend = filteredInvestments.reduce((s, i) => s + i.monthlyDividend, 0);\n const activeCount = filteredInvestments.filter((i) => i.status === 'active').length;\n\n const riskScores: Record<string, number> = { low: 1, medium: 2, high: 3 };\n const avgRiskScore =\n filteredInvestments.length > 0\n ? filteredInvestments.reduce((s, i) => s + riskScores[i.riskLevel], 0) /\n filteredInvestments.length\n : 0;\n\n const bestPerformer = filteredInvestments.reduce(\n (best, inv) => (inv.returnsPercentage > best.returnsPercentage ? inv : best),\n filteredInvestments[0] || { cartName: '', returnsPercentage: 0 }\n );\n\n const handleWithdraw = useCallback((investmentId: string) => {\n alert(`Withdrawal request submitted for ${investmentId}`);\n }, []);\n\n // Asset allocation\n const allocationMap = filteredInvestments.reduce<Record<string, number>>((acc, inv) => {\n acc[inv.category] = (acc[inv.category] || 0) + inv.currentValue;\n return acc;\n }, {});\n\n return (\n <PageLayout title=\"My Portfolio\" description=\"Track your investment performance and holdings\">\n {/* Summary Cards */}\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(totalInvested, { minimumFractionDigits: 0 })}\n label=\"Total Invested\"\n trend=\"up\"\n trendValue={`${activeCount} active`}\n />\n <MetricsCard\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={formatCurrency(currentValue, { minimumFractionDigits: 0 })}\n label=\"Current Value\"\n trend={returnsPercentage > 0 ? 'up' : 'down'}\n trendValue={fmtPct(returnsPercentage)}\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={formatCurrency(Math.abs(totalReturns), { minimumFractionDigits: 0 })}\n label=\"Total Returns\"\n trend={totalReturns >= 0 ? 'up' : 'down'}\n trendValue={fmtPct(returnsPercentage)}\n />\n <MetricsCard\n icon={<Briefcase className=\"h-5 w-5\" />}\n value={formatCurrency(monthlyDividend, { minimumFractionDigits: 0 })}\n label=\"Monthly Dividend\"\n trend=\"up\"\n trendValue=\"Next: July 1\"\n />\n </div>\n\n {/* Additional Stats */}\n <div className=\"mt-4 grid grid-cols-2 gap-3 lg:grid-cols-4\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-3\">\n <p className=\"text-xs text-text-secondary\">Active Investments</p>\n <p className=\"text-xl font-bold text-text-primary\">{activeCount}</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-3\">\n <p className=\"text-xs text-text-secondary\">Avg Risk Score</p>\n <div className=\"mt-1 flex items-center gap-2\">\n <div className=\"h-2 flex-1 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={cn(\n 'h-full rounded-full',\n avgRiskScore <= 1.5\n ? 'bg-green-500'\n : avgRiskScore <= 2.5\n ? 'bg-yellow-500'\n : 'bg-red-500'\n )}\n style={{ width: `${(avgRiskScore / 3) * 100}%` }}\n />\n </div>\n <span className=\"text-sm font-medium text-text-primary\">{avgRiskScore.toFixed(1)}/3</span>\n </div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-3\">\n <p className=\"text-xs text-text-secondary\">Best Performer</p>\n <p className=\"truncate text-sm font-bold text-text-primary\">{bestPerformer.cartName}</p>\n <p className=\"text-xs text-green-600 dark:text-green-400\">\n {fmtPct(bestPerformer.returnsPercentage)}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-3\">\n <p className=\"text-xs text-text-secondary\">Next Payout</p>\n <p className=\"text-lg font-bold text-text-primary\">July 1</p>\n <p className=\"text-xs text-text-secondary\">In 7 days</p>\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"mt-6 rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"flex border-b border-border-subtle overflow-x-auto\">\n {(\n [\n { key: 'overview', label: 'Overview', Icon: BarChart3 },\n {\n key: 'investments',\n label: `Investments (${filteredInvestments.length})`,\n Icon: Briefcase,\n },\n { key: 'transactions', label: 'Transactions', Icon: CreditCard },\n ] as const\n ).map(({ key, label, Icon }) => (\n <button\n key={key}\n type=\"button\"\n onClick={() => setActiveTab(key)}\n className={cn(\n 'flex items-center gap-2 whitespace-nowrap px-4 py-3 text-sm font-medium transition-colors',\n activeTab === key\n ? 'border-b-2 border-primary text-text-primary'\n : 'text-text-secondary hover:text-text-primary'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n {label}\n </button>\n ))}\n </div>\n\n <div className=\"p-4\">\n {/* Overview Tab */}\n {activeTab === 'overview' && (\n <div className=\"space-y-6\">\n {/* Performance placeholder */}\n <div>\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">\n Portfolio Performance\n </h3>\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/50 p-8 text-center\">\n <BarChart3 className=\"mx-auto mb-2 h-8 w-8 text-text-secondary/50\" />\n <p className=\"text-sm text-text-secondary\">Performance chart visualization</p>\n <p className=\"mt-1 text-xs text-text-secondary\">\n Shows portfolio value over time\n </p>\n </div>\n </div>\n\n {/* Asset Allocation */}\n <div>\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Asset Allocation</h3>\n <div className=\"space-y-3\">\n {Object.entries(allocationMap).map(([category, value]) => (\n <div key={category} className=\"flex items-center\">\n <span className=\"w-40 truncate text-sm text-text-primary\">{category}</span>\n <div className=\"mx-3 h-6 flex-1 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className=\"flex h-6 items-center justify-end rounded-full bg-action-primary-bg pr-2\"\n style={{\n width: `${currentValue > 0 ? (value / currentValue) * 100 : 0}%`,\n }}\n >\n <span className=\"text-xs font-medium text-action-primary-text\">\n {currentValue > 0 ? ((value / currentValue) * 100).toFixed(1) : 0}%\n </span>\n </div>\n </div>\n <span className=\"ml-2 text-sm font-medium text-text-primary\">\n {formatCurrency(value, { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Investments Tab */}\n {activeTab === 'investments' && (\n <div>\n {/* Category filter */}\n <div className=\"mb-4\">\n <select\n value={filterCategory}\n onChange={(e) => setFilterCategory(e.target.value)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">All Categories</option>\n {categories.filter(Boolean).map((cat) => (\n <option key={cat} value={cat}>\n {cat}\n </option>\n ))}\n </select>\n </div>\n\n {/* Investment list */}\n <div className=\"space-y-4\">\n {filteredInvestments.map((inv) => (\n <div\n key={inv.id}\n className=\"rounded-lg border border-border-subtle p-4 hover:bg-accent/50 transition-colors\"\n >\n <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"flex-1\">\n <h4 className=\"text-base font-semibold text-text-primary\">{inv.cartName}</h4>\n <p className=\"text-sm text-text-secondary\">\n Owned by {inv.cartOwner} &bull; {inv.location}\n </p>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <span className=\"text-sm text-text-secondary\">{inv.category}</span>\n {getRiskBadge(inv.riskLevel)}\n </div>\n </div>\n <div className=\"text-left sm:text-right\">\n <p className=\"text-xl font-bold text-text-primary\">\n {formatCurrency(inv.currentValue, { minimumFractionDigits: 0 })}\n </p>\n <p\n className={cn(\n 'text-sm',\n inv.returns > 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {formatCurrency(Math.abs(inv.returns), { minimumFractionDigits: 0 })} (\n {fmtPct(inv.returnsPercentage)})\n </p>\n </div>\n </div>\n\n <div className=\"mb-4 grid grid-cols-2 gap-3 lg:grid-cols-4\">\n <div>\n <p className=\"text-xs text-text-secondary\">Invested</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(inv.amount, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Ownership</p>\n <p className=\"text-sm font-medium text-text-primary\">{inv.ownership}%</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Monthly Dividend</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(inv.monthlyDividend, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Investment Date</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {formatDate(inv.investmentDate, { hour: undefined, minute: undefined })}\n </p>\n </div>\n </div>\n\n {/* Performance metrics */}\n <div className=\"border-t border-border-subtle pt-4\">\n <p className=\"mb-2 text-sm font-medium text-text-secondary\">\n Performance Metrics\n </p>\n <div className=\"grid grid-cols-3 gap-3 text-center\">\n <div>\n <p className=\"text-lg font-bold text-text-primary\">\n {inv.performanceMetrics.monthlyOrders}\n </p>\n <p className=\"text-xs text-text-secondary\">Monthly Orders</p>\n </div>\n <div>\n <div className=\"flex items-center justify-center gap-1\">\n <Star className=\"h-4 w-4 fill-yellow-400 text-yellow-400\" />\n <p className=\"text-lg font-bold text-text-primary\">\n {inv.performanceMetrics.averageRating}\n </p>\n </div>\n <p className=\"text-xs text-text-secondary\">Rating</p>\n </div>\n <div>\n <p className=\"text-lg font-bold text-green-600 dark:text-green-400\">\n +{inv.performanceMetrics.growthRate}%\n </p>\n <p className=\"text-xs text-text-secondary\">Growth Rate</p>\n </div>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"mt-4 flex flex-wrap gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo(`/investor/investments/${inv.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 {inv.status === 'active' && (\n <button\n type=\"button\"\n onClick={() => handleWithdraw(inv.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 <ArrowDownCircle className=\"h-4 w-4\" />\n Withdraw\n </button>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Transactions Tab */}\n {activeTab === 'transactions' && (\n <div className=\"space-y-3\">\n {mockTransactions.map((txn) => (\n <div\n key={txn.id}\n className=\"flex flex-col gap-3 rounded-lg border border-border-subtle p-4 hover:bg-accent/50 transition-colors sm:flex-row sm:items-center sm:justify-between\"\n >\n <div className=\"flex items-center gap-3\">\n <div\n className={cn(\n 'flex h-10 w-10 shrink-0 items-center justify-center rounded-full',\n txn.type === 'investment'\n ? 'bg-blue-500/10'\n : txn.type === 'dividend'\n ? 'bg-green-500/10'\n : 'bg-red-500/10'\n )}\n >\n {txn.type === 'investment' ? (\n <Wallet className=\"h-5 w-5 text-blue-600 dark:text-blue-400\" />\n ) : txn.type === 'dividend' ? (\n <TrendingUp className=\"h-5 w-5 text-green-600 dark:text-green-400\" />\n ) : (\n <TrendingDown className=\"h-5 w-5 text-red-600 dark:text-red-400\" />\n )}\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n {txn.type === 'investment'\n ? 'Investment in'\n : txn.type === 'dividend'\n ? 'Dividend from'\n : 'Withdrawal from'}{' '}\n {txn.cartName}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {formatDate(txn.date, { hour: undefined, minute: undefined })}\n </p>\n </div>\n </div>\n <div className=\"flex items-center justify-between sm:gap-4\">\n <p\n className={cn(\n 'text-sm font-bold',\n txn.type === 'dividend'\n ? 'text-green-600 dark:text-green-400'\n : 'text-text-primary'\n )}\n >\n {txn.type === 'dividend' ? '+' : '-'}\n {formatCurrency(txn.amount, { minimumFractionDigits: 0 })}\n </p>\n <span\n className={cn(\n 'rounded-full px-2.5 py-0.5 text-xs font-medium',\n txn.status === 'completed'\n ? 'bg-green-500/20 text-green-600 dark:text-green-400'\n : txn.status === 'pending'\n ? 'bg-yellow-500/20 text-yellow-600 dark:text-yellow-400'\n : 'bg-red-500/20 text-red-600 dark:text-red-400'\n )}\n >\n {txn.status}\n </span>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"InvestorPortfolioPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/investor/InvestorPortfolioPage.tsx"],"sourcesContent":["/**\n * Investor Portfolio Page\n * @module adaptercloud/pages/investor\n *\n * Portfolio summary cards, 3-tab UI (overview/investments/transactions),\n * asset allocation bars, category filter, transactions list, withdrawal action,\n * and performance metrics per investment.\n */\n\nimport { useState, useCallback, useMemo } from'react';\nimport {\n Wallet,\n TrendingUp,\n TrendingDown,\n Briefcase,\n IndianRupee,\n Star,\n Eye,\n ArrowDownCircle,\n BarChart3,\n CreditCard,\n LayoutList,\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, formatDate } from'../../utils/formatters';\n\n// ---------------------------------------------------------------------------\n// Types & mock data\n// ---------------------------------------------------------------------------\n\ninterface Investment {\n id: string;\n cartId: string;\n cartName: string;\n cartOwner: string;\n investmentDate: string;\n amount: number;\n currentValue: number;\n returns: number;\n returnsPercentage: number;\n ownership: number;\n status: 'active' | 'matured' | 'exited';\n monthlyRevenue: number;\n monthlyDividend: number;\n nextPayoutDate: string;\n riskLevel: 'low' | 'medium' | 'high';\n category: string;\n location: string;\n performanceMetrics: {\n monthlyOrders: number;\n averageRating: number;\n growthRate: number;\n };\n}\n\ninterface Transaction {\n id: string;\n type: 'investment' | 'dividend' | 'withdrawal';\n cartName: string;\n amount: number;\n date: string;\n status: 'completed' | 'pending' | 'failed';\n}\n\nconst mockInvestments: Investment[] = [\n {\n id: 'inv-001',\n cartId: 'SERV-001',\n cartName: 'Quick Cuts Salon',\n cartOwner: 'Ravi Kumar',\n investmentDate: '2023-06-15',\n amount: 50000,\n currentValue: 62500,\n returns: 12500,\n returnsPercentage: 25,\n ownership: 15,\n status: 'active',\n monthlyRevenue: 185000,\n monthlyDividend: 2775,\n nextPayoutDate: '2024-07-01',\n riskLevel: 'low',\n category: 'Personal Care & Beauty',\n location: 'Indiranagar, Bangalore',\n performanceMetrics: { monthlyOrders: 1250, averageRating: 4.8, growthRate: 12 },\n },\n {\n id: 'inv-002',\n cartId: 'SERV-003',\n cartName: 'Fix-It Mobile Repair',\n cartOwner: 'Amit Sharma',\n investmentDate: '2023-08-20',\n amount: 30000,\n currentValue: 35400,\n returns: 5400,\n returnsPercentage: 18,\n ownership: 10,\n status: 'active',\n monthlyRevenue: 120000,\n monthlyDividend: 1200,\n nextPayoutDate: '2024-07-01',\n riskLevel: 'medium',\n category: 'Repair & Maintenance',\n location: 'Jayanagar, Bangalore',\n performanceMetrics: { monthlyOrders: 890, averageRating: 4.6, growthRate: 8 },\n },\n {\n id: 'inv-003',\n cartId: 'SERV-005',\n cartName: 'Spotless Cleaning Services',\n cartOwner: 'Priya Cleaning',\n investmentDate: '2023-04-10',\n amount: 40000,\n currentValue: 52000,\n returns: 12000,\n returnsPercentage: 30,\n ownership: 20,\n status: 'active',\n monthlyRevenue: 95000,\n monthlyDividend: 1900,\n nextPayoutDate: '2024-07-01',\n riskLevel: 'low',\n category: 'Home Services',\n location: 'HSR Layout, Bangalore',\n performanceMetrics: { monthlyOrders: 1450, averageRating: 4.7, growthRate: 15 },\n },\n {\n id: 'inv-004',\n cartId: 'FOOD-001',\n cartName: 'Dosa Express',\n cartOwner: 'Rajesh Kumar',\n investmentDate: '2023-10-05',\n amount: 25000,\n currentValue: 27500,\n returns: 2500,\n returnsPercentage: 10,\n ownership: 5,\n status: 'active',\n monthlyRevenue: 150000,\n monthlyDividend: 750,\n nextPayoutDate: '2024-07-01',\n riskLevel: 'high',\n category: 'Food & Beverage',\n location: 'Koramangala, Bangalore',\n performanceMetrics: { monthlyOrders: 780, averageRating: 4.5, growthRate: 5 },\n },\n];\n\nconst mockTransactions: Transaction[] = [\n {\n id: 'txn-001',\n type: 'investment',\n cartName: 'Quick Cuts Salon',\n amount: 50000,\n date: '2023-06-15',\n status: 'completed',\n },\n {\n id: 'txn-002',\n type: 'dividend',\n cartName: 'Quick Cuts Salon',\n amount: 2775,\n date: '2024-06-01',\n status: 'completed',\n },\n {\n id: 'txn-003',\n type: 'dividend',\n cartName: 'Fix-It Mobile Repair',\n amount: 1200,\n date: '2024-06-01',\n status: 'completed',\n },\n {\n id: 'txn-004',\n type: 'investment',\n cartName: 'Spotless Cleaning Services',\n amount: 40000,\n date: '2023-04-10',\n status: 'completed',\n },\n {\n id: 'txn-005',\n type: 'dividend',\n cartName: 'Spotless Cleaning Services',\n amount: 1900,\n date: '2024-06-01',\n status: 'pending',\n },\n];\n\nconst categories = [\n '',\n 'Personal Care & Beauty',\n 'Repair & Maintenance',\n 'Home Services',\n 'Food & Beverage',\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getRiskBadge(risk: Investment['riskLevel']) {\n const map = {\n low: { color: 'bg-status-success-bg-subtle/20 text-status-success-text', label: 'Low Risk' },\n medium: {\n color: 'bg-status-warning-bg-subtle/20 text-status-warning-text',\n label: 'Medium Risk',\n },\n high: { color: 'bg-status-error-bg-subtle/20 text-status-error-text', label: 'High Risk' },\n };\n const { color, label } = map[risk];\n return <span className={cn('rounded-full px-2 py-0.5 text-xs font-medium', color)}>{label}</span>;\n}\n\nfunction fmtPct(value: number) {\n return`${value > 0 ? '+' : ''}${value.toFixed(1)}%`;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function InvestorPortfolioPage() {\n const { navigateTo } = useAdapterCloud();\n const [activeTab, setActiveTab] = useState<'overview' | 'investments' | 'transactions'>(\n 'overview'\n );\n const [filterCategory, setFilterCategory] = useState('');\n\n const filteredInvestments = useMemo(() => {\n if (!filterCategory) return mockInvestments;\n return mockInvestments.filter((inv) => inv.category === filterCategory);\n }, [filterCategory]);\n\n const totalInvested = filteredInvestments.reduce((s, i) => s + i.amount, 0);\n const currentValue = filteredInvestments.reduce((s, i) => s + i.currentValue, 0);\n const totalReturns = currentValue - totalInvested;\n const returnsPercentage = totalInvested > 0 ? (totalReturns / totalInvested) * 100 : 0;\n const monthlyDividend = filteredInvestments.reduce((s, i) => s + i.monthlyDividend, 0);\n const activeCount = filteredInvestments.filter((i) => i.status === 'active').length;\n\n const riskScores: Record<string, number> = { low: 1, medium: 2, high: 3 };\n const avgRiskScore =\n filteredInvestments.length > 0\n ? filteredInvestments.reduce((s, i) => s + riskScores[i.riskLevel], 0) /\n filteredInvestments.length\n : 0;\n\n const bestPerformer = filteredInvestments.reduce(\n (best, inv) => (inv.returnsPercentage > best.returnsPercentage ? inv : best),\n filteredInvestments[0] || { cartName: '', returnsPercentage: 0 }\n );\n\n const handleWithdraw = useCallback((investmentId: string) => {\n alert(`Withdrawal request submitted for ${investmentId}`);\n }, []);\n\n // Asset allocation\n const allocationMap = filteredInvestments.reduce<Record<string, number>>((acc, inv) => {\n acc[inv.category] = (acc[inv.category] || 0) + inv.currentValue;\n return acc;\n }, {});\n\n return (\n <PageLayout title=\"My Portfolio\" description=\"Track your investment performance and holdings\">\n {/* Summary Cards */}\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(totalInvested, { minimumFractionDigits: 0 })}\n label=\"Total Invested\"\n trend=\"up\"\n trendValue={`${activeCount} active`}\n />\n <MetricsCard\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={formatCurrency(currentValue, { minimumFractionDigits: 0 })}\n label=\"Current Value\"\n trend={returnsPercentage > 0 ? 'up' : 'down'}\n trendValue={fmtPct(returnsPercentage)}\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={formatCurrency(Math.abs(totalReturns), { minimumFractionDigits: 0 })}\n label=\"Total Returns\"\n trend={totalReturns >= 0 ? 'up' : 'down'}\n trendValue={fmtPct(returnsPercentage)}\n />\n <MetricsCard\n icon={<Briefcase className=\"h-5 w-5\" />}\n value={formatCurrency(monthlyDividend, { minimumFractionDigits: 0 })}\n label=\"Monthly Dividend\"\n trend=\"up\"\n trendValue=\"Next: July 1\"\n />\n </div>\n\n {/* Additional Stats */}\n <div className=\"mt-4 grid grid-cols-2 gap-3 lg:grid-cols-4\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-3\">\n <p className=\"text-xs text-text-secondary\">Active Investments</p>\n <p className=\"text-xl font-bold text-text-primary\">{activeCount}</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-3\">\n <p className=\"text-xs text-text-secondary\">Avg Risk Score</p>\n <div className=\"mt-1 flex items-center gap-2\">\n <div className=\"h-2 flex-1 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={cn(\n 'h-full rounded-full',\n avgRiskScore <= 1.5\n ? 'bg-status-success-bg-subtle'\n : avgRiskScore <= 2.5\n ? 'bg-status-warning-bg-subtle'\n : 'bg-status-error-bg-subtle'\n )}\n style={{ width: `${(avgRiskScore / 3) * 100}%` }}\n />\n </div>\n <span className=\"text-sm font-medium text-text-primary\">{avgRiskScore.toFixed(1)}/3</span>\n </div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-3\">\n <p className=\"text-xs text-text-secondary\">Best Performer</p>\n <p className=\"truncate text-sm font-bold text-text-primary\">{bestPerformer.cartName}</p>\n <p className=\"text-xs text-status-success-text\">\n {fmtPct(bestPerformer.returnsPercentage)}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-3\">\n <p className=\"text-xs text-text-secondary\">Next Payout</p>\n <p className=\"text-lg font-bold text-text-primary\">July 1</p>\n <p className=\"text-xs text-text-secondary\">In 7 days</p>\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"mt-6 rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"flex border-b border-border-subtle overflow-x-auto\">\n {(\n [\n { key: 'overview', label: 'Overview', Icon: BarChart3 },\n {\n key: 'investments',\n label: `Investments (${filteredInvestments.length})`,\n Icon: Briefcase,\n },\n { key: 'transactions', label: 'Transactions', Icon: CreditCard },\n ] as const\n ).map(({ key, label, Icon }) => (\n <button\n key={key}\n type=\"button\"\n onClick={() => setActiveTab(key)}\n className={cn(\n 'flex items-center gap-2 whitespace-nowrap px-4 py-3 text-sm font-medium transition-colors',\n activeTab === key\n ? 'border-b-2 border-primary text-text-primary'\n : 'text-text-secondary hover:text-text-primary'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n {label}\n </button>\n ))}\n </div>\n\n <div className=\"p-4\">\n {/* Overview Tab */}\n {activeTab === 'overview' && (\n <div className=\"space-y-6\">\n {/* Performance placeholder */}\n <div>\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">\n Portfolio Performance\n </h3>\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/50 p-8 text-center\">\n <BarChart3 className=\"mx-auto mb-2 h-8 w-8 text-text-secondary/50\" />\n <p className=\"text-sm text-text-secondary\">Performance chart visualization</p>\n <p className=\"mt-1 text-xs text-text-secondary\">\n Shows portfolio value over time\n </p>\n </div>\n </div>\n\n {/* Asset Allocation */}\n <div>\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Asset Allocation</h3>\n <div className=\"space-y-3\">\n {Object.entries(allocationMap).map(([category, value]) => (\n <div key={category} className=\"flex items-center\">\n <span className=\"w-40 truncate text-sm text-text-primary\">{category}</span>\n <div className=\"mx-3 h-6 flex-1 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className=\"flex h-6 items-center justify-end rounded-full bg-action-primary-bg pr-2\"\n style={{\n width: `${currentValue > 0 ? (value / currentValue) * 100 : 0}%`,\n }}\n >\n <span className=\"text-xs font-medium text-action-primary-text\">\n {currentValue > 0 ? ((value / currentValue) * 100).toFixed(1) : 0}%\n </span>\n </div>\n </div>\n <span className=\"ml-2 text-sm font-medium text-text-primary\">\n {formatCurrency(value, { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Investments Tab */}\n {activeTab === 'investments' && (\n <div>\n {/* Category filter */}\n <div className=\"mb-4\">\n <select\n value={filterCategory}\n onChange={(e) => setFilterCategory(e.target.value)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">All Categories</option>\n {categories.filter(Boolean).map((cat) => (\n <option key={cat} value={cat}>\n {cat}\n </option>\n ))}\n </select>\n </div>\n\n {/* Investment list */}\n <div className=\"space-y-4\">\n {filteredInvestments.map((inv) => (\n <div\n key={inv.id}\n className=\"rounded-lg border border-border-subtle p-4 hover:bg-accent/50 transition-colors\"\n >\n <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"flex-1\">\n <h4 className=\"text-base font-semibold text-text-primary\">{inv.cartName}</h4>\n <p className=\"text-sm text-text-secondary\">\n Owned by {inv.cartOwner} &bull; {inv.location}\n </p>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <span className=\"text-sm text-text-secondary\">{inv.category}</span>\n {getRiskBadge(inv.riskLevel)}\n </div>\n </div>\n <div className=\"text-left sm:text-right\">\n <p className=\"text-xl font-bold text-text-primary\">\n {formatCurrency(inv.currentValue, { minimumFractionDigits: 0 })}\n </p>\n <p\n className={cn(\n 'text-sm',\n inv.returns > 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {formatCurrency(Math.abs(inv.returns), { minimumFractionDigits: 0 })} (\n {fmtPct(inv.returnsPercentage)})\n </p>\n </div>\n </div>\n\n <div className=\"mb-4 grid grid-cols-2 gap-3 lg:grid-cols-4\">\n <div>\n <p className=\"text-xs text-text-secondary\">Invested</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(inv.amount, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Ownership</p>\n <p className=\"text-sm font-medium text-text-primary\">{inv.ownership}%</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Monthly Dividend</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(inv.monthlyDividend, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Investment Date</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {formatDate(inv.investmentDate, { hour: undefined, minute: undefined })}\n </p>\n </div>\n </div>\n\n {/* Performance metrics */}\n <div className=\"border-t border-border-subtle pt-4\">\n <p className=\"mb-2 text-sm font-medium text-text-secondary\">\n Performance Metrics\n </p>\n <div className=\"grid grid-cols-3 gap-3 text-center\">\n <div>\n <p className=\"text-lg font-bold text-text-primary\">\n {inv.performanceMetrics.monthlyOrders}\n </p>\n <p className=\"text-xs text-text-secondary\">Monthly Orders</p>\n </div>\n <div>\n <div className=\"flex items-center justify-center gap-1\">\n <Star className=\"h-4 w-4 fill-status-warning-text text-status-warning-text\" />\n <p className=\"text-lg font-bold text-text-primary\">\n {inv.performanceMetrics.averageRating}\n </p>\n </div>\n <p className=\"text-xs text-text-secondary\">Rating</p>\n </div>\n <div>\n <p className=\"text-lg font-bold text-status-success-text\">\n +{inv.performanceMetrics.growthRate}%\n </p>\n <p className=\"text-xs text-text-secondary\">Growth Rate</p>\n </div>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"mt-4 flex flex-wrap gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo(`/investor/investments/${inv.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 {inv.status === 'active' && (\n <button\n type=\"button\"\n onClick={() => handleWithdraw(inv.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 <ArrowDownCircle className=\"h-4 w-4\" />\n Withdraw\n </button>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Transactions Tab */}\n {activeTab === 'transactions' && (\n <div className=\"space-y-3\">\n {mockTransactions.map((txn) => (\n <div\n key={txn.id}\n className=\"flex flex-col gap-3 rounded-lg border border-border-subtle p-4 hover:bg-accent/50 transition-colors sm:flex-row sm:items-center sm:justify-between\"\n >\n <div className=\"flex items-center gap-3\">\n <div\n className={cn(\n 'flex h-10 w-10 shrink-0 items-center justify-center rounded-full',\n txn.type === 'investment'\n ? 'bg-accent-blue-subtle/10'\n : txn.type === 'dividend'\n ? 'bg-status-success-bg-subtle/10'\n : 'bg-status-error-bg-subtle/10'\n )}\n >\n {txn.type === 'investment' ? (\n <Wallet className=\"h-5 w-5 text-accent-blue\" />\n ) : txn.type === 'dividend' ? (\n <TrendingUp className=\"h-5 w-5 text-status-success-text\" />\n ) : (\n <TrendingDown className=\"h-5 w-5 text-status-error-text\" />\n )}\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n {txn.type === 'investment'\n ? 'Investment in'\n : txn.type === 'dividend'\n ? 'Dividend from'\n : 'Withdrawal from'}{' '}\n {txn.cartName}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {formatDate(txn.date, { hour: undefined, minute: undefined })}\n </p>\n </div>\n </div>\n <div className=\"flex items-center justify-between sm:gap-4\">\n <p\n className={cn(\n 'text-sm font-bold',\n txn.type === 'dividend'\n ? 'text-status-success-text'\n : 'text-text-primary'\n )}\n >\n {txn.type === 'dividend' ? '+' : '-'}\n {formatCurrency(txn.amount, { minimumFractionDigits: 0 })}\n </p>\n <span\n className={cn(\n 'rounded-full px-2.5 py-0.5 text-xs font-medium',\n txn.status === 'completed'\n ? 'bg-status-success-bg-subtle/20 text-status-success-text'\n : txn.status === 'pending'\n ? 'bg-status-warning-bg-subtle/20 text-status-warning-text'\n : 'bg-status-error-bg-subtle/20 text-status-error-text'\n )}\n >\n {txn.status}\n </span>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -212,7 +212,7 @@ function A() {
212
212
  actions: /* @__PURE__ */ E("div", {
213
213
  className: "flex items-center gap-2",
214
214
  children: [L && /* @__PURE__ */ T("span", {
215
- className: "text-sm font-medium text-green-600 dark:text-green-400",
215
+ className: "text-sm font-medium text-status-success-text",
216
216
  children: L
217
217
  }), N ? /* @__PURE__ */ E(w, { children: [/* @__PURE__ */ E("button", {
218
218
  type: "button",
@@ -240,7 +240,7 @@ function A() {
240
240
  className: "lg:col-span-1",
241
241
  children: [
242
242
  /* @__PURE__ */ E("div", {
243
- className: "rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6",
243
+ className: "rounded-lg border border-border-seam bg-bg-surface p-4 sm:p-6 bg-gloss-card shadow-pop",
244
244
  children: [/* @__PURE__ */ E("div", {
245
245
  className: "text-center",
246
246
  children: [
@@ -312,7 +312,7 @@ function A() {
312
312
  className: "text-xs text-text-secondary sm:text-sm",
313
313
  children: "Total Returns"
314
314
  }), /* @__PURE__ */ E("span", {
315
- className: "text-xs font-semibold text-green-600 dark:text-green-400 sm:text-sm",
315
+ className: "text-xs font-semibold text-status-success-text sm:text-sm",
316
316
  children: ["+", r(B.totalReturns ?? 0, { minimumFractionDigits: 0 })]
317
317
  })]
318
318
  }),
@@ -351,7 +351,7 @@ function A() {
351
351
  }), /* @__PURE__ */ T("div", {
352
352
  className: "lg:col-span-3",
353
353
  children: /* @__PURE__ */ E("div", {
354
- className: "rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6 lg:p-8",
354
+ className: "rounded-lg border border-border-seam bg-bg-surface p-4 sm:p-6 lg:p-8 bg-gloss-card shadow-pop",
355
355
  children: [
356
356
  j === "personal" && /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("h2", {
357
357
  className: "mb-6 text-lg font-semibold text-text-primary sm:text-xl",
@@ -634,7 +634,7 @@ function A() {
634
634
  className: "text-sm font-medium text-text-primary",
635
635
  children: "Risk Tolerance"
636
636
  }), /* @__PURE__ */ T("span", {
637
- className: t("text-sm font-semibold", B.riskProfile === "Conservative" ? "text-green-600 dark:text-green-400" : B.riskProfile === "Moderate" ? "text-yellow-600 dark:text-yellow-400" : "text-red-600 dark:text-red-400"),
637
+ className: t("text-sm font-semibold", B.riskProfile === "Conservative" ? "text-status-success-text" : B.riskProfile === "Moderate" ? "text-status-warning-text" : "text-status-error-text"),
638
638
  children: B.riskProfile
639
639
  })]
640
640
  }), /* @__PURE__ */ T("div", {
@@ -643,7 +643,7 @@ function A() {
643
643
  "Conservative",
644
644
  "Moderate",
645
645
  "Aggressive"
646
- ].map((e) => /* @__PURE__ */ T("div", { className: t("h-2.5 flex-1 rounded-full", e === "Conservative" && "bg-green-500/30", e === "Moderate" && "bg-yellow-500/30", e === "Aggressive" && "bg-red-500/30", e === B.riskProfile && e === "Conservative" && "bg-green-500", e === B.riskProfile && e === "Moderate" && "bg-yellow-500", e === B.riskProfile && e === "Aggressive" && "bg-red-500") }, e))
646
+ ].map((e) => /* @__PURE__ */ T("div", { className: t("h-2.5 flex-1 rounded-full", e === "Conservative" && "bg-status-success-bg-subtle/30", e === "Moderate" && "bg-status-warning-bg-subtle/30", e === "Aggressive" && "bg-status-error-bg-subtle/30", e === B.riskProfile && e === "Conservative" && "bg-status-success-bg-subtle", e === B.riskProfile && e === "Moderate" && "bg-status-warning-bg-subtle", e === B.riskProfile && e === "Aggressive" && "bg-status-error-bg-subtle") }, e))
647
647
  })]
648
648
  })
649
649
  ]
@@ -676,7 +676,7 @@ function A() {
676
676
  /* @__PURE__ */ E("div", {
677
677
  className: "rounded-lg bg-bg-sunken/50 p-4",
678
678
  children: [
679
- /* @__PURE__ */ T(l, { className: "mb-2 h-7 w-7 text-blue-600 sm:h-8 sm:w-8" }),
679
+ /* @__PURE__ */ T(l, { className: "mb-2 h-7 w-7 text-accent-blue sm:h-8 sm:w-8" }),
680
680
  /* @__PURE__ */ T("div", {
681
681
  className: "text-lg font-bold text-text-primary sm:text-2xl",
682
682
  children: B.activeInvestments
@@ -690,7 +690,7 @@ function A() {
690
690
  /* @__PURE__ */ E("div", {
691
691
  className: "rounded-lg bg-bg-sunken/50 p-4",
692
692
  children: [
693
- /* @__PURE__ */ T(x, { className: "mb-2 h-7 w-7 text-green-600 sm:h-8 sm:w-8" }),
693
+ /* @__PURE__ */ T(x, { className: "mb-2 h-7 w-7 text-status-success-text sm:h-8 sm:w-8" }),
694
694
  /* @__PURE__ */ T("div", {
695
695
  className: "text-lg font-bold text-text-primary sm:text-2xl",
696
696
  children: r(B.totalReturns ?? 0, {
@@ -707,7 +707,7 @@ function A() {
707
707
  /* @__PURE__ */ E("div", {
708
708
  className: "rounded-lg bg-bg-sunken/50 p-4",
709
709
  children: [
710
- /* @__PURE__ */ T(b, { className: "mb-2 h-7 w-7 text-purple-600 sm:h-8 sm:w-8" }),
710
+ /* @__PURE__ */ T(b, { className: "mb-2 h-7 w-7 text-accent-purple sm:h-8 sm:w-8" }),
711
711
  /* @__PURE__ */ T("div", {
712
712
  className: "text-lg font-bold text-text-primary sm:text-2xl",
713
713
  children: r(B.portfolioValue ?? 0, {
@@ -736,7 +736,7 @@ function A() {
736
736
  className: "text-sm font-medium text-text-primary sm:text-base",
737
737
  children: e.cartName
738
738
  }), /* @__PURE__ */ E("span", {
739
- className: t("text-sm font-semibold", e.returns > 0 ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400"),
739
+ className: t("text-sm font-semibold", e.returns > 0 ? "text-status-success-text" : "text-status-error-text"),
740
740
  children: [
741
741
  e.returns > 0 ? "+" : "",
742
742
  e.returns,
@@ -764,7 +764,7 @@ function A() {
764
764
  className: "text-text-secondary",
765
765
  children: "Returns: "
766
766
  }), /* @__PURE__ */ T("span", {
767
- className: "font-medium text-green-600 dark:text-green-400",
767
+ className: "font-medium text-status-success-text",
768
768
  children: r(e.currentValue - e.investedAmount, { minimumFractionDigits: 0 })
769
769
  })] })
770
770
  ]
@@ -779,16 +779,16 @@ function A() {
779
779
  className: "space-y-6",
780
780
  children: [
781
781
  /* @__PURE__ */ E("div", {
782
- className: "flex items-center gap-2 rounded-lg bg-green-500/10 px-4 py-3",
783
- children: [/* @__PURE__ */ T(d, { className: "h-5 w-5 text-green-600 dark:text-green-400" }), /* @__PURE__ */ T("p", {
784
- className: "text-sm font-medium text-green-600 dark:text-green-400",
782
+ className: "flex items-center gap-2 rounded-lg bg-status-success-bg-subtle/10 px-4 py-3",
783
+ children: [/* @__PURE__ */ T(d, { className: "h-5 w-5 text-status-success-text" }), /* @__PURE__ */ T("p", {
784
+ className: "text-sm font-medium text-status-success-text",
785
785
  children: "Your KYC is complete and verified"
786
786
  })]
787
787
  }),
788
788
  /* @__PURE__ */ T("div", {
789
789
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 sm:gap-6",
790
790
  children: O.map((e) => /* @__PURE__ */ E("div", {
791
- className: "rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6",
791
+ className: "rounded-lg border border-border-seam bg-bg-surface p-4 sm:p-6 bg-gloss-card shadow-pop",
792
792
  children: [
793
793
  /* @__PURE__ */ T(m, { className: "mb-3 h-8 w-8 text-primary" }),
794
794
  /* @__PURE__ */ T("h3", {
@@ -803,11 +803,11 @@ function A() {
803
803
  className: "mt-3 flex items-center gap-2",
804
804
  children: [
805
805
  e.status === "verified" && /* @__PURE__ */ E("span", {
806
- className: "flex items-center gap-1 rounded-full bg-green-500/20 px-2 py-0.5 text-xs font-medium text-green-600 dark:text-green-400",
806
+ className: "flex items-center gap-1 rounded-full bg-status-success-bg-subtle/20 px-2 py-0.5 text-xs font-medium text-status-success-text",
807
807
  children: [/* @__PURE__ */ T(d, { className: "h-3 w-3" }), "Verified"]
808
808
  }),
809
809
  e.status === "uploaded" && /* @__PURE__ */ E("span", {
810
- className: "flex items-center gap-1 rounded-full bg-blue-500/20 px-2 py-0.5 text-xs font-medium text-blue-600 dark:text-blue-400",
810
+ className: "flex items-center gap-1 rounded-full bg-accent-blue-subtle/20 px-2 py-0.5 text-xs font-medium text-accent-blue",
811
811
  children: [/* @__PURE__ */ T(m, { className: "h-3 w-3" }), "Uploaded"]
812
812
  }),
813
813
  /* @__PURE__ */ T("button", {
@@ -955,7 +955,7 @@ function A() {
955
955
  children: [/* @__PURE__ */ T("div", {
956
956
  className: "flex items-center gap-2",
957
957
  children: /* @__PURE__ */ T("span", {
958
- className: t("inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium", Q ? "bg-green-500/20 text-green-600 dark:text-green-400" : "bg-bg-sunken text-text-secondary"),
958
+ className: t("inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium", Q ? "bg-status-success-bg-subtle/20 text-status-success-text" : "bg-bg-sunken text-text-secondary"),
959
959
  children: Q ? "Enabled" : "Disabled"
960
960
  })
961
961
  }), /* @__PURE__ */ T("button", {
@@ -985,7 +985,7 @@ function A() {
985
985
  className: "text-sm font-medium text-text-primary",
986
986
  children: e.device
987
987
  }), e.current && /* @__PURE__ */ T("span", {
988
- className: "rounded-full bg-green-500/20 px-2 py-0.5 text-xs font-medium text-green-600 dark:text-green-400",
988
+ className: "rounded-full bg-status-success-bg-subtle/20 px-2 py-0.5 text-xs font-medium text-status-success-text",
989
989
  children: "Current"
990
990
  })]
991
991
  }), /* @__PURE__ */ E("div", {