@burdenoff/microfe-kadaikodi 2026.704.4 → 2026.704.5

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 (126) hide show
  1. package/dist/kadaikodi/KadaikodiRoutes.js +30 -26
  2. package/dist/kadaikodi/KadaikodiRoutes.js.map +1 -1
  3. package/dist/kadaikodi/components/viz/AllocationBar.js +68 -0
  4. package/dist/kadaikodi/components/viz/AllocationBar.js.map +1 -0
  5. package/dist/kadaikodi/components/viz/AreaChart.js +102 -0
  6. package/dist/kadaikodi/components/viz/AreaChart.js.map +1 -0
  7. package/dist/kadaikodi/components/viz/AvatarStack.js +36 -0
  8. package/dist/kadaikodi/components/viz/AvatarStack.js.map +1 -0
  9. package/dist/kadaikodi/components/viz/BarChart.js +83 -0
  10. package/dist/kadaikodi/components/viz/BarChart.js.map +1 -0
  11. package/dist/kadaikodi/components/viz/CertificateCard.js +4 -0
  12. package/dist/kadaikodi/components/viz/DonutChart.js +109 -0
  13. package/dist/kadaikodi/components/viz/DonutChart.js.map +1 -0
  14. package/dist/kadaikodi/components/viz/HBarFunnel.js +54 -0
  15. package/dist/kadaikodi/components/viz/HBarFunnel.js.map +1 -0
  16. package/dist/kadaikodi/components/viz/Heatmap.js +3 -0
  17. package/dist/kadaikodi/components/viz/KanbanBoard.js +50 -0
  18. package/dist/kadaikodi/components/viz/KanbanBoard.js.map +1 -0
  19. package/dist/kadaikodi/components/viz/LineChart.js +4 -0
  20. package/dist/kadaikodi/components/viz/OrgTree.js +2 -0
  21. package/dist/kadaikodi/components/viz/PathSteps.js +3 -0
  22. package/dist/kadaikodi/components/viz/ProgressRing.js +68 -0
  23. package/dist/kadaikodi/components/viz/ProgressRing.js.map +1 -0
  24. package/dist/kadaikodi/components/viz/RatingStars.js +51 -0
  25. package/dist/kadaikodi/components/viz/RatingStars.js.map +1 -0
  26. package/dist/kadaikodi/components/viz/SegmentedTabs.js +69 -0
  27. package/dist/kadaikodi/components/viz/SegmentedTabs.js.map +1 -0
  28. package/dist/kadaikodi/components/viz/SkillBar.js +3 -0
  29. package/dist/kadaikodi/components/viz/Sparkline.js +74 -0
  30. package/dist/kadaikodi/components/viz/Sparkline.js.map +1 -0
  31. package/dist/kadaikodi/components/viz/StatCard.js +60 -0
  32. package/dist/kadaikodi/components/viz/StatCard.js.map +1 -0
  33. package/dist/kadaikodi/components/viz/StepProgress.js +64 -0
  34. package/dist/kadaikodi/components/viz/StepProgress.js.map +1 -0
  35. package/dist/kadaikodi/components/viz/Timeline.js +66 -0
  36. package/dist/kadaikodi/components/viz/Timeline.js.map +1 -0
  37. package/dist/kadaikodi/components/viz/index.js +23 -0
  38. package/dist/kadaikodi/components/viz/lib/Avatar.js +30 -0
  39. package/dist/kadaikodi/components/viz/lib/Avatar.js.map +1 -0
  40. package/dist/kadaikodi/components/viz/lib/CartesianFrame.js +119 -0
  41. package/dist/kadaikodi/components/viz/lib/CartesianFrame.js.map +1 -0
  42. package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.js +35 -0
  43. package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.js.map +1 -0
  44. package/dist/kadaikodi/components/viz/lib/format.js +21 -0
  45. package/dist/kadaikodi/components/viz/lib/format.js.map +1 -0
  46. package/dist/kadaikodi/components/viz/lib/geometry.js +61 -0
  47. package/dist/kadaikodi/components/viz/lib/geometry.js.map +1 -0
  48. package/dist/kadaikodi/components/viz/lib/hooks.js +39 -0
  49. package/dist/kadaikodi/components/viz/lib/hooks.js.map +1 -0
  50. package/dist/kadaikodi/components/viz/lib/palette.js +27 -0
  51. package/dist/kadaikodi/components/viz/lib/palette.js.map +1 -0
  52. package/dist/kadaikodi/hooks/useKadaikodiApi.js +18 -10
  53. package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
  54. package/dist/kadaikodi/pages/HomePage.js +373 -631
  55. package/dist/kadaikodi/pages/HomePage.js.map +1 -1
  56. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +304 -169
  57. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
  58. package/dist/kadaikodi/pages/admin/AdminDashboard.js +255 -271
  59. package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
  60. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +185 -125
  61. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
  62. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +141 -102
  63. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
  64. package/dist/kadaikodi/pages/admin/CartManagementPage.js +558 -718
  65. package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
  66. package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
  67. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +142 -55
  68. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  69. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +129 -164
  70. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  71. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +379 -361
  72. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  73. package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js +266 -166
  74. package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js.map +1 -1
  75. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js +373 -0
  76. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js.map +1 -0
  77. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +288 -161
  78. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
  79. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +180 -181
  80. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
  81. package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
  82. package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
  83. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js +17 -34
  84. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js.map +1 -1
  85. package/dist/kadaikodi/pages/customer/CartDetailPage.js +405 -248
  86. package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
  87. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +258 -232
  88. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
  89. package/dist/kadaikodi/pages/customer/CheckoutPage.js +254 -205
  90. package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
  91. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js +270 -230
  92. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
  93. package/dist/kadaikodi/pages/customer/FavoritesPage.js +149 -412
  94. package/dist/kadaikodi/pages/customer/FavoritesPage.js.map +1 -1
  95. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js +173 -134
  96. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
  97. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +176 -175
  98. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
  99. package/dist/kadaikodi/pages/customer/ReviewsPage.js +295 -438
  100. package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
  101. package/dist/kadaikodi/pages/customer/shared.js +181 -0
  102. package/dist/kadaikodi/pages/customer/shared.js.map +1 -0
  103. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js +438 -311
  104. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
  105. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js +320 -293
  106. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  107. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js +159 -91
  108. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  109. package/dist/kadaikodi/pages/investor/InvestorDashboard.js +137 -107
  110. package/dist/kadaikodi/pages/investor/InvestorDashboard.js.map +1 -1
  111. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js +157 -135
  112. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  113. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js +280 -206
  114. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js.map +1 -1
  115. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
  116. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +424 -448
  117. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
  118. package/dist/kadaikodi/pages/worker/WorkerDashboard.js +328 -445
  119. package/dist/kadaikodi/pages/worker/WorkerDashboard.js.map +1 -1
  120. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js +141 -164
  121. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
  122. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +300 -296
  123. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
  124. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +284 -309
  125. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
  126. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"InvestmentDetailsPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/investor/InvestmentDetailsPage.tsx"],"sourcesContent":["/**\n * Investment Details Page\n * @module kadaikodi/pages/investor\n *\n * Serves both /investor/opportunity/:id and /investor/investments/:id. Resolves\n * the opportunity (and the investor's holding, if any) from the live backend by\n * route id — no fabricated business figures, documents or updates.\n */\n\nimport { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n TrendingUp,\n Shield,\n Users,\n IndianRupee,\n BarChart3,\n PieChart,\n Building2,\n Target,\n Clock,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useInvestmentOpportunities, useInvestments } from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatDate } from '../../utils/formatters';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getRiskConfig(risk: string): { label: string; color: string } {\n switch (risk) {\n case 'low':\n return { label: 'Low Risk', color: 'text-status-success-text' };\n case 'medium':\n return { label: 'Medium Risk', color: 'text-status-warning-text' };\n case 'high':\n return { label: 'High Risk', color: 'text-status-error-text' };\n default:\n return { label: risk, color: 'text-text-secondary' };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function InvestmentDetailsPage() {\n const { navigateTo, currentUser } = useKadaikodi();\n const { id } = useParams<{ id: string }>();\n\n const { data: opportunities = [], isLoading: opportunitiesLoading } =\n useInvestmentOpportunities();\n const { data: investments = [], isLoading: investmentsLoading } = useInvestments(\n currentUser?.id || ''\n );\n\n const isLoading = opportunitiesLoading || investmentsLoading;\n\n // The route id may be an investment id or an opportunity id. Resolve the\n // holding first (if it belongs to this investor), then the opportunity.\n const investment = useMemo(() => investments.find((inv) => inv.id === id), [investments, id]);\n const opportunity = useMemo(\n () =>\n opportunities.find((opp) => opp.id === id || opp.id === investment?.opportunityId) ?? null,\n [opportunities, id, investment]\n );\n\n if (isLoading) {\n return (\n <PageLayout title=\"Investment Details\" description=\"Loading...\">\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 investment details...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n if (!opportunity && !investment) {\n return (\n <PageLayout title=\"Investment Not Found\">\n <EmptyState\n illustration=\"empty-generic\"\n title=\"Investment not found\"\n description=\"We couldn't find this investment. It may have been closed or the link is out of date.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/portfolio')}\n className=\"rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Back to Portfolio\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n const cartName = opportunity?.cartName ?? investment?.cartName ?? 'Investment';\n const risk = opportunity ? getRiskConfig(opportunity.riskLevel) : null;\n const fundingPct =\n opportunity && opportunity.targetAmount > 0\n ? Math.min((opportunity.raisedAmount / opportunity.targetAmount) * 100, 100)\n : 0;\n const daysLeft = opportunity?.expiresAt\n ? Math.max(0, Math.ceil((new Date(opportunity.expiresAt).getTime() - Date.now()) / 86400000))\n : null;\n\n const holdingReturns = investment ? investment.currentValue - investment.investedAmount : 0;\n const holdingReturnsPct =\n investment && investment.investedAmount > 0\n ? (holdingReturns / investment.investedAmount) * 100\n : 0;\n\n return (\n <PageLayout\n title={cartName}\n description=\"Investment Details & Performance\"\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/portfolio')}\n className=\"flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Back to Portfolio</span>\n <span className=\"sm:hidden\">Back</span>\n </button>\n }\n >\n <PagePurpose className=\"mb-6\">\n A deep dive into this investment. Review the funding progress, expected returns and terms on\n offer, and — if you already hold a stake — exactly what you&apos;ve put in and what\n it&apos;s worth today.\n </PagePurpose>\n\n {/* Summary Cards — the one emphasis zone for this page */}\n <EmphasisPanel>\n {investment ? (\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 text-center\">\n <IndianRupee className=\"mx-auto mb-2 h-6 w-6 text-primary sm:h-8 sm:w-8\" />\n <div className=\"text-lg font-bold text-text-primary sm:text-2xl\">\n {formatCurrency(investment.investedAmount, { minimumFractionDigits: 0 })}\n </div>\n <div className=\"text-xs text-text-secondary sm:text-sm\">Your Investment</div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 text-center\">\n <TrendingUp className=\"mx-auto mb-2 h-6 w-6 text-status-success-text sm:h-8 sm:w-8\" />\n <div\n className={cn(\n 'text-lg font-bold sm:text-2xl',\n holdingReturns >= 0 ? 'text-status-success-text' : 'text-status-error-text'\n )}\n >\n {holdingReturnsPct >= 0 ? '+' : ''}\n {holdingReturnsPct.toFixed(1)}%\n </div>\n <div className=\"text-xs text-text-secondary sm:text-sm\">Returns</div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 text-center\">\n <Building2 className=\"mx-auto mb-2 h-6 w-6 text-text-primary sm:h-8 sm:w-8\" />\n <div className=\"text-lg font-bold text-text-primary sm:text-2xl\">\n {formatCurrency(investment.currentValue, { minimumFractionDigits: 0 })}\n </div>\n <div className=\"text-xs text-text-secondary sm:text-sm\">Current Value</div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 text-center\">\n <PieChart className=\"mx-auto mb-2 h-6 w-6 text-text-primary sm:h-8 sm:w-8\" />\n <div className=\"text-lg font-bold text-text-primary sm:text-2xl\">\n {investment.returnsPercentage}%\n </div>\n <div className=\"text-xs text-text-secondary sm:text-sm\">Expected Return</div>\n </div>\n </div>\n ) : (\n opportunity && (\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 text-center\">\n <Target className=\"mx-auto mb-2 h-6 w-6 text-primary sm:h-8 sm:w-8\" />\n <div className=\"text-lg font-bold text-text-primary sm:text-2xl\">\n {formatCurrency(opportunity.targetAmount, { minimumFractionDigits: 0 })}\n </div>\n <div className=\"text-xs text-text-secondary sm:text-sm\">Target Amount</div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 text-center\">\n <IndianRupee className=\"mx-auto mb-2 h-6 w-6 text-status-success-text sm:h-8 sm:w-8\" />\n <div className=\"text-lg font-bold text-text-primary sm:text-2xl\">\n {formatCurrency(opportunity.raisedAmount, { minimumFractionDigits: 0 })}\n </div>\n <div className=\"text-xs text-text-secondary sm:text-sm\">Raised So Far</div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 text-center\">\n <TrendingUp className=\"mx-auto mb-2 h-6 w-6 text-status-success-text sm:h-8 sm:w-8\" />\n <div className=\"text-lg font-bold text-status-success-text sm:text-2xl\">\n {opportunity.expectedReturns}%\n </div>\n <div className=\"text-xs text-text-secondary sm:text-sm\">Expected Returns</div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 text-center\">\n <IndianRupee className=\"mx-auto mb-2 h-6 w-6 text-text-primary sm:h-8 sm:w-8\" />\n <div className=\"text-lg font-bold text-text-primary sm:text-2xl\">\n {formatCurrency(opportunity.minimumInvestment, { minimumFractionDigits: 0 })}\n </div>\n <div className=\"text-xs text-text-secondary sm:text-sm\">Min Investment</div>\n </div>\n </div>\n )\n )}\n </EmphasisPanel>\n\n <div className=\"mt-6 grid gap-6 lg:grid-cols-3\">\n {/* Opportunity Details */}\n <div className=\"space-y-6 lg:col-span-2\">\n {opportunity && (\n <>\n {opportunity.description && (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">About This Cart</h2>\n <p className=\"text-sm leading-relaxed text-text-secondary\">\n {opportunity.description}\n </p>\n </div>\n )}\n\n {/* Funding Progress */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">Funding Progress</h2>\n <div className=\"mb-2 flex justify-between text-sm\">\n <span className=\"font-medium text-text-primary\">\n {formatCurrency(opportunity.raisedAmount, { minimumFractionDigits: 0 })} raised\n </span>\n <span className=\"text-text-secondary\">\n of {formatCurrency(opportunity.targetAmount, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"h-2 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className=\"h-full rounded-full bg-action-primary-bg transition-all duration-300\"\n style={{ width: `${fundingPct}%` }}\n />\n </div>\n <div className=\"mt-2 flex justify-between text-xs text-text-secondary\">\n <span>{fundingPct.toFixed(0)}% funded</span>\n {daysLeft !== null && <span>{daysLeft} days left</span>}\n </div>\n </div>\n </>\n )}\n\n {/* Your Holding */}\n {investment && (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">Your Holding</h2>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div>\n <p className=\"text-sm text-text-secondary\">Invested Amount</p>\n <p className=\"font-medium text-text-primary\">\n {formatCurrency(investment.investedAmount, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Current Value</p>\n <p className=\"font-medium text-text-primary\">\n {formatCurrency(investment.currentValue, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Returns Realised</p>\n <p className=\"font-medium text-text-primary\">\n {formatCurrency(investment.returns, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Invested On</p>\n <p className=\"font-medium 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>\n\n {/* Sidebar */}\n <div className=\"space-y-6\">\n {opportunity && (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">Investment Terms</h2>\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <TrendingUp className=\"h-4 w-4\" />\n Expected Returns\n </span>\n <span className=\"font-medium text-status-success-text\">\n {opportunity.expectedReturns}%\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Clock className=\"h-4 w-4\" />\n Lock-in Period\n </span>\n <span className=\"font-medium text-text-primary\">\n {opportunity.investmentPeriod} months\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <IndianRupee className=\"h-4 w-4\" />\n Minimum Investment\n </span>\n <span className=\"font-medium text-text-primary\">\n {formatCurrency(opportunity.minimumInvestment, { minimumFractionDigits: 0 })}\n </span>\n </div>\n {risk && (\n <div className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Shield className=\"h-4 w-4\" />\n Risk Level\n </span>\n <span className={cn('font-medium', risk.color)}>{risk.label}</span>\n </div>\n )}\n {opportunity.investors.length > 0 && (\n <div className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Users className=\"h-4 w-4\" />\n Investors\n </span>\n <span className=\"font-medium text-text-primary\">\n {opportunity.investors.length}\n </span>\n </div>\n )}\n </div>\n\n {opportunity.status === 'active' && !investment && (\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n className=\"mt-6 flex w-full items-center justify-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2.5 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n <BarChart3 className=\"h-4 w-4\" />\n Invest in this Cart\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAmCA,SAAS,EAAc,GAAgD;AACrE,SAAQ,GAAR;EACE,KAAK,MACH,QAAO;GAAE,OAAO;GAAY,OAAO;GAA4B;EACjE,KAAK,SACH,QAAO;GAAE,OAAO;GAAe,OAAO;GAA4B;EACpE,KAAK,OACH,QAAO;GAAE,OAAO;GAAa,OAAO;GAA0B;EAChE,QACE,QAAO;GAAE,OAAO;GAAM,OAAO;GAAuB;;;AAQ1D,SAAgB,IAAwB;CACtC,IAAM,EAAE,eAAY,mBAAgB,GAAc,EAC5C,EAAE,UAAO,GAA2B,EAEpC,EAAE,MAAM,IAAgB,EAAE,EAAE,WAAW,MAC3C,GAA4B,EACxB,EAAE,MAAM,IAAc,EAAE,EAAE,WAAW,MAAuB,EAChE,GAAa,MAAM,GACpB,EAEK,IAAY,KAAwB,GAIpC,IAAa,QAAc,EAAY,MAAM,MAAQ,EAAI,OAAO,EAAG,EAAE,CAAC,GAAa,EAAG,CAAC,EACvF,IAAc,QAEhB,EAAc,MAAM,MAAQ,EAAI,OAAO,KAAM,EAAI,OAAO,GAAY,cAAc,IAAI,MACxF;EAAC;EAAe;EAAI;EAAW,CAChC;AAED,KAAI,EACF,QACE,kBAAC,GAAD;EAAY,OAAM;EAAqB,aAAY;YACjD,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAK,WAAU,8EAA+E,CAAA,EAC9F,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAAiC,CAAA,CACxE;;GACF,CAAA;EACK,CAAA;AAIjB,KAAI,CAAC,KAAe,CAAC,EACnB,QACE,kBAAC,GAAD;EAAY,OAAM;YAChB,kBAAC,GAAD;GACE,cAAa;GACb,OAAM;GACN,aAAY;GACZ,QACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAW,sBAAsB;IAChD,WAAU;cACX;IAEQ,CAAA;GAEX,CAAA;EACS,CAAA;CAIjB,IAAM,IAAW,GAAa,YAAY,GAAY,YAAY,cAC5D,IAAO,IAAc,EAAc,EAAY,UAAU,GAAG,MAC5D,IACJ,KAAe,EAAY,eAAe,IACtC,KAAK,IAAK,EAAY,eAAe,EAAY,eAAgB,KAAK,IAAI,GAC1E,GACA,IAAW,GAAa,YAC1B,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,KAAK,EAAY,UAAU,CAAC,SAAS,GAAG,KAAK,KAAK,IAAI,MAAS,CAAC,GAC3F,MAEE,IAAiB,IAAa,EAAW,eAAe,EAAW,iBAAiB,GACpF,IACJ,KAAc,EAAW,iBAAiB,IACrC,IAAiB,EAAW,iBAAkB,MAC/C;AAEN,QACE,kBAAC,GAAD;EACE,OAAO;EACP,aAAY;EACZ,SACE,kBAAC,UAAD;GACE,MAAK;GACL,eAAe,EAAW,sBAAsB;GAChD,WAAU;aAHZ;IAKE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;IACjC,kBAAC,QAAD;KAAM,WAAU;eAAmB;KAAwB,CAAA;IAC3D,kBAAC,QAAD;KAAM,WAAU;eAAY;KAAW,CAAA;IAChC;;YAZb;GAeE,kBAAC,GAAD;IAAa,WAAU;cAAO;IAIhB,CAAA;GAGd,kBAAC,GAAD,EAAA,UACG,IACC,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD,EAAa,WAAU,mDAAoD,CAAA;OAC3E,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAe,EAAW,gBAAgB,EAAE,uBAAuB,GAAG,CAAC;QACpE,CAAA;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAyC;QAAqB,CAAA;OACzE;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD,EAAY,WAAU,+DAAgE,CAAA;OACtF,kBAAC,OAAD;QACE,WAAW,EACT,iCACA,KAAkB,IAAI,6BAA6B,yBACpD;kBAJH;SAMG,KAAqB,IAAI,MAAM;SAC/B,EAAkB,QAAQ,EAAE;SAAC;SAC1B;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAyC;QAAa,CAAA;OACjE;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD,EAAW,WAAU,wDAAyD,CAAA;OAC9E,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAe,EAAW,cAAc,EAAE,uBAAuB,GAAG,CAAC;QAClE,CAAA;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAyC;QAAmB,CAAA;OACvE;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD,EAAU,WAAU,wDAAyD,CAAA;OAC7E,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACG,EAAW,mBAAkB,IAC1B;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAyC;QAAqB,CAAA;OACzE;;KACF;QAEN,KACE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD,EAAQ,WAAU,mDAAoD,CAAA;OACtE,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAe,EAAY,cAAc,EAAE,uBAAuB,GAAG,CAAC;QACnE,CAAA;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAyC;QAAmB,CAAA;OACvE;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD,EAAa,WAAU,+DAAgE,CAAA;OACvF,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAe,EAAY,cAAc,EAAE,uBAAuB,GAAG,CAAC;QACnE,CAAA;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAyC;QAAmB,CAAA;OACvE;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD,EAAY,WAAU,+DAAgE,CAAA;OACtF,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACG,EAAY,iBAAgB,IACzB;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAyC;QAAsB,CAAA;OAC1E;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD,EAAa,WAAU,wDAAyD,CAAA;OAChF,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAe,EAAY,mBAAmB,EAAE,uBAAuB,GAAG,CAAC;QACxE,CAAA;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAyC;QAAoB,CAAA;OACxE;;KACF;OAGI,CAAA;GAEhB,kBAAC,OAAD;IAAK,WAAU;cAAf,CAEE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACG,KACC,kBAAA,GAAA,EAAA,UAAA,CACG,EAAY,eACX,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBAA+C;OAAoB,CAAA,EACjF,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAY;OACX,CAAA,CACA;SAIR,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,MAAD;QAAI,WAAU;kBAA+C;QAAqB,CAAA;OAClF,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBAAhB,CACG,EAAe,EAAY,cAAc,EAAE,uBAAuB,GAAG,CAAC,EAAC,UACnE;YACP,kBAAC,QAAD;SAAM,WAAU;mBAAhB,CAAsC,OAChC,EAAe,EAAY,cAAc,EAAE,uBAAuB,GAAG,CAAC,CACrE;WACH;;OACN,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,OAAD;SACE,WAAU;SACV,OAAO,EAAE,OAAO,GAAG,EAAW,IAAI;SAClC,CAAA;QACE,CAAA;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD,EAAA,UAAA,CAAO,EAAW,QAAQ,EAAE,EAAC,WAAe,EAAA,CAAA,EAC3C,MAAa,QAAQ,kBAAC,QAAD,EAAA,UAAA,CAAO,GAAS,aAAiB,EAAA,CAAA,CACnD;;OACF;QACL,EAAA,CAAA,EAIJ,KACC,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBAA+C;OAAiB,CAAA,EAC9E,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;mBAA8B;SAAmB,CAAA,EAC9D,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAe,EAAW,gBAAgB,EAAE,uBAAuB,GAAG,CAAC;SACtE,CAAA,CACA,EAAA,CAAA;QACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;mBAA8B;SAAiB,CAAA,EAC5D,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAe,EAAW,cAAc,EAAE,uBAAuB,GAAG,CAAC;SACpE,CAAA,CACA,EAAA,CAAA;QACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;mBAA8B;SAAoB,CAAA,EAC/D,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAe,EAAW,SAAS,EAAE,uBAAuB,GAAG,CAAC;SAC/D,CAAA,CACA,EAAA,CAAA;QACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;mBAA8B;SAAe,CAAA,EAC1D,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAW,EAAW,gBAAgB;UACrC,MAAM,KAAA;UACN,QAAQ,KAAA;UACT,CAAC;SACA,CAAA,CACA,EAAA,CAAA;QACF;SACF;QAEJ;QAGN,kBAAC,OAAD;KAAK,WAAU;eACZ,KACC,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,MAAD;QAAI,WAAU;kBAA+C;QAAqB,CAAA;OAClF,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAhB,CACE,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA,EAAA,mBAE7B;cACP,kBAAC,QAAD;WAAM,WAAU;qBAAhB,CACG,EAAY,iBAAgB,IACxB;aACH;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAhB,CACE,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA,EAAA,iBAExB;cACP,kBAAC,QAAD;WAAM,WAAU;qBAAhB,CACG,EAAY,kBAAiB,UACzB;aACH;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAhB,CACE,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA,EAAA,qBAE9B;cACP,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAe,EAAY,mBAAmB,EAAE,uBAAuB,GAAG,CAAC;WACvE,CAAA,CACH;;SACL,KACC,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAhB,CACE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAAA,aAEzB;cACP,kBAAC,QAAD;WAAM,WAAW,EAAG,eAAe,EAAK,MAAM;qBAAG,EAAK;WAAa,CAAA,CAC/D;;SAEP,EAAY,UAAU,SAAS,KAC9B,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAhB,CACE,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA,EAAA,YAExB;cACP,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAY,UAAU;WAClB,CAAA,CACH;;SAEJ;;OAEL,EAAY,WAAW,YAAY,CAAC,KACnC,kBAAC,UAAD;QACE,MAAK;QACL,eAAe,EAAW,0BAA0B;QACpD,WAAU;kBAHZ,CAKE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,sBAE1B;;OAEP;;KAEJ,CAAA,CACF;;GACK"}
1
+ {"version":3,"file":"InvestmentDetailsPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/investor/InvestmentDetailsPage.tsx"],"sourcesContent":["/**\n * Investment Details Page\n * @module kadaikodi/pages/investor\n *\n * Serves both /investor/opportunity/:id and /investor/investments/:id. Resolves\n * the opportunity (and the investor's holding, if any) from the live backend by\n * route id. Business metrics are read from the real service-provider record\n * (useProvider by cartId) — never fabricated. The invest panel is wired to the\n * live useInvest mutation; the projected-returns curve is a transparent forecast\n * computed from the stated expected return, not invented performance data.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n TrendingUp,\n Shield,\n Users,\n IndianRupee,\n Star,\n MessageSquare,\n Receipt,\n Tag,\n CheckCircle2,\n Lock,\n Target,\n} from 'lucide-react';\nimport { EmphasisPanel, GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { AreaChart, ProgressRing, StatCard } from '../../components/viz';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport {\n useInvestmentOpportunities,\n useInvestments,\n useInvest,\n useProvider,\n} from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatDate } from '../../utils/formatters';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getRiskConfig(risk: string): { label: string; color: string; badge: string } {\n switch (risk) {\n case 'low':\n return {\n label: 'Low risk',\n color: 'text-status-success-text',\n badge: 'border-status-success-border bg-status-success-bg-subtle text-status-success-text',\n };\n case 'medium':\n return {\n label: 'Medium risk',\n color: 'text-status-warning-text',\n badge: 'border-status-warning-border bg-status-warning-bg-subtle text-status-warning-text',\n };\n case 'high':\n return {\n label: 'High risk',\n color: 'text-status-error-text',\n badge: 'border-status-error-border bg-status-error-bg-subtle text-status-error-text',\n };\n default:\n return { label: risk, color: 'text-text-secondary', badge: 'border-border-default' };\n }\n}\n\n/** Compact rupee formatter for chart axes / tooltips. */\nfunction formatRupeeCompact(value: number): string {\n return formatCurrency(value, { minimumFractionDigits: 0, notation: 'compact' });\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function InvestmentDetailsPage() {\n const { navigateTo, currentUser } = useKadaikodi();\n const { id } = useParams<{ id: string }>();\n\n const { data: opportunities = [], isLoading: opportunitiesLoading } =\n useInvestmentOpportunities();\n const { data: investments = [], isLoading: investmentsLoading } = useInvestments(\n currentUser?.id || ''\n );\n\n const isLoading = opportunitiesLoading || investmentsLoading;\n\n // The route id may be an investment id or an opportunity id. Resolve the\n // holding first (if it belongs to this investor), then the opportunity.\n const investment = useMemo(() => investments.find((inv) => inv.id === id), [investments, id]);\n const opportunity = useMemo(\n () =>\n opportunities.find((opp) => opp.id === id || opp.id === investment?.opportunityId) ?? null,\n [opportunities, id, investment]\n );\n\n // Real business metrics come from the underlying service-provider record.\n const { data: provider } = useProvider(opportunity?.cartId);\n\n // Invest panel state (wired to the live mutation) ------------------------\n const invest = useInvest();\n const [amount, setAmount] = useState('');\n const [investStatus, setInvestStatus] = useState<'idle' | 'success' | 'error'>('idle');\n\n const minInvestment = opportunity?.minimumInvestment ?? 0;\n const remaining = opportunity ? Math.max(0, opportunity.targetAmount - opportunity.raisedAmount) : 0;\n const maxInvestment = Math.max(minInvestment, remaining);\n const parsedAmount = Number.parseInt(amount, 10);\n const amountValid =\n !Number.isNaN(parsedAmount) && parsedAmount >= minInvestment && parsedAmount <= maxInvestment;\n\n const handleInvest = useCallback(() => {\n if (!opportunity || !amountValid) {\n setInvestStatus('error');\n return;\n }\n invest.mutate(\n { amount: parsedAmount, investorId: currentUser?.id ?? '', opportunityId: opportunity.id },\n {\n onSuccess: () => {\n setInvestStatus('success');\n window.setTimeout(() => navigateTo('/investor/portfolio'), 1400);\n },\n onError: () => setInvestStatus('error'),\n }\n );\n }, [opportunity, amountValid, invest, parsedAmount, currentUser?.id, navigateTo]);\n\n // Projected-returns forecast: a transparent linear glide from the amount put\n // in today to amount × (1 + expected return) at the end of the lock-in. It is\n // a computed projection from the stated rate, clearly labelled — not data.\n const projection = useMemo(() => {\n if (!opportunity) return [];\n const base = amountValid ? parsedAmount : minInvestment || opportunity.targetAmount / 10;\n const finalValue = base * (1 + opportunity.expectedReturns / 100);\n const months = Math.min(Math.max(opportunity.investmentPeriod, 3), 12);\n const steps = 6;\n return Array.from({ length: steps + 1 }, (_, i) => {\n const monthLabel =\n i === 0 ? 'Now' : i === steps ? `${months}mo` : `M${Math.round((months * i) / steps)}`;\n return { label: monthLabel, value: base + (finalValue - base) * (i / steps) };\n });\n }, [opportunity, amountValid, parsedAmount, minInvestment]);\n\n if (isLoading) {\n return (\n <PageLayout title=\"Investment Details\" description=\"Loading...\">\n <div className=\"space-y-4\">\n <div className=\"h-28 animate-pulse rounded-[var(--radius-card)] bg-bg-sunken\" />\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <div className=\"h-96 animate-pulse rounded-[var(--radius-card)] bg-bg-sunken lg:col-span-2\" />\n <div className=\"h-96 animate-pulse rounded-[var(--radius-card)] bg-bg-sunken\" />\n </div>\n </div>\n </PageLayout>\n );\n }\n\n if (!opportunity && !investment) {\n return (\n <PageLayout title=\"Investment Not Found\">\n <EmptyState\n illustration=\"empty-generic\"\n title=\"Investment not found\"\n description=\"We couldn't find this investment. It may have been closed or the link is out of date.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/portfolio')}\n className=\"rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Back to Portfolio\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n const cartName = opportunity?.cartName ?? investment?.cartName ?? 'Investment';\n const risk = opportunity ? getRiskConfig(opportunity.riskLevel) : null;\n const fundingPct =\n opportunity && opportunity.targetAmount > 0\n ? Math.min((opportunity.raisedAmount / opportunity.targetAmount) * 100, 100)\n : 0;\n const daysLeft = opportunity?.expiresAt\n ? Math.max(0, Math.ceil((new Date(opportunity.expiresAt).getTime() - Date.now()) / 86400000))\n : null;\n\n const holdingReturns = investment ? investment.currentValue - investment.investedAmount : 0;\n const holdingReturnsPct =\n investment && investment.investedAmount > 0\n ? (holdingReturns / investment.investedAmount) * 100\n : 0;\n\n const canInvest = Boolean(opportunity) && opportunity?.status === 'active';\n\n return (\n <PageLayout\n title={cartName}\n description=\"Investment details & performance\"\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/portfolio')}\n className=\"flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Back to Portfolio</span>\n <span className=\"sm:hidden\">Back</span>\n </button>\n }\n >\n <PagePurpose className=\"mb-6\">\n A deep dive into this investment. Review the business behind it, funding progress, expected\n returns and terms on offer, and — if you already hold a stake — exactly what you&apos;ve put\n in and what it&apos;s worth today.\n </PagePurpose>\n\n {/* Existing holding summary — the one emphasis zone when you own a stake */}\n {investment && (\n <EmphasisPanel>\n <h2 className=\"mb-4 text-base font-semibold text-text-primary\">Your Position</h2>\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n <StatCard\n label=\"Your Investment\"\n value={formatCurrency(investment.investedAmount, { minimumFractionDigits: 0 })}\n icon={<IndianRupee className=\"h-4 w-4\" />}\n />\n <StatCard\n label=\"Current Value\"\n value={formatCurrency(investment.currentValue, { minimumFractionDigits: 0 })}\n icon={<TrendingUp className=\"h-4 w-4\" />}\n />\n <StatCard\n label=\"Returns\"\n value={`${holdingReturnsPct >= 0 ? '+' : ''}${holdingReturnsPct.toFixed(1)}%`}\n delta={Number(holdingReturnsPct.toFixed(1))}\n deltaLabel=\"on invested\"\n icon={<TrendingUp className=\"h-4 w-4\" />}\n />\n <StatCard\n label=\"Realised Returns\"\n value={formatCurrency(investment.returns, { minimumFractionDigits: 0 })}\n icon={<Receipt className=\"h-4 w-4\" />}\n />\n </div>\n </EmphasisPanel>\n )}\n\n <div className=\"mt-6 grid gap-6 lg:grid-cols-3\">\n {/* Left — the business & funding story */}\n <div className=\"space-y-6 lg:col-span-2\">\n {/* Hero header with risk badge */}\n {opportunity && (\n <GlassCard treatment=\"glass\" className=\"p-5 sm:p-6\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"text-sm text-text-secondary\">{opportunity.businessOwner}</p>\n <h2 className=\"mt-0.5 text-xl font-bold tracking-tight text-text-primary sm:text-2xl\">\n {opportunity.cartName}\n </h2>\n </div>\n {risk && (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-sm font-semibold',\n risk.badge\n )}\n >\n <Shield className=\"h-4 w-4\" />\n {risk.label}\n </span>\n )}\n </div>\n {opportunity.description && (\n <p className=\"mt-4 text-sm leading-relaxed text-text-secondary\">\n {opportunity.description}\n </p>\n )}\n </GlassCard>\n )}\n\n {/* Business Metrics — real provider figures */}\n {provider && (\n <section>\n <h3 className=\"mb-3 text-lg font-semibold text-text-primary\">Business Metrics</h3>\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4 sm:gap-4\">\n <StatCard\n label=\"Rating\"\n value={provider.rating > 0 ? provider.rating.toFixed(1) : '—'}\n icon={<Star className=\"h-4 w-4\" />}\n />\n <StatCard\n label=\"Reviews\"\n value={provider.totalRatings.toLocaleString('en-IN')}\n icon={<MessageSquare className=\"h-4 w-4\" />}\n />\n <StatCard\n label=\"Avg Order\"\n value={\n provider.averageOrderValue\n ? formatCurrency(provider.averageOrderValue, { minimumFractionDigits: 0 })\n : '—'\n }\n icon={<Receipt className=\"h-4 w-4\" />}\n />\n <StatCard\n label=\"Category\"\n value={\n <span className=\"text-lg font-semibold capitalize\">\n {provider.category || '—'}\n </span>\n }\n icon={<Tag className=\"h-4 w-4\" />}\n />\n </div>\n </section>\n )}\n\n {/* Funding progress with a ProgressRing */}\n {opportunity && (\n <GlassCard treatment=\"plain\" className=\"p-5 sm:p-6\">\n <h3 className=\"mb-4 text-lg font-semibold text-text-primary\">Funding Progress</h3>\n <div className=\"flex flex-col items-center gap-6 sm:flex-row sm:gap-8\">\n <ProgressRing\n value={fundingPct}\n size={140}\n label={`${fundingPct.toFixed(0)}%`}\n caption=\"funded\"\n />\n <div className=\"w-full flex-1 space-y-4\">\n <div>\n <div className=\"flex items-baseline justify-between\">\n <span className=\"text-2xl font-bold text-text-primary\">\n {formatCurrency(opportunity.raisedAmount, { minimumFractionDigits: 0 })}\n </span>\n <span className=\"text-sm text-text-secondary\">\n of {formatCurrency(opportunity.targetAmount, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <p className=\"mt-1 text-sm text-text-secondary\">raised so far</p>\n </div>\n <div className=\"grid grid-cols-3 gap-3 border-t border-border-subtle pt-4 text-center\">\n <div>\n <p className=\"text-base font-bold text-text-primary sm:text-lg\">\n {opportunity.investors.length}\n </p>\n <p className=\"text-xs text-text-secondary\">Investors</p>\n </div>\n <div>\n <p className=\"text-base font-bold text-text-primary sm:text-lg\">\n {formatCurrency(remaining, { minimumFractionDigits: 0, notation: 'compact' })}\n </p>\n <p className=\"text-xs text-text-secondary\">To Go</p>\n </div>\n <div>\n <p className=\"text-base font-bold text-text-primary sm:text-lg\">\n {daysLeft !== null ? `${daysLeft}` : '—'}\n </p>\n <p className=\"text-xs text-text-secondary\">Days Left</p>\n </div>\n </div>\n </div>\n </div>\n </GlassCard>\n )}\n\n {/* Your holding detail */}\n {investment && (\n <GlassCard treatment=\"plain\" className=\"p-5 sm:p-6\">\n <h3 className=\"mb-4 text-lg font-semibold text-text-primary\">Your Holding</h3>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div>\n <p className=\"text-sm text-text-secondary\">Invested Amount</p>\n <p className=\"font-medium text-text-primary\">\n {formatCurrency(investment.investedAmount, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Current Value</p>\n <p className=\"font-medium text-text-primary\">\n {formatCurrency(investment.currentValue, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Returns Realised</p>\n <p className=\"font-medium text-text-primary\">\n {formatCurrency(investment.returns, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Invested On</p>\n <p className=\"font-medium text-text-primary\">\n {formatDate(investment.investmentDate, { hour: undefined, minute: undefined })}\n </p>\n </div>\n </div>\n </GlassCard>\n )}\n </div>\n\n {/* Right — sticky invest panel */}\n <div className=\"space-y-6\">\n <div className=\"lg:sticky lg:top-6\">\n <GlassCard treatment=\"glass\" glow className=\"p-5 sm:p-6\">\n <h3 className=\"mb-4 text-lg font-semibold text-text-primary\">\n {canInvest ? 'Invest' : 'Investment Terms'}\n </h3>\n\n {/* Terms */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <TrendingUp className=\"h-4 w-4\" />\n Expected returns\n </span>\n <span className=\"font-semibold text-status-success-text\">\n {opportunity?.expectedReturns ?? investment?.returnsPercentage}% p.a.\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Lock className=\"h-4 w-4\" />\n Lock-in\n </span>\n <span className=\"font-semibold text-text-primary\">\n {opportunity?.investmentPeriod ?? '—'} months\n </span>\n </div>\n {opportunity && (\n <div className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <IndianRupee className=\"h-4 w-4\" />\n Minimum\n </span>\n <span className=\"font-semibold text-text-primary\">\n {formatCurrency(opportunity.minimumInvestment, { minimumFractionDigits: 0 })}\n </span>\n </div>\n )}\n {opportunity && opportunity.investors.length > 0 && (\n <div className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Users className=\"h-4 w-4\" />\n Investors\n </span>\n <span className=\"font-semibold text-text-primary\">\n {opportunity.investors.length}\n </span>\n </div>\n )}\n </div>\n\n {canInvest && investStatus !== 'success' && (\n <div className=\"mt-5 space-y-4 border-t border-border-subtle pt-5\">\n <div>\n <label\n htmlFor=\"invest-amount\"\n className=\"mb-1.5 block text-sm font-medium text-text-primary\"\n >\n Amount\n </label>\n <div className=\"relative\">\n <IndianRupee className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n id=\"invest-amount\"\n type=\"number\"\n inputMode=\"numeric\"\n value={amount}\n onChange={(e) => {\n setAmount(e.target.value);\n setInvestStatus('idle');\n }}\n placeholder={String(minInvestment)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2.5 pl-9 pr-3 text-base font-semibold text-text-primary placeholder:font-normal placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <p className=\"mt-1.5 text-xs text-text-secondary\">\n {formatCurrency(minInvestment, { minimumFractionDigits: 0 })} –{' '}\n {formatCurrency(maxInvestment, { minimumFractionDigits: 0 })}\n </p>\n {investStatus === 'error' && (\n <p className=\"mt-1 text-xs text-status-error-text\">\n Enter an amount between{' '}\n {formatCurrency(minInvestment, { minimumFractionDigits: 0 })} and{' '}\n {formatCurrency(maxInvestment, { minimumFractionDigits: 0 })}.\n </p>\n )}\n </div>\n\n {/* Projected returns forecast */}\n <div>\n <p className=\"mb-1 text-sm font-medium text-text-primary\">Projected returns</p>\n <p className=\"mb-2 text-xs text-text-muted\">\n Forecast at {opportunity?.expectedReturns}% over {opportunity?.investmentPeriod}{' '}\n months\n </p>\n <AreaChart\n series={projection}\n height={140}\n valueFormatter={formatRupeeCompact}\n title=\"Projected value over the lock-in period\"\n />\n {amountValid && (\n <div className=\"mt-2 flex items-center justify-between rounded-lg bg-bg-sunken/60 px-3 py-2 text-sm\">\n <span className=\"text-text-secondary\">Projected value</span>\n <span className=\"font-semibold text-status-success-text\">\n {formatCurrency(\n parsedAmount * (1 + (opportunity?.expectedReturns ?? 0) / 100),\n { minimumFractionDigits: 0 }\n )}\n </span>\n </div>\n )}\n </div>\n\n <button\n type=\"button\"\n onClick={handleInvest}\n disabled={!amountValid || invest.isPending}\n className={cn(\n 'flex w-full items-center justify-center gap-2 rounded-lg px-4 py-3 text-sm font-semibold transition-colors',\n amountValid && !invest.isPending\n ? 'bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg-hover'\n : 'cursor-not-allowed bg-bg-sunken text-text-secondary'\n )}\n >\n {invest.isPending ? 'Processing…' : 'Invest Now'}\n </button>\n </div>\n )}\n\n {investStatus === 'success' && (\n <div className=\"mt-5 border-t border-border-subtle pt-5 text-center\">\n <CheckCircle2 className=\"mx-auto mb-2 h-10 w-10 text-status-success-text\" />\n <p className=\"text-sm font-medium text-text-primary\">Investment successful!</p>\n <p className=\"mt-1 text-xs text-text-secondary\">Redirecting to your portfolio…</p>\n </div>\n )}\n\n {!canInvest && !investment && opportunity && (\n <div className=\"mt-5 flex items-center gap-2 rounded-lg border border-border-subtle bg-bg-sunken/50 p-3 text-sm text-text-secondary\">\n <Target className=\"h-4 w-4 shrink-0\" />\n This opportunity is {opportunity.status}. It&apos;s no longer accepting\n investments.\n </div>\n )}\n </GlassCard>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}