@burdenoff/microfe-subscriberbot 2026.615.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.
- package/dist/node_modules/{.bun/clsx@2.1.1/node_modules/clsx → clsx}/dist/clsx.js +1 -1
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/{.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge → tailwind-merge}/dist/bundle-mjs.js +212 -170
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/dist/subscriberbot/components/EmptyState.js +20 -13
- package/dist/subscriberbot/components/EmptyState.js.map +1 -1
- package/dist/subscriberbot/components/InvestmentCard.js +29 -28
- package/dist/subscriberbot/components/InvestmentCard.js.map +1 -1
- package/dist/subscriberbot/components/MetricsCard.js +18 -15
- package/dist/subscriberbot/components/MetricsCard.js.map +1 -1
- package/dist/subscriberbot/components/PageLayout.js +27 -15
- package/dist/subscriberbot/components/PageLayout.js.map +1 -1
- package/dist/subscriberbot/components/RatingDisplay.js +3 -3
- package/dist/subscriberbot/components/RatingDisplay.js.map +1 -1
- package/dist/subscriberbot/components/StatusBadge.js +26 -14
- package/dist/subscriberbot/components/StatusBadge.js.map +1 -1
- package/dist/subscriberbot/context/SubscriberBotContext.js.map +1 -1
- package/dist/subscriberbot/pages/HomePage.js +109 -105
- package/dist/subscriberbot/pages/HomePage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js +87 -87
- package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminDashboard.js +102 -101
- package/dist/subscriberbot/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminFinancialPage.js +48 -48
- package/dist/subscriberbot/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminOrdersPage.js +96 -96
- package/dist/subscriberbot/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminProfilePage.js +34 -34
- package/dist/subscriberbot/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminSettingsPage.js +40 -40
- package/dist/subscriberbot/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/CartManagementPage.js +104 -104
- package/dist/subscriberbot/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/UserManagementPage.js +99 -99
- package/dist/subscriberbot/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js +117 -117
- package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js +34 -34
- package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js +158 -153
- package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js +117 -117
- package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js +89 -89
- package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js +109 -109
- package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js +90 -89
- package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js +97 -97
- package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/common/HelpSupportPage.js +138 -138
- package/dist/subscriberbot/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/subscriberbot/pages/common/NotificationCenterPage.js +67 -66
- package/dist/subscriberbot/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/subscriberbot/pages/common/SettingsPage.js +116 -116
- package/dist/subscriberbot/pages/common/SettingsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/BookingDetailsPage.js +73 -72
- package/dist/subscriberbot/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CartDetailPage.js +89 -88
- package/dist/subscriberbot/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js +68 -66
- package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CheckoutPage.js +80 -80
- package/dist/subscriberbot/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CustomerDashboard.js +89 -88
- package/dist/subscriberbot/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CustomerProfilePage.js +84 -84
- package/dist/subscriberbot/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js +92 -91
- package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/FavoritesPage.js +34 -33
- package/dist/subscriberbot/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/OrderHistoryPage.js +45 -43
- package/dist/subscriberbot/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/OrderTrackingPage.js +61 -60
- package/dist/subscriberbot/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js +59 -58
- package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/ReviewsPage.js +49 -48
- package/dist/subscriberbot/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/SavedAddressesPage.js +47 -46
- package/dist/subscriberbot/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js +129 -129
- package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js +90 -88
- package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js +88 -88
- package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorDashboard.js +63 -62
- package/dist/subscriberbot/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js +39 -38
- package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js +66 -66
- package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorProfilePage.js +154 -154
- package/dist/subscriberbot/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/TaskDetailsPage.js +80 -79
- package/dist/subscriberbot/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerDashboard.js +107 -106
- package/dist/subscriberbot/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js +73 -72
- package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerProfilePage.js +108 -108
- package/dist/subscriberbot/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js +71 -69
- package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/dist/subscriberbot/utils/cn.js +2 -2
- package/package.json +3 -3
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +0 -1
- package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InvestorAnalyticsPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/investor/InvestorAnalyticsPage.tsx"],"sourcesContent":["/**\n * Investor Analytics Page\n * @module subscriberbot/pages/investor\n *\n * Date range selector, export button, metrics grid, performance by cart\n * with rankings, category distribution with progress bars, monthly\n * performance table, risk analysis with scores, diversification score,\n * and recommendations list.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport {\n TrendingUp,\n PieChart,\n BarChart3,\n Calendar,\n Download,\n Target,\n Activity,\n Wallet,\n IndianRupee,\n Lightbulb,\n Shield,\n AlertTriangle,\n ArrowUp,\n ArrowDown,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatNumber } from '../../utils/formatters';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface AnalyticsData {\n portfolioMetrics: {\n totalValue: number;\n totalInvested: number;\n totalReturns: number;\n averageRoi: number;\n portfolioGrowth: number;\n bestPerforming: string;\n worstPerforming: string;\n };\n performanceByCart: Array<{\n cartName: string;\n investedAmount: number;\n currentValue: number;\n returns: number;\n roi: number;\n }>;\n performanceByCategory: Array<{\n category: string;\n investedAmount: number;\n returns: number;\n percentage: number;\n }>;\n monthlyPerformance: Array<{\n month: string;\n invested: number;\n value: number;\n returns: number;\n }>;\n riskAnalysis: {\n riskScore: number;\n diversificationScore: number;\n volatilityScore: number;\n recommendations: string[];\n };\n}\n\n// ---------------------------------------------------------------------------\n// Mock data\n// ---------------------------------------------------------------------------\n\nconst mockAnalytics: AnalyticsData = {\n portfolioMetrics: {\n totalValue: 283700,\n totalInvested: 255000,\n totalReturns: 28700,\n averageRoi: 19.6,\n portfolioGrowth: 11.3,\n bestPerforming: 'Biryani House',\n worstPerforming: 'Healthy Bites',\n },\n performanceByCart: [\n {\n cartName: 'Biryani House',\n investedAmount: 60000,\n currentValue: 72000,\n returns: 12000,\n roi: 20.0,\n },\n {\n cartName: 'South Indian Express',\n investedAmount: 50000,\n currentValue: 58500,\n returns: 8500,\n roi: 17.0,\n },\n {\n cartName: 'Pizza Corner',\n investedAmount: 75000,\n currentValue: 82000,\n returns: 7000,\n roi: 9.3,\n },\n {\n cartName: 'Healthy Bites',\n investedAmount: 30000,\n currentValue: 31200,\n returns: 1200,\n roi: 4.0,\n },\n {\n cartName: 'Street Food Junction',\n investedAmount: 40000,\n currentValue: 40000,\n returns: 0,\n roi: 0,\n },\n ],\n performanceByCategory: [\n {\n category: 'South Indian',\n investedAmount: 110000,\n returns: 20500,\n percentage: 43.1,\n },\n {\n category: 'Fast Food',\n investedAmount: 75000,\n returns: 7000,\n percentage: 29.4,\n },\n {\n category: 'Street Food',\n investedAmount: 40000,\n returns: 0,\n percentage: 15.7,\n },\n {\n category: 'Healthy Food',\n investedAmount: 30000,\n returns: 1200,\n percentage: 11.8,\n },\n ],\n monthlyPerformance: [\n { month: 'Jun 2024', invested: 195000, value: 202000, returns: 7000 },\n { month: 'Jul 2024', invested: 215000, value: 228000, returns: 13000 },\n { month: 'Aug 2024', invested: 255000, value: 265000, returns: 10000 },\n { month: 'Sep 2024', invested: 255000, value: 275000, returns: 20000 },\n { month: 'Oct 2024', invested: 255000, value: 280000, returns: 25000 },\n { month: 'Nov 2024', invested: 255000, value: 283700, returns: 28700 },\n ],\n riskAnalysis: {\n riskScore: 3.2,\n diversificationScore: 7.8,\n volatilityScore: 2.5,\n recommendations: [\n 'Consider diversifying into more food categories',\n 'Your portfolio shows good risk distribution',\n 'Consider investing in carts from different locations',\n 'Monitor underperforming investments closely',\n 'Explore premium segment opportunities for higher returns',\n ],\n },\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getRiskLevel(score: number): { label: string; color: string } {\n if (score <= 2) return { label: 'Low Risk', color: 'text-green-600 dark:text-green-400' };\n if (score <= 4) return { label: 'Moderate Risk', color: 'text-yellow-600 dark:text-yellow-400' };\n return { label: 'High Risk', color: 'text-red-600 dark:text-red-400' };\n}\n\nfunction getRiskBgColor(score: number): string {\n if (score <= 2) return 'bg-green-500';\n if (score <= 4) return 'bg-yellow-500';\n return 'bg-red-500';\n}\n\nfunction getDiversificationLevel(score: number): { label: string; color: string } {\n if (score >= 8) return { label: 'Well Diversified', color: 'text-green-600 dark:text-green-400' };\n if (score >= 6)\n return { label: 'Moderately Diversified', color: 'text-yellow-600 dark:text-yellow-400' };\n return { label: 'Poorly Diversified', color: 'text-red-600 dark:text-red-400' };\n}\n\nfunction getDiversificationBgColor(score: number): string {\n if (score >= 8) return 'bg-green-500';\n if (score >= 6) return 'bg-yellow-500';\n return 'bg-red-500';\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function InvestorAnalyticsPage() {\n const { navigateTo } = useSubscriberBot();\n const [isLoading, setIsLoading] = useState(true);\n const [dateRange, setDateRange] = useState('6m');\n const [analytics, setAnalytics] = useState<AnalyticsData | null>(null);\n const [exportStatus, setExportStatus] = useState<'idle' | 'exporting' | 'done'>('idle');\n\n useEffect(() => {\n setIsLoading(true);\n const timer = setTimeout(() => {\n setAnalytics(mockAnalytics);\n setIsLoading(false);\n }, 600);\n return () => clearTimeout(timer);\n }, [dateRange]);\n\n const handleExportReport = useCallback(() => {\n setExportStatus('exporting');\n setTimeout(() => {\n setExportStatus('done');\n setTimeout(() => setExportStatus('idle'), 2000);\n }, 1200);\n }, []);\n\n if (isLoading || !analytics) {\n return (\n <PageLayout title=\"Investment Analytics\" description=\"Loading analytics...\">\n <div className=\"flex items-center justify-center py-20\">\n <div className=\"text-center\">\n <div className=\"mx-auto mb-4 h-12 w-12 animate-spin rounded-full border-b-2 border-primary\" />\n <p className=\"text-sm text-muted-foreground\">Loading analytics data...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n const riskLevel = getRiskLevel(analytics.riskAnalysis.riskScore);\n const diversificationLevel = getDiversificationLevel(analytics.riskAnalysis.diversificationScore);\n\n // Sort carts by ROI for ranking\n const sortedCarts = [...analytics.performanceByCart].sort((a, b) => b.roi - a.roi);\n\n return (\n <PageLayout\n title=\"Investment Analytics\"\n description=\"Comprehensive analysis of your portfolio performance\"\n actions={\n <div className=\"flex items-center gap-3\">\n {/* Date Range Selector */}\n <select\n value={dateRange}\n onChange={(e) => setDateRange(e.target.value)}\n className=\"rounded-lg border border-border bg-card px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n >\n <option value=\"1m\">Last Month</option>\n <option value=\"3m\">Last 3 Months</option>\n <option value=\"6m\">Last 6 Months</option>\n <option value=\"1y\">Last Year</option>\n <option value=\"all\">All Time</option>\n </select>\n\n {/* Export Button */}\n <button\n type=\"button\"\n onClick={handleExportReport}\n disabled={exportStatus === 'exporting'}\n className={cn(\n 'flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors',\n exportStatus === 'exporting'\n ? 'cursor-not-allowed bg-muted text-muted-foreground'\n : exportStatus === 'done'\n ? 'bg-green-600 text-white'\n : 'bg-primary text-primary-foreground hover:bg-primary/90'\n )}\n >\n <Download className=\"h-4 w-4\" />\n {exportStatus === 'exporting'\n ? 'Exporting...'\n : exportStatus === 'done'\n ? 'Exported!'\n : 'Export Report'}\n </button>\n </div>\n }\n >\n {/* Key Metrics */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <MetricsCard\n icon={<Wallet className=\"h-5 w-5\" />}\n value={formatCurrency(analytics.portfolioMetrics.totalValue, {\n minimumFractionDigits: 0,\n })}\n label=\"Portfolio Value\"\n trend=\"up\"\n trendValue={`+${analytics.portfolioMetrics.portfolioGrowth}% total growth`}\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={formatCurrency(analytics.portfolioMetrics.totalReturns, {\n minimumFractionDigits: 0,\n })}\n label=\"Total Returns\"\n trend=\"up\"\n trendValue=\"Profit earned so far\"\n />\n <MetricsCard\n icon={<Target className=\"h-5 w-5\" />}\n value={`${analytics.portfolioMetrics.averageRoi}%`}\n label=\"Average ROI\"\n trend=\"up\"\n trendValue=\"Across all investments\"\n />\n <MetricsCard\n icon={<Activity className=\"h-5 w-5\" />}\n value={`${analytics.riskAnalysis.riskScore}/5`}\n label=\"Risk Score\"\n trend=\"neutral\"\n trendValue={riskLevel.label}\n />\n </div>\n\n {/* Best / Worst Performers */}\n <div className=\"mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div className=\"flex items-center gap-3 rounded-lg border border-border bg-card p-4\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-green-500/10\">\n <ArrowUp className=\"h-5 w-5 text-green-600 dark:text-green-400\" />\n </div>\n <div>\n <p className=\"text-xs text-muted-foreground\">Best Performing</p>\n <p className=\"text-sm font-semibold text-green-600 dark:text-green-400\">\n {analytics.portfolioMetrics.bestPerforming}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-3 rounded-lg border border-border bg-card p-4\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-red-500/10\">\n <ArrowDown className=\"h-5 w-5 text-red-600 dark:text-red-400\" />\n </div>\n <div>\n <p className=\"text-xs text-muted-foreground\">Worst Performing</p>\n <p className=\"text-sm font-semibold text-foreground\">\n {analytics.portfolioMetrics.worstPerforming}\n </p>\n </div>\n </div>\n </div>\n\n {/* Performance by Cart & Category Distribution */}\n <div className=\"mt-6 grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Performance by Cart */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <BarChart3 className=\"h-5 w-5 text-muted-foreground\" />\n <h2 className=\"text-lg font-semibold text-foreground\">Performance by Cart</h2>\n </div>\n\n <div className=\"space-y-3\">\n {sortedCarts.map((cart, index) => (\n <div\n key={cart.cartName}\n className=\"flex items-center justify-between rounded-lg border border-border bg-card p-3\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary text-xs font-bold text-primary-foreground\">\n {index + 1}\n </div>\n <div>\n <p className=\"text-sm font-medium text-foreground\">{cart.cartName}</p>\n <p className=\"text-xs text-muted-foreground\">\n {formatCurrency(cart.investedAmount, { minimumFractionDigits: 0 })} invested\n </p>\n </div>\n </div>\n <div className=\"text-right\">\n <p\n className={cn(\n 'text-sm font-semibold',\n cart.returns >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {cart.returns >= 0 ? '+' : ''}\n {formatCurrency(cart.returns, { minimumFractionDigits: 0 })}\n </p>\n <p\n className={cn(\n 'text-xs',\n cart.roi >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {cart.roi >= 0 ? '+' : ''}\n {cart.roi}% ROI\n </p>\n </div>\n </div>\n ))}\n </div>\n </section>\n\n {/* Category Distribution */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <PieChart className=\"h-5 w-5 text-muted-foreground\" />\n <h2 className=\"text-lg font-semibold text-foreground\">Category Distribution</h2>\n </div>\n\n <div className=\"space-y-4\">\n {analytics.performanceByCategory.map((category) => (\n <div key={category.category} className=\"rounded-lg border border-border bg-card p-3\">\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm font-medium text-foreground\">{category.category}</span>\n <span className=\"text-sm text-muted-foreground\">{category.percentage}%</span>\n </div>\n <div className=\"mb-2 h-2 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-full rounded-full bg-primary transition-all duration-300\"\n style={{ width: `${category.percentage}%` }}\n />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-muted-foreground\">\n {formatCurrency(category.investedAmount, { minimumFractionDigits: 0 })} invested\n </span>\n <span\n className={cn(\n 'text-xs font-semibold',\n category.returns >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {category.returns >= 0 ? '+' : ''}\n {formatCurrency(category.returns, { minimumFractionDigits: 0 })}\n </span>\n </div>\n </div>\n ))}\n </div>\n </section>\n </div>\n\n {/* Monthly Performance Table */}\n <section className=\"mt-8\">\n <div className=\"mb-4 flex items-center gap-2\">\n <Calendar className=\"h-5 w-5 text-muted-foreground\" />\n <h2 className=\"text-lg font-semibold text-foreground\">Portfolio Growth Trend</h2>\n </div>\n\n <div className=\"overflow-hidden rounded-lg border border-border bg-card\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border bg-muted/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-muted-foreground sm:px-6\">\n Month\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-muted-foreground sm:px-6\">\n Invested\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-muted-foreground sm:px-6\">\n Portfolio Value\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-muted-foreground sm:px-6\">\n Returns\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-muted-foreground sm:px-6\">\n Growth %\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {analytics.monthlyPerformance.map((month) => {\n const growthPct =\n month.invested > 0\n ? (((month.value - month.invested) / month.invested) * 100).toFixed(1)\n : '0.0';\n\n return (\n <tr key={month.month} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"whitespace-nowrap px-4 py-4 text-sm font-medium text-foreground sm:px-6\">\n {month.month}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm text-foreground sm:px-6\">\n {formatCurrency(month.invested, { minimumFractionDigits: 0 })}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm text-foreground sm:px-6\">\n {formatCurrency(month.value, { minimumFractionDigits: 0 })}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm sm:px-6\">\n <span\n className={cn(\n 'font-semibold',\n month.returns >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {month.returns >= 0 ? '+' : ''}\n {formatCurrency(month.returns, { minimumFractionDigits: 0 })}\n </span>\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm sm:px-6\">\n <span\n className={cn(\n 'font-medium',\n parseFloat(growthPct) >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {parseFloat(growthPct) >= 0 ? '+' : ''}\n {growthPct}%\n </span>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n </section>\n\n {/* Risk Analysis & Diversification */}\n <div className=\"mt-8 grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Risk Analysis */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <Shield className=\"h-5 w-5 text-muted-foreground\" />\n <h2 className=\"text-lg font-semibold text-foreground\">Risk Analysis</h2>\n </div>\n\n <div className=\"rounded-lg border border-border bg-card p-4 sm:p-6\">\n <div className=\"space-y-5\">\n {/* Risk Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-foreground\">Risk Score</span>\n <span className={cn('text-sm font-semibold', riskLevel.color)}>\n {analytics.riskAnalysis.riskScore}/5 ({riskLevel.label})\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getRiskBgColor(analytics.riskAnalysis.riskScore)\n )}\n style={{ width: `${(analytics.riskAnalysis.riskScore / 5) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Diversification Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-foreground\">Diversification</span>\n <span className={cn('text-sm font-semibold', diversificationLevel.color)}>\n {analytics.riskAnalysis.diversificationScore}/10 ({diversificationLevel.label})\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getDiversificationBgColor(analytics.riskAnalysis.diversificationScore)\n )}\n style={{\n width: `${(analytics.riskAnalysis.diversificationScore / 10) * 100}%`,\n }}\n />\n </div>\n </div>\n\n {/* Volatility Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-foreground\">Volatility</span>\n <span\n className={cn(\n 'text-sm font-semibold',\n getRiskLevel(analytics.riskAnalysis.volatilityScore).color\n )}\n >\n {analytics.riskAnalysis.volatilityScore}/5\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getRiskBgColor(analytics.riskAnalysis.volatilityScore)\n )}\n style={{ width: `${(analytics.riskAnalysis.volatilityScore / 5) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Quick Stats */}\n <div className=\"grid grid-cols-2 gap-3 border-t border-border pt-4\">\n <div className=\"rounded-lg bg-muted/50 p-3 text-center\">\n <p className=\"text-lg font-bold text-foreground\">\n {analytics.performanceByCart.length}\n </p>\n <p className=\"text-xs text-muted-foreground\">Active Investments</p>\n </div>\n <div className=\"rounded-lg bg-muted/50 p-3 text-center\">\n <p className=\"text-lg font-bold text-foreground\">\n {analytics.performanceByCategory.length}\n </p>\n <p className=\"text-xs text-muted-foreground\">Sectors Covered</p>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Recommendations */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <Lightbulb className=\"h-5 w-5 text-yellow-500\" />\n <h2 className=\"text-lg font-semibold text-foreground\">Recommendations</h2>\n </div>\n\n <div className=\"rounded-lg border border-border bg-card p-4 sm:p-6\">\n <div className=\"space-y-3\">\n {analytics.riskAnalysis.recommendations.map((recommendation, index) => (\n <div\n key={index}\n className=\"flex items-start gap-3 rounded-lg border border-border bg-muted/30 p-3\"\n >\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-primary text-xs font-bold text-primary-foreground\">\n {index + 1}\n </div>\n <p className=\"text-sm leading-relaxed text-foreground\">{recommendation}</p>\n </div>\n ))}\n </div>\n\n {/* Overall Assessment */}\n <div className=\"mt-5 rounded-lg border border-border bg-muted/50 p-4\">\n <h4 className=\"mb-2 text-sm font-semibold text-foreground\">Overall Assessment</h4>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-muted-foreground\">Portfolio Health</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn('h-2 w-4 rounded-sm', i <= 4 ? 'bg-green-500' : 'bg-muted')}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-foreground\">4/5</span>\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-muted-foreground\">Growth Potential</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn(\n 'h-2 w-4 rounded-sm',\n i <= 3 ? 'bg-yellow-500' : 'bg-muted'\n )}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-foreground\">3/5</span>\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-muted-foreground\">Income Stability</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn('h-2 w-4 rounded-sm', i <= 4 ? 'bg-green-500' : 'bg-muted')}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-foreground\">4/5</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n </div>\n\n {/* Quick Navigation */}\n <div className=\"mt-8 flex flex-wrap gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/portfolio')}\n className=\"flex items-center gap-2 rounded-lg border border-border px-4 py-2 text-sm font-medium text-foreground hover:bg-accent transition-colors\"\n >\n <PieChart className=\"h-4 w-4\" />\n View Portfolio\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n className=\"flex items-center gap-2 rounded-lg border border-border px-4 py-2 text-sm font-medium text-foreground hover:bg-accent transition-colors\"\n >\n <Target className=\"h-4 w-4\" />\n Browse Opportunities\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/investments')}\n className=\"flex items-center gap-2 rounded-lg border border-border px-4 py-2 text-sm font-medium text-foreground hover:bg-accent transition-colors\"\n >\n <Wallet className=\"h-4 w-4\" />\n My Investments\n </button>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InvestorAnalyticsPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/investor/InvestorAnalyticsPage.tsx"],"sourcesContent":["/**\n * Investor Analytics Page\n * @module subscriberbot/pages/investor\n *\n * Date range selector, export button, metrics grid, performance by cart\n * with rankings, category distribution with progress bars, monthly\n * performance table, risk analysis with scores, diversification score,\n * and recommendations list.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport {\n TrendingUp,\n PieChart,\n BarChart3,\n Calendar,\n Download,\n Target,\n Activity,\n Wallet,\n IndianRupee,\n Lightbulb,\n Shield,\n AlertTriangle,\n ArrowUp,\n ArrowDown,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatNumber } from '../../utils/formatters';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface AnalyticsData {\n portfolioMetrics: {\n totalValue: number;\n totalInvested: number;\n totalReturns: number;\n averageRoi: number;\n portfolioGrowth: number;\n bestPerforming: string;\n worstPerforming: string;\n };\n performanceByCart: Array<{\n cartName: string;\n investedAmount: number;\n currentValue: number;\n returns: number;\n roi: number;\n }>;\n performanceByCategory: Array<{\n category: string;\n investedAmount: number;\n returns: number;\n percentage: number;\n }>;\n monthlyPerformance: Array<{\n month: string;\n invested: number;\n value: number;\n returns: number;\n }>;\n riskAnalysis: {\n riskScore: number;\n diversificationScore: number;\n volatilityScore: number;\n recommendations: string[];\n };\n}\n\n// ---------------------------------------------------------------------------\n// Mock data\n// ---------------------------------------------------------------------------\n\nconst mockAnalytics: AnalyticsData = {\n portfolioMetrics: {\n totalValue: 283700,\n totalInvested: 255000,\n totalReturns: 28700,\n averageRoi: 19.6,\n portfolioGrowth: 11.3,\n bestPerforming: 'Biryani House',\n worstPerforming: 'Healthy Bites',\n },\n performanceByCart: [\n {\n cartName: 'Biryani House',\n investedAmount: 60000,\n currentValue: 72000,\n returns: 12000,\n roi: 20.0,\n },\n {\n cartName: 'South Indian Express',\n investedAmount: 50000,\n currentValue: 58500,\n returns: 8500,\n roi: 17.0,\n },\n {\n cartName: 'Pizza Corner',\n investedAmount: 75000,\n currentValue: 82000,\n returns: 7000,\n roi: 9.3,\n },\n {\n cartName: 'Healthy Bites',\n investedAmount: 30000,\n currentValue: 31200,\n returns: 1200,\n roi: 4.0,\n },\n {\n cartName: 'Street Food Junction',\n investedAmount: 40000,\n currentValue: 40000,\n returns: 0,\n roi: 0,\n },\n ],\n performanceByCategory: [\n {\n category: 'South Indian',\n investedAmount: 110000,\n returns: 20500,\n percentage: 43.1,\n },\n {\n category: 'Fast Food',\n investedAmount: 75000,\n returns: 7000,\n percentage: 29.4,\n },\n {\n category: 'Street Food',\n investedAmount: 40000,\n returns: 0,\n percentage: 15.7,\n },\n {\n category: 'Healthy Food',\n investedAmount: 30000,\n returns: 1200,\n percentage: 11.8,\n },\n ],\n monthlyPerformance: [\n { month: 'Jun 2024', invested: 195000, value: 202000, returns: 7000 },\n { month: 'Jul 2024', invested: 215000, value: 228000, returns: 13000 },\n { month: 'Aug 2024', invested: 255000, value: 265000, returns: 10000 },\n { month: 'Sep 2024', invested: 255000, value: 275000, returns: 20000 },\n { month: 'Oct 2024', invested: 255000, value: 280000, returns: 25000 },\n { month: 'Nov 2024', invested: 255000, value: 283700, returns: 28700 },\n ],\n riskAnalysis: {\n riskScore: 3.2,\n diversificationScore: 7.8,\n volatilityScore: 2.5,\n recommendations: [\n 'Consider diversifying into more food categories',\n 'Your portfolio shows good risk distribution',\n 'Consider investing in carts from different locations',\n 'Monitor underperforming investments closely',\n 'Explore premium segment opportunities for higher returns',\n ],\n },\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getRiskLevel(score: number): { label: string; color: string } {\n if (score <= 2) return { label: 'Low Risk', color: 'text-status-success-text' };\n if (score <= 4) return { label: 'Moderate Risk', color: 'text-status-warning-text' };\n return { label: 'High Risk', color: 'text-status-error-text' };\n}\n\nfunction getRiskBgColor(score: number): string {\n if (score <= 2) return 'bg-status-success-text';\n if (score <= 4) return 'bg-status-warning-text';\n return 'bg-status-error-text';\n}\n\nfunction getDiversificationLevel(score: number): { label: string; color: string } {\n if (score >= 8) return { label: 'Well Diversified', color: 'text-status-success-text' };\n if (score >= 6) return { label: 'Moderately Diversified', color: 'text-status-warning-text' };\n return { label: 'Poorly Diversified', color: 'text-status-error-text' };\n}\n\nfunction getDiversificationBgColor(score: number): string {\n if (score >= 8) return 'bg-status-success-text';\n if (score >= 6) return 'bg-status-warning-text';\n return 'bg-status-error-text';\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function InvestorAnalyticsPage() {\n const { navigateTo } = useSubscriberBot();\n const [isLoading, setIsLoading] = useState(true);\n const [dateRange, setDateRange] = useState('6m');\n const [analytics, setAnalytics] = useState<AnalyticsData | null>(null);\n const [exportStatus, setExportStatus] = useState<'idle' | 'exporting' | 'done'>('idle');\n\n useEffect(() => {\n setIsLoading(true);\n const timer = setTimeout(() => {\n setAnalytics(mockAnalytics);\n setIsLoading(false);\n }, 600);\n return () => clearTimeout(timer);\n }, [dateRange]);\n\n const handleExportReport = useCallback(() => {\n setExportStatus('exporting');\n setTimeout(() => {\n setExportStatus('done');\n setTimeout(() => setExportStatus('idle'), 2000);\n }, 1200);\n }, []);\n\n if (isLoading || !analytics) {\n return (\n <PageLayout title=\"Investment Analytics\" description=\"Loading analytics...\">\n <div className=\"flex items-center justify-center py-20\">\n <div className=\"text-center\">\n <div className=\"mx-auto mb-4 h-12 w-12 animate-spin rounded-full border-b-2 border-primary\" />\n <p className=\"text-sm text-text-secondary\">Loading analytics data...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n const riskLevel = getRiskLevel(analytics.riskAnalysis.riskScore);\n const diversificationLevel = getDiversificationLevel(analytics.riskAnalysis.diversificationScore);\n\n // Sort carts by ROI for ranking\n const sortedCarts = [...analytics.performanceByCart].sort((a, b) => b.roi - a.roi);\n\n return (\n <PageLayout\n title=\"Investment Analytics\"\n description=\"Comprehensive analysis of your portfolio performance\"\n actions={\n <div className=\"flex items-center gap-3\">\n {/* Date Range Selector */}\n <select\n value={dateRange}\n onChange={(e) => setDateRange(e.target.value)}\n className=\"rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"1m\">Last Month</option>\n <option value=\"3m\">Last 3 Months</option>\n <option value=\"6m\">Last 6 Months</option>\n <option value=\"1y\">Last Year</option>\n <option value=\"all\">All Time</option>\n </select>\n\n {/* Export Button */}\n <button\n type=\"button\"\n onClick={handleExportReport}\n disabled={exportStatus === 'exporting'}\n className={cn(\n 'flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors',\n exportStatus === 'exporting'\n ? 'cursor-not-allowed bg-bg-sunken text-text-secondary'\n : exportStatus === 'done'\n ? 'bg-status-success-text text-text-inverse'\n : 'bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90'\n )}\n >\n <Download className=\"h-4 w-4\" />\n {exportStatus === 'exporting'\n ? 'Exporting...'\n : exportStatus === 'done'\n ? 'Exported!'\n : 'Export Report'}\n </button>\n </div>\n }\n >\n {/* Key Metrics */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <MetricsCard\n icon={<Wallet className=\"h-5 w-5\" />}\n value={formatCurrency(analytics.portfolioMetrics.totalValue, {\n minimumFractionDigits: 0,\n })}\n label=\"Portfolio Value\"\n trend=\"up\"\n trendValue={`+${analytics.portfolioMetrics.portfolioGrowth}% total growth`}\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={formatCurrency(analytics.portfolioMetrics.totalReturns, {\n minimumFractionDigits: 0,\n })}\n label=\"Total Returns\"\n trend=\"up\"\n trendValue=\"Profit earned so far\"\n />\n <MetricsCard\n icon={<Target className=\"h-5 w-5\" />}\n value={`${analytics.portfolioMetrics.averageRoi}%`}\n label=\"Average ROI\"\n trend=\"up\"\n trendValue=\"Across all investments\"\n />\n <MetricsCard\n icon={<Activity className=\"h-5 w-5\" />}\n value={`${analytics.riskAnalysis.riskScore}/5`}\n label=\"Risk Score\"\n trend=\"neutral\"\n trendValue={riskLevel.label}\n />\n </div>\n\n {/* Best / Worst Performers */}\n <div className=\"mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div className=\"flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-status-success-bg/10\">\n <ArrowUp className=\"h-5 w-5 text-status-success-text\" />\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Best Performing</p>\n <p className=\"text-sm font-semibold text-status-success-text\">\n {analytics.portfolioMetrics.bestPerforming}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-status-error-bg/10\">\n <ArrowDown className=\"h-5 w-5 text-status-error-text\" />\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Worst Performing</p>\n <p className=\"text-sm font-semibold text-text-primary\">\n {analytics.portfolioMetrics.worstPerforming}\n </p>\n </div>\n </div>\n </div>\n\n {/* Performance by Cart & Category Distribution */}\n <div className=\"mt-6 grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Performance by Cart */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <BarChart3 className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Performance by Cart</h2>\n </div>\n\n <div className=\"space-y-3\">\n {sortedCarts.map((cart, index) => (\n <div\n key={cart.cartName}\n className=\"flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface p-3\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-xs font-bold text-action-primary-text\">\n {index + 1}\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{cart.cartName}</p>\n <p className=\"text-xs text-text-secondary\">\n {formatCurrency(cart.investedAmount, { minimumFractionDigits: 0 })} invested\n </p>\n </div>\n </div>\n <div className=\"text-right\">\n <p\n className={cn(\n 'text-sm font-semibold',\n cart.returns >= 0 ? 'text-status-success-text' : 'text-status-error-text'\n )}\n >\n {cart.returns >= 0 ? '+' : ''}\n {formatCurrency(cart.returns, { minimumFractionDigits: 0 })}\n </p>\n <p\n className={cn(\n 'text-xs',\n cart.roi >= 0 ? 'text-status-success-text' : 'text-status-error-text'\n )}\n >\n {cart.roi >= 0 ? '+' : ''}\n {cart.roi}% ROI\n </p>\n </div>\n </div>\n ))}\n </div>\n </section>\n\n {/* Category Distribution */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <PieChart className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Category Distribution</h2>\n </div>\n\n <div className=\"space-y-4\">\n {analytics.performanceByCategory.map((category) => (\n <div\n key={category.category}\n className=\"rounded-lg border border-border-seam bg-bg-surface p-3\"\n >\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm font-medium text-text-primary\">{category.category}</span>\n <span className=\"text-sm text-text-secondary\">{category.percentage}%</span>\n </div>\n <div className=\"mb-2 h-2 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className=\"h-full rounded-full bg-action-primary-bg transition-all duration-300\"\n style={{ width: `${category.percentage}%` }}\n />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">\n {formatCurrency(category.investedAmount, { minimumFractionDigits: 0 })} invested\n </span>\n <span\n className={cn(\n 'text-xs font-semibold',\n category.returns >= 0 ? 'text-status-success-text' : 'text-status-error-text'\n )}\n >\n {category.returns >= 0 ? '+' : ''}\n {formatCurrency(category.returns, { minimumFractionDigits: 0 })}\n </span>\n </div>\n </div>\n ))}\n </div>\n </section>\n </div>\n\n {/* Monthly Performance Table */}\n <section className=\"mt-8\">\n <div className=\"mb-4 flex items-center gap-2\">\n <Calendar className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Portfolio Growth Trend</h2>\n </div>\n\n <div className=\"overflow-hidden rounded-lg border border-border-seam bg-bg-surface\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-seam bg-bg-sunken/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Month\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Invested\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Portfolio Value\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Returns\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Growth %\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {analytics.monthlyPerformance.map((month) => {\n const growthPct =\n month.invested > 0\n ? (((month.value - month.invested) / month.invested) * 100).toFixed(1)\n : '0.0';\n\n return (\n <tr key={month.month} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"whitespace-nowrap px-4 py-4 text-sm font-medium text-text-primary sm:px-6\">\n {month.month}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm text-text-primary sm:px-6\">\n {formatCurrency(month.invested, { minimumFractionDigits: 0 })}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm text-text-primary sm:px-6\">\n {formatCurrency(month.value, { minimumFractionDigits: 0 })}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm sm:px-6\">\n <span\n className={cn(\n 'font-semibold',\n month.returns >= 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {month.returns >= 0 ? '+' : ''}\n {formatCurrency(month.returns, { minimumFractionDigits: 0 })}\n </span>\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm sm:px-6\">\n <span\n className={cn(\n 'font-medium',\n parseFloat(growthPct) >= 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {parseFloat(growthPct) >= 0 ? '+' : ''}\n {growthPct}%\n </span>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n </section>\n\n {/* Risk Analysis & Diversification */}\n <div className=\"mt-8 grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Risk Analysis */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <Shield className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Risk Analysis</h2>\n </div>\n\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 sm:p-6\">\n <div className=\"space-y-5\">\n {/* Risk Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Risk Score</span>\n <span className={cn('text-sm font-semibold', riskLevel.color)}>\n {analytics.riskAnalysis.riskScore}/5 ({riskLevel.label})\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getRiskBgColor(analytics.riskAnalysis.riskScore)\n )}\n style={{ width: `${(analytics.riskAnalysis.riskScore / 5) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Diversification Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Diversification</span>\n <span className={cn('text-sm font-semibold', diversificationLevel.color)}>\n {analytics.riskAnalysis.diversificationScore}/10 ({diversificationLevel.label})\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getDiversificationBgColor(analytics.riskAnalysis.diversificationScore)\n )}\n style={{\n width: `${(analytics.riskAnalysis.diversificationScore / 10) * 100}%`,\n }}\n />\n </div>\n </div>\n\n {/* Volatility Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Volatility</span>\n <span\n className={cn(\n 'text-sm font-semibold',\n getRiskLevel(analytics.riskAnalysis.volatilityScore).color\n )}\n >\n {analytics.riskAnalysis.volatilityScore}/5\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getRiskBgColor(analytics.riskAnalysis.volatilityScore)\n )}\n style={{ width: `${(analytics.riskAnalysis.volatilityScore / 5) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Quick Stats */}\n <div className=\"grid grid-cols-2 gap-3 border-t border-border-seam pt-4\">\n <div className=\"rounded-lg bg-bg-sunken/50 p-3 text-center\">\n <p className=\"text-lg font-bold text-text-primary\">\n {analytics.performanceByCart.length}\n </p>\n <p className=\"text-xs text-text-secondary\">Active Investments</p>\n </div>\n <div className=\"rounded-lg bg-bg-sunken/50 p-3 text-center\">\n <p className=\"text-lg font-bold text-text-primary\">\n {analytics.performanceByCategory.length}\n </p>\n <p className=\"text-xs text-text-secondary\">Sectors Covered</p>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Recommendations */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <Lightbulb className=\"h-5 w-5 text-status-warning-text\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Recommendations</h2>\n </div>\n\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 sm:p-6\">\n <div className=\"space-y-3\">\n {analytics.riskAnalysis.recommendations.map((recommendation, index) => (\n <div\n key={index}\n className=\"flex items-start gap-3 rounded-lg border border-border-seam bg-bg-sunken/30 p-3\"\n >\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-xs font-bold text-action-primary-text\">\n {index + 1}\n </div>\n <p className=\"text-sm leading-relaxed text-text-primary\">{recommendation}</p>\n </div>\n ))}\n </div>\n\n {/* Overall Assessment */}\n <div className=\"mt-5 rounded-lg border border-border-seam bg-bg-sunken/50 p-4\">\n <h4 className=\"mb-2 text-sm font-semibold text-text-primary\">Overall Assessment</h4>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Portfolio Health</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn(\n 'h-2 w-4 rounded-sm',\n i <= 4 ? 'bg-status-success-text' : 'bg-bg-sunken'\n )}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">4/5</span>\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Growth Potential</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn(\n 'h-2 w-4 rounded-sm',\n i <= 3 ? 'bg-status-warning-text' : 'bg-bg-sunken'\n )}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">3/5</span>\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Income Stability</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn(\n 'h-2 w-4 rounded-sm',\n i <= 4 ? 'bg-status-success-text' : 'bg-bg-sunken'\n )}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">4/5</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n </div>\n\n {/* Quick Navigation */}\n <div className=\"mt-8 flex flex-wrap gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/portfolio')}\n className=\"flex items-center gap-2 rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <PieChart className=\"h-4 w-4\" />\n View Portfolio\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n className=\"flex items-center gap-2 rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Target className=\"h-4 w-4\" />\n Browse Opportunities\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/investments')}\n className=\"flex items-center gap-2 rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Wallet className=\"h-4 w-4\" />\n My Investments\n </button>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -63,9 +63,9 @@ var T = [
|
|
|
63
63
|
];
|
|
64
64
|
function D(e) {
|
|
65
65
|
switch (e) {
|
|
66
|
-
case "active": return "bg-
|
|
67
|
-
case "pending": return "bg-
|
|
68
|
-
case "completed": return "bg-
|
|
66
|
+
case "active": return "bg-status-success-bg/20 text-status-success-text";
|
|
67
|
+
case "pending": return "bg-status-warning-bg/20 text-status-warning-text";
|
|
68
|
+
case "completed": return "bg-status-info-bg/20 text-status-info-text";
|
|
69
69
|
default: return "bg-secondary text-secondary-foreground";
|
|
70
70
|
}
|
|
71
71
|
}
|
|
@@ -88,7 +88,7 @@ function O() {
|
|
|
88
88
|
children: /* @__PURE__ */ w("div", {
|
|
89
89
|
className: "text-center",
|
|
90
90
|
children: [/* @__PURE__ */ C("div", { className: "mx-auto mb-4 h-12 w-12 animate-spin rounded-full border-b-2 border-primary" }), /* @__PURE__ */ C("p", {
|
|
91
|
-
className: "text-sm text-
|
|
91
|
+
className: "text-sm text-text-secondary",
|
|
92
92
|
children: "Loading your portfolio..."
|
|
93
93
|
})]
|
|
94
94
|
})
|
|
@@ -96,8 +96,9 @@ function O() {
|
|
|
96
96
|
}) : /* @__PURE__ */ w(n, {
|
|
97
97
|
title: `Welcome back, ${I}!`,
|
|
98
98
|
description: "Here's your investment portfolio overview.",
|
|
99
|
+
titleGradient: !0,
|
|
99
100
|
children: [/* @__PURE__ */ w("section", { children: [/* @__PURE__ */ C("h2", {
|
|
100
|
-
className: "mb-4 text-lg font-semibold text-
|
|
101
|
+
className: "mb-4 text-lg font-semibold text-text-primary",
|
|
101
102
|
children: "Portfolio Overview"
|
|
102
103
|
}), /* @__PURE__ */ w("div", {
|
|
103
104
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
@@ -137,16 +138,16 @@ function O() {
|
|
|
137
138
|
className: "lg:col-span-2",
|
|
138
139
|
children: [
|
|
139
140
|
/* @__PURE__ */ w("div", {
|
|
140
|
-
className: "mb-6 flex rounded-lg bg-
|
|
141
|
+
className: "mb-6 flex rounded-lg bg-bg-sunken p-1",
|
|
141
142
|
children: [/* @__PURE__ */ C("button", {
|
|
142
143
|
type: "button",
|
|
143
144
|
onClick: () => j("portfolio"),
|
|
144
|
-
className: t("flex-1 rounded-md px-4 py-2 text-sm font-medium transition-colors", A === "portfolio" ? "bg-
|
|
145
|
+
className: t("flex-1 rounded-md px-4 py-2 text-sm font-medium transition-colors", A === "portfolio" ? "bg-bg-surface text-text-primary shadow-sm" : "text-text-secondary hover:text-text-primary"),
|
|
145
146
|
children: "My Investments"
|
|
146
147
|
}), /* @__PURE__ */ C("button", {
|
|
147
148
|
type: "button",
|
|
148
149
|
onClick: () => j("opportunities"),
|
|
149
|
-
className: t("flex-1 rounded-md px-4 py-2 text-sm font-medium transition-colors", A === "opportunities" ? "bg-
|
|
150
|
+
className: t("flex-1 rounded-md px-4 py-2 text-sm font-medium transition-colors", A === "opportunities" ? "bg-bg-surface text-text-primary shadow-sm" : "text-text-secondary hover:text-text-primary"),
|
|
150
151
|
children: "New Opportunities"
|
|
151
152
|
})]
|
|
152
153
|
}),
|
|
@@ -155,20 +156,20 @@ function O() {
|
|
|
155
156
|
children: [/* @__PURE__ */ w("div", {
|
|
156
157
|
className: "flex items-center justify-between",
|
|
157
158
|
children: [/* @__PURE__ */ C("h3", {
|
|
158
|
-
className: "text-base font-semibold text-
|
|
159
|
+
className: "text-base font-semibold text-text-primary",
|
|
159
160
|
children: "Active Investments"
|
|
160
161
|
}), /* @__PURE__ */ w("button", {
|
|
161
162
|
type: "button",
|
|
162
163
|
onClick: () => alert("Filter functionality coming soon!"),
|
|
163
|
-
className: "flex items-center gap-2 rounded-lg border border-border px-3 py-2 text-sm font-medium text-
|
|
164
|
+
className: "flex items-center gap-2 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
164
165
|
children: [/* @__PURE__ */ C(h, { className: "h-4 w-4" }), "Filter"]
|
|
165
166
|
})]
|
|
166
167
|
}), P.length === 0 ? /* @__PURE__ */ w("div", {
|
|
167
|
-
className: "rounded-lg border border-dashed border-border p-8 text-center",
|
|
168
|
+
className: "rounded-lg border border-dashed border-border-seam p-8 text-center",
|
|
168
169
|
children: [
|
|
169
|
-
/* @__PURE__ */ C(p, { className: "mx-auto h-12 w-12 text-
|
|
170
|
+
/* @__PURE__ */ C(p, { className: "mx-auto h-12 w-12 text-text-secondary opacity-20" }),
|
|
170
171
|
/* @__PURE__ */ C("p", {
|
|
171
|
-
className: "mt-2 text-sm text-
|
|
172
|
+
className: "mt-2 text-sm text-text-secondary",
|
|
172
173
|
children: "No active investments found."
|
|
173
174
|
}),
|
|
174
175
|
/* @__PURE__ */ C("button", {
|
|
@@ -179,7 +180,7 @@ function O() {
|
|
|
179
180
|
})
|
|
180
181
|
]
|
|
181
182
|
}) : P.map((e) => /* @__PURE__ */ w("div", {
|
|
182
|
-
className: "rounded-lg border border-border bg-
|
|
183
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm hover:shadow-md transition-shadow",
|
|
183
184
|
children: [/* @__PURE__ */ w("div", {
|
|
184
185
|
className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",
|
|
185
186
|
children: [/* @__PURE__ */ w("div", {
|
|
@@ -187,14 +188,14 @@ function O() {
|
|
|
187
188
|
children: [/* @__PURE__ */ w("div", {
|
|
188
189
|
className: "mb-2 flex flex-wrap items-center gap-2",
|
|
189
190
|
children: [/* @__PURE__ */ C("h4", {
|
|
190
|
-
className: "text-base font-semibold text-
|
|
191
|
+
className: "text-base font-semibold text-text-primary",
|
|
191
192
|
children: e.cartName
|
|
192
193
|
}), /* @__PURE__ */ C("span", {
|
|
193
194
|
className: t("rounded-full px-2 py-0.5 text-xs font-medium", D(e.status)),
|
|
194
195
|
children: e.status
|
|
195
196
|
})]
|
|
196
197
|
}), /* @__PURE__ */ w("div", {
|
|
197
|
-
className: "mb-3 flex flex-wrap items-center gap-3 text-xs text-
|
|
198
|
+
className: "mb-3 flex flex-wrap items-center gap-3 text-xs text-text-secondary",
|
|
198
199
|
children: [/* @__PURE__ */ w("span", {
|
|
199
200
|
className: "flex items-center gap-1",
|
|
200
201
|
children: [/* @__PURE__ */ C(v, { className: "h-3.5 w-3.5" }), "India"]
|
|
@@ -203,38 +204,38 @@ function O() {
|
|
|
203
204
|
}), /* @__PURE__ */ w("button", {
|
|
204
205
|
type: "button",
|
|
205
206
|
onClick: () => O(`/investor/investments/${e.id}`),
|
|
206
|
-
className: "flex items-center gap-2 rounded-lg border border-border px-3 py-2 text-sm font-medium text-
|
|
207
|
+
className: "flex items-center gap-2 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
207
208
|
children: [/* @__PURE__ */ C(m, { className: "h-4 w-4" }), "View Details"]
|
|
208
209
|
})]
|
|
209
210
|
}), /* @__PURE__ */ w("div", {
|
|
210
211
|
className: "grid grid-cols-2 gap-3 sm:grid-cols-4",
|
|
211
212
|
children: [
|
|
212
213
|
/* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
213
|
-
className: "text-xs text-
|
|
214
|
+
className: "text-xs text-text-secondary",
|
|
214
215
|
children: "Invested"
|
|
215
216
|
}), /* @__PURE__ */ C("p", {
|
|
216
|
-
className: "text-sm font-semibold text-
|
|
217
|
+
className: "text-sm font-semibold text-text-primary",
|
|
217
218
|
children: o(e.investedAmount, { minimumFractionDigits: 0 })
|
|
218
219
|
})] }),
|
|
219
220
|
/* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
220
|
-
className: "text-xs text-
|
|
221
|
+
className: "text-xs text-text-secondary",
|
|
221
222
|
children: "Current Value"
|
|
222
223
|
}), /* @__PURE__ */ C("p", {
|
|
223
|
-
className: "text-sm font-semibold text-
|
|
224
|
+
className: "text-sm font-semibold text-status-success-text",
|
|
224
225
|
children: o(e.currentValue, { minimumFractionDigits: 0 })
|
|
225
226
|
})] }),
|
|
226
227
|
/* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
227
|
-
className: "text-xs text-
|
|
228
|
+
className: "text-xs text-text-secondary",
|
|
228
229
|
children: "Returns"
|
|
229
230
|
}), /* @__PURE__ */ C("p", {
|
|
230
|
-
className: "text-sm font-semibold text-
|
|
231
|
+
className: "text-sm font-semibold text-text-primary",
|
|
231
232
|
children: o(e.returns, { minimumFractionDigits: 0 })
|
|
232
233
|
})] }),
|
|
233
234
|
/* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
234
|
-
className: "text-xs text-
|
|
235
|
+
className: "text-xs text-text-secondary",
|
|
235
236
|
children: "Growth"
|
|
236
237
|
}), /* @__PURE__ */ w("p", {
|
|
237
|
-
className: "text-sm font-semibold text-
|
|
238
|
+
className: "text-sm font-semibold text-status-success-text",
|
|
238
239
|
children: [e.returnsPercentage, "%"]
|
|
239
240
|
})] })
|
|
240
241
|
]
|
|
@@ -246,12 +247,12 @@ function O() {
|
|
|
246
247
|
children: [/* @__PURE__ */ w("div", {
|
|
247
248
|
className: "flex items-center justify-between",
|
|
248
249
|
children: [/* @__PURE__ */ C("h3", {
|
|
249
|
-
className: "text-base font-semibold text-
|
|
250
|
+
className: "text-base font-semibold text-text-primary",
|
|
250
251
|
children: "Investment Opportunities"
|
|
251
252
|
}), /* @__PURE__ */ w("button", {
|
|
252
253
|
type: "button",
|
|
253
254
|
onClick: () => O("/investor/opportunities"),
|
|
254
|
-
className: "flex items-center gap-2 rounded-lg bg-primary px-4 py-2 text-sm font-medium text-primary-
|
|
255
|
+
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",
|
|
255
256
|
children: [/* @__PURE__ */ C(b, { className: "h-4 w-4" }), "Browse All"]
|
|
256
257
|
})]
|
|
257
258
|
}), /* @__PURE__ */ C("div", {
|
|
@@ -271,22 +272,22 @@ function O() {
|
|
|
271
272
|
/* @__PURE__ */ w("section", {
|
|
272
273
|
className: "mt-8",
|
|
273
274
|
children: [/* @__PURE__ */ C("h2", {
|
|
274
|
-
className: "mb-4 text-lg font-semibold text-
|
|
275
|
+
className: "mb-4 text-lg font-semibold text-text-primary",
|
|
275
276
|
children: "Recent Activity"
|
|
276
277
|
}), /* @__PURE__ */ C("div", {
|
|
277
|
-
className: "divide-y divide-border rounded-lg border border-border bg-
|
|
278
|
+
className: "divide-y divide-border rounded-lg border border-border-seam bg-bg-surface",
|
|
278
279
|
children: E.map((e) => /* @__PURE__ */ w("div", {
|
|
279
280
|
className: "flex items-center justify-between px-4 py-3",
|
|
280
281
|
children: [/* @__PURE__ */ w("div", {
|
|
281
282
|
className: "flex items-center gap-3",
|
|
282
283
|
children: [/* @__PURE__ */ C("div", {
|
|
283
|
-
className: t("flex h-8 w-8 items-center justify-center rounded-full", e.amount > 0 ? "bg-
|
|
284
|
-
children: /* @__PURE__ */ C(u, { className: t("h-4 w-4", e.amount > 0 ? "text-
|
|
284
|
+
className: t("flex h-8 w-8 items-center justify-center rounded-full", e.amount > 0 ? "bg-status-success-bg/10" : "bg-bg-sunken"),
|
|
285
|
+
children: /* @__PURE__ */ C(u, { className: t("h-4 w-4", e.amount > 0 ? "text-status-success-text" : "text-text-secondary") })
|
|
285
286
|
}), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
286
|
-
className: "text-sm font-medium text-
|
|
287
|
+
className: "text-sm font-medium text-text-primary",
|
|
287
288
|
children: e.description
|
|
288
289
|
}), /* @__PURE__ */ C("p", {
|
|
289
|
-
className: "text-xs text-
|
|
290
|
+
className: "text-xs text-text-secondary",
|
|
290
291
|
children: new Date(e.date).toLocaleDateString("en-IN", {
|
|
291
292
|
day: "numeric",
|
|
292
293
|
month: "short",
|
|
@@ -294,7 +295,7 @@ function O() {
|
|
|
294
295
|
})
|
|
295
296
|
})] })]
|
|
296
297
|
}), /* @__PURE__ */ w("span", {
|
|
297
|
-
className: t("text-sm font-semibold", e.amount > 0 ? "text-
|
|
298
|
+
className: t("text-sm font-semibold", e.amount > 0 ? "text-status-success-text" : "text-text-primary"),
|
|
298
299
|
children: [e.amount > 0 ? "+" : "", o(Math.abs(e.amount), { minimumFractionDigits: 0 })]
|
|
299
300
|
})]
|
|
300
301
|
}, e.id))
|
|
@@ -305,37 +306,37 @@ function O() {
|
|
|
305
306
|
className: "space-y-6",
|
|
306
307
|
children: [
|
|
307
308
|
/* @__PURE__ */ w("div", {
|
|
308
|
-
className: "rounded-lg border border-border bg-
|
|
309
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-4",
|
|
309
310
|
children: [/* @__PURE__ */ w("div", {
|
|
310
311
|
className: "mb-3 flex items-center gap-2",
|
|
311
|
-
children: [/* @__PURE__ */ C(_, { className: "h-5 w-5 text-
|
|
312
|
-
className: "text-base font-semibold text-
|
|
312
|
+
children: [/* @__PURE__ */ C(_, { className: "h-5 w-5 text-status-warning-text" }), /* @__PURE__ */ C("h3", {
|
|
313
|
+
className: "text-base font-semibold text-text-primary",
|
|
313
314
|
children: "AI Insights"
|
|
314
315
|
})]
|
|
315
316
|
}), /* @__PURE__ */ C("div", {
|
|
316
317
|
className: "space-y-3",
|
|
317
318
|
children: T.map((e) => /* @__PURE__ */ w("div", {
|
|
318
|
-
className: "rounded-lg border border-border bg-
|
|
319
|
+
className: "rounded-lg border border-border-seam bg-bg-sunken/50 p-3",
|
|
319
320
|
children: [/* @__PURE__ */ w("div", {
|
|
320
321
|
className: "mb-1 flex items-center justify-between",
|
|
321
322
|
children: [/* @__PURE__ */ C("h4", {
|
|
322
|
-
className: "text-xs font-semibold text-
|
|
323
|
+
className: "text-xs font-semibold text-text-primary",
|
|
323
324
|
children: e.title
|
|
324
325
|
}), /* @__PURE__ */ w("span", {
|
|
325
|
-
className: "rounded-full bg-primary/10 px-2 py-0.5 text-xs font-medium text-primary",
|
|
326
|
+
className: "rounded-full bg-action-primary-bg/10 px-2 py-0.5 text-xs font-medium text-primary",
|
|
326
327
|
children: [e.confidence, "%"]
|
|
327
328
|
})]
|
|
328
329
|
}), /* @__PURE__ */ C("p", {
|
|
329
|
-
className: "text-xs leading-relaxed text-
|
|
330
|
+
className: "text-xs leading-relaxed text-text-secondary",
|
|
330
331
|
children: e.description
|
|
331
332
|
})]
|
|
332
333
|
}, e.id))
|
|
333
334
|
})]
|
|
334
335
|
}),
|
|
335
336
|
/* @__PURE__ */ w("div", {
|
|
336
|
-
className: "rounded-lg border border-border bg-
|
|
337
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-4",
|
|
337
338
|
children: [/* @__PURE__ */ C("h3", {
|
|
338
|
-
className: "mb-3 text-base font-semibold text-
|
|
339
|
+
className: "mb-3 text-base font-semibold text-text-primary",
|
|
339
340
|
children: "Quick Actions"
|
|
340
341
|
}), /* @__PURE__ */ w("div", {
|
|
341
342
|
className: "space-y-2",
|
|
@@ -343,65 +344,65 @@ function O() {
|
|
|
343
344
|
/* @__PURE__ */ w("button", {
|
|
344
345
|
type: "button",
|
|
345
346
|
onClick: () => O("/investor/portfolio"),
|
|
346
|
-
className: "flex w-full items-center gap-2 rounded-lg border border-border px-3 py-2.5 text-left text-sm font-medium text-
|
|
347
|
-
children: [/* @__PURE__ */ C(y, { className: "h-4 w-4 text-
|
|
347
|
+
className: "flex w-full items-center gap-2 rounded-lg border border-border-seam px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
348
|
+
children: [/* @__PURE__ */ C(y, { className: "h-4 w-4 text-text-secondary" }), "View Full Portfolio"]
|
|
348
349
|
}),
|
|
349
350
|
/* @__PURE__ */ w("button", {
|
|
350
351
|
type: "button",
|
|
351
352
|
onClick: () => O("/investor/opportunities"),
|
|
352
|
-
className: "flex w-full items-center gap-2 rounded-lg border border-border px-3 py-2.5 text-left text-sm font-medium text-
|
|
353
|
-
children: [/* @__PURE__ */ C(x, { className: "h-4 w-4 text-
|
|
353
|
+
className: "flex w-full items-center gap-2 rounded-lg border border-border-seam px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
354
|
+
children: [/* @__PURE__ */ C(x, { className: "h-4 w-4 text-text-secondary" }), "Browse Opportunities"]
|
|
354
355
|
}),
|
|
355
356
|
/* @__PURE__ */ w("button", {
|
|
356
357
|
type: "button",
|
|
357
358
|
onClick: () => O("/investor/analytics"),
|
|
358
|
-
className: "flex w-full items-center gap-2 rounded-lg border border-border px-3 py-2.5 text-left text-sm font-medium text-
|
|
359
|
-
children: [/* @__PURE__ */ C(f, { className: "h-4 w-4 text-
|
|
359
|
+
className: "flex w-full items-center gap-2 rounded-lg border border-border-seam px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
360
|
+
children: [/* @__PURE__ */ C(f, { className: "h-4 w-4 text-text-secondary" }), "Investment Analytics"]
|
|
360
361
|
}),
|
|
361
362
|
/* @__PURE__ */ w("button", {
|
|
362
363
|
type: "button",
|
|
363
364
|
onClick: () => O("/investor/profile"),
|
|
364
|
-
className: "flex w-full items-center gap-2 rounded-lg border border-border px-3 py-2.5 text-left text-sm font-medium text-
|
|
365
|
-
children: [/* @__PURE__ */ C(d, { className: "h-4 w-4 text-
|
|
365
|
+
className: "flex w-full items-center gap-2 rounded-lg border border-border-seam px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
366
|
+
children: [/* @__PURE__ */ C(d, { className: "h-4 w-4 text-text-secondary" }), "View Profile"]
|
|
366
367
|
})
|
|
367
368
|
]
|
|
368
369
|
})]
|
|
369
370
|
}),
|
|
370
371
|
/* @__PURE__ */ w("div", {
|
|
371
|
-
className: "rounded-lg border border-border bg-
|
|
372
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-4",
|
|
372
373
|
children: [/* @__PURE__ */ C("h3", {
|
|
373
|
-
className: "mb-3 text-base font-semibold text-
|
|
374
|
+
className: "mb-3 text-base font-semibold text-text-primary",
|
|
374
375
|
children: "Market Updates"
|
|
375
376
|
}), /* @__PURE__ */ w("div", {
|
|
376
377
|
className: "space-y-3",
|
|
377
378
|
children: [
|
|
378
379
|
/* @__PURE__ */ w("div", {
|
|
379
|
-
className: "border-l-4 border-
|
|
380
|
+
className: "border-l-4 border-status-success-border pl-3",
|
|
380
381
|
children: [/* @__PURE__ */ C("h4", {
|
|
381
|
-
className: "text-xs font-semibold text-
|
|
382
|
+
className: "text-xs font-semibold text-text-primary",
|
|
382
383
|
children: "Mobile Services Market Growing"
|
|
383
384
|
}), /* @__PURE__ */ C("p", {
|
|
384
|
-
className: "mt-1 text-xs leading-relaxed text-
|
|
385
|
+
className: "mt-1 text-xs leading-relaxed text-text-secondary",
|
|
385
386
|
children: "Mobile service industry shows 35% growth in Q4 2024"
|
|
386
387
|
})]
|
|
387
388
|
}),
|
|
388
389
|
/* @__PURE__ */ w("div", {
|
|
389
|
-
className: "border-l-4 border-
|
|
390
|
+
className: "border-l-4 border-status-info-border pl-3",
|
|
390
391
|
children: [/* @__PURE__ */ C("h4", {
|
|
391
|
-
className: "text-xs font-semibold text-
|
|
392
|
+
className: "text-xs font-semibold text-text-primary",
|
|
392
393
|
children: "New Investment Tax Benefits"
|
|
393
394
|
}), /* @__PURE__ */ C("p", {
|
|
394
|
-
className: "mt-1 text-xs leading-relaxed text-
|
|
395
|
+
className: "mt-1 text-xs leading-relaxed text-text-secondary",
|
|
395
396
|
children: "Government announces SME investment incentives"
|
|
396
397
|
})]
|
|
397
398
|
}),
|
|
398
399
|
/* @__PURE__ */ w("div", {
|
|
399
|
-
className: "border-l-4 border-
|
|
400
|
+
className: "border-l-4 border-status-warning-border pl-3",
|
|
400
401
|
children: [/* @__PURE__ */ C("h4", {
|
|
401
|
-
className: "text-xs font-semibold text-
|
|
402
|
+
className: "text-xs font-semibold text-text-primary",
|
|
402
403
|
children: "Home Services Demand Surge"
|
|
403
404
|
}), /* @__PURE__ */ C("p", {
|
|
404
|
-
className: "mt-1 text-xs leading-relaxed text-
|
|
405
|
+
className: "mt-1 text-xs leading-relaxed text-text-secondary",
|
|
405
406
|
children: "Cleaning and maintenance businesses up 25% this quarter"
|
|
406
407
|
})]
|
|
407
408
|
})
|