@burdenoff/microfe-coolandlovely 2026.625.2 → 2026.628.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/coolandlovely/CoolAndLovelyRoot.js +66 -122
- package/dist/coolandlovely/CoolAndLovelyRoot.js.map +1 -1
- package/dist/coolandlovely/CoolAndLovelyRoutes.js +87 -175
- package/dist/coolandlovely/CoolAndLovelyRoutes.js.map +1 -1
- package/dist/coolandlovely/components/Field.js +81 -0
- package/dist/coolandlovely/components/Field.js.map +1 -0
- package/dist/coolandlovely/components/StateViews.js +34 -0
- package/dist/coolandlovely/components/StateViews.js.map +1 -0
- package/dist/coolandlovely/components/StatusBadge.js +25 -22
- package/dist/coolandlovely/components/StatusBadge.js.map +1 -1
- package/dist/coolandlovely/components/TagList.js +21 -0
- package/dist/coolandlovely/components/TagList.js.map +1 -0
- package/dist/coolandlovely/components/Thumbnail.js +29 -0
- package/dist/coolandlovely/components/Thumbnail.js.map +1 -0
- package/dist/coolandlovely/context/CoolAndLovelyContext.js +10 -10
- package/dist/coolandlovely/context/CoolAndLovelyContext.js.map +1 -1
- package/dist/coolandlovely/hooks/index.js +1 -0
- package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js +462 -169
- package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js.map +1 -1
- package/dist/coolandlovely/pages/HomePage.js +251 -845
- package/dist/coolandlovely/pages/HomePage.js.map +1 -1
- package/dist/coolandlovely/pages/brands/BrandDetailPage.js +319 -0
- package/dist/coolandlovely/pages/brands/BrandDetailPage.js.map +1 -0
- package/dist/coolandlovely/pages/brands/BrandFormPage.js +190 -0
- package/dist/coolandlovely/pages/brands/BrandFormPage.js.map +1 -0
- package/dist/coolandlovely/pages/brands/BrandsListPage.js +158 -0
- package/dist/coolandlovely/pages/brands/BrandsListPage.js.map +1 -0
- package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.js +253 -0
- package/dist/coolandlovely/pages/collaborations/CollaborationDetailPage.js.map +1 -0
- package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.js +206 -0
- package/dist/coolandlovely/pages/collaborations/CollaborationFormPage.js.map +1 -0
- package/dist/coolandlovely/pages/collaborations/CollaborationsListPage.js +129 -0
- package/dist/coolandlovely/pages/collaborations/CollaborationsListPage.js.map +1 -0
- package/dist/coolandlovely/pages/collections/CollectionDetailPage.js +217 -0
- package/dist/coolandlovely/pages/collections/CollectionDetailPage.js.map +1 -0
- package/dist/coolandlovely/pages/collections/CollectionFormPage.js +217 -0
- package/dist/coolandlovely/pages/collections/CollectionFormPage.js.map +1 -0
- package/dist/coolandlovely/pages/collections/CollectionsListPage.js +122 -0
- package/dist/coolandlovely/pages/collections/CollectionsListPage.js.map +1 -0
- package/dist/coolandlovely/pages/items/StyleItemDetailPage.js +230 -0
- package/dist/coolandlovely/pages/items/StyleItemDetailPage.js.map +1 -0
- package/dist/coolandlovely/pages/items/StyleItemFormPage.js +276 -0
- package/dist/coolandlovely/pages/items/StyleItemFormPage.js.map +1 -0
- package/dist/coolandlovely/pages/items/StyleItemsListPage.js +170 -0
- package/dist/coolandlovely/pages/items/StyleItemsListPage.js.map +1 -0
- package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.js +124 -0
- package/dist/coolandlovely/pages/lookbooks/LookbookDetailPage.js.map +1 -0
- package/dist/coolandlovely/pages/lookbooks/LookbooksListPage.js +156 -0
- package/dist/coolandlovely/pages/lookbooks/LookbooksListPage.js.map +1 -0
- package/dist/coolandlovely/pages/looks/LookDetailPage.js +238 -0
- package/dist/coolandlovely/pages/looks/LookDetailPage.js.map +1 -0
- package/dist/coolandlovely/pages/looks/LookFormPage.js +209 -0
- package/dist/coolandlovely/pages/looks/LookFormPage.js.map +1 -0
- package/dist/coolandlovely/pages/looks/LooksListPage.js +181 -0
- package/dist/coolandlovely/pages/looks/LooksListPage.js.map +1 -0
- package/dist/coolandlovely/pages/profile/StyleProfilePage.js +224 -0
- package/dist/coolandlovely/pages/profile/StyleProfilePage.js.map +1 -0
- package/dist/coolandlovely/pages/wardrobe/WardrobeFormPage.js +173 -0
- package/dist/coolandlovely/pages/wardrobe/WardrobeFormPage.js.map +1 -0
- package/dist/coolandlovely/pages/wardrobe/WardrobeListPage.js +172 -0
- package/dist/coolandlovely/pages/wardrobe/WardrobeListPage.js.map +1 -0
- package/dist/coolandlovely/store/coolandlovelyStore.js +2 -6
- package/dist/coolandlovely/store/coolandlovelyStore.js.map +1 -1
- package/dist/coolandlovely/utils/formatters.js +31 -23
- package/dist/coolandlovely/utils/formatters.js.map +1 -1
- package/dist/coolandlovely/utils/icons.js +34 -0
- package/dist/coolandlovely/utils/icons.js.map +1 -0
- package/dist/index.js +4 -4
- package/package.json +1 -1
- package/dist/coolandlovely/components/InvestmentCard.js +0 -98
- package/dist/coolandlovely/components/InvestmentCard.js.map +0 -1
- package/dist/coolandlovely/components/RatingDisplay.js +0 -35
- package/dist/coolandlovely/components/RatingDisplay.js.map +0 -1
- package/dist/coolandlovely/mocks/data.js +0 -1517
- package/dist/coolandlovely/mocks/data.js.map +0 -1
- package/dist/coolandlovely/mocks/users.js +0 -34
- package/dist/coolandlovely/mocks/users.js.map +0 -1
- package/dist/coolandlovely/pages/admin/AdminAnalyticsPage.js +0 -651
- package/dist/coolandlovely/pages/admin/AdminAnalyticsPage.js.map +0 -1
- package/dist/coolandlovely/pages/admin/AdminDashboard.js +0 -673
- package/dist/coolandlovely/pages/admin/AdminDashboard.js.map +0 -1
- package/dist/coolandlovely/pages/admin/AdminFinancialPage.js +0 -427
- package/dist/coolandlovely/pages/admin/AdminFinancialPage.js.map +0 -1
- package/dist/coolandlovely/pages/admin/AdminOrdersPage.js +0 -665
- package/dist/coolandlovely/pages/admin/AdminOrdersPage.js.map +0 -1
- package/dist/coolandlovely/pages/admin/AdminProfilePage.js +0 -264
- package/dist/coolandlovely/pages/admin/AdminProfilePage.js.map +0 -1
- package/dist/coolandlovely/pages/admin/AdminSettingsPage.js +0 -654
- package/dist/coolandlovely/pages/admin/AdminSettingsPage.js.map +0 -1
- package/dist/coolandlovely/pages/admin/CartManagementPage.js +0 -874
- package/dist/coolandlovely/pages/admin/CartManagementPage.js.map +0 -1
- package/dist/coolandlovely/pages/admin/UserManagementPage.js +0 -898
- package/dist/coolandlovely/pages/admin/UserManagementPage.js.map +0 -1
- package/dist/coolandlovely/pages/cart-owner/AnalyticsDashboard.js +0 -842
- package/dist/coolandlovely/pages/cart-owner/AnalyticsDashboard.js.map +0 -1
- package/dist/coolandlovely/pages/cart-owner/BusinessSettingsPage.js +0 -705
- package/dist/coolandlovely/pages/cart-owner/BusinessSettingsPage.js.map +0 -1
- package/dist/coolandlovely/pages/cart-owner/CartOwnerDashboard.js +0 -802
- package/dist/coolandlovely/pages/cart-owner/CartOwnerDashboard.js.map +0 -1
- package/dist/coolandlovely/pages/cart-owner/CartOwnerProfilePage.js +0 -891
- package/dist/coolandlovely/pages/cart-owner/CartOwnerProfilePage.js.map +0 -1
- package/dist/coolandlovely/pages/cart-owner/CartServiceConfigPage.js +0 -639
- package/dist/coolandlovely/pages/cart-owner/CartServiceConfigPage.js.map +0 -1
- package/dist/coolandlovely/pages/cart-owner/InventoryManagementPage.js +0 -914
- package/dist/coolandlovely/pages/cart-owner/InventoryManagementPage.js.map +0 -1
- package/dist/coolandlovely/pages/cart-owner/OrderManagementPage.js +0 -882
- package/dist/coolandlovely/pages/cart-owner/OrderManagementPage.js.map +0 -1
- package/dist/coolandlovely/pages/cart-owner/StaffManagementPage.js +0 -831
- package/dist/coolandlovely/pages/cart-owner/StaffManagementPage.js.map +0 -1
- package/dist/coolandlovely/pages/common/HelpSupportPage.js +0 -1325
- package/dist/coolandlovely/pages/common/HelpSupportPage.js.map +0 -1
- package/dist/coolandlovely/pages/common/NotificationCenterPage.js +0 -671
- package/dist/coolandlovely/pages/common/NotificationCenterPage.js.map +0 -1
- package/dist/coolandlovely/pages/common/SettingsPage.js +0 -973
- package/dist/coolandlovely/pages/common/SettingsPage.js.map +0 -1
- package/dist/coolandlovely/pages/customer/BookingDetailsPage.js +0 -630
- package/dist/coolandlovely/pages/customer/BookingDetailsPage.js.map +0 -1
- package/dist/coolandlovely/pages/customer/CartDetailPage.js +0 -623
- package/dist/coolandlovely/pages/customer/CartDetailPage.js.map +0 -1
- package/dist/coolandlovely/pages/customer/CartDiscoveryPage.js +0 -558
- package/dist/coolandlovely/pages/customer/CartDiscoveryPage.js.map +0 -1
- package/dist/coolandlovely/pages/customer/CheckoutPage.js +0 -529
- package/dist/coolandlovely/pages/customer/CheckoutPage.js.map +0 -1
- package/dist/coolandlovely/pages/customer/CustomerDashboard.js +0 -538
- package/dist/coolandlovely/pages/customer/CustomerDashboard.js.map +0 -1
- package/dist/coolandlovely/pages/customer/CustomerProfilePage.js +0 -658
- package/dist/coolandlovely/pages/customer/CustomerProfilePage.js.map +0 -1
- package/dist/coolandlovely/pages/customer/DirectServiceBookingPage.js +0 -632
- package/dist/coolandlovely/pages/customer/DirectServiceBookingPage.js.map +0 -1
- package/dist/coolandlovely/pages/customer/FavoritesPage.js +0 -487
- package/dist/coolandlovely/pages/customer/FavoritesPage.js.map +0 -1
- package/dist/coolandlovely/pages/customer/OrderHistoryPage.js +0 -447
- package/dist/coolandlovely/pages/customer/OrderHistoryPage.js.map +0 -1
- package/dist/coolandlovely/pages/customer/OrderTrackingPage.js +0 -425
- package/dist/coolandlovely/pages/customer/OrderTrackingPage.js.map +0 -1
- package/dist/coolandlovely/pages/customer/PaymentMethodsPage.js +0 -494
- package/dist/coolandlovely/pages/customer/PaymentMethodsPage.js.map +0 -1
- package/dist/coolandlovely/pages/customer/ReviewsPage.js +0 -616
- package/dist/coolandlovely/pages/customer/ReviewsPage.js.map +0 -1
- package/dist/coolandlovely/pages/customer/SavedAddressesPage.js +0 -449
- package/dist/coolandlovely/pages/customer/SavedAddressesPage.js.map +0 -1
- package/dist/coolandlovely/pages/investor/InvestmentDetailsPage.js +0 -887
- package/dist/coolandlovely/pages/investor/InvestmentDetailsPage.js.map +0 -1
- package/dist/coolandlovely/pages/investor/InvestmentOpportunitiesPage.js +0 -945
- package/dist/coolandlovely/pages/investor/InvestmentOpportunitiesPage.js.map +0 -1
- package/dist/coolandlovely/pages/investor/InvestorAnalyticsPage.js +0 -687
- package/dist/coolandlovely/pages/investor/InvestorAnalyticsPage.js.map +0 -1
- package/dist/coolandlovely/pages/investor/InvestorDashboard.js +0 -455
- package/dist/coolandlovely/pages/investor/InvestorDashboard.js.map +0 -1
- package/dist/coolandlovely/pages/investor/InvestorInvestmentsPage.js +0 -405
- package/dist/coolandlovely/pages/investor/InvestorInvestmentsPage.js.map +0 -1
- package/dist/coolandlovely/pages/investor/InvestorPortfolioPage.js +0 -602
- package/dist/coolandlovely/pages/investor/InvestorPortfolioPage.js.map +0 -1
- package/dist/coolandlovely/pages/investor/InvestorProfilePage.js +0 -1070
- package/dist/coolandlovely/pages/investor/InvestorProfilePage.js.map +0 -1
- package/dist/coolandlovely/pages/worker/TaskDetailsPage.js +0 -533
- package/dist/coolandlovely/pages/worker/TaskDetailsPage.js.map +0 -1
- package/dist/coolandlovely/pages/worker/WorkerDashboard.js +0 -671
- package/dist/coolandlovely/pages/worker/WorkerDashboard.js.map +0 -1
- package/dist/coolandlovely/pages/worker/WorkerOrdersPage.js +0 -680
- package/dist/coolandlovely/pages/worker/WorkerOrdersPage.js.map +0 -1
- package/dist/coolandlovely/pages/worker/WorkerProfilePage.js +0 -692
- package/dist/coolandlovely/pages/worker/WorkerProfilePage.js.map +0 -1
- package/dist/coolandlovely/pages/worker/WorkerSchedulePage.js +0 -583
- package/dist/coolandlovely/pages/worker/WorkerSchedulePage.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InvestorAnalyticsPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/investor/InvestorAnalyticsPage.tsx"],"sourcesContent":["/**\n * Investor Analytics Page\n * @module coolandlovely/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 { EmphasisPanel, PagePurpose } from'@burdenoff/fe-libs/ui';\nimport { PageLayout } from'../../components/PageLayout';\nimport { MetricsCard } from'../../components/MetricsCard';\nimport { useCoolAndLovely } from'../../context/CoolAndLovelyContext';\nimport { cn } from'../../utils/cn';\nimport { formatCurrency, formatNumber } from'../../utils/formatters';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface AnalyticsData {\n portfolioMetrics: {\n totalValue: number;\n totalInvested: number;\n totalReturns: number;\n averageRoi: number;\n portfolioGrowth: number;\n bestPerforming: string;\n worstPerforming: string;\n };\n performanceByCart: Array<{\n cartName: string;\n investedAmount: number;\n currentValue: number;\n returns: number;\n roi: number;\n }>;\n performanceByCategory: Array<{\n category: string;\n investedAmount: number;\n returns: number;\n percentage: number;\n }>;\n monthlyPerformance: Array<{\n month: string;\n invested: number;\n value: number;\n returns: number;\n }>;\n riskAnalysis: {\n riskScore: number;\n diversificationScore: number;\n volatilityScore: number;\n recommendations: string[];\n };\n}\n\n// ---------------------------------------------------------------------------\n// Mock data\n// ---------------------------------------------------------------------------\n\nconst mockAnalytics: AnalyticsData = {\n portfolioMetrics: {\n totalValue: 283700,\n totalInvested: 255000,\n totalReturns: 28700,\n averageRoi: 19.6,\n portfolioGrowth: 11.3,\n bestPerforming: 'Biryani House',\n worstPerforming: 'Healthy Bites',\n },\n performanceByCart: [\n {\n cartName: 'Biryani House',\n investedAmount: 60000,\n currentValue: 72000,\n returns: 12000,\n roi: 20.0,\n },\n {\n cartName: 'South Indian Express',\n investedAmount: 50000,\n currentValue: 58500,\n returns: 8500,\n roi: 17.0,\n },\n {\n cartName: 'Pizza Corner',\n investedAmount: 75000,\n currentValue: 82000,\n returns: 7000,\n roi: 9.3,\n },\n {\n cartName: 'Healthy Bites',\n investedAmount: 30000,\n currentValue: 31200,\n returns: 1200,\n roi: 4.0,\n },\n {\n cartName: 'Street Food Junction',\n investedAmount: 40000,\n currentValue: 40000,\n returns: 0,\n roi: 0,\n },\n ],\n performanceByCategory: [\n {\n category: 'South Indian',\n investedAmount: 110000,\n returns: 20500,\n percentage: 43.1,\n },\n {\n category: 'Fast Food',\n investedAmount: 75000,\n returns: 7000,\n percentage: 29.4,\n },\n {\n category: 'Street Food',\n investedAmount: 40000,\n returns: 0,\n percentage: 15.7,\n },\n {\n category: 'Healthy Food',\n investedAmount: 30000,\n returns: 1200,\n percentage: 11.8,\n },\n ],\n monthlyPerformance: [\n { month: 'Jun 2024', invested: 195000, value: 202000, returns: 7000 },\n { month: 'Jul 2024', invested: 215000, value: 228000, returns: 13000 },\n { month: 'Aug 2024', invested: 255000, value: 265000, returns: 10000 },\n { month: 'Sep 2024', invested: 255000, value: 275000, returns: 20000 },\n { month: 'Oct 2024', invested: 255000, value: 280000, returns: 25000 },\n { month: 'Nov 2024', invested: 255000, value: 283700, returns: 28700 },\n ],\n riskAnalysis: {\n riskScore: 3.2,\n diversificationScore: 7.8,\n volatilityScore: 2.5,\n recommendations: [\n 'Consider diversifying into more food categories',\n 'Your portfolio shows good risk distribution',\n 'Consider investing in carts from different locations',\n 'Monitor underperforming investments closely',\n 'Explore premium segment opportunities for higher returns',\n ],\n },\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getRiskLevel(score: number): { label: string; color: string } {\n if (score <= 2) return { label: 'Low Risk', color: 'text-status-success-text' };\n if (score <= 4) return { label: 'Moderate Risk', color: 'text-status-warning-text' };\n return { label: 'High Risk', color: 'text-status-error-text' };\n}\n\nfunction getRiskBgColor(score: number): string {\n if (score <= 2) return'bg-status-success-bg-subtle';\n if (score <= 4) return'bg-status-warning-bg-subtle';\n return'bg-status-error-bg-subtle';\n}\n\nfunction getDiversificationLevel(score: number): { label: string; color: string } {\n if (score >= 8) return { label: 'Well Diversified', color: 'text-status-success-text' };\n if (score >= 6)\n return { label: 'Moderately Diversified', color: 'text-status-warning-text' };\n return { label: 'Poorly Diversified', color: 'text-status-error-text' };\n}\n\nfunction getDiversificationBgColor(score: number): string {\n if (score >= 8) return'bg-status-success-bg-subtle';\n if (score >= 6) return'bg-status-warning-bg-subtle';\n return'bg-status-error-bg-subtle';\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function InvestorAnalyticsPage() {\n const { navigateTo } = useCoolAndLovely();\n const [isLoading, setIsLoading] = useState(true);\n const [dateRange, setDateRange] = useState('6m');\n const [analytics, setAnalytics] = useState<AnalyticsData | null>(null);\n const [exportStatus, setExportStatus] = useState<'idle' | 'exporting' | 'done'>('idle');\n\n useEffect(() => {\n setIsLoading(true);\n const timer = setTimeout(() => {\n setAnalytics(mockAnalytics);\n setIsLoading(false);\n }, 600);\n return () => clearTimeout(timer);\n }, [dateRange]);\n\n const handleExportReport = useCallback(() => {\n setExportStatus('exporting');\n setTimeout(() => {\n setExportStatus('done');\n setTimeout(() => setExportStatus('idle'), 2000);\n }, 1200);\n }, []);\n\n if (isLoading || !analytics) {\n return (\n <PageLayout title=\"Investment Analytics\" description=\"Loading analytics...\">\n <div className=\"flex items-center justify-center py-20\">\n <div className=\"text-center\">\n <div className=\"mx-auto mb-4 h-12 w-12 animate-spin rounded-full border-b-2 border-primary\" />\n <p className=\"text-sm text-text-secondary\">Loading analytics data...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n const riskLevel = getRiskLevel(analytics.riskAnalysis.riskScore);\n const diversificationLevel = getDiversificationLevel(analytics.riskAnalysis.diversificationScore);\n\n // Sort carts by ROI for ranking\n const sortedCarts = [...analytics.performanceByCart].sort((a, b) => b.roi - a.roi);\n\n return (\n <PageLayout\n title=\"Investment Analytics\"\n description=\"Comprehensive analysis of your portfolio performance\"\n actions={\n <div className=\"flex items-center gap-3\">\n {/* Date Range Selector */}\n <select\n value={dateRange}\n onChange={(e) => setDateRange(e.target.value)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"1m\">Last Month</option>\n <option value=\"3m\">Last 3 Months</option>\n <option value=\"6m\">Last 6 Months</option>\n <option value=\"1y\">Last Year</option>\n <option value=\"all\">All Time</option>\n </select>\n\n {/* Export Button */}\n <button\n type=\"button\"\n onClick={handleExportReport}\n disabled={exportStatus === 'exporting'}\n className={cn(\n 'flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors',\n exportStatus === 'exporting'\n ? 'cursor-not-allowed bg-bg-sunken text-text-secondary'\n : exportStatus === 'done'\n ? 'bg-status-success-bg-subtle text-white'\n : 'bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90'\n )}\n >\n <Download className=\"h-4 w-4\" />\n {exportStatus === 'exporting'\n ? 'Exporting...'\n : exportStatus === 'done'\n ? 'Exported!'\n : 'Export Report'}\n </button>\n </div>\n }\n >\n <PagePurpose className=\"mb-6\" icon={<BarChart3 className=\"h-4 w-4\" />}>\n Understand how your portfolio is really performing. See total value,\n returns, ROI and risk at a glance, spot your best and worst performers,\n adjust the time range, and export a report — turning raw numbers into\n decisions about where to invest next.\n </PagePurpose>\n\n {/* Key Metrics — primary emphasis zone */}\n <EmphasisPanel className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4 p-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 </EmphasisPanel>\n\n {/* Best / Worst Performers */}\n <div className=\"mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div className=\"flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-status-success-bg-subtle/10\">\n <ArrowUp className=\"h-5 w-5 text-status-success-text\" />\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Best Performing</p>\n <p className=\"text-sm font-semibold text-status-success-text\">\n {analytics.portfolioMetrics.bestPerforming}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-status-error-bg-subtle/10\">\n <ArrowDown className=\"h-5 w-5 text-status-error-text\" />\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Worst Performing</p>\n <p className=\"text-sm font-semibold text-text-primary\">\n {analytics.portfolioMetrics.worstPerforming}\n </p>\n </div>\n </div>\n </div>\n\n {/* Performance by Cart & Category Distribution */}\n <div className=\"mt-6 grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Performance by Cart */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <BarChart3 className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Performance by Cart</h2>\n </div>\n\n <div className=\"space-y-3\">\n {sortedCarts.map((cart, index) => (\n <div\n key={cart.cartName}\n className=\"flex items-center justify-between rounded-lg border border-border-subtle bg-bg-surface p-3\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-xs font-bold text-action-primary-text\">\n {index + 1}\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{cart.cartName}</p>\n <p className=\"text-xs text-text-secondary\">\n {formatCurrency(cart.investedAmount, { minimumFractionDigits: 0 })} invested\n </p>\n </div>\n </div>\n <div className=\"text-right\">\n <p\n className={cn(\n 'text-sm font-semibold',\n cart.returns >= 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {cart.returns >= 0 ? '+' : ''}\n {formatCurrency(cart.returns, { minimumFractionDigits: 0 })}\n </p>\n <p\n className={cn(\n 'text-xs',\n cart.roi >= 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {cart.roi >= 0 ? '+' : ''}\n {cart.roi}% ROI\n </p>\n </div>\n </div>\n ))}\n </div>\n </section>\n\n {/* Category Distribution */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <PieChart className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Category Distribution</h2>\n </div>\n\n <div className=\"space-y-4\">\n {analytics.performanceByCategory.map((category) => (\n <div key={category.category} className=\"rounded-lg border border-border-subtle bg-bg-surface p-3\">\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm font-medium text-text-primary\">{category.category}</span>\n <span className=\"text-sm text-text-secondary\">{category.percentage}%</span>\n </div>\n <div className=\"mb-2 h-2 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className=\"h-full rounded-full bg-action-primary-bg transition-all duration-300\"\n style={{ width: `${category.percentage}%` }}\n />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">\n {formatCurrency(category.investedAmount, { minimumFractionDigits: 0 })} invested\n </span>\n <span\n className={cn(\n 'text-xs font-semibold',\n category.returns >= 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {category.returns >= 0 ? '+' : ''}\n {formatCurrency(category.returns, { minimumFractionDigits: 0 })}\n </span>\n </div>\n </div>\n ))}\n </div>\n </section>\n </div>\n\n {/* Monthly Performance Table */}\n <section className=\"mt-8\">\n <div className=\"mb-4 flex items-center gap-2\">\n <Calendar className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Portfolio Growth Trend</h2>\n </div>\n\n <div className=\"overflow-hidden rounded-lg border border-border-subtle bg-bg-surface\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-subtle bg-bg-sunken/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Month\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Invested\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Portfolio Value\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Returns\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Growth %\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {analytics.monthlyPerformance.map((month) => {\n const growthPct =\n month.invested > 0\n ? (((month.value - month.invested) / month.invested) * 100).toFixed(1)\n : '0.0';\n\n return (\n <tr key={month.month} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"whitespace-nowrap px-4 py-4 text-sm font-medium text-text-primary sm:px-6\">\n {month.month}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm text-text-primary sm:px-6\">\n {formatCurrency(month.invested, { minimumFractionDigits: 0 })}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm text-text-primary sm:px-6\">\n {formatCurrency(month.value, { minimumFractionDigits: 0 })}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm sm:px-6\">\n <span\n className={cn(\n 'font-semibold',\n month.returns >= 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {month.returns >= 0 ? '+' : ''}\n {formatCurrency(month.returns, { minimumFractionDigits: 0 })}\n </span>\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm sm:px-6\">\n <span\n className={cn(\n 'font-medium',\n parseFloat(growthPct) >= 0\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {parseFloat(growthPct) >= 0 ? '+' : ''}\n {growthPct}%\n </span>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n </section>\n\n {/* Risk Analysis & Diversification */}\n <div className=\"mt-8 grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Risk Analysis */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <Shield className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Risk Analysis</h2>\n </div>\n\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 sm:p-6 bg-gloss-card shadow-pop\">\n <div className=\"space-y-5\">\n {/* Risk Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Risk Score</span>\n <span className={cn('text-sm font-semibold', riskLevel.color)}>\n {analytics.riskAnalysis.riskScore}/5 ({riskLevel.label})\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getRiskBgColor(analytics.riskAnalysis.riskScore)\n )}\n style={{ width: `${(analytics.riskAnalysis.riskScore / 5) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Diversification Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Diversification</span>\n <span className={cn('text-sm font-semibold', diversificationLevel.color)}>\n {analytics.riskAnalysis.diversificationScore}/10 ({diversificationLevel.label})\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getDiversificationBgColor(analytics.riskAnalysis.diversificationScore)\n )}\n style={{\n width: `${(analytics.riskAnalysis.diversificationScore / 10) * 100}%`,\n }}\n />\n </div>\n </div>\n\n {/* Volatility Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Volatility</span>\n <span\n className={cn(\n 'text-sm font-semibold',\n getRiskLevel(analytics.riskAnalysis.volatilityScore).color\n )}\n >\n {analytics.riskAnalysis.volatilityScore}/5\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getRiskBgColor(analytics.riskAnalysis.volatilityScore)\n )}\n style={{ width: `${(analytics.riskAnalysis.volatilityScore / 5) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Quick Stats */}\n <div className=\"grid grid-cols-2 gap-3 border-t border-border-subtle pt-4\">\n <div className=\"rounded-lg bg-bg-sunken/50 p-3 text-center\">\n <p className=\"text-lg font-bold text-text-primary\">\n {analytics.performanceByCart.length}\n </p>\n <p className=\"text-xs text-text-secondary\">Active Investments</p>\n </div>\n <div className=\"rounded-lg bg-bg-sunken/50 p-3 text-center\">\n <p className=\"text-lg font-bold text-text-primary\">\n {analytics.performanceByCategory.length}\n </p>\n <p className=\"text-xs text-text-secondary\">Sectors Covered</p>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Recommendations */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <Lightbulb className=\"h-5 w-5 text-status-warning-text\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Recommendations</h2>\n </div>\n\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 sm:p-6 bg-gloss-card shadow-pop\">\n <div className=\"space-y-3\">\n {analytics.riskAnalysis.recommendations.map((recommendation, index) => (\n <div\n key={index}\n className=\"flex items-start gap-3 rounded-lg border border-border-subtle bg-bg-sunken/30 p-3\"\n >\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-xs font-bold text-action-primary-text\">\n {index + 1}\n </div>\n <p className=\"text-sm leading-relaxed text-text-primary\">{recommendation}</p>\n </div>\n ))}\n </div>\n\n {/* Overall Assessment */}\n <div className=\"mt-5 rounded-lg border border-border-subtle bg-bg-sunken/50 p-4\">\n <h4 className=\"mb-2 text-sm font-semibold text-text-primary\">Overall Assessment</h4>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Portfolio Health</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn('h-2 w-4 rounded-sm', i <= 4 ? 'bg-status-success-bg-subtle' : 'bg-bg-sunken')}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">4/5</span>\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Growth Potential</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn(\n 'h-2 w-4 rounded-sm',\n i <= 3 ? 'bg-status-warning-bg-subtle' : 'bg-bg-sunken'\n )}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">3/5</span>\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Income Stability</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn('h-2 w-4 rounded-sm', i <= 4 ? 'bg-status-success-bg-subtle' : 'bg-bg-sunken')}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">4/5</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n </div>\n\n {/* Quick Navigation */}\n <div className=\"mt-8 flex flex-wrap gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/portfolio')}\n className=\"flex items-center gap-2 rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <PieChart className=\"h-4 w-4\" />\n View Portfolio\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n className=\"flex items-center gap-2 rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Target className=\"h-4 w-4\" />\n Browse Opportunities\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/investments')}\n className=\"flex items-center gap-2 rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Wallet className=\"h-4 w-4\" />\n My Investments\n </button>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,455 +0,0 @@
|
|
|
1
|
-
import { useCoolAndLovely as e } from "../../context/CoolAndLovelyContext.js";
|
|
2
|
-
import { cn as t } from "../../utils/cn.js";
|
|
3
|
-
import { PageLayout as n } from "../../components/PageLayout.js";
|
|
4
|
-
import { MetricsCard as r } from "../../components/MetricsCard.js";
|
|
5
|
-
import { EmptyState as i } from "../../components/EmptyState.js";
|
|
6
|
-
import { useInvestmentOpportunities as a, useInvestments as o } from "../../hooks/useCoolAndLovelyApi.js";
|
|
7
|
-
import { formatCurrency as s } from "../../utils/formatters.js";
|
|
8
|
-
import { InvestmentCard as c } from "../../components/InvestmentCard.js";
|
|
9
|
-
import { useMemo as l, useState as u } from "react";
|
|
10
|
-
import { Activity as d, Award as f, BarChart3 as p, Eye as m, Filter as h, IndianRupee as g, Lightbulb as _, MapPin as v, PieChart as y, Plus as b, Target as x, TrendingUp as S, Wallet as C } from "lucide-react";
|
|
11
|
-
import { jsx as w, jsxs as T } from "react/jsx-runtime";
|
|
12
|
-
import { EmphasisPanel as E, NextSteps as D, PagePurpose as O } from "@burdenoff/fe-libs/ui";
|
|
13
|
-
//#region src/coolandlovely/pages/investor/InvestorDashboard.tsx
|
|
14
|
-
var k = [
|
|
15
|
-
{
|
|
16
|
-
id: "1",
|
|
17
|
-
type: "opportunity",
|
|
18
|
-
title: "High-Potential Business Detected",
|
|
19
|
-
description: "Glow Beauty Services in Koramangala shows 95% growth potential based on location analytics and market demand.",
|
|
20
|
-
confidence: 94
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
id: "2",
|
|
24
|
-
type: "suggestion",
|
|
25
|
-
title: "Portfolio Diversification Recommended",
|
|
26
|
-
description: "Consider investing in Education & Skills to balance your services-heavy portfolio. Current allocation: 70% services, 30% retail.",
|
|
27
|
-
confidence: 87
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
id: "3",
|
|
31
|
-
type: "trend",
|
|
32
|
-
title: "Market Trend Alert",
|
|
33
|
-
description: "Health & Wellness businesses in tech hubs are experiencing 40% higher returns. Whitefield shows promising opportunities.",
|
|
34
|
-
confidence: 91
|
|
35
|
-
}
|
|
36
|
-
], A = [
|
|
37
|
-
{
|
|
38
|
-
id: "act-1",
|
|
39
|
-
type: "dividend",
|
|
40
|
-
description: "Dividend received from Quick Cuts Salon",
|
|
41
|
-
amount: 4200,
|
|
42
|
-
date: "2024-01-14T10:00:00Z"
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
id: "act-2",
|
|
46
|
-
type: "investment",
|
|
47
|
-
description: "Invested in Spotless Cleaning Services",
|
|
48
|
-
amount: -4e4,
|
|
49
|
-
date: "2024-01-10T09:30:00Z"
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
id: "act-3",
|
|
53
|
-
type: "return",
|
|
54
|
-
description: "Returns from Fix-It Mobile Repair",
|
|
55
|
-
amount: 6800,
|
|
56
|
-
date: "2024-01-05T14:00:00Z"
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
id: "act-4",
|
|
60
|
-
type: "investment",
|
|
61
|
-
description: "Invested in Fix-It Mobile Repair",
|
|
62
|
-
amount: -75e3,
|
|
63
|
-
date: "2023-12-20T11:00:00Z"
|
|
64
|
-
}
|
|
65
|
-
];
|
|
66
|
-
function j(e) {
|
|
67
|
-
switch (e) {
|
|
68
|
-
case "active": return "bg-status-success-bg-subtle/20 text-status-success-text";
|
|
69
|
-
case "pending": return "bg-status-warning-bg-subtle/20 text-status-warning-text";
|
|
70
|
-
case "completed": return "bg-accent-blue-subtle/20 text-accent-blue";
|
|
71
|
-
default: return "bg-secondary text-secondary-foreground";
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
function M() {
|
|
75
|
-
let { navigateTo: M, currentUser: N } = e(), [P, F] = u("portfolio"), { data: I = [], isLoading: L } = a(), { data: R = [], isLoading: z } = o(N?.id || ""), B = N?.firstName ?? N?.name ?? "Investor", V = I.filter((e) => e.status === "active"), H = l(() => {
|
|
76
|
-
let e = R.reduce((e, t) => e + t.investedAmount, 0), t = R.reduce((e, t) => e + t.currentValue, 0), n = R.reduce((e, t) => e + t.returns, 0);
|
|
77
|
-
return {
|
|
78
|
-
totalInvested: e,
|
|
79
|
-
currentValue: t,
|
|
80
|
-
totalReturns: n,
|
|
81
|
-
monthlyIncome: n / 12,
|
|
82
|
-
roi: e > 0 ? n / e * 100 : 0
|
|
83
|
-
};
|
|
84
|
-
}, [R]);
|
|
85
|
-
return L || z ? /* @__PURE__ */ w(n, {
|
|
86
|
-
title: "Investment Dashboard",
|
|
87
|
-
description: "Loading your portfolio...",
|
|
88
|
-
children: /* @__PURE__ */ w("div", {
|
|
89
|
-
className: "flex items-center justify-center py-20",
|
|
90
|
-
children: /* @__PURE__ */ T("div", {
|
|
91
|
-
className: "text-center",
|
|
92
|
-
children: [/* @__PURE__ */ w("div", { className: "mx-auto mb-4 h-12 w-12 animate-spin rounded-full border-b-2 border-primary" }), /* @__PURE__ */ w("p", {
|
|
93
|
-
className: "text-sm text-text-secondary",
|
|
94
|
-
children: "Loading your portfolio..."
|
|
95
|
-
})]
|
|
96
|
-
})
|
|
97
|
-
})
|
|
98
|
-
}) : /* @__PURE__ */ T(n, {
|
|
99
|
-
title: `Welcome back, ${B}!`,
|
|
100
|
-
description: "Here's your investment portfolio overview.",
|
|
101
|
-
children: [
|
|
102
|
-
/* @__PURE__ */ w(O, {
|
|
103
|
-
className: "mb-6",
|
|
104
|
-
icon: /* @__PURE__ */ w(S, { className: "h-4 w-4" }),
|
|
105
|
-
children: "Your money at work across local businesses. Track what you've invested, what it's worth now and the income it generates, switch between your holdings and fresh opportunities, and act on AI insights and market updates to grow your portfolio."
|
|
106
|
-
}),
|
|
107
|
-
/* @__PURE__ */ w(D, {
|
|
108
|
-
className: "mb-6",
|
|
109
|
-
storageKey: "coolandlovely-investor-dashboard",
|
|
110
|
-
steps: [
|
|
111
|
-
{
|
|
112
|
-
id: "review-portfolio",
|
|
113
|
-
label: "Review your portfolio",
|
|
114
|
-
description: "See the full breakdown and performance of your holdings.",
|
|
115
|
-
icon: /* @__PURE__ */ w(y, { className: "h-4 w-4" }),
|
|
116
|
-
onClick: () => M("/investor/portfolio"),
|
|
117
|
-
done: R.length > 0
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
id: "browse",
|
|
121
|
-
label: "Browse new opportunities",
|
|
122
|
-
description: "Find businesses open for investment that fit your goals.",
|
|
123
|
-
icon: /* @__PURE__ */ w(x, { className: "h-4 w-4" }),
|
|
124
|
-
onClick: () => M("/investor/opportunities")
|
|
125
|
-
},
|
|
126
|
-
{
|
|
127
|
-
id: "analytics",
|
|
128
|
-
label: "Check your analytics",
|
|
129
|
-
description: "Dig into returns, allocation and trends across investments.",
|
|
130
|
-
icon: /* @__PURE__ */ w(p, { className: "h-4 w-4" }),
|
|
131
|
-
onClick: () => M("/investor/analytics")
|
|
132
|
-
}
|
|
133
|
-
]
|
|
134
|
-
}),
|
|
135
|
-
/* @__PURE__ */ T(E, {
|
|
136
|
-
className: "p-5",
|
|
137
|
-
children: [/* @__PURE__ */ w("h2", {
|
|
138
|
-
className: "mb-4 text-lg font-semibold text-text-primary",
|
|
139
|
-
children: "Portfolio Overview"
|
|
140
|
-
}), /* @__PURE__ */ T("div", {
|
|
141
|
-
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
142
|
-
children: [
|
|
143
|
-
/* @__PURE__ */ w(r, {
|
|
144
|
-
icon: /* @__PURE__ */ w(C, { className: "h-5 w-5" }),
|
|
145
|
-
value: s(H.totalInvested, { minimumFractionDigits: 0 }),
|
|
146
|
-
label: "Total Invested",
|
|
147
|
-
trend: "up",
|
|
148
|
-
trendValue: "Across all businesses"
|
|
149
|
-
}),
|
|
150
|
-
/* @__PURE__ */ w(r, {
|
|
151
|
-
icon: /* @__PURE__ */ w(g, { className: "h-5 w-5" }),
|
|
152
|
-
value: s(H.currentValue, { minimumFractionDigits: 0 }),
|
|
153
|
-
label: "Current Value",
|
|
154
|
-
trend: "up",
|
|
155
|
-
trendValue: `+${H.roi.toFixed(1)}%`
|
|
156
|
-
}),
|
|
157
|
-
/* @__PURE__ */ w(r, {
|
|
158
|
-
icon: /* @__PURE__ */ w(x, { className: "h-5 w-5" }),
|
|
159
|
-
value: s(H.totalReturns, { minimumFractionDigits: 0 }),
|
|
160
|
-
label: "Total Returns",
|
|
161
|
-
trend: "up",
|
|
162
|
-
trendValue: "+15.2% this month"
|
|
163
|
-
}),
|
|
164
|
-
/* @__PURE__ */ w(r, {
|
|
165
|
-
icon: /* @__PURE__ */ w(d, { className: "h-5 w-5" }),
|
|
166
|
-
value: s(H.monthlyIncome, { minimumFractionDigits: 0 }),
|
|
167
|
-
label: "Monthly Income",
|
|
168
|
-
trend: "up",
|
|
169
|
-
trendValue: "+8.5% vs last month"
|
|
170
|
-
})
|
|
171
|
-
]
|
|
172
|
-
})]
|
|
173
|
-
}),
|
|
174
|
-
/* @__PURE__ */ T("div", {
|
|
175
|
-
className: "mt-8 grid grid-cols-1 gap-6 lg:grid-cols-3",
|
|
176
|
-
children: [/* @__PURE__ */ T("div", {
|
|
177
|
-
className: "lg:col-span-2",
|
|
178
|
-
children: [
|
|
179
|
-
/* @__PURE__ */ T("div", {
|
|
180
|
-
className: "mb-6 flex rounded-lg bg-bg-sunken p-1",
|
|
181
|
-
children: [/* @__PURE__ */ w("button", {
|
|
182
|
-
type: "button",
|
|
183
|
-
onClick: () => F("portfolio"),
|
|
184
|
-
className: t("flex-1 rounded-md px-4 py-2 text-sm font-medium transition-colors", P === "portfolio" ? "bg-bg-surface text-text-primary shadow-sm" : "text-text-secondary hover:text-text-primary"),
|
|
185
|
-
children: "My Investments"
|
|
186
|
-
}), /* @__PURE__ */ w("button", {
|
|
187
|
-
type: "button",
|
|
188
|
-
onClick: () => F("opportunities"),
|
|
189
|
-
className: t("flex-1 rounded-md px-4 py-2 text-sm font-medium transition-colors", P === "opportunities" ? "bg-bg-surface text-text-primary shadow-sm" : "text-text-secondary hover:text-text-primary"),
|
|
190
|
-
children: "New Opportunities"
|
|
191
|
-
})]
|
|
192
|
-
}),
|
|
193
|
-
P === "portfolio" && /* @__PURE__ */ T("div", {
|
|
194
|
-
className: "space-y-4",
|
|
195
|
-
children: [/* @__PURE__ */ T("div", {
|
|
196
|
-
className: "flex items-center justify-between",
|
|
197
|
-
children: [/* @__PURE__ */ w("h3", {
|
|
198
|
-
className: "text-base font-semibold text-text-primary",
|
|
199
|
-
children: "Active Investments"
|
|
200
|
-
}), /* @__PURE__ */ T("button", {
|
|
201
|
-
type: "button",
|
|
202
|
-
onClick: () => alert("Filter functionality coming soon!"),
|
|
203
|
-
className: "flex items-center gap-2 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
204
|
-
children: [/* @__PURE__ */ w(h, { className: "h-4 w-4" }), "Filter"]
|
|
205
|
-
})]
|
|
206
|
-
}), R.length === 0 ? /* @__PURE__ */ w(i, {
|
|
207
|
-
illustration: "empty-data",
|
|
208
|
-
title: "No active investments found",
|
|
209
|
-
description: "You haven't invested in any businesses yet. Explore opportunities to put your money to work.",
|
|
210
|
-
action: /* @__PURE__ */ w("button", {
|
|
211
|
-
type: "button",
|
|
212
|
-
onClick: () => F("opportunities"),
|
|
213
|
-
className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors",
|
|
214
|
-
children: "Browse opportunities"
|
|
215
|
-
})
|
|
216
|
-
}) : R.map((e) => /* @__PURE__ */ T("div", {
|
|
217
|
-
className: "rounded-lg border border-border-seam bg-bg-surface p-4 hover:shadow-md transition-shadow bg-gloss-card shadow-pop",
|
|
218
|
-
children: [/* @__PURE__ */ T("div", {
|
|
219
|
-
className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",
|
|
220
|
-
children: [/* @__PURE__ */ T("div", {
|
|
221
|
-
className: "flex-1",
|
|
222
|
-
children: [/* @__PURE__ */ T("div", {
|
|
223
|
-
className: "mb-2 flex flex-wrap items-center gap-2",
|
|
224
|
-
children: [/* @__PURE__ */ w("h4", {
|
|
225
|
-
className: "text-base font-semibold text-text-primary",
|
|
226
|
-
children: e.cartName
|
|
227
|
-
}), /* @__PURE__ */ w("span", {
|
|
228
|
-
className: t("rounded-full px-2 py-0.5 text-xs font-medium", j(e.status)),
|
|
229
|
-
children: e.status
|
|
230
|
-
})]
|
|
231
|
-
}), /* @__PURE__ */ T("div", {
|
|
232
|
-
className: "mb-3 flex flex-wrap items-center gap-3 text-xs text-text-secondary",
|
|
233
|
-
children: [/* @__PURE__ */ T("span", {
|
|
234
|
-
className: "flex items-center gap-1",
|
|
235
|
-
children: [/* @__PURE__ */ w(v, { className: "h-3.5 w-3.5" }), "India"]
|
|
236
|
-
}), /* @__PURE__ */ w("span", { children: "Services" })]
|
|
237
|
-
})]
|
|
238
|
-
}), /* @__PURE__ */ T("button", {
|
|
239
|
-
type: "button",
|
|
240
|
-
onClick: () => M(`/investor/investments/${e.id}`),
|
|
241
|
-
className: "flex items-center gap-2 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
242
|
-
children: [/* @__PURE__ */ w(m, { className: "h-4 w-4" }), "View Details"]
|
|
243
|
-
})]
|
|
244
|
-
}), /* @__PURE__ */ T("div", {
|
|
245
|
-
className: "grid grid-cols-2 gap-3 sm:grid-cols-4",
|
|
246
|
-
children: [
|
|
247
|
-
/* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("p", {
|
|
248
|
-
className: "text-xs text-text-secondary",
|
|
249
|
-
children: "Invested"
|
|
250
|
-
}), /* @__PURE__ */ w("p", {
|
|
251
|
-
className: "text-sm font-semibold text-text-primary",
|
|
252
|
-
children: s(e.investedAmount, { minimumFractionDigits: 0 })
|
|
253
|
-
})] }),
|
|
254
|
-
/* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("p", {
|
|
255
|
-
className: "text-xs text-text-secondary",
|
|
256
|
-
children: "Current Value"
|
|
257
|
-
}), /* @__PURE__ */ w("p", {
|
|
258
|
-
className: "text-sm font-semibold text-status-success-text",
|
|
259
|
-
children: s(e.currentValue, { minimumFractionDigits: 0 })
|
|
260
|
-
})] }),
|
|
261
|
-
/* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("p", {
|
|
262
|
-
className: "text-xs text-text-secondary",
|
|
263
|
-
children: "Returns"
|
|
264
|
-
}), /* @__PURE__ */ w("p", {
|
|
265
|
-
className: "text-sm font-semibold text-text-primary",
|
|
266
|
-
children: s(e.returns, { minimumFractionDigits: 0 })
|
|
267
|
-
})] }),
|
|
268
|
-
/* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("p", {
|
|
269
|
-
className: "text-xs text-text-secondary",
|
|
270
|
-
children: "Growth"
|
|
271
|
-
}), /* @__PURE__ */ T("p", {
|
|
272
|
-
className: "text-sm font-semibold text-status-success-text",
|
|
273
|
-
children: [e.returnsPercentage, "%"]
|
|
274
|
-
})] })
|
|
275
|
-
]
|
|
276
|
-
})]
|
|
277
|
-
}, e.id))]
|
|
278
|
-
}),
|
|
279
|
-
P === "opportunities" && /* @__PURE__ */ T("div", {
|
|
280
|
-
className: "space-y-4",
|
|
281
|
-
children: [/* @__PURE__ */ T("div", {
|
|
282
|
-
className: "flex items-center justify-between",
|
|
283
|
-
children: [/* @__PURE__ */ w("h3", {
|
|
284
|
-
className: "text-base font-semibold text-text-primary",
|
|
285
|
-
children: "Investment Opportunities"
|
|
286
|
-
}), /* @__PURE__ */ T("button", {
|
|
287
|
-
type: "button",
|
|
288
|
-
onClick: () => M("/investor/opportunities"),
|
|
289
|
-
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",
|
|
290
|
-
children: [/* @__PURE__ */ w(b, { className: "h-4 w-4" }), "Browse All"]
|
|
291
|
-
})]
|
|
292
|
-
}), /* @__PURE__ */ w("div", {
|
|
293
|
-
className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
|
|
294
|
-
children: V.slice(0, 2).map((e) => /* @__PURE__ */ w(c, {
|
|
295
|
-
id: e.id,
|
|
296
|
-
cartName: e.cartName,
|
|
297
|
-
targetAmount: e.targetAmount,
|
|
298
|
-
raisedAmount: e.raisedAmount,
|
|
299
|
-
expectedReturns: `${e.expectedReturns}%`,
|
|
300
|
-
riskLevel: e.riskLevel,
|
|
301
|
-
status: e.status,
|
|
302
|
-
onClick: (e) => M(`/investor/opportunities/${e}`)
|
|
303
|
-
}, e.id))
|
|
304
|
-
})]
|
|
305
|
-
}),
|
|
306
|
-
/* @__PURE__ */ T("section", {
|
|
307
|
-
className: "mt-8",
|
|
308
|
-
children: [/* @__PURE__ */ w("h2", {
|
|
309
|
-
className: "mb-4 text-lg font-semibold text-text-primary",
|
|
310
|
-
children: "Recent Activity"
|
|
311
|
-
}), /* @__PURE__ */ w("div", {
|
|
312
|
-
className: "divide-y divide-border rounded-lg border border-border-subtle bg-bg-surface",
|
|
313
|
-
children: A.map((e) => /* @__PURE__ */ T("div", {
|
|
314
|
-
className: "flex items-center justify-between px-4 py-3",
|
|
315
|
-
children: [/* @__PURE__ */ T("div", {
|
|
316
|
-
className: "flex items-center gap-3",
|
|
317
|
-
children: [/* @__PURE__ */ w("div", {
|
|
318
|
-
className: t("flex h-8 w-8 items-center justify-center rounded-full", e.amount > 0 ? "bg-status-success-bg-subtle/10" : "bg-bg-sunken"),
|
|
319
|
-
children: /* @__PURE__ */ w(d, { className: t("h-4 w-4", e.amount > 0 ? "text-status-success-text" : "text-text-secondary") })
|
|
320
|
-
}), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("p", {
|
|
321
|
-
className: "text-sm font-medium text-text-primary",
|
|
322
|
-
children: e.description
|
|
323
|
-
}), /* @__PURE__ */ w("p", {
|
|
324
|
-
className: "text-xs text-text-secondary",
|
|
325
|
-
children: new Date(e.date).toLocaleDateString("en-IN", {
|
|
326
|
-
day: "numeric",
|
|
327
|
-
month: "short",
|
|
328
|
-
year: "numeric"
|
|
329
|
-
})
|
|
330
|
-
})] })]
|
|
331
|
-
}), /* @__PURE__ */ T("span", {
|
|
332
|
-
className: t("text-sm font-semibold", e.amount > 0 ? "text-status-success-text" : "text-text-primary"),
|
|
333
|
-
children: [e.amount > 0 ? "+" : "", s(Math.abs(e.amount), { minimumFractionDigits: 0 })]
|
|
334
|
-
})]
|
|
335
|
-
}, e.id))
|
|
336
|
-
})]
|
|
337
|
-
})
|
|
338
|
-
]
|
|
339
|
-
}), /* @__PURE__ */ T("div", {
|
|
340
|
-
className: "space-y-6",
|
|
341
|
-
children: [
|
|
342
|
-
/* @__PURE__ */ T("div", {
|
|
343
|
-
className: "rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop",
|
|
344
|
-
children: [/* @__PURE__ */ T("div", {
|
|
345
|
-
className: "mb-3 flex items-center gap-2",
|
|
346
|
-
children: [/* @__PURE__ */ w(_, { className: "h-5 w-5 text-status-warning-text" }), /* @__PURE__ */ w("h3", {
|
|
347
|
-
className: "text-base font-semibold text-text-primary",
|
|
348
|
-
children: "AI Insights"
|
|
349
|
-
})]
|
|
350
|
-
}), /* @__PURE__ */ w("div", {
|
|
351
|
-
className: "space-y-3",
|
|
352
|
-
children: k.map((e) => /* @__PURE__ */ T("div", {
|
|
353
|
-
className: "rounded-lg border border-border-subtle bg-bg-sunken/50 p-3",
|
|
354
|
-
children: [/* @__PURE__ */ T("div", {
|
|
355
|
-
className: "mb-1 flex items-center justify-between",
|
|
356
|
-
children: [/* @__PURE__ */ w("h4", {
|
|
357
|
-
className: "text-xs font-semibold text-text-primary",
|
|
358
|
-
children: e.title
|
|
359
|
-
}), /* @__PURE__ */ T("span", {
|
|
360
|
-
className: "rounded-full bg-action-primary-bg/10 px-2 py-0.5 text-xs font-medium text-primary",
|
|
361
|
-
children: [e.confidence, "%"]
|
|
362
|
-
})]
|
|
363
|
-
}), /* @__PURE__ */ w("p", {
|
|
364
|
-
className: "text-xs leading-relaxed text-text-secondary",
|
|
365
|
-
children: e.description
|
|
366
|
-
})]
|
|
367
|
-
}, e.id))
|
|
368
|
-
})]
|
|
369
|
-
}),
|
|
370
|
-
/* @__PURE__ */ T("div", {
|
|
371
|
-
className: "rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop",
|
|
372
|
-
children: [/* @__PURE__ */ w("h3", {
|
|
373
|
-
className: "mb-3 text-base font-semibold text-text-primary",
|
|
374
|
-
children: "Quick Actions"
|
|
375
|
-
}), /* @__PURE__ */ T("div", {
|
|
376
|
-
className: "space-y-2",
|
|
377
|
-
children: [
|
|
378
|
-
/* @__PURE__ */ T("button", {
|
|
379
|
-
type: "button",
|
|
380
|
-
onClick: () => M("/investor/portfolio"),
|
|
381
|
-
className: "flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
382
|
-
children: [/* @__PURE__ */ w(y, { className: "h-4 w-4 text-text-secondary" }), "View Full Portfolio"]
|
|
383
|
-
}),
|
|
384
|
-
/* @__PURE__ */ T("button", {
|
|
385
|
-
type: "button",
|
|
386
|
-
onClick: () => M("/investor/opportunities"),
|
|
387
|
-
className: "flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
388
|
-
children: [/* @__PURE__ */ w(x, { className: "h-4 w-4 text-text-secondary" }), "Browse Opportunities"]
|
|
389
|
-
}),
|
|
390
|
-
/* @__PURE__ */ T("button", {
|
|
391
|
-
type: "button",
|
|
392
|
-
onClick: () => M("/investor/analytics"),
|
|
393
|
-
className: "flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
394
|
-
children: [/* @__PURE__ */ w(p, { className: "h-4 w-4 text-text-secondary" }), "Investment Analytics"]
|
|
395
|
-
}),
|
|
396
|
-
/* @__PURE__ */ T("button", {
|
|
397
|
-
type: "button",
|
|
398
|
-
onClick: () => M("/investor/profile"),
|
|
399
|
-
className: "flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
400
|
-
children: [/* @__PURE__ */ w(f, { className: "h-4 w-4 text-text-secondary" }), "View Profile"]
|
|
401
|
-
})
|
|
402
|
-
]
|
|
403
|
-
})]
|
|
404
|
-
}),
|
|
405
|
-
/* @__PURE__ */ T("div", {
|
|
406
|
-
className: "rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop",
|
|
407
|
-
children: [/* @__PURE__ */ w("h3", {
|
|
408
|
-
className: "mb-3 text-base font-semibold text-text-primary",
|
|
409
|
-
children: "Market Updates"
|
|
410
|
-
}), /* @__PURE__ */ T("div", {
|
|
411
|
-
className: "space-y-3",
|
|
412
|
-
children: [
|
|
413
|
-
/* @__PURE__ */ T("div", {
|
|
414
|
-
className: "border-l-4 border-status-success-border pl-3",
|
|
415
|
-
children: [/* @__PURE__ */ w("h4", {
|
|
416
|
-
className: "text-xs font-semibold text-text-primary",
|
|
417
|
-
children: "Mobile Services Market Growing"
|
|
418
|
-
}), /* @__PURE__ */ w("p", {
|
|
419
|
-
className: "mt-1 text-xs leading-relaxed text-text-secondary",
|
|
420
|
-
children: "Mobile service industry shows 35% growth in Q4 2024"
|
|
421
|
-
})]
|
|
422
|
-
}),
|
|
423
|
-
/* @__PURE__ */ T("div", {
|
|
424
|
-
className: "border-l-4 border-accent-blue-subtle pl-3",
|
|
425
|
-
children: [/* @__PURE__ */ w("h4", {
|
|
426
|
-
className: "text-xs font-semibold text-text-primary",
|
|
427
|
-
children: "New Investment Tax Benefits"
|
|
428
|
-
}), /* @__PURE__ */ w("p", {
|
|
429
|
-
className: "mt-1 text-xs leading-relaxed text-text-secondary",
|
|
430
|
-
children: "Government announces SME investment incentives"
|
|
431
|
-
})]
|
|
432
|
-
}),
|
|
433
|
-
/* @__PURE__ */ T("div", {
|
|
434
|
-
className: "border-l-4 border-status-warning-border pl-3",
|
|
435
|
-
children: [/* @__PURE__ */ w("h4", {
|
|
436
|
-
className: "text-xs font-semibold text-text-primary",
|
|
437
|
-
children: "Home Services Demand Surge"
|
|
438
|
-
}), /* @__PURE__ */ w("p", {
|
|
439
|
-
className: "mt-1 text-xs leading-relaxed text-text-secondary",
|
|
440
|
-
children: "Cleaning and maintenance businesses up 25% this quarter"
|
|
441
|
-
})]
|
|
442
|
-
})
|
|
443
|
-
]
|
|
444
|
-
})]
|
|
445
|
-
})
|
|
446
|
-
]
|
|
447
|
-
})]
|
|
448
|
-
})
|
|
449
|
-
]
|
|
450
|
-
});
|
|
451
|
-
}
|
|
452
|
-
//#endregion
|
|
453
|
-
export { M as InvestorDashboard };
|
|
454
|
-
|
|
455
|
-
//# sourceMappingURL=InvestorDashboard.js.map
|