@microcosmmoney/portal-react 3.12.8 → 3.13.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/index.d.ts +22 -0
- package/dist/index.js +48 -1
- package/dist/main-portal/components/auctions/AuctionsPage.d.ts +1 -0
- package/dist/main-portal/components/auctions/AuctionsPage.js +218 -0
- package/dist/main-portal/components/data/asset-stats.d.ts +1 -0
- package/dist/main-portal/components/data/asset-stats.js +33 -0
- package/dist/main-portal/components/data/charts/MCCSupplyChart.d.ts +7 -0
- package/dist/main-portal/components/data/charts/MCCSupplyChart.js +27 -0
- package/dist/main-portal/components/data/charts/MiningTrendChart.d.ts +7 -0
- package/dist/main-portal/components/data/charts/MiningTrendChart.js +39 -0
- package/dist/main-portal/components/data/charts/PriceChart.d.ts +5 -0
- package/dist/main-portal/components/data/charts/PriceChart.js +99 -0
- package/dist/main-portal/components/data/charts/TeamWalletChart.d.ts +7 -0
- package/dist/main-portal/components/data/charts/TeamWalletChart.js +33 -0
- package/dist/main-portal/components/data/charts/TerritoryProgressChart.d.ts +7 -0
- package/dist/main-portal/components/data/charts/TerritoryProgressChart.js +35 -0
- package/dist/main-portal/components/data/charts/UserLevelPieChart.d.ts +7 -0
- package/dist/main-portal/components/data/charts/UserLevelPieChart.js +34 -0
- package/dist/main-portal/components/data/charts/index.d.ts +5 -0
- package/dist/main-portal/components/data/charts/index.js +14 -0
- package/dist/main-portal/components/data/data-hero.d.ts +1 -0
- package/dist/main-portal/components/data/data-hero.js +81 -0
- package/dist/main-portal/components/data/mining-history-stats.d.ts +1 -0
- package/dist/main-portal/components/data/mining-history-stats.js +44 -0
- package/dist/main-portal/components/data/team-wallet-stats.d.ts +1 -0
- package/dist/main-portal/components/data/team-wallet-stats.js +34 -0
- package/dist/main-portal/components/data/territory-stats.d.ts +1 -0
- package/dist/main-portal/components/data/territory-stats.js +48 -0
- package/dist/main-portal/components/data/user-level-stats.d.ts +1 -0
- package/dist/main-portal/components/data/user-level-stats.js +36 -0
- package/dist/main-portal/components/fragment/FragmentPage.d.ts +1 -0
- package/dist/main-portal/components/fragment/FragmentPage.js +13 -0
- package/dist/main-portal/components/income/ManagerIncomePage.d.ts +1 -0
- package/dist/main-portal/components/income/ManagerIncomePage.js +147 -0
- package/dist/main-portal/components/layout/AppSidebar.d.ts +3 -0
- package/dist/main-portal/components/layout/AppSidebar.js +88 -0
- package/dist/main-portal/components/layout/DashboardHeader.d.ts +1 -0
- package/dist/main-portal/components/layout/DashboardHeader.js +121 -0
- package/dist/main-portal/components/layout/LocaleSwitcher.d.ts +1 -0
- package/dist/main-portal/components/layout/LocaleSwitcher.js +30 -0
- package/dist/main-portal/components/layout/MainFooter.d.ts +2 -0
- package/dist/main-portal/components/layout/MainFooter.js +50 -0
- package/dist/main-portal/components/layout/ShadcnNavbar.d.ts +1 -0
- package/dist/main-portal/components/layout/ShadcnNavbar.js +155 -0
- package/dist/main-portal/components/layout/TerminalSidebar.d.ts +1 -0
- package/dist/main-portal/components/layout/TerminalSidebar.js +110 -0
- package/dist/main-portal/components/lending/LendingPage.d.ts +1 -0
- package/dist/main-portal/components/lending/LendingPage.js +20 -0
- package/dist/main-portal/components/mcd/MCDPage.d.ts +1 -0
- package/dist/main-portal/components/mcd/MCDPage.js +125 -0
- package/dist/main-portal/components/messages/MessagesPage.d.ts +1 -0
- package/dist/main-portal/components/messages/MessagesPage.js +13 -0
- package/dist/main-portal/components/mining/MiningDistributionHistory.d.ts +11 -0
- package/dist/main-portal/components/mining/MiningDistributionHistory.js +84 -0
- package/dist/main-portal/components/mining/MiningModal.d.ts +12 -0
- package/dist/main-portal/components/mining/MiningModal.js +302 -0
- package/dist/main-portal/components/mining/MiningPage.d.ts +1 -0
- package/dist/main-portal/components/mining/MiningPage.js +237 -0
- package/dist/main-portal/components/mining/index.d.ts +1 -0
- package/dist/main-portal/components/mining/index.js +6 -0
- package/dist/main-portal/components/notifications/NotificationsPage.d.ts +1 -0
- package/dist/main-portal/components/notifications/NotificationsPage.js +13 -0
- package/dist/main-portal/components/organization/OrganizationPage.d.ts +1 -0
- package/dist/main-portal/components/organization/OrganizationPage.js +235 -0
- package/dist/main-portal/components/organization/connection-line.d.ts +12 -0
- package/dist/main-portal/components/organization/connection-line.js +38 -0
- package/dist/main-portal/components/organization/diagram-node.d.ts +17 -0
- package/dist/main-portal/components/organization/diagram-node.js +105 -0
- package/dist/main-portal/components/organization/system-panel.d.ts +11 -0
- package/dist/main-portal/components/organization/system-panel.js +72 -0
- package/dist/main-portal/components/profile/EmailChangeCard.d.ts +1 -0
- package/dist/main-portal/components/profile/EmailChangeCard.js +58 -0
- package/dist/main-portal/components/profile/ProfilePage.d.ts +1 -0
- package/dist/main-portal/components/profile/ProfilePage.js +263 -0
- package/dist/main-portal/components/profile/TwoFactorSettings.d.ts +1 -0
- package/dist/main-portal/components/profile/TwoFactorSettings.js +99 -0
- package/dist/main-portal/components/providers/ClientProviders.d.ts +6 -0
- package/dist/main-portal/components/providers/ClientProviders.js +17 -0
- package/dist/main-portal/components/providers/SolanaWalletProvider.d.ts +7 -0
- package/dist/main-portal/components/providers/SolanaWalletProvider.js +17 -0
- package/dist/main-portal/components/providers/theme-provider.d.ts +5 -0
- package/dist/main-portal/components/providers/theme-provider.js +10 -0
- package/dist/main-portal/components/queue/QueueStatusPage.d.ts +1 -0
- package/dist/main-portal/components/queue/QueueStatusPage.js +245 -0
- package/dist/main-portal/components/reincarnation/ReincarnationPage.d.ts +1 -0
- package/dist/main-portal/components/reincarnation/ReincarnationPage.js +87 -0
- package/dist/main-portal/components/resources/mcc-stats-section.d.ts +1 -0
- package/dist/main-portal/components/resources/mcc-stats-section.js +199 -0
- package/dist/main-portal/components/resources/mcd-stats-section.d.ts +1 -0
- package/dist/main-portal/components/resources/mcd-stats-section.js +76 -0
- package/dist/main-portal/components/resources/minting-entry-section.d.ts +1 -0
- package/dist/main-portal/components/resources/minting-entry-section.js +70 -0
- package/dist/main-portal/components/resources/public-mining-modal.d.ts +7 -0
- package/dist/main-portal/components/resources/public-mining-modal.js +239 -0
- package/dist/main-portal/components/resources/recycle-pool-section.d.ts +1 -0
- package/dist/main-portal/components/resources/recycle-pool-section.js +82 -0
- package/dist/main-portal/components/resources/registration-prompt.d.ts +8 -0
- package/dist/main-portal/components/resources/registration-prompt.js +13 -0
- package/dist/main-portal/components/rewards/RewardsPage.d.ts +1 -0
- package/dist/main-portal/components/rewards/RewardsPage.js +149 -0
- package/dist/main-portal/components/security/domain-verification-bar.d.ts +1 -0
- package/dist/main-portal/components/security/domain-verification-bar.js +32 -0
- package/dist/main-portal/components/stations/StationDetailPage.d.ts +5 -0
- package/dist/main-portal/components/stations/StationDetailPage.js +232 -0
- package/dist/main-portal/components/stations/StationIncomeChart.d.ts +11 -0
- package/dist/main-portal/components/stations/StationIncomeChart.js +57 -0
- package/dist/main-portal/components/stations/StationKPIHistory.d.ts +1 -0
- package/dist/main-portal/components/stations/StationKPIHistory.js +7 -0
- package/dist/main-portal/components/stations/StationListPage.d.ts +1 -0
- package/dist/main-portal/components/stations/StationListPage.js +341 -0
- package/dist/main-portal/components/stations/StationMemberRanking.d.ts +13 -0
- package/dist/main-portal/components/stations/StationMemberRanking.js +64 -0
- package/dist/main-portal/components/stations/StationSummaryCards.d.ts +13 -0
- package/dist/main-portal/components/stations/StationSummaryCards.js +30 -0
- package/dist/main-portal/components/stations/StationsPage.d.ts +1 -0
- package/dist/main-portal/components/stations/StationsPage.js +239 -0
- package/dist/main-portal/components/territory/TerritoryNFTBrowser.d.ts +1 -0
- package/dist/main-portal/components/territory/TerritoryNFTBrowser.js +147 -0
- package/dist/main-portal/components/ui/accordion.d.ts +7 -0
- package/dist/main-portal/components/ui/accordion.js +57 -0
- package/dist/main-portal/components/ui/alert-dialog.d.ts +14 -0
- package/dist/main-portal/components/ui/alert-dialog.js +85 -0
- package/dist/main-portal/components/ui/alert.d.ts +9 -0
- package/dist/main-portal/components/ui/alert.js +28 -0
- package/dist/main-portal/components/ui/aspect-ratio.d.ts +3 -0
- package/dist/main-portal/components/ui/aspect-ratio.js +43 -0
- package/dist/main-portal/components/ui/avatar.d.ts +6 -0
- package/dist/main-portal/components/ui/avatar.js +52 -0
- package/dist/main-portal/components/ui/badge.d.ts +9 -0
- package/dist/main-portal/components/ui/badge.js +26 -0
- package/dist/main-portal/components/ui/breadcrumb.d.ts +11 -0
- package/dist/main-portal/components/ui/breadcrumb.js +35 -0
- package/dist/main-portal/components/ui/button-group.d.ts +11 -0
- package/dist/main-portal/components/ui/button-group.js +34 -0
- package/dist/main-portal/components/ui/button.d.ts +10 -0
- package/dist/main-portal/components/ui/button.js +35 -0
- package/dist/main-portal/components/ui/calendar.d.ts +8 -0
- package/dist/main-portal/components/ui/calendar.js +111 -0
- package/dist/main-portal/components/ui/card.d.ts +17 -0
- package/dist/main-portal/components/ui/card.js +41 -0
- package/dist/main-portal/components/ui/carousel.d.ts +19 -0
- package/dist/main-portal/components/ui/carousel.js +134 -0
- package/dist/main-portal/components/ui/chart.d.ts +40 -0
- package/dist/main-portal/components/ui/chart.js +168 -0
- package/dist/main-portal/components/ui/checkbox.d.ts +4 -0
- package/dist/main-portal/components/ui/checkbox.js +45 -0
- package/dist/main-portal/components/ui/collapsible.d.ts +5 -0
- package/dist/main-portal/components/ui/collapsible.js +51 -0
- package/dist/main-portal/components/ui/command.d.ts +18 -0
- package/dist/main-portal/components/ui/command.js +45 -0
- package/dist/main-portal/components/ui/context-menu.d.ts +25 -0
- package/dist/main-portal/components/ui/context-menu.js +101 -0
- package/dist/main-portal/components/ui/dialog.d.ts +15 -0
- package/dist/main-portal/components/ui/dialog.js +81 -0
- package/dist/main-portal/components/ui/drawer.d.ts +13 -0
- package/dist/main-portal/components/ui/drawer.js +47 -0
- package/dist/main-portal/components/ui/dropdown-menu.d.ts +25 -0
- package/dist/main-portal/components/ui/dropdown-menu.js +101 -0
- package/dist/main-portal/components/ui/empty.d.ts +11 -0
- package/dist/main-portal/components/ui/empty.js +41 -0
- package/dist/main-portal/components/ui/field.d.ts +24 -0
- package/dist/main-portal/components/ui/field.js +85 -0
- package/dist/main-portal/components/ui/form.d.ts +24 -0
- package/dist/main-portal/components/ui/form.js +103 -0
- package/dist/main-portal/components/ui/hover-avatar.d.ts +10 -0
- package/dist/main-portal/components/ui/hover-avatar.js +70 -0
- package/dist/main-portal/components/ui/hover-card.d.ts +6 -0
- package/dist/main-portal/components/ui/hover-card.js +52 -0
- package/dist/main-portal/components/ui/input-group.d.ts +15 -0
- package/dist/main-portal/components/ui/input-group.js +65 -0
- package/dist/main-portal/components/ui/input-otp.d.ts +11 -0
- package/dist/main-portal/components/ui/input-otp.js +60 -0
- package/dist/main-portal/components/ui/input.d.ts +3 -0
- package/dist/main-portal/components/ui/input.js +8 -0
- package/dist/main-portal/components/ui/item.d.ts +23 -0
- package/dist/main-portal/components/ui/item.js +77 -0
- package/dist/main-portal/components/ui/kbd.d.ts +3 -0
- package/dist/main-portal/components/ui/kbd.js +13 -0
- package/dist/main-portal/components/ui/label.d.ts +4 -0
- package/dist/main-portal/components/ui/label.js +44 -0
- package/dist/main-portal/components/ui/menubar.d.ts +26 -0
- package/dist/main-portal/components/ui/menubar.js +105 -0
- package/dist/main-portal/components/ui/navigation-menu.d.ts +14 -0
- package/dist/main-portal/components/ui/navigation-menu.js +75 -0
- package/dist/main-portal/components/ui/pagination.d.ts +13 -0
- package/dist/main-portal/components/ui/pagination.js +37 -0
- package/dist/main-portal/components/ui/popover.d.ts +7 -0
- package/dist/main-portal/components/ui/popover.js +56 -0
- package/dist/main-portal/components/ui/progress.d.ts +4 -0
- package/dist/main-portal/components/ui/progress.js +44 -0
- package/dist/main-portal/components/ui/radio-group.d.ts +5 -0
- package/dist/main-portal/components/ui/radio-group.js +49 -0
- package/dist/main-portal/components/ui/resizable.d.ts +8 -0
- package/dist/main-portal/components/ui/resizable.js +53 -0
- package/dist/main-portal/components/ui/scroll-area.d.ts +5 -0
- package/dist/main-portal/components/ui/scroll-area.js +50 -0
- package/dist/main-portal/components/ui/select.d.ts +15 -0
- package/dist/main-portal/components/ui/select.js +83 -0
- package/dist/main-portal/components/ui/separator.d.ts +4 -0
- package/dist/main-portal/components/ui/separator.js +44 -0
- package/dist/main-portal/components/ui/sheet.d.ts +13 -0
- package/dist/main-portal/components/ui/sheet.js +83 -0
- package/dist/main-portal/components/ui/sidebar.d.ts +69 -0
- package/dist/main-portal/components/ui/sidebar.js +258 -0
- package/dist/main-portal/components/ui/skeleton.d.ts +2 -0
- package/dist/main-portal/components/ui/skeleton.js +9 -0
- package/dist/main-portal/components/ui/slider.d.ts +4 -0
- package/dist/main-portal/components/ui/slider.js +50 -0
- package/dist/main-portal/components/ui/sonner.d.ts +3 -0
- package/dist/main-portal/components/ui/sonner.js +17 -0
- package/dist/main-portal/components/ui/spinner.d.ts +2 -0
- package/dist/main-portal/components/ui/spinner.js +10 -0
- package/dist/main-portal/components/ui/switch.d.ts +4 -0
- package/dist/main-portal/components/ui/switch.js +44 -0
- package/dist/main-portal/components/ui/table.d.ts +10 -0
- package/dist/main-portal/components/ui/table.js +38 -0
- package/dist/main-portal/components/ui/tabs.d.ts +7 -0
- package/dist/main-portal/components/ui/tabs.js +53 -0
- package/dist/main-portal/components/ui/terminal.d.ts +49 -0
- package/dist/main-portal/components/ui/terminal.js +56 -0
- package/dist/main-portal/components/ui/textarea.d.ts +3 -0
- package/dist/main-portal/components/ui/textarea.js +8 -0
- package/dist/main-portal/components/ui/time-remaining.d.ts +54 -0
- package/dist/main-portal/components/ui/time-remaining.js +223 -0
- package/dist/main-portal/components/ui/toast.d.ts +15 -0
- package/dist/main-portal/components/ui/toast.js +77 -0
- package/dist/main-portal/components/ui/toaster.d.ts +1 -0
- package/dist/main-portal/components/ui/toaster.js +14 -0
- package/dist/main-portal/components/ui/toggle-group.d.ts +7 -0
- package/dist/main-portal/components/ui/toggle-group.js +58 -0
- package/dist/main-portal/components/ui/toggle.d.ts +9 -0
- package/dist/main-portal/components/ui/toggle.js +64 -0
- package/dist/main-portal/components/ui/tooltip.d.ts +7 -0
- package/dist/main-portal/components/ui/tooltip.js +56 -0
- package/dist/main-portal/components/ui/use-mobile.d.ts +1 -0
- package/dist/main-portal/components/ui/use-mobile.js +53 -0
- package/dist/main-portal/components/voting/VotingPage.d.ts +1 -0
- package/dist/main-portal/components/voting/VotingPage.js +14 -0
- package/dist/main-portal/components/wallet/MCCHistory.d.ts +9 -0
- package/dist/main-portal/components/wallet/MCCHistory.js +100 -0
- package/dist/main-portal/components/wallet/WalletManagement.d.ts +5 -0
- package/dist/main-portal/components/wallet/WalletManagement.js +144 -0
- package/dist/main-portal/components/wallet/WalletPage.d.ts +1 -0
- package/dist/main-portal/components/wallet/WalletPage.js +130 -0
- package/dist/main-portal/config/menu-config.d.ts +22 -0
- package/dist/main-portal/config/menu-config.js +167 -0
- package/dist/main-portal/contexts/MCCPriceContext.d.ts +38 -0
- package/dist/main-portal/contexts/MCCPriceContext.js +70 -0
- package/dist/main-portal/contexts/WalletContext.d.ts +48 -0
- package/dist/main-portal/contexts/WalletContext.js +94 -0
- package/dist/main-portal/hooks/index.d.ts +4 -0
- package/dist/main-portal/hooks/index.js +11 -0
- package/dist/main-portal/hooks/use-breakpoint.d.ts +45 -0
- package/dist/main-portal/hooks/use-breakpoint.js +91 -0
- package/dist/main-portal/hooks/use-mobile.d.ts +1 -0
- package/dist/main-portal/hooks/use-mobile.js +55 -0
- package/dist/main-portal/hooks/use-toast.d.ts +44 -0
- package/dist/main-portal/hooks/use-toast.js +164 -0
- package/dist/main-portal/hooks/useAuth.d.ts +30 -0
- package/dist/main-portal/hooks/useAuth.js +136 -0
- package/dist/main-portal/hooks/useMCC.d.ts +26 -0
- package/dist/main-portal/hooks/useMCC.js +148 -0
- package/dist/main-portal/hooks/useMCD.d.ts +17 -0
- package/dist/main-portal/hooks/useMCD.js +114 -0
- package/dist/main-portal/hooks/useMultiWalletBalance.d.ts +31 -0
- package/dist/main-portal/hooks/useMultiWalletBalance.js +65 -0
- package/dist/main-portal/hooks/useSolanaBalance.d.ts +21 -0
- package/dist/main-portal/hooks/useSolanaBalance.js +58 -0
- package/dist/main-portal/hooks/useSpeechRecognition.d.ts +6 -0
- package/dist/main-portal/hooks/useSpeechRecognition.js +82 -0
- package/dist/main-portal/hooks/useStats.d.ts +131 -0
- package/dist/main-portal/hooks/useStats.js +161 -0
- package/dist/main-portal/hooks/useStrategies.d.ts +134 -0
- package/dist/main-portal/hooks/useStrategies.js +28 -0
- package/dist/main-portal/hooks/useUserRank.d.ts +16 -0
- package/dist/main-portal/hooks/useUserRank.js +61 -0
- package/dist/main-portal/hooks/useWalletTokenBalances.d.ts +29 -0
- package/dist/main-portal/hooks/useWalletTokenBalances.js +106 -0
- package/dist/main-portal/i18n/navigation.d.ts +341 -0
- package/dist/main-portal/i18n/navigation.js +7 -0
- package/dist/main-portal/i18n/request.d.ts +2 -0
- package/dist/main-portal/i18n/request.js +47 -0
- package/dist/main-portal/i18n/routing.d.ts +18 -0
- package/dist/main-portal/i18n/routing.js +10 -0
- package/dist/main-portal/lib/ai-chat-config.d.ts +8 -0
- package/dist/main-portal/lib/ai-chat-config.js +144 -0
- package/dist/main-portal/lib/api/blockchain.d.ts +178 -0
- package/dist/main-portal/lib/api/blockchain.js +302 -0
- package/dist/main-portal/lib/api/core.d.ts +3 -0
- package/dist/main-portal/lib/api/core.js +47 -0
- package/dist/main-portal/lib/api/index.d.ts +9 -0
- package/dist/main-portal/lib/api/index.js +37 -0
- package/dist/main-portal/lib/api/services/ai.d.ts +139 -0
- package/dist/main-portal/lib/api/services/ai.js +214 -0
- package/dist/main-portal/lib/api/services/finance.d.ts +37 -0
- package/dist/main-portal/lib/api/services/finance.js +144 -0
- package/dist/main-portal/lib/api/services/index.d.ts +5 -0
- package/dist/main-portal/lib/api/services/index.js +21 -0
- package/dist/main-portal/lib/api/services/mining.d.ts +68 -0
- package/dist/main-portal/lib/api/services/mining.js +76 -0
- package/dist/main-portal/lib/api/services/organization.d.ts +161 -0
- package/dist/main-portal/lib/api/services/organization.js +139 -0
- package/dist/main-portal/lib/api/services/user.d.ts +90 -0
- package/dist/main-portal/lib/api/services/user.js +78 -0
- package/dist/main-portal/lib/api/services.d.ts +1 -0
- package/dist/main-portal/lib/api/services.js +17 -0
- package/dist/main-portal/lib/api-service.d.ts +1 -0
- package/dist/main-portal/lib/api-service.js +18 -0
- package/dist/main-portal/lib/auth-service.d.ts +65 -0
- package/dist/main-portal/lib/auth-service.js +382 -0
- package/dist/main-portal/lib/config/mainstream-tokens.d.ts +13 -0
- package/dist/main-portal/lib/config/mainstream-tokens.js +88 -0
- package/dist/main-portal/lib/docs-data.d.ts +36 -0
- package/dist/main-portal/lib/docs-data.js +108 -0
- package/dist/main-portal/lib/oauth-config.d.ts +12 -0
- package/dist/main-portal/lib/oauth-config.js +48 -0
- package/dist/main-portal/lib/order-id-generator.d.ts +19 -0
- package/dist/main-portal/lib/order-id-generator.js +97 -0
- package/dist/main-portal/lib/solana/reincarnation-client.d.ts +28 -0
- package/dist/main-portal/lib/solana/reincarnation-client.js +39 -0
- package/dist/main-portal/lib/solana/solana-pay.d.ts +31 -0
- package/dist/main-portal/lib/solana/solana-pay.js +85 -0
- package/dist/main-portal/lib/strategy/defaults.d.ts +2 -0
- package/dist/main-portal/lib/strategy/defaults.js +58 -0
- package/dist/main-portal/lib/strategy/index.d.ts +3 -0
- package/dist/main-portal/lib/strategy/index.js +20 -0
- package/dist/main-portal/lib/strategy/tooltips.d.ts +1 -0
- package/dist/main-portal/lib/strategy/tooltips.js +50 -0
- package/dist/main-portal/lib/strategy/types.d.ts +74 -0
- package/dist/main-portal/lib/strategy/types.js +2 -0
- package/dist/main-portal/lib/types/ai.types.d.ts +111 -0
- package/dist/main-portal/lib/types/ai.types.js +2 -0
- package/dist/main-portal/lib/types/api.d.ts +5 -0
- package/dist/main-portal/lib/types/api.js +21 -0
- package/dist/main-portal/lib/types/common.types.d.ts +168 -0
- package/dist/main-portal/lib/types/common.types.js +24 -0
- package/dist/main-portal/lib/types/finance.types.d.ts +267 -0
- package/dist/main-portal/lib/types/finance.types.js +2 -0
- package/dist/main-portal/lib/types/protocol.types.d.ts +216 -0
- package/dist/main-portal/lib/types/protocol.types.js +2 -0
- package/dist/main-portal/lib/types/user.types.d.ts +243 -0
- package/dist/main-portal/lib/types/user.types.js +12 -0
- package/dist/main-portal/lib/utils/territoryId.d.ts +75 -0
- package/dist/main-portal/lib/utils/territoryId.js +241 -0
- package/dist/main-portal/lib/utils.d.ts +4 -0
- package/dist/main-portal/lib/utils.js +24 -0
- package/dist/main-portal/lib/wallet-auth/api.d.ts +13 -0
- package/dist/main-portal/lib/wallet-auth/api.js +132 -0
- package/dist/main-portal/lib/wallet-auth/types.d.ts +87 -0
- package/dist/main-portal/lib/wallet-auth/types.js +58 -0
- package/package.json +55 -5
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.PriceChart = PriceChart;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
const button_1 = require("../../ui/button");
|
|
8
|
+
const recharts_1 = require("recharts");
|
|
9
|
+
const THEMES = {
|
|
10
|
+
blue: {
|
|
11
|
+
bg: "bg-neutral-900 border-neutral-700",
|
|
12
|
+
title: "text-white",
|
|
13
|
+
btnActive: "bg-cyan-700 hover:bg-cyan-600 text-white",
|
|
14
|
+
btnInactive: "hover:bg-neutral-700 text-neutral-500",
|
|
15
|
+
btnBg: "bg-neutral-800",
|
|
16
|
+
grid: "#333",
|
|
17
|
+
cursor: "#06B6D4",
|
|
18
|
+
tooltip: { bg: "#0E0E0E", border: "#333" },
|
|
19
|
+
market: "#67e8f9",
|
|
20
|
+
base: "#f59e0b",
|
|
21
|
+
mining: "#4ade80",
|
|
22
|
+
},
|
|
23
|
+
orange: {
|
|
24
|
+
bg: "bg-[#1B1B1B] border-[#2A2A2A]",
|
|
25
|
+
title: "text-[#EDEDED]",
|
|
26
|
+
btnActive: "bg-[#FF6B00] hover:bg-[#E55A00] text-black",
|
|
27
|
+
btnInactive: "hover:bg-[#2A2A2A] text-[#9A9A9A]",
|
|
28
|
+
btnBg: "bg-[#0E0E0E]",
|
|
29
|
+
grid: "#2A2A2A",
|
|
30
|
+
cursor: "#FF6B00",
|
|
31
|
+
tooltip: { bg: "#0E0E0E", border: "#2A2A2A" },
|
|
32
|
+
market: "#FF6B00",
|
|
33
|
+
base: "#f59e0b",
|
|
34
|
+
mining: "#4ade80",
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
function PriceChart({ theme = "blue" }) {
|
|
38
|
+
const t = THEMES[theme];
|
|
39
|
+
const [timeRange, setTimeRange] = (0, react_1.useState)("30D");
|
|
40
|
+
const [allHistory, setAllHistory] = (0, react_1.useState)([]);
|
|
41
|
+
const [loading, setLoading] = (0, react_1.useState)(true);
|
|
42
|
+
(0, react_1.useEffect)(() => {
|
|
43
|
+
const load = async () => {
|
|
44
|
+
setLoading(true);
|
|
45
|
+
try {
|
|
46
|
+
const res = await fetch("/api/stats/price-history?range=1Y");
|
|
47
|
+
const json = await res.json();
|
|
48
|
+
if (json.success && Array.isArray(json.data)) {
|
|
49
|
+
setAllHistory(json.data);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch { }
|
|
53
|
+
setLoading(false);
|
|
54
|
+
};
|
|
55
|
+
load();
|
|
56
|
+
const interval = setInterval(load, 900000);
|
|
57
|
+
return () => clearInterval(interval);
|
|
58
|
+
}, []);
|
|
59
|
+
const visibleHistory = (0, react_1.useMemo)(() => {
|
|
60
|
+
if (allHistory.length === 0)
|
|
61
|
+
return [];
|
|
62
|
+
const now = Date.now() / 1000;
|
|
63
|
+
const cutoffs = {
|
|
64
|
+
"30D": now - 30 * 86400,
|
|
65
|
+
"180D": now - 180 * 86400,
|
|
66
|
+
"1Y": 0,
|
|
67
|
+
};
|
|
68
|
+
const cutoff = cutoffs[timeRange];
|
|
69
|
+
return cutoff > 0 ? allHistory.filter((p) => p.timestamp >= cutoff) : allHistory;
|
|
70
|
+
}, [allHistory, timeRange]);
|
|
71
|
+
const chartData = (0, react_1.useMemo)(() => {
|
|
72
|
+
return visibleHistory.map((p) => {
|
|
73
|
+
const d = new Date(p.timestamp * 1000);
|
|
74
|
+
let label;
|
|
75
|
+
if (timeRange === "30D") {
|
|
76
|
+
label = `${(d.getUTCMonth() + 1).toString().padStart(2, "0")}/${d.getUTCDate().toString().padStart(2, "0")} ${d.getUTCHours().toString().padStart(2, "0")}h`;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
label = `${(d.getUTCMonth() + 1).toString().padStart(2, "0")}/${d.getUTCDate().toString().padStart(2, "0")}`;
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
time: label,
|
|
83
|
+
market: p.market_price,
|
|
84
|
+
base: p.base_price,
|
|
85
|
+
mining: p.base_price != null ? p.base_price * 4 : null,
|
|
86
|
+
};
|
|
87
|
+
});
|
|
88
|
+
}, [visibleHistory, timeRange]);
|
|
89
|
+
if (loading) {
|
|
90
|
+
return (0, jsx_runtime_1.jsx)("div", { className: `h-[240px] sm:h-[380px] ${t.bg} rounded-lg animate-pulse border` });
|
|
91
|
+
}
|
|
92
|
+
if (chartData.length === 0) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: `${t.bg} rounded-lg p-3 sm:p-4 border`, children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between mb-2 sm:mb-3", children: [(0, jsx_runtime_1.jsx)("span", { className: `text-xs sm:text-sm font-medium ${t.title}`, children: "MCC Pricing Overview" }), (0, jsx_runtime_1.jsx)("div", { className: `flex items-center gap-1 ${t.btnBg} p-0.5 rounded`, children: ["30D", "180D", "1Y"].map((range) => ((0, jsx_runtime_1.jsx)(button_1.Button, { size: "sm", variant: timeRange === range ? "default" : "ghost", onClick: () => setTimeRange(range), className: `${timeRange === range ? t.btnActive : t.btnInactive} px-2.5 py-0.5 h-6 text-xs`, children: range }, range))) })] }), (0, jsx_runtime_1.jsx)("div", { className: "h-[200px] sm:h-[320px]", children: (0, jsx_runtime_1.jsx)(recharts_1.ResponsiveContainer, { width: "100%", height: "100%", children: (0, jsx_runtime_1.jsxs)(recharts_1.LineChart, { data: chartData, margin: { top: 5, right: 10, left: -15, bottom: 0 }, children: [(0, jsx_runtime_1.jsx)(recharts_1.CartesianGrid, { vertical: false, strokeDasharray: "3 3", stroke: t.grid }), (0, jsx_runtime_1.jsx)(recharts_1.XAxis, { dataKey: "time", tick: { fill: "#9A9A9A", fontSize: 9 }, tickLine: false, axisLine: false, interval: Math.max(1, Math.floor(chartData.length / 10)) }), (0, jsx_runtime_1.jsx)(recharts_1.YAxis, { tick: { fill: "#9A9A9A", fontSize: 10 }, tickLine: false, axisLine: false, tickFormatter: (value) => `$${value.toFixed(2)}`, domain: ["dataMin - 0.1", "dataMax + 0.1"] }), (0, jsx_runtime_1.jsx)(recharts_1.Tooltip, { cursor: { stroke: t.cursor, strokeWidth: 1, strokeDasharray: "4 4" }, contentStyle: { backgroundColor: t.tooltip.bg, border: `1px solid ${t.tooltip.border}`, borderRadius: "0.5rem", fontSize: "12px" }, labelStyle: { color: "#9A9A9A" }, formatter: (value, name) => {
|
|
96
|
+
const labels = { market: "Market Price", base: "Base Price", mining: "Mining Price" };
|
|
97
|
+
return value != null ? [`$${value.toFixed(4)}`, labels[name] || name] : ["--", name];
|
|
98
|
+
} }), (0, jsx_runtime_1.jsx)(recharts_1.Line, { type: "monotone", dataKey: "mining", name: "mining", stroke: t.mining, strokeWidth: 2, dot: false, connectNulls: true, activeDot: { r: 3, fill: t.mining, stroke: t.tooltip.bg, strokeWidth: 2 } }), (0, jsx_runtime_1.jsx)(recharts_1.Line, { type: "monotone", dataKey: "market", name: "market", stroke: t.market, strokeWidth: 2, dot: false, connectNulls: true, activeDot: { r: 3, fill: t.market, stroke: t.tooltip.bg, strokeWidth: 2 } }), (0, jsx_runtime_1.jsx)(recharts_1.Line, { type: "monotone", dataKey: "base", name: "base", stroke: t.base, strokeWidth: 2, dot: false, connectNulls: true, strokeDasharray: "6 3", activeDot: { r: 3, fill: t.base, stroke: t.tooltip.bg, strokeWidth: 2 } })] }) }) })] }));
|
|
99
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TeamWalletItem } from "../../../hooks/useStats";
|
|
2
|
+
interface TeamWalletChartProps {
|
|
3
|
+
data: TeamWalletItem[];
|
|
4
|
+
className?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function TeamWalletChart({ data, className }: TeamWalletChartProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// AI-generated · AI-managed · AI-maintained
|
|
3
|
+
"use client";
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.TeamWalletChart = TeamWalletChart;
|
|
6
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
+
const GREEN_COLORS = [
|
|
8
|
+
"#5EEAD4",
|
|
9
|
+
"#2DD4BF",
|
|
10
|
+
"#99F6E4",
|
|
11
|
+
"#14B8A6",
|
|
12
|
+
"#0D9488",
|
|
13
|
+
];
|
|
14
|
+
function formatValue(value) {
|
|
15
|
+
if (value >= 1000000000)
|
|
16
|
+
return `${(value / 1000000000).toFixed(2)}B`;
|
|
17
|
+
if (value >= 1000000)
|
|
18
|
+
return `${(value / 1000000).toFixed(2)}M`;
|
|
19
|
+
if (value >= 1000)
|
|
20
|
+
return `${(value / 1000).toFixed(1)}K`;
|
|
21
|
+
return value.toLocaleString();
|
|
22
|
+
}
|
|
23
|
+
function TeamWalletChart({ data, className }) {
|
|
24
|
+
const maxValue = Math.max(...data.map(d => d.mcc_balance), 1);
|
|
25
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: className, children: (0, jsx_runtime_1.jsx)("div", { className: "flex flex-col justify-center h-full gap-3 sm:gap-4", children: data.map((wallet, index) => {
|
|
26
|
+
const ratio = wallet.mcc_balance / maxValue;
|
|
27
|
+
const widthPercent = Math.max(ratio * 93, 2);
|
|
28
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2 sm:gap-3", children: [(0, jsx_runtime_1.jsx)("div", { className: "w-20 sm:w-24 flex-shrink-0 text-right", children: (0, jsx_runtime_1.jsx)("span", { className: "font-mono text-xs sm:text-sm text-foreground/50 truncate block", children: wallet.label }) }), (0, jsx_runtime_1.jsxs)("div", { className: "flex-1 flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)("div", { className: "flex-1 h-7 sm:h-8 bg-border/10 rounded-r overflow-hidden", children: (0, jsx_runtime_1.jsx)("div", { className: "h-full rounded-r transition-all duration-500 ease-out", style: {
|
|
29
|
+
width: `${widthPercent}%`,
|
|
30
|
+
backgroundColor: GREEN_COLORS[index % GREEN_COLORS.length],
|
|
31
|
+
} }) }), (0, jsx_runtime_1.jsx)("span", { className: "font-mono text-xs sm:text-sm text-foreground/60 tabular-nums flex-shrink-0 w-12 sm:w-16 text-left", children: formatValue(wallet.mcc_balance) })] })] }, wallet.key));
|
|
32
|
+
}) }) }));
|
|
33
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TerritoryItem } from "../../../hooks/useStats";
|
|
2
|
+
interface TerritoryProgressChartProps {
|
|
3
|
+
data: TerritoryItem[];
|
|
4
|
+
className?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function TerritoryProgressChart({ data, className }: TerritoryProgressChartProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// AI-generated · AI-managed · AI-maintained
|
|
3
|
+
"use client";
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.TerritoryProgressChart = TerritoryProgressChart;
|
|
6
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
+
const recharts_1 = require("recharts");
|
|
8
|
+
const chart_1 = require("../../ui/chart");
|
|
9
|
+
const chartConfig = {
|
|
10
|
+
active: {
|
|
11
|
+
label: "活跃",
|
|
12
|
+
color: "#10b981"
|
|
13
|
+
},
|
|
14
|
+
inactive: {
|
|
15
|
+
label: "未活跃",
|
|
16
|
+
color: "#374151"
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const TERRITORY_COLORS = {
|
|
20
|
+
System: "#047857",
|
|
21
|
+
Sector: "#059669",
|
|
22
|
+
Matrix: "#10b981",
|
|
23
|
+
Station: "#34d399"
|
|
24
|
+
};
|
|
25
|
+
function TerritoryProgressChart({ data, className }) {
|
|
26
|
+
const chartData = data.map(item => ({
|
|
27
|
+
name: `${item.type} (${item.name})`,
|
|
28
|
+
type: item.type,
|
|
29
|
+
active: item.active,
|
|
30
|
+
total: item.total,
|
|
31
|
+
rate: item.total > 0 ? Math.round((item.active / item.total) * 100) : 0,
|
|
32
|
+
fill: TERRITORY_COLORS[item.type] || "#10b981"
|
|
33
|
+
}));
|
|
34
|
+
return ((0, jsx_runtime_1.jsx)(chart_1.ChartContainer, { config: chartConfig, className: className, children: (0, jsx_runtime_1.jsxs)(recharts_1.BarChart, { data: chartData, layout: "vertical", margin: { left: 120, right: 60 }, accessibilityLayer: true, children: [(0, jsx_runtime_1.jsx)(recharts_1.CartesianGrid, { horizontal: false, strokeDasharray: "3 3", stroke: "#374151" }), (0, jsx_runtime_1.jsx)(recharts_1.XAxis, { type: "number", tickLine: false, axisLine: false, domain: [0, 100], tick: { fill: "#9ca3af" }, tickFormatter: (value) => `${value}%` }), (0, jsx_runtime_1.jsx)(recharts_1.YAxis, { type: "category", dataKey: "name", tickLine: false, axisLine: false, width: 120, tick: { fill: "#9ca3af" } }), (0, jsx_runtime_1.jsx)(chart_1.ChartTooltip, { cursor: false, content: (0, jsx_runtime_1.jsx)(chart_1.ChartTooltipContent, { formatter: (value, name, item) => ((0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col gap-1", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-medium", children: item.payload.type }), (0, jsx_runtime_1.jsxs)("span", { children: ["\u6D3B\u8DC3: ", item.payload.active, " / ", item.payload.total] }), (0, jsx_runtime_1.jsxs)("span", { children: ["\u6D3B\u8DC3\u7387: ", item.payload.rate, "%"] })] })) }) }), (0, jsx_runtime_1.jsx)(recharts_1.Bar, { dataKey: "rate", radius: [0, 4, 4, 0], children: chartData.map((entry, index) => ((0, jsx_runtime_1.jsx)(recharts_1.Cell, { fill: entry.fill }, `cell-${index}`))) })] }) }));
|
|
35
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { UserLevelItem } from "../../../hooks/useStats";
|
|
2
|
+
interface UserLevelPieChartProps {
|
|
3
|
+
data: UserLevelItem[];
|
|
4
|
+
className?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function UserLevelPieChart({ data, className }: UserLevelPieChartProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// AI-generated · AI-managed · AI-maintained
|
|
3
|
+
"use client";
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.UserLevelPieChart = UserLevelPieChart;
|
|
6
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
+
const recharts_1 = require("recharts");
|
|
8
|
+
const chart_1 = require("../../ui/chart");
|
|
9
|
+
const LEVEL_COLORS = [
|
|
10
|
+
"#10b981",
|
|
11
|
+
"#34d399",
|
|
12
|
+
"#6ee7b7",
|
|
13
|
+
"#059669",
|
|
14
|
+
"#047857",
|
|
15
|
+
"#065f46",
|
|
16
|
+
"#064e3b"
|
|
17
|
+
];
|
|
18
|
+
function UserLevelPieChart({ data, className }) {
|
|
19
|
+
const chartConfig = {};
|
|
20
|
+
data.forEach((item, index) => {
|
|
21
|
+
chartConfig[item.name.toLowerCase()] = {
|
|
22
|
+
label: `${item.name} (${item.chinese})`,
|
|
23
|
+
color: LEVEL_COLORS[index] || LEVEL_COLORS[0]
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
const chartData = data.map((item, index) => ({
|
|
27
|
+
name: item.name,
|
|
28
|
+
chinese: item.chinese,
|
|
29
|
+
value: item.count,
|
|
30
|
+
percentage: item.percentage,
|
|
31
|
+
fill: LEVEL_COLORS[index] || LEVEL_COLORS[0]
|
|
32
|
+
}));
|
|
33
|
+
return ((0, jsx_runtime_1.jsx)(chart_1.ChartContainer, { config: chartConfig, className: className, children: (0, jsx_runtime_1.jsxs)(recharts_1.PieChart, { children: [(0, jsx_runtime_1.jsx)(recharts_1.Pie, { data: chartData, dataKey: "value", nameKey: "name", cx: "50%", cy: "50%", innerRadius: 60, outerRadius: 100, paddingAngle: 2, label: ({ name, percentage }) => `${name} ${percentage}%`, labelLine: { stroke: "#6ee7b7" }, children: chartData.map((entry, index) => ((0, jsx_runtime_1.jsx)(recharts_1.Cell, { fill: entry.fill }, `cell-${index}`))) }), (0, jsx_runtime_1.jsx)(chart_1.ChartTooltip, { content: (0, jsx_runtime_1.jsx)(chart_1.ChartTooltipContent, { formatter: (value, name, item) => ((0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col gap-1", children: [(0, jsx_runtime_1.jsxs)("span", { className: "font-medium", children: [item.payload.name, " (", item.payload.chinese, ")"] }), (0, jsx_runtime_1.jsxs)("span", { children: ["\u4EBA\u6570: ", Number(value).toLocaleString()] }), (0, jsx_runtime_1.jsxs)("span", { className: "text-muted-foreground text-xs", children: ["\u5360\u6BD4: ", item.payload.percentage, "%"] })] })) }) })] }) }));
|
|
34
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { MiningTrendChart } from './MiningTrendChart';
|
|
2
|
+
export { UserLevelPieChart } from './UserLevelPieChart';
|
|
3
|
+
export { TeamWalletChart } from './TeamWalletChart';
|
|
4
|
+
export { MCCSupplyChart } from './MCCSupplyChart';
|
|
5
|
+
export { TerritoryProgressChart } from './TerritoryProgressChart';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TerritoryProgressChart = exports.MCCSupplyChart = exports.TeamWalletChart = exports.UserLevelPieChart = exports.MiningTrendChart = void 0;
|
|
4
|
+
// AI-generated · AI-managed · AI-maintained
|
|
5
|
+
var MiningTrendChart_1 = require("./MiningTrendChart");
|
|
6
|
+
Object.defineProperty(exports, "MiningTrendChart", { enumerable: true, get: function () { return MiningTrendChart_1.MiningTrendChart; } });
|
|
7
|
+
var UserLevelPieChart_1 = require("./UserLevelPieChart");
|
|
8
|
+
Object.defineProperty(exports, "UserLevelPieChart", { enumerable: true, get: function () { return UserLevelPieChart_1.UserLevelPieChart; } });
|
|
9
|
+
var TeamWalletChart_1 = require("./TeamWalletChart");
|
|
10
|
+
Object.defineProperty(exports, "TeamWalletChart", { enumerable: true, get: function () { return TeamWalletChart_1.TeamWalletChart; } });
|
|
11
|
+
var MCCSupplyChart_1 = require("./MCCSupplyChart");
|
|
12
|
+
Object.defineProperty(exports, "MCCSupplyChart", { enumerable: true, get: function () { return MCCSupplyChart_1.MCCSupplyChart; } });
|
|
13
|
+
var TerritoryProgressChart_1 = require("./TerritoryProgressChart");
|
|
14
|
+
Object.defineProperty(exports, "TerritoryProgressChart", { enumerable: true, get: function () { return TerritoryProgressChart_1.TerritoryProgressChart; } });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function DataHero(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// AI-generated · AI-managed · AI-maintained
|
|
3
|
+
"use client";
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.DataHero = DataHero;
|
|
6
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
+
const react_1 = require("react");
|
|
8
|
+
const useStats_1 = require("../../hooks/useStats");
|
|
9
|
+
const next_intl_1 = require("next-intl");
|
|
10
|
+
function DataHero() {
|
|
11
|
+
const [svgContent, setSvgContent] = (0, react_1.useState)("");
|
|
12
|
+
const [mounted, setMounted] = (0, react_1.useState)(false);
|
|
13
|
+
const { data: stats, loading, error } = (0, useStats_1.useOverviewStats)();
|
|
14
|
+
const t = (0, next_intl_1.useTranslations)("data");
|
|
15
|
+
(0, react_1.useEffect)(() => {
|
|
16
|
+
setMounted(true);
|
|
17
|
+
}, []);
|
|
18
|
+
(0, react_1.useEffect)(() => {
|
|
19
|
+
const loadSVG = async () => {
|
|
20
|
+
try {
|
|
21
|
+
const response = await fetch("/map-dark.svg");
|
|
22
|
+
const svgText = await response.text();
|
|
23
|
+
setSvgContent(svgText);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
console.error("Failed to load SVG:", error);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
if (mounted) {
|
|
30
|
+
loadSVG();
|
|
31
|
+
}
|
|
32
|
+
}, [mounted]);
|
|
33
|
+
(0, react_1.useEffect)(() => {
|
|
34
|
+
if (svgContent) {
|
|
35
|
+
const timer = setTimeout(() => {
|
|
36
|
+
const rects = document.querySelectorAll("#zion-map rect");
|
|
37
|
+
rects.forEach((rect) => {
|
|
38
|
+
const duration = Math.random() * 1.5 + 0.5;
|
|
39
|
+
const delay = Math.random() * 1;
|
|
40
|
+
rect.setAttribute("style", `animation: glimmer ${duration}s ease-in-out ${delay}s infinite alternate;`);
|
|
41
|
+
});
|
|
42
|
+
if (!document.getElementById("glimmer-style")) {
|
|
43
|
+
const style = document.createElement("style");
|
|
44
|
+
style.id = "glimmer-style";
|
|
45
|
+
style.textContent = `
|
|
46
|
+
@keyframes glimmer {
|
|
47
|
+
0% { opacity: 1; }
|
|
48
|
+
100% { opacity: 0.1; }
|
|
49
|
+
}
|
|
50
|
+
`;
|
|
51
|
+
document.head.appendChild(style);
|
|
52
|
+
}
|
|
53
|
+
}, 100);
|
|
54
|
+
return () => clearTimeout(timer);
|
|
55
|
+
}
|
|
56
|
+
}, [svgContent]);
|
|
57
|
+
const formatNumber = (num) => {
|
|
58
|
+
if (num >= 1000000000)
|
|
59
|
+
return `${(num / 1000000000).toFixed(1)}B`;
|
|
60
|
+
if (num >= 1000000)
|
|
61
|
+
return `${(num / 1000000).toFixed(1)}M`;
|
|
62
|
+
if (num >= 1000)
|
|
63
|
+
return `${(num / 1000).toFixed(1)}K`;
|
|
64
|
+
return num.toLocaleString();
|
|
65
|
+
};
|
|
66
|
+
const formatCurrency = (num) => {
|
|
67
|
+
if (num >= 1000000)
|
|
68
|
+
return `$${(num / 1000000).toFixed(1)}M`;
|
|
69
|
+
if (num >= 1000)
|
|
70
|
+
return `$${(num / 1000).toFixed(1)}K`;
|
|
71
|
+
return `$${num.toLocaleString()}`;
|
|
72
|
+
};
|
|
73
|
+
return ((0, jsx_runtime_1.jsxs)("section", { className: "relative min-h-[80vh] flex items-center justify-center overflow-hidden", children: [(0, jsx_runtime_1.jsx)("div", { className: "absolute inset-0 bg-gradient-to-b from-background via-background to-primary/5" }), (0, jsx_runtime_1.jsx)("div", { className: "absolute inset-0 flex items-center justify-center opacity-50", style: { transform: 'translateY(140px) scale(1.2)' }, children: svgContent ? ((0, jsx_runtime_1.jsx)("div", { id: "zion-map", className: "w-full h-full max-w-[1400px] flex items-center justify-center", dangerouslySetInnerHTML: { __html: svgContent } })) : ((0, jsx_runtime_1.jsx)("div", { className: "w-[800px] h-[500px] bg-muted/20 animate-pulse rounded-lg" })) }), (0, jsx_runtime_1.jsxs)("div", { className: "relative z-10 text-center px-4 sm:px-6 max-w-4xl mx-auto", children: [(0, jsx_runtime_1.jsx)("p", { className: "font-mono text-xs uppercase tracking-[0.3em] text-primary mb-4", children: "MICROCOSM NETWORK STATUS" }), (0, jsx_runtime_1.jsx)("h1", { className: "text-4xl sm:text-5xl md:text-6xl font-bold text-foreground mb-6 leading-tight", children: t('heroTitle') }), (0, jsx_runtime_1.jsx)("p", { className: "text-lg sm:text-xl text-muted-foreground max-w-2xl mx-auto mb-8", children: t('heroSubtitle') }), (0, jsx_runtime_1.jsx)("div", { className: "grid grid-cols-2 sm:grid-cols-4 gap-4 sm:gap-6 mt-12", children: loading ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(QuickStatSkeleton, {}), (0, jsx_runtime_1.jsx)(QuickStatSkeleton, {}), (0, jsx_runtime_1.jsx)(QuickStatSkeleton, {}), (0, jsx_runtime_1.jsx)(QuickStatSkeleton, {})] })) : error ? ((0, jsx_runtime_1.jsxs)("div", { className: "col-span-4 text-center text-red-400", children: [t('loadFailed'), ": ", error] })) : stats ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(QuickStat, { label: t('activeUsers'), value: formatNumber(stats.total_users), change: `+${stats.new_users_today} ${t('today')}` }), (0, jsx_runtime_1.jsx)(QuickStat, { label: t('totalTerritories'), value: formatNumber(stats.total_territories), change: `${t('active')} ${stats.active_users_24h}` }), (0, jsx_runtime_1.jsx)(QuickStat, { label: t('mccCirculating'), value: formatNumber(stats.mcc_circulating), change: t('onchainVerified') }), (0, jsx_runtime_1.jsx)(QuickStat, { label: "MCD", value: formatNumber(stats.mcd_locked), change: "Vault Total" })] })) : null }), stats?.updated_at && ((0, jsx_runtime_1.jsxs)("p", { className: "text-xs text-muted-foreground mt-6", children: [t('dataUpdatedAt'), " ", new Date(stats.updated_at).toLocaleString()] }))] }), (0, jsx_runtime_1.jsx)("div", { className: "absolute bottom-0 left-0 right-0 h-32 bg-gradient-to-t from-background to-transparent" })] }));
|
|
74
|
+
}
|
|
75
|
+
function QuickStat({ label, value, change }) {
|
|
76
|
+
const isPositive = change.startsWith("+") || change.includes("today") || change.includes("active") || change.includes("今日") || change.includes("活跃");
|
|
77
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "bg-card/50 backdrop-blur-sm border border-border/50 rounded-xl p-4 sm:p-5", children: [(0, jsx_runtime_1.jsx)("p", { className: "text-xs text-muted-foreground uppercase tracking-wider mb-1", children: label }), (0, jsx_runtime_1.jsx)("p", { className: "text-2xl sm:text-3xl font-bold text-foreground", children: value }), (0, jsx_runtime_1.jsx)("p", { className: `text-xs mt-1 ${isPositive ? "text-primary" : "text-muted-foreground"}`, children: change })] }));
|
|
78
|
+
}
|
|
79
|
+
function QuickStatSkeleton() {
|
|
80
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "bg-card/50 backdrop-blur-sm border border-border/50 rounded-xl p-4 sm:p-5", children: [(0, jsx_runtime_1.jsx)("div", { className: "h-3 w-16 bg-muted animate-pulse rounded mb-2" }), (0, jsx_runtime_1.jsx)("div", { className: "h-8 w-24 bg-muted animate-pulse rounded mb-2" }), (0, jsx_runtime_1.jsx)("div", { className: "h-3 w-12 bg-muted animate-pulse rounded" })] }));
|
|
81
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function MiningHistoryStats(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// AI-generated · AI-managed · AI-maintained
|
|
3
|
+
"use client";
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.MiningHistoryStats = MiningHistoryStats;
|
|
6
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
+
const react_1 = require("react");
|
|
8
|
+
const useStats_1 = require("../../hooks/useStats");
|
|
9
|
+
const charts_1 = require("./charts");
|
|
10
|
+
const next_intl_1 = require("next-intl");
|
|
11
|
+
function MiningHistoryStats() {
|
|
12
|
+
const [days, setDays] = (0, react_1.useState)(7);
|
|
13
|
+
const { data: stats, loading, error } = (0, useStats_1.useMiningHistory)(days);
|
|
14
|
+
const t = (0, next_intl_1.useTranslations)("data");
|
|
15
|
+
const formatLargeNumber = (num) => {
|
|
16
|
+
if (num >= 1000000000)
|
|
17
|
+
return `${(num / 1000000000).toFixed(2)}B`;
|
|
18
|
+
if (num >= 1000000)
|
|
19
|
+
return `${(num / 1000000).toFixed(2)}M`;
|
|
20
|
+
if (num >= 1000)
|
|
21
|
+
return `${(num / 1000).toFixed(2)}K`;
|
|
22
|
+
return num.toLocaleString();
|
|
23
|
+
};
|
|
24
|
+
const formatAmount = (num) => {
|
|
25
|
+
if (num >= 1000000)
|
|
26
|
+
return `${(num / 1000000).toFixed(2)}M`;
|
|
27
|
+
if (num >= 1000)
|
|
28
|
+
return `${(num / 1000).toFixed(2)}K`;
|
|
29
|
+
return num.toLocaleString();
|
|
30
|
+
};
|
|
31
|
+
return ((0, jsx_runtime_1.jsx)("section", { className: "py-20 md:py-24 px-4 sm:px-6", children: (0, jsx_runtime_1.jsxs)("div", { className: "max-w-[1400px] mx-auto", children: [(0, jsx_runtime_1.jsxs)("header", { className: "text-center mb-12 md:mb-16", children: [(0, jsx_runtime_1.jsx)("p", { className: "font-mono text-xs sm:text-sm uppercase tracking-widest text-[#5EEAD4] mb-3 md:mb-4", children: "MINTING HISTORY" }), (0, jsx_runtime_1.jsx)("h2", { className: "font-sans font-bold text-3xl sm:text-4xl md:text-5xl text-foreground mb-4 md:mb-5 text-balance", children: t('miningHistory') }), (0, jsx_runtime_1.jsx)("p", { className: "font-mono text-sm sm:text-base text-foreground/60 max-w-3xl mx-auto text-balance", children: t('miningHistoryDesc') })] }), (0, jsx_runtime_1.jsx)("div", { className: "flex justify-center mb-8", children: (0, jsx_runtime_1.jsxs)("div", { className: "inline-flex bg-background/50 border border-border/30 rounded-lg p-1", children: [(0, jsx_runtime_1.jsx)("button", { onClick: () => setDays(7), className: `px-4 py-2 rounded-md font-mono text-sm font-medium transition-colors ${days === 7
|
|
32
|
+
? "bg-[#5EEAD4]/15 text-[#5EEAD4] border border-[#5EEAD4]/25"
|
|
33
|
+
: "text-foreground/50 hover:text-foreground"}`, children: t('days7') }), (0, jsx_runtime_1.jsx)("button", { onClick: () => setDays(30), className: `px-4 py-2 rounded-md font-mono text-sm font-medium transition-colors ${days === 30
|
|
34
|
+
? "bg-[#5EEAD4]/15 text-[#5EEAD4] border border-[#5EEAD4]/25"
|
|
35
|
+
: "text-foreground/50 hover:text-foreground"}`, children: t('days30') })] }) }), loading ? ((0, jsx_runtime_1.jsxs)("div", { className: "space-y-6", children: [(0, jsx_runtime_1.jsx)("div", { className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3 md:gap-4", children: [...Array(6)].map((_, i) => ((0, jsx_runtime_1.jsxs)("div", { className: "border border-border/30 bg-background/50 rounded-lg p-4 blockchain-card", children: [(0, jsx_runtime_1.jsx)("div", { className: "h-3 w-16 bg-muted animate-pulse rounded mb-2" }), (0, jsx_runtime_1.jsx)("div", { className: "h-7 w-24 bg-muted animate-pulse rounded mb-1" }), (0, jsx_runtime_1.jsx)("div", { className: "h-3 w-12 bg-muted animate-pulse rounded" })] }, i))) }), (0, jsx_runtime_1.jsx)("div", { className: "border border-border/30 bg-background/50 rounded-lg p-6 blockchain-card", children: (0, jsx_runtime_1.jsx)("div", { className: "h-[350px] bg-muted animate-pulse rounded" }) })] })) : error ? ((0, jsx_runtime_1.jsxs)("div", { className: "text-center text-red-400 py-12 font-mono text-sm", children: [t('loadFailed'), ": ", error] })) : stats ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3 md:gap-4 mb-8", children: [(0, jsx_runtime_1.jsx)(SummaryCard, { label: t('usdcInput'), value: formatAmount(stats.summary.total_usdc), sub: t('stablecoin'), highlight: true }), (0, jsx_runtime_1.jsx)(SummaryCard, { label: t('usdtInput'), value: formatAmount(stats.summary.total_usdt), sub: t('stablecoin'), highlightColor: "blue" }), (0, jsx_runtime_1.jsx)(SummaryCard, { label: t('mccMinted'), value: formatLargeNumber(stats.summary.total_mcc), sub: t('tokenOutput'), highlight: true }), (0, jsx_runtime_1.jsx)(SummaryCard, { label: t('mcdMinted'), value: formatLargeNumber(stats.summary.total_mcd), sub: t('creditsOutput'), highlightColor: "blue" }), (0, jsx_runtime_1.jsx)(SummaryCard, { label: t('dailyAvgInput'), value: formatAmount(stats.summary.avg_daily), sub: "USDC+USDT" }), (0, jsx_runtime_1.jsx)(SummaryCard, { label: t('totalTx'), value: stats.summary.total_tx.toLocaleString(), sub: t('onchainRecords') })] }), (0, jsx_runtime_1.jsxs)("div", { className: "border border-border/30 bg-background/50 rounded-lg p-4 sm:p-6 blockchain-card", children: [(0, jsx_runtime_1.jsxs)("h3", { className: "font-sans font-medium text-base sm:text-lg text-foreground mb-6", children: [days, t('daysMintTrend')] }), (0, jsx_runtime_1.jsx)(charts_1.MiningTrendChart, { data: stats.history, className: "h-[350px] w-full" })] })] })) : null] }) }));
|
|
36
|
+
}
|
|
37
|
+
function SummaryCard({ label, value, sub, highlight = false, highlightColor, }) {
|
|
38
|
+
const colorClass = highlightColor === "blue"
|
|
39
|
+
? "text-[#5EBCD4]"
|
|
40
|
+
: highlight
|
|
41
|
+
? "text-[#5EEAD4]"
|
|
42
|
+
: "text-foreground";
|
|
43
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "border border-border/30 bg-background/50 rounded-lg p-4 blockchain-card", children: [(0, jsx_runtime_1.jsx)("p", { className: "font-mono text-[10px] sm:text-xs uppercase tracking-widest text-foreground/50 mb-1", children: label }), (0, jsx_runtime_1.jsx)("p", { className: `font-sans font-bold text-xl sm:text-2xl tabular-nums ${colorClass}`, children: value }), (0, jsx_runtime_1.jsx)("p", { className: "font-mono text-[10px] sm:text-xs text-foreground/40 mt-0.5 tabular-nums", children: sub })] }));
|
|
44
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function TeamWalletStats(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// AI-generated · AI-managed · AI-maintained
|
|
3
|
+
"use client";
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.TeamWalletStats = TeamWalletStats;
|
|
6
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
+
const useStats_1 = require("../../hooks/useStats");
|
|
8
|
+
const charts_1 = require("./charts");
|
|
9
|
+
const lucide_react_1 = require("lucide-react");
|
|
10
|
+
const react_1 = require("react");
|
|
11
|
+
const next_intl_1 = require("next-intl");
|
|
12
|
+
function TeamWalletStats() {
|
|
13
|
+
const { data: stats, loading, error } = (0, useStats_1.useTeamWalletStats)();
|
|
14
|
+
const [copiedAddress, setCopiedAddress] = (0, react_1.useState)(null);
|
|
15
|
+
const t = (0, next_intl_1.useTranslations)("data");
|
|
16
|
+
const formatLargeNumber = (num) => {
|
|
17
|
+
if (num >= 1000000000)
|
|
18
|
+
return `${(num / 1000000000).toFixed(2)}B`;
|
|
19
|
+
if (num >= 1000000)
|
|
20
|
+
return `${(num / 1000000).toFixed(2)}M`;
|
|
21
|
+
if (num >= 1000)
|
|
22
|
+
return `${(num / 1000).toFixed(2)}K`;
|
|
23
|
+
return num.toLocaleString();
|
|
24
|
+
};
|
|
25
|
+
const shortenAddress = (address) => {
|
|
26
|
+
return `${address.slice(0, 6)}...${address.slice(-4)}`;
|
|
27
|
+
};
|
|
28
|
+
const copyAddress = async (address) => {
|
|
29
|
+
await navigator.clipboard.writeText(address);
|
|
30
|
+
setCopiedAddress(address);
|
|
31
|
+
setTimeout(() => setCopiedAddress(null), 2000);
|
|
32
|
+
};
|
|
33
|
+
return ((0, jsx_runtime_1.jsx)("section", { className: "py-20 md:py-24 px-4 sm:px-6", "aria-labelledby": "foundation-wallet-title", children: (0, jsx_runtime_1.jsxs)("div", { className: "max-w-7xl mx-auto", children: [(0, jsx_runtime_1.jsxs)("header", { className: "text-center mb-12 md:mb-16", children: [(0, jsx_runtime_1.jsx)("p", { className: "font-mono text-xs sm:text-sm uppercase tracking-widest text-[#5EEAD4] mb-3 md:mb-4", children: "FOUNDATION WALLETS" }), (0, jsx_runtime_1.jsx)("h2", { id: "foundation-wallet-title", className: "font-sans font-bold text-3xl sm:text-4xl md:text-5xl text-foreground mb-4 md:mb-5 text-balance", children: t('foundationTitle') }), (0, jsx_runtime_1.jsxs)("div", { className: "max-w-3xl mx-auto space-y-2", children: [(0, jsx_runtime_1.jsx)("p", { className: "font-mono text-sm sm:text-base text-foreground/60 text-balance", children: t('foundationDesc') }), (0, jsx_runtime_1.jsx)("p", { className: "font-mono text-xs sm:text-sm text-foreground/40 text-balance", children: t('foundationSubDesc') })] })] }), loading ? ((0, jsx_runtime_1.jsx)("div", { className: "space-y-6", children: (0, jsx_runtime_1.jsxs)("div", { className: "blockchain-card border border-border/30 bg-background/50 rounded-lg p-6", children: [(0, jsx_runtime_1.jsx)("div", { className: "h-8 w-48 bg-muted animate-pulse rounded mb-6" }), (0, jsx_runtime_1.jsx)("div", { className: "h-[300px] bg-muted animate-pulse rounded" })] }) })) : error ? ((0, jsx_runtime_1.jsxs)("div", { className: "text-center text-red-400 py-12 font-mono text-sm", children: [t('loadFailed'), ": ", error] })) : stats ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "blockchain-card border border-border/30 bg-background/50 rounded-lg p-4 sm:p-6 mb-8", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between mb-6", children: [(0, jsx_runtime_1.jsx)("h3", { className: "font-sans font-medium text-base sm:text-lg text-foreground", children: t('mccBalanceDist') }), (0, jsx_runtime_1.jsxs)("div", { className: "font-mono text-sm text-foreground/50", children: [t('totalLabel'), ": ", (0, jsx_runtime_1.jsxs)("span", { className: "text-[#5EEAD4] font-medium", children: [formatLargeNumber(stats.total_mcc), " MCC"] })] })] }), (0, jsx_runtime_1.jsx)(charts_1.TeamWalletChart, { data: stats.wallets, className: "h-[300px]" })] }), (0, jsx_runtime_1.jsx)("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3 md:gap-4", children: stats.wallets.map((wallet) => ((0, jsx_runtime_1.jsxs)("div", { className: "blockchain-card border border-border/30 bg-background/50 rounded-lg p-4 transition-colors duration-200 hover:bg-background/70 hover:border-border/50", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-sans font-medium text-base text-foreground", children: wallet.label }), (0, jsx_runtime_1.jsxs)("span", { className: "font-mono text-xs text-foreground/40 tabular-nums", children: [wallet.percentage, "%"] })] }), (0, jsx_runtime_1.jsxs)("p", { className: "font-sans font-bold text-3xl text-[#5EEAD4] tabular-nums mb-3", children: [formatLargeNumber(wallet.mcc_balance), (0, jsx_runtime_1.jsx)("span", { className: "text-base text-foreground/40 ml-1 font-normal", children: "MCC" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2 bg-muted/50 rounded-lg px-3 py-2", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-mono text-sm text-foreground/50 flex-1 tabular-nums", children: shortenAddress(wallet.address) }), (0, jsx_runtime_1.jsx)("button", { onClick: () => copyAddress(wallet.address), className: "p-1 hover:bg-background/50 rounded transition-colors", title: t('copyAddress'), children: (0, jsx_runtime_1.jsx)(lucide_react_1.Copy, { className: `w-3.5 h-3.5 ${copiedAddress === wallet.address ? 'text-[#5EEAD4]' : 'text-foreground/40'}` }) }), (0, jsx_runtime_1.jsx)("a", { href: `https://solscan.io/account/${wallet.address}`, target: "_blank", rel: "noopener noreferrer", className: "p-1 hover:bg-background/50 rounded transition-colors", title: t('viewOnSolscan'), children: (0, jsx_runtime_1.jsx)(lucide_react_1.ExternalLink, { className: "w-3.5 h-3.5 text-foreground/40 hover:text-[#5EEAD4]" }) })] })] }, wallet.key))) }), (0, jsx_runtime_1.jsx)("div", { className: "mt-8 p-4 bg-[#5EEAD4]/5 border border-[#5EEAD4]/15 rounded-lg", children: (0, jsx_runtime_1.jsxs)("p", { className: "font-mono text-xs sm:text-sm text-foreground/50 leading-relaxed", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-[#5EEAD4] font-medium", children: t('legalDisclaimer') }), t('legalDisclaimerText')] }) }), stats.updated_at && ((0, jsx_runtime_1.jsxs)("p", { className: "font-mono text-xs text-foreground/30 text-center mt-4 tabular-nums", children: [t('dataUpdatedAt'), " ", new Date(stats.updated_at).toLocaleString()] }))] })) : null] }) }));
|
|
34
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function TerritoryStats(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// AI-generated · AI-managed · AI-maintained
|
|
3
|
+
"use client";
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.TerritoryStats = TerritoryStats;
|
|
6
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
+
const useStats_1 = require("../../hooks/useStats");
|
|
8
|
+
const next_intl_1 = require("next-intl");
|
|
9
|
+
const recharts_1 = require("recharts");
|
|
10
|
+
const TerritoryIcons = {
|
|
11
|
+
System: ((0, jsx_runtime_1.jsxs)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", className: "text-[#5EEAD4]", children: [(0, jsx_runtime_1.jsx)("circle", { cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "1.5" }), (0, jsx_runtime_1.jsx)("circle", { cx: "12", cy: "12", r: "6", stroke: "currentColor", strokeWidth: "1.5" }), (0, jsx_runtime_1.jsx)("circle", { cx: "12", cy: "12", r: "2", fill: "currentColor" })] })),
|
|
12
|
+
Sector: ((0, jsx_runtime_1.jsxs)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", className: "text-[#5EEAD4]", children: [(0, jsx_runtime_1.jsx)("path", { d: "M12 2L22 8.5V15.5L12 22L2 15.5V8.5L12 2Z", stroke: "currentColor", strokeWidth: "1.5" }), (0, jsx_runtime_1.jsx)("path", { d: "M12 8L17 11V17L12 20L7 17V11L12 8Z", stroke: "currentColor", strokeWidth: "1.5" })] })),
|
|
13
|
+
Matrix: ((0, jsx_runtime_1.jsxs)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", className: "text-[#5EBCD4]", children: [(0, jsx_runtime_1.jsx)("rect", { x: "3", y: "3", width: "7", height: "7", stroke: "currentColor", strokeWidth: "1.5", rx: "1" }), (0, jsx_runtime_1.jsx)("rect", { x: "14", y: "3", width: "7", height: "7", stroke: "currentColor", strokeWidth: "1.5", rx: "1" }), (0, jsx_runtime_1.jsx)("rect", { x: "3", y: "14", width: "7", height: "7", stroke: "currentColor", strokeWidth: "1.5", rx: "1" }), (0, jsx_runtime_1.jsx)("rect", { x: "14", y: "14", width: "7", height: "7", stroke: "currentColor", strokeWidth: "1.5", rx: "1" })] })),
|
|
14
|
+
Station: ((0, jsx_runtime_1.jsxs)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", className: "text-[#5EBCD4]", children: [(0, jsx_runtime_1.jsx)("rect", { x: "4", y: "4", width: "16", height: "16", rx: "2", stroke: "currentColor", strokeWidth: "1.5" }), (0, jsx_runtime_1.jsx)("circle", { cx: "12", cy: "12", r: "3", stroke: "currentColor", strokeWidth: "1.5" })] }))
|
|
15
|
+
};
|
|
16
|
+
const compactFormatter = new Intl.NumberFormat("zh-CN", {
|
|
17
|
+
notation: "compact",
|
|
18
|
+
compactDisplay: "short",
|
|
19
|
+
maximumFractionDigits: 2,
|
|
20
|
+
});
|
|
21
|
+
function TerritoryStats() {
|
|
22
|
+
const { data: stats, loading, error } = (0, useStats_1.useTerritoryStats)();
|
|
23
|
+
const { data: mccData } = (0, useStats_1.useMCCStats)();
|
|
24
|
+
const { data: mcdData } = (0, useStats_1.useMCDStats)();
|
|
25
|
+
const { data: growthData } = (0, useStats_1.useUserGrowth)(30);
|
|
26
|
+
const t = (0, next_intl_1.useTranslations)("data");
|
|
27
|
+
const getIcon = (type) => {
|
|
28
|
+
return TerritoryIcons[type] || TerritoryIcons.Station;
|
|
29
|
+
};
|
|
30
|
+
return ((0, jsx_runtime_1.jsx)("section", { className: "py-20 md:py-24 px-4 sm:px-6", "aria-labelledby": "territory-title", children: (0, jsx_runtime_1.jsxs)("div", { className: "max-w-7xl mx-auto", children: [(0, jsx_runtime_1.jsxs)("header", { className: "text-center mb-12 md:mb-16", children: [(0, jsx_runtime_1.jsx)("p", { className: "font-mono text-xs sm:text-sm uppercase tracking-widest text-[#5EEAD4] mb-3 md:mb-4", children: "TERRITORY HIERARCHY" }), (0, jsx_runtime_1.jsx)("h2", { id: "territory-title", className: "font-sans font-bold text-3xl sm:text-4xl md:text-5xl text-foreground mb-4 md:mb-5 text-balance", children: t('territoryHierarchy') }), (0, jsx_runtime_1.jsxs)("div", { className: "max-w-3xl mx-auto space-y-2", children: [(0, jsx_runtime_1.jsx)("p", { className: "font-mono text-sm sm:text-base text-foreground/60 text-balance", children: t('territoryHierarchyDesc') }), (0, jsx_runtime_1.jsx)("p", { className: "font-mono text-xs sm:text-sm text-foreground/40 text-balance", children: t('territoryHierarchySubDesc') })] })] }), loading ? ((0, jsx_runtime_1.jsx)("div", { className: "space-y-6", children: (0, jsx_runtime_1.jsx)("div", { className: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-3 md:gap-4", children: [...Array(6)].map((_, i) => ((0, jsx_runtime_1.jsxs)("div", { className: "blockchain-card border border-border/30 bg-background/50 rounded-lg p-4", children: [(0, jsx_runtime_1.jsx)("div", { className: "h-3 w-16 bg-muted animate-pulse rounded mb-2" }), (0, jsx_runtime_1.jsx)("div", { className: "h-7 w-24 bg-muted animate-pulse rounded mb-1" }), (0, jsx_runtime_1.jsx)("div", { className: "h-3 w-12 bg-muted animate-pulse rounded" })] }, i))) }) })) : error ? ((0, jsx_runtime_1.jsxs)("div", { className: "text-center text-red-400 py-12 font-mono text-sm", children: [t('loadFailed'), ": ", error] })) : stats ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-3 md:gap-4 mb-8", role: "list", "aria-label": t('territoryHierarchy'), children: [(0, jsx_runtime_1.jsx)(StatCard, { label: t('currentUsers'), value: stats.total_users_in_territories.toLocaleString(), sub: t('onchainRegistered'), highlight: true }), (0, jsx_runtime_1.jsx)(StatCard, { label: t('inTerritory'), value: stats.territories.reduce((a, tr) => a + (tr.population ?? 0), 0).toLocaleString(), sub: t('assignedTerritory'), highlight: true }), (0, jsx_runtime_1.jsx)(StatCard, { label: t('totalMinted'), value: compactFormatter.format(mccData?.circulating_supply ?? 0), sub: "MCC", highlightColor: "blue" }), (0, jsx_runtime_1.jsx)(StatCard, { label: t('mintCount'), value: (mccData?.total_mining_count ?? 0).toLocaleString(), sub: t('onchainRecords') }), (0, jsx_runtime_1.jsx)(StatCard, { label: t('vaultBalance'), value: compactFormatter.format(mcdData?.total_vault_balance ?? 0), sub: "MCD", highlightColor: "blue" }), (0, jsx_runtime_1.jsx)(StatCard, { label: t('territoryTotal'), value: stats.territories.reduce((a, tr) => a + tr.total, 0).toString(), sub: t('activeTerritory') })] }), (0, jsx_runtime_1.jsx)("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 md:gap-5 mb-8", children: stats.territories.map((territory) => ((0, jsx_runtime_1.jsxs)("div", { className: "blockchain-card border border-border/30 bg-background/50 rounded-lg p-5 transition-colors duration-200 hover:bg-background/70 hover:border-border/50", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-3 mb-4", children: [getIcon(territory.type), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h3", { className: "font-sans font-medium text-base text-foreground", children: territory.type }), (0, jsx_runtime_1.jsx)("p", { className: "font-mono text-xs text-foreground/40", children: territory.name })] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "space-y-2", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex justify-between items-center", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-mono text-sm text-foreground/50", children: t('totalCount') }), (0, jsx_runtime_1.jsx)("span", { className: "font-sans font-bold text-xl text-foreground tabular-nums", children: territory.total })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex justify-between items-center", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-mono text-sm text-foreground/50", children: t('activeCount') }), (0, jsx_runtime_1.jsx)("span", { className: "font-sans font-bold text-xl text-[#5EEAD4] tabular-nums", children: territory.active })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex justify-between items-center", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-mono text-sm text-foreground/50", children: t('population') }), (0, jsx_runtime_1.jsx)("span", { className: "font-sans font-medium text-base text-foreground tabular-nums", children: territory.population?.toLocaleString() || 0 })] })] })] }, territory.type))) }), (0, jsx_runtime_1.jsxs)("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-6 mb-8", children: [(0, jsx_runtime_1.jsxs)("div", { className: "blockchain-card border border-border/30 bg-background/50 rounded-lg p-4 sm:p-6 flex flex-col", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex justify-between items-baseline mb-4", children: [(0, jsx_runtime_1.jsx)("h3", { className: "font-sans font-medium text-base sm:text-lg text-foreground", children: t('userGrowthTrend') }), (0, jsx_runtime_1.jsx)("span", { className: "font-mono text-sm text-[#5EEAD4] font-bold tabular-nums", children: (growthData?.total_users ?? stats.total_users_in_territories).toLocaleString() })] }), (0, jsx_runtime_1.jsx)("div", { className: "flex-1 min-h-[260px]", children: growthData && growthData.history.length > 0 ? ((0, jsx_runtime_1.jsx)(recharts_1.ResponsiveContainer, { width: "100%", height: 260, children: (0, jsx_runtime_1.jsxs)(recharts_1.AreaChart, { data: growthData.history, margin: { top: 10, right: 10, bottom: 0, left: 0 }, children: [(0, jsx_runtime_1.jsx)("defs", { children: (0, jsx_runtime_1.jsxs)("linearGradient", { id: "fillGrowth", x1: "0", y1: "0", x2: "0", y2: "1", children: [(0, jsx_runtime_1.jsx)("stop", { offset: "5%", stopColor: "#5EEAD4", stopOpacity: 0.6 }), (0, jsx_runtime_1.jsx)("stop", { offset: "95%", stopColor: "#5EEAD4", stopOpacity: 0.05 })] }) }), (0, jsx_runtime_1.jsx)(recharts_1.CartesianGrid, { strokeDasharray: "3 3", stroke: "rgba(255,255,255,0.05)", vertical: false }), (0, jsx_runtime_1.jsx)(recharts_1.XAxis, { dataKey: "date", tick: { fontSize: 10, fill: "rgba(255,255,255,0.4)" }, tickLine: false, axisLine: false, minTickGap: 24, tickFormatter: (v) => {
|
|
31
|
+
const d = new Date(v);
|
|
32
|
+
return `${d.getMonth() + 1}/${d.getDate()}`;
|
|
33
|
+
} }), (0, jsx_runtime_1.jsx)(recharts_1.YAxis, { tick: { fontSize: 10, fill: "rgba(255,255,255,0.4)" }, tickLine: false, axisLine: false, width: 32 }), (0, jsx_runtime_1.jsx)(recharts_1.Tooltip, { contentStyle: {
|
|
34
|
+
backgroundColor: "rgba(23,23,23,0.95)",
|
|
35
|
+
border: "1px solid rgba(94,234,212,0.2)",
|
|
36
|
+
borderRadius: "6px",
|
|
37
|
+
fontSize: "12px",
|
|
38
|
+
fontFamily: "monospace",
|
|
39
|
+
}, labelFormatter: (v) => `${v}`, formatter: (value) => [value.toLocaleString(), t('currentOnchainUsers')] }), (0, jsx_runtime_1.jsx)(recharts_1.Area, { type: "monotone", dataKey: "total_users", stroke: "#5EEAD4", strokeWidth: 2, fill: "url(#fillGrowth)" })] }) })) : ((0, jsx_runtime_1.jsx)("div", { className: "h-full flex items-center justify-center", children: (0, jsx_runtime_1.jsx)("p", { className: "font-mono text-3xl text-[#5EEAD4] font-bold tabular-nums", children: (stats.total_users_in_territories ?? 0).toLocaleString() }) })) })] }), (0, jsx_runtime_1.jsxs)("div", { className: "blockchain-card border border-border/30 bg-background/50 rounded-lg p-4 sm:p-6", children: [(0, jsx_runtime_1.jsx)("h3", { className: "font-sans font-medium text-base sm:text-lg text-foreground mb-6", children: t('mcdEcoData') }), (0, jsx_runtime_1.jsxs)("div", { className: "space-y-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "border border-border/30 bg-background/30 rounded-lg p-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex justify-between items-center mb-1", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-mono text-sm text-foreground/50", children: t('mcdUsage') }), (0, jsx_runtime_1.jsx)("span", { className: "font-mono text-xs text-foreground/30", children: t('userToWhitelist') })] }), (0, jsx_runtime_1.jsx)("p", { className: "font-sans font-bold text-2xl text-[#5EBCD4] tabular-nums", children: compactFormatter.format(mcdData?.total_spent ?? 0) }), (0, jsx_runtime_1.jsx)("p", { className: "font-mono text-xs text-foreground/40 mt-1", children: t('spentToDeveloper') })] }), (0, jsx_runtime_1.jsxs)("div", { className: "border border-border/30 bg-background/30 rounded-lg p-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex justify-between items-center mb-1", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-mono text-sm text-foreground/50", children: t('mcdAllocation') }), (0, jsx_runtime_1.jsx)("span", { className: "font-mono text-xs text-foreground/30", children: t('vaultToUser') })] }), (0, jsx_runtime_1.jsx)("p", { className: "font-sans font-bold text-2xl text-[#5EEAD4] tabular-nums", children: compactFormatter.format(mcdData?.user_balance ?? 0) }), (0, jsx_runtime_1.jsx)("p", { className: "font-mono text-xs text-foreground/40 mt-1", children: t('dailyAutoAllocation') })] }), (0, jsx_runtime_1.jsxs)("div", { className: "border border-border/30 bg-background/30 rounded-lg p-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex justify-between items-center mb-1", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-mono text-sm text-foreground/50", children: t('vaultMcdBalance') }), (0, jsx_runtime_1.jsx)("span", { className: "font-mono text-xs text-foreground/30", children: t('allStationVaults') })] }), (0, jsx_runtime_1.jsx)("p", { className: "font-sans font-bold text-2xl text-foreground tabular-nums", children: compactFormatter.format(mcdData?.total_vault_balance ?? 0) }), (0, jsx_runtime_1.jsx)("p", { className: "font-mono text-xs text-foreground/40 mt-1", children: t('companionYieldInjection') })] })] })] })] })] })) : null] }) }));
|
|
40
|
+
}
|
|
41
|
+
function StatCard({ label, value, sub, highlight = false, highlightColor, }) {
|
|
42
|
+
const colorClass = highlightColor === "blue"
|
|
43
|
+
? "text-[#5EBCD4]"
|
|
44
|
+
: highlight
|
|
45
|
+
? "text-[#5EEAD4]"
|
|
46
|
+
: "text-foreground";
|
|
47
|
+
return ((0, jsx_runtime_1.jsxs)("div", { role: "listitem", className: "blockchain-card border border-border/30 bg-background/50 rounded-lg p-4 transition-colors duration-200 hover:bg-background/70 hover:border-border/50", children: [(0, jsx_runtime_1.jsx)("p", { className: "font-mono text-xs sm:text-sm uppercase tracking-widest text-foreground/50 mb-1", children: label }), (0, jsx_runtime_1.jsx)("p", { className: `font-sans font-bold text-2xl sm:text-3xl tabular-nums ${colorClass}`, children: value }), (0, jsx_runtime_1.jsx)("p", { className: "font-mono text-xs sm:text-sm text-foreground/40 mt-0.5 tabular-nums", children: sub })] }));
|
|
48
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function UserLevelStats(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// AI-generated · AI-managed · AI-maintained
|
|
3
|
+
"use client";
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.UserLevelStats = UserLevelStats;
|
|
6
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
+
const useStats_1 = require("../../hooks/useStats");
|
|
8
|
+
const charts_1 = require("./charts");
|
|
9
|
+
const next_intl_1 = require("next-intl");
|
|
10
|
+
const LEVEL_COLORS = {
|
|
11
|
+
1: "#2DD4BF",
|
|
12
|
+
2: "#14B8A6",
|
|
13
|
+
3: "#0D9488",
|
|
14
|
+
4: "#0F766E",
|
|
15
|
+
5: "#115E59",
|
|
16
|
+
};
|
|
17
|
+
function UserLevelStats() {
|
|
18
|
+
const { data: stats, loading, error } = (0, useStats_1.useUserLevelStats)();
|
|
19
|
+
const t = (0, next_intl_1.useTranslations)("data");
|
|
20
|
+
const getLevelDescription = (level) => {
|
|
21
|
+
const key = `levelDesc${level}`;
|
|
22
|
+
return t(key);
|
|
23
|
+
};
|
|
24
|
+
return ((0, jsx_runtime_1.jsx)("section", { className: "bg-muted/30 py-20 md:py-24 px-4 sm:px-6", "aria-labelledby": "user-level-title", children: (0, jsx_runtime_1.jsxs)("div", { className: "max-w-7xl mx-auto", children: [(0, jsx_runtime_1.jsxs)("header", { className: "text-center mb-12 md:mb-16", children: [(0, jsx_runtime_1.jsx)("p", { className: "font-mono text-xs sm:text-sm uppercase tracking-widest text-[#5EEAD4] mb-3 md:mb-4", children: "USER DISTRIBUTION" }), (0, jsx_runtime_1.jsx)("h2", { id: "user-level-title", className: "font-sans font-bold text-3xl sm:text-4xl md:text-5xl text-foreground mb-4 md:mb-5 text-balance", children: t('userLevelDist') }), (0, jsx_runtime_1.jsxs)("div", { className: "max-w-3xl mx-auto space-y-2", children: [(0, jsx_runtime_1.jsx)("p", { className: "font-mono text-sm sm:text-base text-foreground/60 text-balance", children: t('userLevelDesc') }), (0, jsx_runtime_1.jsx)("p", { className: "font-mono text-xs sm:text-sm text-foreground/40 text-balance", children: t('userLevelSubDesc') })] })] }), loading ? ((0, jsx_runtime_1.jsx)("div", { className: "space-y-4", children: (0, jsx_runtime_1.jsx)("div", { className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3 md:gap-4 mb-8", children: [...Array(4)].map((_, i) => ((0, jsx_runtime_1.jsxs)("div", { className: "blockchain-card border border-border/30 bg-background/50 rounded-lg p-4", children: [(0, jsx_runtime_1.jsx)("div", { className: "h-3 w-16 bg-muted animate-pulse rounded mb-2" }), (0, jsx_runtime_1.jsx)("div", { className: "h-7 w-24 bg-muted animate-pulse rounded" })] }, i))) }) })) : error ? ((0, jsx_runtime_1.jsxs)("div", { className: "text-center text-red-400 py-12 font-mono text-sm", children: [t('loadFailed'), ": ", error] })) : stats ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "grid grid-cols-2 sm:grid-cols-4 gap-3 md:gap-4 mb-8", children: [(0, jsx_runtime_1.jsx)(OverviewCard, { label: t('totalUsers'), value: stats.total_users.toLocaleString(), highlight: true }), (0, jsx_runtime_1.jsx)(OverviewCard, { label: t('minerAndAbove'), value: stats.miners_and_above.toLocaleString(), highlightColor: "blue" }), (0, jsx_runtime_1.jsx)(OverviewCard, { label: t('newToday'), value: `+${stats.new_users_today}`, highlight: true }), (0, jsx_runtime_1.jsx)(OverviewCard, { label: t('monthlyActiveRate'), value: `${stats.monthly_active_rate}%` })] }), (0, jsx_runtime_1.jsxs)("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-4 md:gap-6 mb-8", children: [(0, jsx_runtime_1.jsxs)("div", { className: "blockchain-card border border-border/30 bg-background/50 rounded-lg p-4 sm:p-6", children: [(0, jsx_runtime_1.jsx)("h3", { className: "font-sans font-medium text-base sm:text-lg text-foreground mb-4 text-center", children: t('userLevelDistChart') }), (0, jsx_runtime_1.jsx)("div", { className: "flex items-center justify-center h-[280px]", children: (0, jsx_runtime_1.jsx)(charts_1.UserLevelPieChart, { data: stats.levels, className: "w-full h-full" }) })] }), (0, jsx_runtime_1.jsxs)("div", { className: "blockchain-card border border-border/30 bg-background/50 rounded-lg p-4 sm:p-6", children: [(0, jsx_runtime_1.jsx)("h3", { className: "font-sans font-medium text-base sm:text-lg text-foreground mb-4", children: t('upgradeSystem') }), (0, jsx_runtime_1.jsx)("div", { className: "space-y-1", children: stats.levels.map((level) => ((0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-3 px-3 py-2.5 rounded-lg hover:bg-background/70 transition-colors", children: [(0, jsx_runtime_1.jsx)("div", { className: "w-8 h-8 rounded-md flex items-center justify-center flex-shrink-0", style: { backgroundColor: `${LEVEL_COLORS[level.level] || '#5EEAD4'}15`, border: `1px solid ${LEVEL_COLORS[level.level] || '#5EEAD4'}25` }, children: (0, jsx_runtime_1.jsx)("span", { className: "font-mono text-sm font-bold", style: { color: LEVEL_COLORS[level.level] || '#5EEAD4' }, children: level.level }) }), (0, jsx_runtime_1.jsxs)("div", { className: "flex-1 min-w-0", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-1.5", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-sans font-medium text-base text-foreground", children: level.name }), (0, jsx_runtime_1.jsxs)("span", { className: "font-mono text-xs text-foreground/40", children: ["(", level.chinese, ")"] })] }), (0, jsx_runtime_1.jsx)("p", { className: "font-mono text-xs text-foreground/40 truncate", children: getLevelDescription(level.level) })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-3 flex-shrink-0", children: [(0, jsx_runtime_1.jsx)("div", { className: "w-16 h-1.5 bg-border/30 rounded-full overflow-hidden hidden sm:block", children: (0, jsx_runtime_1.jsx)("div", { className: "h-full rounded-full", style: {
|
|
25
|
+
width: `${Math.max(level.percentage, 2)}%`,
|
|
26
|
+
backgroundColor: LEVEL_COLORS[level.level] || '#5EEAD4'
|
|
27
|
+
} }) }), (0, jsx_runtime_1.jsx)("span", { className: "font-sans font-bold text-base text-foreground tabular-nums w-14 text-right", children: level.count.toLocaleString() }), (0, jsx_runtime_1.jsxs)("span", { className: "font-mono text-xs text-foreground/40 w-12 text-right tabular-nums", children: [level.percentage, "%"] })] })] }, level.level))) }), (0, jsx_runtime_1.jsx)("div", { className: "mt-4 p-3 bg-[#5EEAD4]/5 border border-[#5EEAD4]/15 rounded-lg", children: (0, jsx_runtime_1.jsxs)("p", { className: "font-mono text-xs sm:text-sm text-foreground/50", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-[#5EEAD4] font-medium", children: t('onchainVerification') }), t('onchainVerificationDesc')] }) })] })] })] })) : null] }) }));
|
|
28
|
+
}
|
|
29
|
+
function OverviewCard({ label, value, highlight = false, highlightColor, }) {
|
|
30
|
+
const colorClass = highlightColor === "blue"
|
|
31
|
+
? "text-[#5EBCD4]"
|
|
32
|
+
: highlight
|
|
33
|
+
? "text-[#5EEAD4]"
|
|
34
|
+
: "text-foreground";
|
|
35
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "blockchain-card border border-border/30 bg-background/50 rounded-lg p-4 transition-colors duration-200 hover:bg-background/70 hover:border-border/50", children: [(0, jsx_runtime_1.jsx)("p", { className: "font-mono text-xs sm:text-sm uppercase tracking-widest text-foreground/50 mb-1", children: label }), (0, jsx_runtime_1.jsx)("p", { className: `font-sans font-bold text-2xl sm:text-3xl tabular-nums ${colorClass}`, children: value })] }));
|
|
36
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function FragmentPage(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// AI-generated · AI-managed · AI-maintained
|
|
3
|
+
'use client';
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.default = FragmentPage;
|
|
6
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
+
const lucide_react_1 = require("lucide-react");
|
|
8
|
+
const card_1 = require("../ui/card");
|
|
9
|
+
const next_intl_1 = require("next-intl");
|
|
10
|
+
function FragmentPage() {
|
|
11
|
+
const t = (0, next_intl_1.useTranslations)('fragmentDash');
|
|
12
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "max-w-7xl mx-auto px-3 py-4 space-y-3 xs:px-4 xs:space-y-4 sm:px-6 sm:py-6 sm:space-y-6 font-mono", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h1", { className: "text-lg sm:text-2xl font-bold text-white", children: t('title') }), (0, jsx_runtime_1.jsx)("p", { className: "text-xs sm:text-sm text-neutral-400 mt-1", children: t('subtitle') })] }), (0, jsx_runtime_1.jsx)(card_1.Card, { className: "bg-neutral-900 border-neutral-700 dash-card", children: (0, jsx_runtime_1.jsxs)(card_1.CardContent, { className: "p-3 sm:p-6", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2 text-neutral-400 text-sm mb-4", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Wallet, { className: "w-4 h-4" }), (0, jsx_runtime_1.jsx)("span", { children: t('myHoldings') })] }), (0, jsx_runtime_1.jsxs)("div", { className: "text-center py-8 text-neutral-400", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Puzzle, { className: "w-12 h-12 mx-auto mb-2 opacity-50" }), (0, jsx_runtime_1.jsx)("p", { children: t('noHoldings') }), (0, jsx_runtime_1.jsx)("p", { className: "text-sm mt-1", children: t('noHoldingsHint') })] })] }) }), (0, jsx_runtime_1.jsx)(card_1.Card, { className: "bg-neutral-900 border-neutral-700 dash-card", children: (0, jsx_runtime_1.jsxs)(card_1.CardContent, { className: "p-3 sm:p-6", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2 text-neutral-400 text-sm mb-4", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.ImageIcon, { className: "w-4 h-4" }), (0, jsx_runtime_1.jsx)("span", { children: t('fragmentVaults') })] }), (0, jsx_runtime_1.jsxs)("div", { className: "text-center py-8 text-neutral-400", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.ImageIcon, { className: "w-12 h-12 mx-auto mb-2 opacity-50" }), (0, jsx_runtime_1.jsx)("p", { children: t('noVaults') }), (0, jsx_runtime_1.jsx)("p", { className: "text-sm mt-1", children: t('noVaultsHint') })] })] }) }), (0, jsx_runtime_1.jsx)(card_1.Card, { className: "bg-neutral-900 border-neutral-700 dash-card", children: (0, jsx_runtime_1.jsxs)(card_1.CardContent, { className: "p-3 sm:p-6", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2 text-neutral-400 text-sm mb-4", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Info, { className: "w-4 h-4" }), (0, jsx_runtime_1.jsx)("span", { children: t('protocolInfo') })] }), (0, jsx_runtime_1.jsxs)("div", { className: "space-y-4 text-sm", children: [(0, jsx_runtime_1.jsxs)("div", { className: "p-4 bg-neutral-800 rounded border border-neutral-700", children: [(0, jsx_runtime_1.jsx)("div", { className: "font-medium text-white mb-2", children: t('whatIsFragmentation') }), (0, jsx_runtime_1.jsx)("p", { className: "text-neutral-400", children: t('fragmentationDesc') })] }), (0, jsx_runtime_1.jsxs)("div", { className: "p-4 bg-neutral-800 rounded border border-neutral-700", children: [(0, jsx_runtime_1.jsx)("div", { className: "font-medium text-white mb-2", children: t('fragmentRights') }), (0, jsx_runtime_1.jsxs)("ul", { className: "list-disc list-inside space-y-1 text-neutral-400", children: [(0, jsx_runtime_1.jsx)("li", { children: t('fragmentRight1') }), (0, jsx_runtime_1.jsx)("li", { children: t('fragmentRight2') }), (0, jsx_runtime_1.jsx)("li", { children: t('fragmentRight3') })] })] })] })] }) })] }));
|
|
13
|
+
}
|