@zendir/ui 0.5.0 → 0.6.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/CHANGELOG.md +419 -386
- package/README.md +640 -631
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/index.js +17 -221
- package/dist/react/3d/CesiumCaptureSource.d.ts +0 -1
- package/dist/react/3d/CesiumCaptureSource.js +364 -283
- package/dist/react/3d/CesiumCaptureSource.js.map +1 -1
- package/dist/react/3d/ZenSpace3D.d.ts +2 -3
- package/dist/react/3d/ZenSpace3D.js +1681 -1237
- package/dist/react/3d/ZenSpace3D.js.map +1 -1
- package/dist/react/3d/ZenSpace3DCesium.d.ts +0 -1
- package/dist/react/3d/ZenSpace3DCesium.js +513 -560
- package/dist/react/3d/ZenSpace3DCesium.js.map +1 -1
- package/dist/react/3d/ZenSpace3DShaders.js +61 -66
- package/dist/react/3d/ZenSpace3DShaders.js.map +1 -1
- package/dist/react/3d/ZenSpace3DTypes.d.ts +19 -20
- package/dist/react/3d/ZenSpace3DUtils.d.ts +0 -1
- package/dist/react/3d/ZenSpace3DUtils.js +37 -24
- package/dist/react/3d/ZenSpace3DUtils.js.map +1 -1
- package/dist/react/3d/capturePngAnalysis.js +42 -36
- package/dist/react/3d/capturePngAnalysis.js.map +1 -1
- package/dist/react/3d/index.d.ts +3 -3
- package/dist/react/3d/index.js +5 -53
- package/dist/react/3d/threeLoader.d.ts +1 -1
- package/dist/react/3d/threeLoader.js +23 -18
- package/dist/react/3d/threeLoader.js.map +1 -1
- package/dist/react/astro/ClassificationBanner.d.ts +2 -3
- package/dist/react/astro/ClassificationBanner.js +95 -79
- package/dist/react/astro/ClassificationBanner.js.map +1 -1
- package/dist/react/astro/GlobalStatusBar.d.ts +0 -1
- package/dist/react/astro/GlobalStatusBar.js +157 -163
- package/dist/react/astro/GlobalStatusBar.js.map +1 -1
- package/dist/react/astro/MissionClock.d.ts +7 -8
- package/dist/react/astro/MissionClock.js +377 -400
- package/dist/react/astro/MissionClock.js.map +1 -1
- package/dist/react/astro/MonitoringIcon.d.ts +1 -2
- package/dist/react/astro/MonitoringIcon.js +422 -358
- package/dist/react/astro/MonitoringIcon.js.map +1 -1
- package/dist/react/astro/Notification.d.ts +1 -2
- package/dist/react/astro/Notification.js +229 -126
- package/dist/react/astro/Notification.js.map +1 -1
- package/dist/react/astro/Progress.d.ts +0 -1
- package/dist/react/astro/Progress.js +199 -141
- package/dist/react/astro/Progress.js.map +1 -1
- package/dist/react/astro/SimulationControls.d.ts +3 -4
- package/dist/react/astro/SimulationControls.js +596 -650
- package/dist/react/astro/SimulationControls.js.map +1 -1
- package/dist/react/astro/StatusIndicator.d.ts +0 -1
- package/dist/react/astro/StatusIndicator.js +236 -170
- package/dist/react/astro/StatusIndicator.js.map +1 -1
- package/dist/react/astro/UnifiedTimeline.d.ts +9 -10
- package/dist/react/astro/UnifiedTimeline.js +2345 -2392
- package/dist/react/astro/UnifiedTimeline.js.map +1 -1
- package/dist/react/astro/index.d.ts +5 -5
- package/dist/react/astro/index.js +1 -25
- package/dist/react/cards/AccessCard.d.ts +0 -1
- package/dist/react/cards/AccessCard.js +471 -405
- package/dist/react/cards/AccessCard.js.map +1 -1
- package/dist/react/cards/OrbitCard.d.ts +0 -1
- package/dist/react/cards/OrbitCard.js +487 -364
- package/dist/react/cards/OrbitCard.js.map +1 -1
- package/dist/react/cards/SpacecraftCard.d.ts +0 -1
- package/dist/react/cards/SpacecraftCard.js +813 -925
- package/dist/react/cards/SpacecraftCard.js.map +1 -1
- package/dist/react/cards/TelemetryCard.d.ts +0 -1
- package/dist/react/cards/TelemetryCard.js +1055 -732
- package/dist/react/cards/TelemetryCard.js.map +1 -1
- package/dist/react/cards/TelemetryStreamCard.d.ts +0 -1
- package/dist/react/cards/TelemetryStreamCard.js +323 -297
- package/dist/react/cards/TelemetryStreamCard.js.map +1 -1
- package/dist/react/cards/index.d.ts +1 -1
- package/dist/react/cards/index.js +1 -8
- package/dist/react/charts/GroundTrackMap.d.ts +6 -7
- package/dist/react/charts/GroundTrackMap.js +1377 -1256
- package/dist/react/charts/GroundTrackMap.js.map +1 -1
- package/dist/react/charts/GroundTrackMapLeaflet.d.ts +1 -2
- package/dist/react/charts/GroundTrackMapLeaflet.js +1065 -987
- package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -1
- package/dist/react/charts/groundTrackMapLeafletTiles.js +34 -25
- package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -1
- package/dist/react/charts/groundTrackMapLeafletUtils.js +70 -61
- package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -1
- package/dist/react/charts/index.d.ts +1 -1
- package/dist/react/charts/index.js +7 -100
- package/dist/react/charts/unified/AstroChart.d.ts +1 -2
- package/dist/react/charts/unified/AstroChart.js +1331 -1411
- package/dist/react/charts/unified/AstroChart.js.map +1 -1
- package/dist/react/charts/unified/PowerOverviewChart.d.ts +3 -3
- package/dist/react/charts/unified/PowerOverviewChart.js +495 -478
- package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -1
- package/dist/react/charts/unified/domain.d.ts +12 -13
- package/dist/react/charts/unified/domain.js +3999 -3145
- package/dist/react/charts/unified/domain.js.map +1 -1
- package/dist/react/charts/unified/generators.d.ts +3 -4
- package/dist/react/charts/unified/generators.js +561 -498
- package/dist/react/charts/unified/generators.js.map +1 -1
- package/dist/react/charts/unified/index.d.ts +1 -1
- package/dist/react/charts/unified/presets.d.ts +14 -15
- package/dist/react/charts/unified/presets.js +857 -994
- package/dist/react/charts/unified/presets.js.map +1 -1
- package/dist/react/charts/unified/sync.d.ts +2 -3
- package/dist/react/charts/unified/sync.js +229 -195
- package/dist/react/charts/unified/sync.js.map +1 -1
- package/dist/react/charts/unified/theme.d.ts +11 -12
- package/dist/react/charts/unified/theme.js +606 -642
- package/dist/react/charts/unified/theme.js.map +1 -1
- package/dist/react/charts/unified/types.d.ts +32 -33
- package/dist/react/charts/unified/useChartStream.d.ts +1 -2
- package/dist/react/charts/unified/useChartStream.js +203 -216
- package/dist/react/charts/unified/useChartStream.js.map +1 -1
- package/dist/react/chatgpt/AppCard.d.ts +1 -2
- package/dist/react/chatgpt/index.d.ts +7 -7
- package/dist/react/chatgpt/index.js +160 -139
- package/dist/react/chatgpt/index.js.map +1 -1
- package/dist/react/context/CategoryContext.d.ts +0 -1
- package/dist/react/context/CategoryContext.js +78 -29
- package/dist/react/context/CategoryContext.js.map +1 -1
- package/dist/react/context/DisplaySettingsContext.d.ts +1 -2
- package/dist/react/context/DisplaySettingsContext.js +205 -156
- package/dist/react/context/DisplaySettingsContext.js.map +1 -1
- package/dist/react/context/SpatialSelectionContext.d.ts +0 -1
- package/dist/react/context/SpatialSelectionContext.js +36 -7
- package/dist/react/context/SpatialSelectionContext.js.map +1 -1
- package/dist/react/core/data/DataTable.d.ts +3 -4
- package/dist/react/core/data/DataTable.js +473 -440
- package/dist/react/core/data/DataTable.js.map +1 -1
- package/dist/react/core/data/DataValue.d.ts +4 -5
- package/dist/react/core/data/DataValue.js +605 -571
- package/dist/react/core/data/DataValue.js.map +1 -1
- package/dist/react/core/data/propertyConfig.d.ts +1 -2
- package/dist/react/core/data/propertyConfig.js +446 -382
- package/dist/react/core/data/propertyConfig.js.map +1 -1
- package/dist/react/core/display/AstroIcon.d.ts +4 -5
- package/dist/react/core/display/AstroIcon.js +339 -429
- package/dist/react/core/display/AstroIcon.js.map +1 -1
- package/dist/react/core/display/Badge.d.ts +2 -3
- package/dist/react/core/display/Badge.js +131 -131
- package/dist/react/core/display/Badge.js.map +1 -1
- package/dist/react/core/display/CardHeader.d.ts +0 -1
- package/dist/react/core/display/CardHeader.js +398 -311
- package/dist/react/core/display/CardHeader.js.map +1 -1
- package/dist/react/core/display/Container.d.ts +2 -3
- package/dist/react/core/display/Container.js +640 -668
- package/dist/react/core/display/Container.js.map +1 -1
- package/dist/react/core/display/CopyButton.d.ts +1 -2
- package/dist/react/core/display/CopyButton.js +158 -101
- package/dist/react/core/display/CopyButton.js.map +1 -1
- package/dist/react/core/display/GlassCard.d.ts +3 -4
- package/dist/react/core/display/GlassCard.js +416 -369
- package/dist/react/core/display/GlassCard.js.map +1 -1
- package/dist/react/core/display/HeaderIconWithStatus.d.ts +0 -1
- package/dist/react/core/display/HeaderIconWithStatus.js +152 -152
- package/dist/react/core/display/HeaderIconWithStatus.js.map +1 -1
- package/dist/react/core/display/Icon.d.ts +2 -3
- package/dist/react/core/display/Icon.js +172 -143
- package/dist/react/core/display/Icon.js.map +1 -1
- package/dist/react/core/display/Typography.d.ts +24 -25
- package/dist/react/core/display/Typography.js +360 -178
- package/dist/react/core/display/Typography.js.map +1 -1
- package/dist/react/core/feedback/ConfirmDialog.d.ts +1 -2
- package/dist/react/core/feedback/ConfirmDialog.js +343 -304
- package/dist/react/core/feedback/ConfirmDialog.js.map +1 -1
- package/dist/react/core/feedback/Dialog.d.ts +2 -3
- package/dist/react/core/feedback/Dialog.js +189 -197
- package/dist/react/core/feedback/Dialog.js.map +1 -1
- package/dist/react/core/feedback/Toast.d.ts +2 -3
- package/dist/react/core/feedback/Toast.js +346 -207
- package/dist/react/core/feedback/Toast.js.map +1 -1
- package/dist/react/core/index.d.ts +26 -26
- package/dist/react/core/index.js +7 -119
- package/dist/react/core/inputs/Button.d.ts +2 -3
- package/dist/react/core/inputs/Button.js +281 -304
- package/dist/react/core/inputs/Button.js.map +1 -1
- package/dist/react/core/inputs/Checkbox.d.ts +2 -3
- package/dist/react/core/inputs/Checkbox.js +139 -127
- package/dist/react/core/inputs/Checkbox.js.map +1 -1
- package/dist/react/core/inputs/Input.d.ts +3 -4
- package/dist/react/core/inputs/Input.js +277 -285
- package/dist/react/core/inputs/Input.js.map +1 -1
- package/dist/react/core/inputs/LimitsBar.d.ts +1 -2
- package/dist/react/core/inputs/LimitsBar.js +271 -196
- package/dist/react/core/inputs/LimitsBar.js.map +1 -1
- package/dist/react/core/inputs/NumberInput.d.ts +2 -3
- package/dist/react/core/inputs/NumberInput.js +531 -503
- package/dist/react/core/inputs/NumberInput.js.map +1 -1
- package/dist/react/core/inputs/PinInput.d.ts +2 -3
- package/dist/react/core/inputs/PinInput.js +224 -207
- package/dist/react/core/inputs/PinInput.js.map +1 -1
- package/dist/react/core/inputs/Select.d.ts +1 -2
- package/dist/react/core/inputs/Select.js +298 -299
- package/dist/react/core/inputs/Select.js.map +1 -1
- package/dist/react/core/inputs/Toggle.d.ts +2 -3
- package/dist/react/core/inputs/Toggle.js +142 -148
- package/dist/react/core/inputs/Toggle.js.map +1 -1
- package/dist/react/core/layout/Box.d.ts +3 -4
- package/dist/react/core/layout/Box.js +118 -122
- package/dist/react/core/layout/Box.js.map +1 -1
- package/dist/react/core/layout/Center.d.ts +0 -1
- package/dist/react/core/layout/Center.js +45 -32
- package/dist/react/core/layout/Center.js.map +1 -1
- package/dist/react/core/layout/Divider.d.ts +1 -2
- package/dist/react/core/layout/Divider.js +112 -106
- package/dist/react/core/layout/Divider.js.map +1 -1
- package/dist/react/core/layout/Flex.d.ts +4 -5
- package/dist/react/core/layout/Flex.js +120 -124
- package/dist/react/core/layout/Flex.js.map +1 -1
- package/dist/react/core/layout/Grid.d.ts +5 -6
- package/dist/react/core/layout/Grid.js +131 -138
- package/dist/react/core/layout/Grid.js.map +1 -1
- package/dist/react/core/layout/Spacer.d.ts +0 -1
- package/dist/react/core/layout/Spacer.js +36 -29
- package/dist/react/core/layout/Spacer.js.map +1 -1
- package/dist/react/core/layout/Stack.d.ts +4 -5
- package/dist/react/core/layout/Stack.js +127 -70
- package/dist/react/core/layout/Stack.js.map +1 -1
- package/dist/react/core/layout/responsive.d.ts +1 -2
- package/dist/react/core/layout/responsive.js +25 -19
- package/dist/react/core/layout/responsive.js.map +1 -1
- package/dist/react/core/layout/useBreakpoint.d.ts +1 -1
- package/dist/react/core/layout/useBreakpoint.js +119 -66
- package/dist/react/core/layout/useBreakpoint.js.map +1 -1
- package/dist/react/core/navigation/AppBar.d.ts +1 -2
- package/dist/react/core/navigation/AppBar.js +827 -805
- package/dist/react/core/navigation/AppBar.js.map +1 -1
- package/dist/react/core/navigation/Pagination.d.ts +2 -3
- package/dist/react/core/navigation/Pagination.js +207 -187
- package/dist/react/core/navigation/Pagination.js.map +1 -1
- package/dist/react/core/navigation/SideNav.d.ts +5 -6
- package/dist/react/core/navigation/SideNav.js +855 -629
- package/dist/react/core/navigation/SideNav.js.map +1 -1
- package/dist/react/core/navigation/Tabs.d.ts +0 -1
- package/dist/react/core/navigation/Tabs.js +113 -119
- package/dist/react/core/navigation/Tabs.js.map +1 -1
- package/dist/react/core/overlays/Popover.d.ts +2 -3
- package/dist/react/core/overlays/Popover.js +303 -282
- package/dist/react/core/overlays/Popover.js.map +1 -1
- package/dist/react/core/overlays/SidePanel.d.ts +1 -2
- package/dist/react/core/overlays/SidePanel.js +217 -212
- package/dist/react/core/overlays/SidePanel.js.map +1 -1
- package/dist/react/core/overlays/Tooltip.d.ts +1 -2
- package/dist/react/core/overlays/Tooltip.js +170 -176
- package/dist/react/core/overlays/Tooltip.js.map +1 -1
- package/dist/react/core/widgets/ActivityPlanner.d.ts +0 -1
- package/dist/react/core/widgets/ActivityPlanner.js +855 -517
- package/dist/react/core/widgets/ActivityPlanner.js.map +1 -1
- package/dist/react/core/widgets/Capture.d.ts +2 -3
- package/dist/react/core/widgets/Capture.js +965 -779
- package/dist/react/core/widgets/Capture.js.map +1 -1
- package/dist/react/core/widgets/ChatPanel.d.ts +16 -17
- package/dist/react/core/widgets/ChatPanel.js +1734 -1034
- package/dist/react/core/widgets/ChatPanel.js.map +1 -1
- package/dist/react/core/widgets/ColorPickerPanel.d.ts +0 -1
- package/dist/react/core/widgets/ColorPickerPanel.js +298 -287
- package/dist/react/core/widgets/ColorPickerPanel.js.map +1 -1
- package/dist/react/core/widgets/CommandBuilder.d.ts +2 -3
- package/dist/react/core/widgets/CommandBuilder.js +624 -516
- package/dist/react/core/widgets/CommandBuilder.js.map +1 -1
- package/dist/react/core/widgets/ConnectionForm.d.ts +2 -3
- package/dist/react/core/widgets/ConnectionForm.js +528 -492
- package/dist/react/core/widgets/ConnectionForm.js.map +1 -1
- package/dist/react/core/widgets/FileExplorer.d.ts +3 -4
- package/dist/react/core/widgets/FileExplorer.js +617 -505
- package/dist/react/core/widgets/FileExplorer.js.map +1 -1
- package/dist/react/core/widgets/HexViewer.d.ts +2 -3
- package/dist/react/core/widgets/HexViewer.js +1353 -1091
- package/dist/react/core/widgets/HexViewer.js.map +1 -1
- package/dist/react/core/widgets/ImageFrame.d.ts +1 -2
- package/dist/react/core/widgets/ImageFrame.js +230 -193
- package/dist/react/core/widgets/ImageFrame.js.map +1 -1
- package/dist/react/core/widgets/ImageGallery.d.ts +2 -1
- package/dist/react/core/widgets/ImageGallery.js +380 -314
- package/dist/react/core/widgets/ImageGallery.js.map +1 -1
- package/dist/react/core/widgets/ImagePanel.d.ts +0 -1
- package/dist/react/core/widgets/ImagePanel.js +110 -101
- package/dist/react/core/widgets/ImagePanel.js.map +1 -1
- package/dist/react/core/widgets/LogViewer.d.ts +2 -3
- package/dist/react/core/widgets/LogViewer.js +711 -607
- package/dist/react/core/widgets/LogViewer.js.map +1 -1
- package/dist/react/core/widgets/MessageStream.d.ts +3 -4
- package/dist/react/core/widgets/MessageStream.js +514 -444
- package/dist/react/core/widgets/MessageStream.js.map +1 -1
- package/dist/react/core/widgets/MissionCalendar.d.ts +3 -4
- package/dist/react/core/widgets/MissionCalendar.js +1488 -1020
- package/dist/react/core/widgets/MissionCalendar.js.map +1 -1
- package/dist/react/core/widgets/PacketViewer.d.ts +2 -3
- package/dist/react/core/widgets/PacketViewer.js +550 -421
- package/dist/react/core/widgets/PacketViewer.js.map +1 -1
- package/dist/react/core/widgets/capture-placeholder.png.js +6 -5
- package/dist/react/core/widgets/capture-placeholder.png.js.map +1 -1
- package/dist/react/hooks/index.d.ts +5 -5
- package/dist/react/hooks/useAccessWindows.d.ts +0 -1
- package/dist/react/hooks/useCompactMode.d.ts +1 -1
- package/dist/react/hooks/useCompactMode.js +104 -58
- package/dist/react/hooks/useCompactMode.js.map +1 -1
- package/dist/react/hooks/useGroundTrackHistory.d.ts +0 -1
- package/dist/react/hooks/useSimulationScene.d.ts +1 -2
- package/dist/react/hooks/useSimulationScene.js +481 -374
- package/dist/react/hooks/useSimulationScene.js.map +1 -1
- package/dist/react/index.d.ts +3 -3
- package/dist/react/panels/LayerControlPanel.d.ts +1 -2
- package/dist/react/panels/LayerControlPanel.js +223 -180
- package/dist/react/panels/LayerControlPanel.js.map +1 -1
- package/dist/react/panels/ObjectInventoryPanel.d.ts +2 -3
- package/dist/react/panels/ObjectInventoryPanel.js +315 -250
- package/dist/react/panels/ObjectInventoryPanel.js.map +1 -1
- package/dist/react/panels/index.d.ts +1 -1
- package/dist/react/panels/index.js +1 -6
- package/dist/react/shared/ErrorBoundary.d.ts +1 -2
- package/dist/react/shared/ErrorBoundary.js +170 -139
- package/dist/react/shared/ErrorBoundary.js.map +1 -1
- package/dist/react/shared/Skeleton.d.ts +1 -2
- package/dist/react/shared/Skeleton.js +300 -301
- package/dist/react/shared/Skeleton.js.map +1 -1
- package/dist/react/theme/ThemeProvider.d.ts +2 -321
- package/dist/react/theme/ThemeProvider.js +313 -939
- package/dist/react/theme/ThemeProvider.js.map +1 -1
- package/dist/react/theme/cardAccent.d.ts +1 -2
- package/dist/react/theme/cardAccent.js +196 -126
- package/dist/react/theme/cardAccent.js.map +1 -1
- package/dist/react/theme/config.d.ts +0 -1
- package/dist/react/theme/config.js +47 -25
- package/dist/react/theme/config.js.map +1 -1
- package/dist/react/theme/index.d.ts +2 -2
- package/dist/react/theme/index.js +1 -16
- package/dist/react/theme/types.d.ts +332 -0
- package/dist/react/theme/types.js +39 -0
- package/dist/react/theme/types.js.map +1 -0
- package/dist/react/types.d.ts +8 -8
- package/dist/react/types.js +147 -47
- package/dist/react/types.js.map +1 -1
- package/dist/react/utils/categoryPalette.d.ts +0 -1
- package/dist/react/utils/categoryPalette.js +91 -102
- package/dist/react/utils/categoryPalette.js.map +1 -1
- package/dist/react/utils/index.d.ts +5 -5
- package/dist/react/utils/index.js +457 -371
- package/dist/react/utils/index.js.map +1 -1
- package/dist/react/visualizations/EclipseTimerCard.d.ts +0 -1
- package/dist/react/visualizations/LinkBudgetCard.d.ts +0 -1
- package/dist/react/visualizations/NavBallCard.d.ts +0 -1
- package/dist/react/visualizations/PropulsionCard.d.ts +1 -2
- package/dist/react/visualizations/SensorFootprintCard.d.ts +1 -2
- package/dist/react/visualizations/ThermalHeatmapCard.d.ts +0 -1
- package/dist/react/visualizations/index.d.ts +3 -3
- package/dist/react.d.ts +2 -1
- package/dist/react.js +17 -221
- package/dist/shaders/atmosphere.frag.js +6 -5
- package/dist/shaders/atmosphere.frag.js.map +1 -1
- package/dist/shaders/atmosphere.vert.js +6 -5
- package/dist/shaders/atmosphere.vert.js.map +1 -1
- package/dist/shaders/stars.frag.js +6 -5
- package/dist/shaders/stars.frag.js.map +1 -1
- package/dist/shaders/stars.vert.js +6 -5
- package/dist/shaders/stars.vert.js.map +1 -1
- package/dist/style.css +26 -3
- package/dist/tokens/core.d.ts +159 -0
- package/dist/tokens/core.js +144 -0
- package/dist/tokens/core.js.map +1 -0
- package/dist/tokens/css-vars.d.ts +213 -2
- package/dist/tokens/css-vars.js +590 -227
- package/dist/tokens/css-vars.js.map +1 -1
- package/dist/tokens/index.d.ts +31 -228
- package/dist/tokens/index.js +281 -366
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/palettes/astro.d.ts +129 -0
- package/dist/tokens/palettes/astro.js +112 -0
- package/dist/tokens/palettes/astro.js.map +1 -0
- package/dist/tokens/palettes/index.d.ts +288 -0
- package/dist/tokens/palettes/index.js +35 -0
- package/dist/tokens/palettes/index.js.map +1 -0
- package/dist/tokens/palettes/tailwind.d.ts +324 -0
- package/dist/tokens/palettes/tailwind.js +201 -0
- package/dist/tokens/palettes/tailwind.js.map +1 -0
- package/dist/tokens/palettes/zendir.d.ts +126 -0
- package/dist/tokens/palettes/zendir.js +92 -0
- package/dist/tokens/palettes/zendir.js.map +1 -0
- package/dist/tokens/themes.d.ts +30 -0
- package/dist/tokens/themes.js +704 -0
- package/dist/tokens/themes.js.map +1 -0
- package/dist/tokens/tokens.css +533 -155
- package/dist/types/index.d.ts +2 -2
- package/package.json +310 -313
- package/dist/index.js.map +0 -1
- package/dist/react/3d/index.js.map +0 -1
- package/dist/react/astro/index.js.map +0 -1
- package/dist/react/cards/index.js.map +0 -1
- package/dist/react/charts/index.js.map +0 -1
- package/dist/react/core/index.js.map +0 -1
- package/dist/react/panels/index.js.map +0 -1
- package/dist/react/theme/astro-tokens.d.ts +0 -153
- package/dist/react/theme/index.js.map +0 -1
- package/dist/react.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ZenSpace3D.js","sources":["../../../src/react/3d/ZenSpace3D.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - ZenSpace3D Component (Optimized)\r\n * \r\n * Professional 3D space visualization with smooth interactions.\r\n * Optimized for performance with settings from EarthViewer.\r\n */\r\n\r\nimport React, {\r\n useRef,\r\n useEffect,\r\n useState,\r\n useCallback,\r\n useImperativeHandle,\r\n forwardRef,\r\n useMemo,\r\n} from 'react';\r\nimport { useTheme } from '../theme';\r\nimport { AstroIcon, type AstroIconName } from '../core/display/AstroIcon';\r\nimport type { GroundStation as _GroundStation } from '../types';\r\nimport type {\r\n ZenSpace3DProps,\r\n ZenSpace3DHandle,\r\n ViewMode,\r\n SpaceObject,\r\n Vector3D,\r\n CameraState,\r\n LayerVisibility,\r\n SelectionState,\r\n OverpassInfo,\r\n} from './ZenSpace3DTypes';\r\nimport {\r\n latLonAltToCartesian,\r\n SCENE_EARTH_RADIUS,\r\n KM_TO_SCENE,\r\n easeOutCubic,\r\n} from './ZenSpace3DUtils';\r\nimport { formatDuration } from '../utils';\r\n\r\n// Import shaders as raw text (like EarthViewer)\r\nimport atmosphereVertexShader from '../../shaders/atmosphere.vert?raw';\r\nimport atmosphereFragmentShader from '../../shaders/atmosphere.frag?raw';\r\nimport starsVertexShader from '../../shaders/stars.vert?raw';\r\nimport starsFragmentShader from '../../shaders/stars.frag?raw';\r\nimport { loadThree, ThreeModule } from './threeLoader';\r\nimport { ZenSpace3DCesium } from './ZenSpace3DCesium';\r\n\r\n// =============================================================================\r\n// Communication Link Types\r\n// =============================================================================\r\n\r\nexport interface CommunicationLink {\r\n id: string;\r\n fromId: string;\r\n toId: string;\r\n type: 'uplink' | 'downlink' | 'crosslink' | 'relay';\r\n status: 'active' | 'idle' | 'blocked';\r\n color?: string;\r\n bandwidth?: number;\r\n latency?: number;\r\n signalStrength?: number;\r\n}\r\n\r\n// =============================================================================\r\n// Configuration - Optimized for smooth interactions\r\n// =============================================================================\r\n\r\nconst DEFAULT_LAYERS: LayerVisibility = {\r\n planets: true,\r\n moons: true,\r\n satellites: true,\r\n debris: false,\r\n stations: true,\r\n asteroids: false,\r\n groundStations: true,\r\n orbits: true,\r\n labels: true,\r\n constellations: false,\r\n coverage: true,\r\n atmosphere: true,\r\n stars: true,\r\n grid: false,\r\n terminator: true,\r\n};\r\n\r\nconst CAMERA_TRANSITION_DURATION = 2000;\r\nconst STARS_COUNT = 5000; // Reduced from 8000\r\nconst EARTH_SEGMENTS = 64; // Reduced from 128\r\nconst EARTH_SEGMENTS_V = 32; // Reduced from 64\r\nconst SPHERICAL_SUBDIVISIONS = 16; // Subdivisions for curved edges on coverage\r\n\r\nfunction checkWebGLCapabilities(): { available: boolean; version: number } {\r\n try {\r\n const canvas = document.createElement('canvas');\r\n const gl2 = canvas.getContext('webgl2');\r\n if (gl2) return { available: true, version: 2 };\r\n const gl = canvas.getContext('webgl');\r\n if (gl) return { available: true, version: 1 };\r\n } catch { /* WebGL not available */ }\r\n return { available: false, version: 0 };\r\n}\r\n\r\n// =============================================================================\r\n// Spherical Geometry Helpers - For realistic curved coverage on sphere\r\n// =============================================================================\r\n\r\n/**\r\n * Spherical linear interpolation (SLERP) between two unit vectors\r\n * Creates smooth arc along the sphere surface\r\n */\r\nfunction slerp(v1: { x: number; y: number; z: number }, v2: { x: number; y: number; z: number }, t: number): { x: number; y: number; z: number } {\r\n // Normalize inputs\r\n const len1 = Math.sqrt(v1.x * v1.x + v1.y * v1.y + v1.z * v1.z);\r\n const len2 = Math.sqrt(v2.x * v2.x + v2.y * v2.y + v2.z * v2.z);\r\n \r\n // Handle zero-length vectors\r\n if (len1 < 0.0001 || len2 < 0.0001) {\r\n return { x: v1.x, y: v1.y, z: v1.z };\r\n }\r\n \r\n const n1 = { x: v1.x / len1, y: v1.y / len1, z: v1.z / len1 };\r\n const n2 = { x: v2.x / len2, y: v2.y / len2, z: v2.z / len2 };\r\n \r\n // Calculate angle between vectors\r\n let dot = n1.x * n2.x + n1.y * n2.y + n1.z * n2.z;\r\n dot = Math.max(-1, Math.min(1, dot)); // Clamp for numerical stability\r\n const theta = Math.acos(dot);\r\n \r\n if (theta < 0.001) {\r\n // Vectors are nearly parallel, use linear interpolation\r\n return {\r\n x: n1.x + t * (n2.x - n1.x),\r\n y: n1.y + t * (n2.y - n1.y),\r\n z: n1.z + t * (n2.z - n1.z)\r\n };\r\n }\r\n \r\n const sinTheta = Math.sin(theta);\r\n if (Math.abs(sinTheta) < 0.0001) {\r\n // Near zero sin, use linear interpolation\r\n return {\r\n x: n1.x + t * (n2.x - n1.x),\r\n y: n1.y + t * (n2.y - n1.y),\r\n z: n1.z + t * (n2.z - n1.z)\r\n };\r\n }\r\n \r\n const a = Math.sin((1 - t) * theta) / sinTheta;\r\n const b = Math.sin(t * theta) / sinTheta;\r\n \r\n return {\r\n x: a * n1.x + b * n2.x,\r\n y: a * n1.y + b * n2.y,\r\n z: a * n1.z + b * n2.z\r\n };\r\n}\r\n\r\n/**\r\n * Subdivide polygon edges along great circles for spherical rendering\r\n * Takes corner points and returns a densely sampled spherical polygon\r\n */\r\nfunction subdivideSphericalPolygon(\r\n corners: Array<{ x: number; y: number; z: number }>,\r\n subdivisions: number,\r\n radius: number\r\n): Array<{ x: number; y: number; z: number }> {\r\n if (corners.length < 3 || subdivisions < 1 || radius <= 0) {\r\n return corners; // Return as-is if invalid params\r\n }\r\n \r\n const result: Array<{ x: number; y: number; z: number }> = [];\r\n \r\n for (let i = 0; i < corners.length; i++) {\r\n const p1 = corners[i];\r\n const p2 = corners[(i + 1) % corners.length];\r\n \r\n // Validate points\r\n if (!isFinite(p1.x) || !isFinite(p1.y) || !isFinite(p1.z) ||\r\n !isFinite(p2.x) || !isFinite(p2.y) || !isFinite(p2.z)) {\r\n continue; // Skip invalid points\r\n }\r\n \r\n // Add interpolated points along the great circle arc\r\n for (let j = 0; j < subdivisions; j++) {\r\n const t = j / subdivisions;\r\n const interpolated = slerp(p1, p2, t);\r\n \r\n // Validate interpolation result\r\n if (!isFinite(interpolated.x) || !isFinite(interpolated.y) || !isFinite(interpolated.z)) {\r\n continue;\r\n }\r\n \r\n // Project onto sphere surface at given radius\r\n const len = Math.sqrt(interpolated.x ** 2 + interpolated.y ** 2 + interpolated.z ** 2);\r\n if (len < 0.0001) continue; // Skip zero-length vectors\r\n \r\n result.push({\r\n x: (interpolated.x / len) * radius,\r\n y: (interpolated.y / len) * radius,\r\n z: (interpolated.z / len) * radius\r\n });\r\n }\r\n }\r\n \r\n return result.length > 0 ? result : corners; // Fallback to original if all failed\r\n}\r\n\r\n// =============================================================================\r\n// Satellite Shape Builders (simplified for performance)\r\n// =============================================================================\r\n\r\nfunction createSatelliteShape(THREE: ThreeModule, category: string, size: number): any {\r\n const group = new THREE.Group();\r\n \r\n if (category === 'station') {\r\n // Simple station shape\r\n const geo = new THREE.BoxGeometry(size * 1.2, size * 0.6, size * 0.6);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0xcccccc });\r\n group.add(new THREE.Mesh(geo, mat));\r\n \r\n // Solar panels\r\n const panelGeo = new THREE.BoxGeometry(size * 2.5, size * 0.03, size * 0.6);\r\n const panelMat = new THREE.MeshBasicMaterial({ color: 0x1a4a7a });\r\n const leftPanel = new THREE.Mesh(panelGeo, panelMat);\r\n leftPanel.position.x = -size * 1.5;\r\n group.add(leftPanel);\r\n const rightPanel = new THREE.Mesh(panelGeo, panelMat);\r\n rightPanel.position.x = size * 1.5;\r\n group.add(rightPanel);\r\n \r\n } else if (category === 'satellite') {\r\n // Simple satellite\r\n const geo = new THREE.BoxGeometry(size * 0.5, size * 0.5, size * 0.6);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0xaaaaaa });\r\n group.add(new THREE.Mesh(geo, mat));\r\n \r\n const panelGeo = new THREE.BoxGeometry(size * 1.2, size * 0.02, size * 0.4);\r\n const panelMat = new THREE.MeshBasicMaterial({ color: 0x1a3a6a });\r\n const leftPanel = new THREE.Mesh(panelGeo, panelMat);\r\n leftPanel.position.x = -size * 0.7;\r\n group.add(leftPanel);\r\n const rightPanel = new THREE.Mesh(panelGeo, panelMat);\r\n rightPanel.position.x = size * 0.7;\r\n group.add(rightPanel);\r\n \r\n } else if (category === 'debris') {\r\n const geo = new THREE.IcosahedronGeometry(size * 0.3, 0);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0x666666 });\r\n group.add(new THREE.Mesh(geo, mat));\r\n } else {\r\n const geo = new THREE.SphereGeometry(size * 0.4, 8, 6);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0x888888 });\r\n group.add(new THREE.Mesh(geo, mat));\r\n }\r\n \r\n return group;\r\n}\r\n\r\n// =============================================================================\r\n// Component\r\n// =============================================================================\r\n\r\nexport const ZenSpace3D = forwardRef<ZenSpace3DHandle, ZenSpace3DProps>(\r\n function ZenSpace3D(props, ref) {\r\n // Prefer Cesium when available (default 3D backend); fall back to Three.js\r\n const [cesiumModule, setCesiumModule] = useState<unknown>(null);\r\n useEffect(() => {\r\n // Cesium is optional peer; fallback to Three.js when not installed\r\n import('cesium').then((m) => setCesiumModule(m)).catch(() => setCesiumModule(null));\r\n }, []);\r\n if (cesiumModule) {\r\n return <ZenSpace3DCesium ref={ref} cesium={cesiumModule} {...props} />;\r\n }\r\n return <ZenSpace3DThree ref={ref} {...props} />;\r\n }\r\n);\r\n\r\n// Three.js implementation — separate component so hook count is consistent (avoids React #300)\r\nconst ZenSpace3DThree = forwardRef<ZenSpace3DHandle, ZenSpace3DProps>(function ZenSpace3DThree(props, ref) {\r\n const {\r\n satellites = [],\r\n debris = [],\r\n stations = [],\r\n groundStations = [],\r\n customObjects = [],\r\n view = 'earth-orbit',\r\n focusedObjectId,\r\n initialCamera,\r\n sunDirection,\r\n planetPositions,\r\n visibilityCones = [],\r\n satelliteCoverages = [],\r\n overpasses: _overpasses = [],\r\n orbitPaths = [],\r\n orbitDesignArcs: _orbitDesignArcs = [],\r\n communicationLinks = [],\r\n showAxisHelper = false,\r\n layers: layerOverrides,\r\n showTools = true,\r\n showInfoPanel = true,\r\n width = '100%',\r\n height = 600,\r\n callbacks,\r\n maxObjects = 10000,\r\n className = '',\r\n style,\r\n } = props;\r\n\r\n const { tokens: _tokens } = useTheme();\r\n const [webglCapabilities] = useState(() => checkWebGLCapabilities());\r\n\r\n // Refs\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const rendererRef = useRef<any>(null);\r\n const sceneRef = useRef<any>(null);\r\n const cameraRef = useRef<any>(null);\r\n const controlsRef = useRef<any>(null);\r\n const animationRef = useRef<number | null>(null);\r\n const raycasterRef = useRef<any>(null);\r\n const mouseRef = useRef<any>(null);\r\n \r\n const earthRef = useRef<any>(null);\r\n const starsMaterialRef = useRef<any>(null);\r\n const atmosphereMaterialRef = useRef<any>(null);\r\n const objectsGroupRef = useRef<any>(null);\r\n const linksGroupRef = useRef<any>(null);\r\n const conesGroupRef = useRef<any>(null);\r\n const orbitsGroupRef = useRef<any>(null);\r\n const planetsGroupRef = useRef<any>(null);\r\n \r\n const timeRef = useRef(0);\r\n const focusTransitionRef = useRef<any>(null);\r\n const isUserInteractingRef = useRef(false);\r\n const objectMeshMapRef = useRef<Map<string, any>>(new Map());\r\n const isAnimatingRef = useRef(false); // Guard against multiple animation loops\r\n const _sceneInitializedRef = useRef(false); // Prevent duplicate initialization\r\n\r\n // State\r\n const [THREE, setTHREE] = useState<ThreeModule | null>(null);\r\n const threeRef = useRef<ThreeModule | null>(null);\r\n threeRef.current = THREE;\r\n const [OrbitControlsClass, setOrbitControlsClass] = useState<any>(null);\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n \r\n const [layers, setLayers] = useState<LayerVisibility>({ ...DEFAULT_LAYERS, ...layerOverrides });\r\n const [selection, setSelection] = useState<SelectionState>({ selectedId: null, selectedObject: null, hoveredId: null });\r\n const [hoverTooltip, setHoverTooltip] = useState<{ visible: boolean; x: number; y: number; object: any }>({ visible: false, x: 0, y: 0, object: null });\r\n const [currentView, setCurrentView] = useState<ViewMode>(view);\r\n \r\n // Ref for view to prevent initScene recreation (fixes flickering on view change)\r\n const currentViewRef = useRef<ViewMode>(view);\r\n\r\n const effectiveLayers = useMemo(() => ({ ...layers, ...layerOverrides }), [layers, layerOverrides]);\r\n\r\n useEffect(() => { \r\n setCurrentView(view); \r\n currentViewRef.current = view;\r\n }, [view]);\r\n\r\n // ==========================================================================\r\n // Load Three.js\r\n // ==========================================================================\r\n \r\n useEffect(() => {\r\n if (!webglCapabilities.available) { setIsLoading(false); return; }\r\n\r\n loadThree()\r\n .then(({ THREE: threeModule, OrbitControls: controls }) => {\r\n setTHREE(threeModule);\r\n setOrbitControlsClass(() => controls);\r\n })\r\n .catch((err) => {\r\n if (import.meta.env.DEV) {\r\n console.error('Failed to load Three.js:', err);\r\n }\r\n setError('Failed to load 3D library');\r\n setIsLoading(false);\r\n });\r\n }, [webglCapabilities.available]);\r\n\r\n // ==========================================================================\r\n // Initialize Scene (Optimized like EarthViewer)\r\n // ==========================================================================\r\n \r\n const initScene = useCallback(() => {\r\n if (!THREE || !containerRef.current || !OrbitControlsClass) return;\r\n \r\n // Clean up any existing scene first (prevents duplicates)\r\n if (rendererRef.current) {\r\n isAnimatingRef.current = false;\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current);\r\n animationRef.current = null;\r\n }\r\n controlsRef.current?.dispose();\r\n rendererRef.current.dispose();\r\n if (containerRef.current?.contains(rendererRef.current.domElement)) {\r\n containerRef.current.removeChild(rendererRef.current.domElement);\r\n }\r\n }\r\n\r\n const container = containerRef.current;\r\n const rect = container.getBoundingClientRect();\r\n const w = rect.width;\r\n const h = typeof height === 'number' ? height : rect.height;\r\n\r\n // Scene\r\n const scene = new THREE.Scene();\r\n sceneRef.current = scene;\r\n\r\n // Use ref for view mode to prevent initScene recreation (fixes flickering)\r\n const viewMode = currentViewRef.current;\r\n \r\n // Camera (adjusted per view mode)\r\n const farClip = viewMode === 'solar-system' ? 1000000 : 100000;\r\n const camera = new THREE.PerspectiveCamera(45, w / h, 1, farClip);\r\n // Solar system: position to see inner planets, Earth orbit view: standard distance\r\n const initialDistance = viewMode === 'solar-system' ? 5000 : 10000;\r\n camera.position.set(0, initialDistance * 0.3, initialDistance);\r\n cameraRef.current = camera;\r\n\r\n if (initialCamera?.position) {\r\n camera.position.set(initialCamera.position.x, initialCamera.position.y, initialCamera.position.z);\r\n }\r\n\r\n // Renderer (optimized settings - preserveDrawingBuffer prevents flickering)\r\n const renderer = new THREE.WebGLRenderer({ \r\n antialias: true, \r\n alpha: true,\r\n powerPreference: 'high-performance',\r\n preserveDrawingBuffer: true, // Prevents flickering from buffer swaps\r\n });\r\n renderer.setSize(w, h);\r\n renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\r\n container.appendChild(renderer.domElement);\r\n rendererRef.current = renderer;\r\n\r\n // Controls (smooth damping, adjusted per view)\r\n const controls = new OrbitControlsClass(camera, renderer.domElement);\r\n controls.enableDamping = true;\r\n controls.dampingFactor = 0.05;\r\n controls.rotateSpeed = 0.5;\r\n controls.minDistance = viewMode === 'solar-system' ? 500 : 3050; // Very close to Earth/objects\r\n controls.maxDistance = viewMode === 'solar-system' ? 100000 : 25000;\r\n controls.enablePan = viewMode === 'solar-system'; // Allow pan in solar system\r\n let interactionTimer: ReturnType<typeof setTimeout>;\r\n const handleControlStart = () => { isUserInteractingRef.current = true; };\r\n const handleControlEnd = () => {\r\n clearTimeout(interactionTimer);\r\n interactionTimer = setTimeout(() => { isUserInteractingRef.current = false; }, 3000);\r\n };\r\n controls.addEventListener('start', handleControlStart);\r\n controls.addEventListener('end', handleControlEnd);\r\n controlsRef.current = controls;\r\n\r\n raycasterRef.current = new THREE.Raycaster();\r\n mouseRef.current = new THREE.Vector2();\r\n\r\n // Groups\r\n objectsGroupRef.current = new THREE.Group();\r\n objectsGroupRef.current.name = 'objects';\r\n scene.add(objectsGroupRef.current);\r\n\r\n linksGroupRef.current = new THREE.Group();\r\n linksGroupRef.current.name = 'links';\r\n scene.add(linksGroupRef.current);\r\n\r\n conesGroupRef.current = new THREE.Group();\r\n conesGroupRef.current.name = 'cones';\r\n scene.add(conesGroupRef.current);\r\n\r\n orbitsGroupRef.current = new THREE.Group();\r\n orbitsGroupRef.current.name = 'orbits';\r\n scene.add(orbitsGroupRef.current);\r\n\r\n planetsGroupRef.current = new THREE.Group();\r\n planetsGroupRef.current.name = 'planets';\r\n scene.add(planetsGroupRef.current);\r\n\r\n if (viewMode === 'solar-system') {\r\n createSolarSystem(THREE, scene);\r\n } else {\r\n createEarth(THREE, scene);\r\n createAtmosphere(THREE, scene);\r\n }\r\n \r\n createStars(THREE, scene);\r\n createLighting(THREE, scene);\r\n \r\n if (showAxisHelper && viewMode !== 'solar-system') {\r\n createAxisHelper(THREE, scene);\r\n }\r\n\r\n setIsLoading(false);\r\n\r\n return () => {\r\n clearTimeout(interactionTimer);\r\n if (animationRef.current) cancelAnimationFrame(animationRef.current);\r\n controls.removeEventListener('start', handleControlStart);\r\n controls.removeEventListener('end', handleControlEnd);\r\n controls.dispose();\r\n renderer.dispose();\r\n if (container.contains(renderer.domElement)) container.removeChild(renderer.domElement);\r\n };\r\n }, [THREE, OrbitControlsClass, height, initialCamera, showAxisHelper]); // Uses currentViewRef to prevent recreation\r\n\r\n // ==========================================================================\r\n // Create Solar System (scaled for visibility)\r\n // ==========================================================================\r\n \r\n const createSolarSystem = useCallback((THREE: ThreeModule, _scene: unknown) => {\r\n const planetsGroup = planetsGroupRef.current;\r\n if (!planetsGroup) return;\r\n\r\n // Scale factor to make solar system viewable (1 unit = ~1000 km)\r\n const DISTANCE_SCALE = 0.000005;\r\n const SIZE_SCALE = 0.01;\r\n\r\n // Sun (emissive glow)\r\n const sunRadius = 696340 * SIZE_SCALE;\r\n const sunGeo = new THREE.SphereGeometry(sunRadius, 32, 24);\r\n const sunMat = new THREE.MeshBasicMaterial({ color: 0xffdd44 });\r\n const sunMesh = new THREE.Mesh(sunGeo, sunMat);\r\n sunMesh.name = 'sun';\r\n sunMesh.userData = { objectId: 'sun', planetId: 'sun', isPlanet: true, isSelectable: true };\r\n planetsGroup.add(sunMesh);\r\n\r\n // Sun glow\r\n const glowGeo = new THREE.SphereGeometry(sunRadius * 1.3, 24, 16);\r\n const glowMat = new THREE.MeshBasicMaterial({ color: 0xffaa00, transparent: true, opacity: 0.2 });\r\n planetsGroup.add(new THREE.Mesh(glowGeo, glowMat));\r\n\r\n // Planets with proper scaling\r\n const configs = [\r\n { id: 'mercury', color: 0x8c7853, radius: 2439.7, distance: 57900000 },\r\n { id: 'venus', color: 0xffc649, radius: 6051.8, distance: 108200000 },\r\n { id: 'earth', color: 0x6b93d6, radius: 6371, distance: 149600000 },\r\n { id: 'mars', color: 0xc1440e, radius: 3389.5, distance: 227900000 },\r\n { id: 'jupiter', color: 0xd8ca9d, radius: 69911, distance: 778500000 },\r\n { id: 'saturn', color: 0xf4d59e, radius: 58232, distance: 1434000000 },\r\n { id: 'uranus', color: 0xd1e7e7, radius: 25362, distance: 2871000000 },\r\n { id: 'neptune', color: 0x5b5ddf, radius: 24622, distance: 4495000000 },\r\n ];\r\n\r\n configs.forEach(c => {\r\n // Make inner planets larger for visibility\r\n const visualScale = c.distance < 300000000 ? 15 : 5;\r\n const planetRadius = c.radius * SIZE_SCALE * visualScale;\r\n const geo = new THREE.SphereGeometry(planetRadius, 24, 16);\r\n const mat = new THREE.MeshPhongMaterial({ color: c.color, shininess: 30 });\r\n const mesh = new THREE.Mesh(geo, mat);\r\n \r\n const orbitDist = c.distance * DISTANCE_SCALE;\r\n mesh.position.x = orbitDist;\r\n mesh.name = c.id;\r\n mesh.userData = { objectId: c.id, planetId: c.id, isPlanet: true, isSelectable: true, data: { id: c.id, name: c.id.charAt(0).toUpperCase() + c.id.slice(1), category: 'planet' } };\r\n planetsGroup.add(mesh);\r\n objectMeshMapRef.current.set(c.id, mesh);\r\n\r\n // Saturn's rings\r\n if (c.id === 'saturn') {\r\n const ringGeo = new THREE.RingGeometry(planetRadius * 1.4, planetRadius * 2.2, 32);\r\n const ringMat = new THREE.MeshBasicMaterial({ color: 0xc9b896, transparent: true, opacity: 0.6, side: THREE.DoubleSide });\r\n const ring = new THREE.Mesh(ringGeo, ringMat);\r\n ring.rotation.x = Math.PI / 2.5;\r\n ring.position.copy(mesh.position);\r\n planetsGroup.add(ring);\r\n }\r\n\r\n // Orbit line\r\n const points: any[] = [];\r\n for (let i = 0; i <= 64; i++) {\r\n const angle = (i / 64) * Math.PI * 2;\r\n points.push(new THREE.Vector3(orbitDist * Math.cos(angle), 0, orbitDist * Math.sin(angle)));\r\n }\r\n const orbitGeo = new THREE.BufferGeometry().setFromPoints(points);\r\n const orbitMat = new THREE.LineBasicMaterial({ color: 0x444466, transparent: true, opacity: 0.3 });\r\n planetsGroup.add(new THREE.Line(orbitGeo, orbitMat));\r\n });\r\n\r\n // Add a point light at Sun\r\n const sunLight = new THREE.PointLight(0xffffee, 2, 100000);\r\n sunLight.position.set(0, 0, 0);\r\n planetsGroup.add(sunLight);\r\n }, []);\r\n\r\n // ==========================================================================\r\n // Create Earth (optimized segments like EarthViewer)\r\n // ==========================================================================\r\n \r\n const createEarth = useCallback((THREE: ThreeModule, scene: any) => {\r\n const earthGeometry = new THREE.SphereGeometry(SCENE_EARTH_RADIUS, EARTH_SEGMENTS, EARTH_SEGMENTS_V);\r\n const earthMaterial = new THREE.MeshPhongMaterial({ color: 0x2244aa, shininess: 10 });\r\n\r\n const textureLoader = new THREE.TextureLoader();\r\n textureLoader.load('/world.topo.jpg', (texture: any) => {\r\n texture.wrapS = THREE.RepeatWrapping;\r\n texture.wrapT = THREE.ClampToEdgeWrapping;\r\n texture.minFilter = THREE.LinearFilter;\r\n texture.magFilter = THREE.LinearFilter;\r\n earthMaterial.map = texture;\r\n earthMaterial.needsUpdate = true;\r\n }, undefined, () => {});\r\n\r\n const earth = new THREE.Mesh(earthGeometry, earthMaterial);\r\n earth.rotation.y = -Math.PI / 2 + Math.PI;\r\n earth.name = 'earth';\r\n scene.add(earth);\r\n earthRef.current = earth;\r\n }, []);\r\n\r\n // ==========================================================================\r\n // Create Atmosphere (sun-reactive glow)\r\n // ==========================================================================\r\n \r\n const createAtmosphere = useCallback((THREE: ThreeModule, scene: any) => {\r\n if (!effectiveLayers.atmosphere) return;\r\n \r\n // Default sun direction (can be updated via props)\r\n const defaultSunDir = new THREE.Vector3(1, 0.3, 0.5).normalize();\r\n \r\n const atmosphereGeometry = new THREE.SphereGeometry(SCENE_EARTH_RADIUS * 1.15, 32, 16);\r\n const atmosphereMaterial = new THREE.ShaderMaterial({\r\n uniforms: {\r\n uSunDirection: { value: defaultSunDir },\r\n },\r\n vertexShader: atmosphereVertexShader,\r\n fragmentShader: atmosphereFragmentShader,\r\n blending: THREE.AdditiveBlending,\r\n side: THREE.BackSide,\r\n transparent: true,\r\n depthWrite: false,\r\n });\r\n const atmosphere = new THREE.Mesh(atmosphereGeometry, atmosphereMaterial);\r\n atmosphere.rotation.y = -Math.PI / 2;\r\n atmosphere.name = 'atmosphere';\r\n scene.add(atmosphere);\r\n \r\n // Store ref for dynamic updates\r\n atmosphereMaterialRef.current = atmosphereMaterial;\r\n }, [effectiveLayers.atmosphere]);\r\n\r\n // ==========================================================================\r\n // Create Stars (optimized like EarthViewer)\r\n // ==========================================================================\r\n \r\n const createStars = useCallback((THREE: ThreeModule, scene: any) => {\r\n const starsGeometry = new THREE.BufferGeometry();\r\n const starsDist = currentView === 'solar-system' ? 50000000000 : 50000;\r\n const positions = new Float32Array(STARS_COUNT * 3);\r\n const opacities = new Float32Array(STARS_COUNT);\r\n\r\n for (let i = 0; i < STARS_COUNT; i++) {\r\n const radius = starsDist + Math.random() * starsDist;\r\n const theta = Math.random() * Math.PI * 2;\r\n const phi = Math.acos(2 * Math.random() - 1);\r\n\r\n positions[i * 3] = radius * Math.sin(phi) * Math.cos(theta);\r\n positions[i * 3 + 1] = radius * Math.sin(phi) * Math.sin(theta);\r\n positions[i * 3 + 2] = radius * Math.cos(phi);\r\n opacities[i] = Math.random();\r\n }\r\n\r\n starsGeometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\r\n starsGeometry.setAttribute('opacity', new THREE.BufferAttribute(opacities, 1));\r\n\r\n const starsMaterial = new THREE.ShaderMaterial({\r\n uniforms: { time: { value: 0 } },\r\n vertexShader: starsVertexShader,\r\n fragmentShader: starsFragmentShader,\r\n transparent: true,\r\n depthWrite: false,\r\n blending: THREE.AdditiveBlending,\r\n });\r\n\r\n scene.add(new THREE.Points(starsGeometry, starsMaterial));\r\n starsMaterialRef.current = starsMaterial;\r\n }, [currentView]);\r\n\r\n // ==========================================================================\r\n // Create Lighting (simple like EarthViewer)\r\n // ==========================================================================\r\n \r\n const createLighting = useCallback((THREE: ThreeModule, scene: any) => {\r\n scene.add(new THREE.AmbientLight(0x404040, 0.6));\r\n const sunLight = new THREE.DirectionalLight(0xffffff, 1.2);\r\n sunLight.position.set(10000, 5000, 10000);\r\n scene.add(sunLight);\r\n }, []);\r\n\r\n // ==========================================================================\r\n // Create Axis Helper\r\n // ==========================================================================\r\n \r\n const createAxisHelper = useCallback((THREE: ThreeModule, scene: any) => {\r\n const len = SCENE_EARTH_RADIUS * 1.5;\r\n const group = new THREE.Group();\r\n \r\n [\r\n { color: 0xff3333, dir: [1, 0, 0] },\r\n { color: 0x33ff33, dir: [0, 1, 0] },\r\n { color: 0x3333ff, dir: [0, 0, 1] },\r\n ].forEach(({ color, dir }) => {\r\n const points = [new THREE.Vector3(0, 0, 0), new THREE.Vector3(dir[0] * len, dir[1] * len, dir[2] * len)];\r\n const geo = new THREE.BufferGeometry().setFromPoints(points);\r\n const mat = new THREE.LineBasicMaterial({ color });\r\n group.add(new THREE.Line(geo, mat));\r\n });\r\n \r\n scene.add(group);\r\n }, []);\r\n\r\n // ==========================================================================\r\n // Update Objects\r\n // ==========================================================================\r\n \r\n const updateObjects = useCallback(() => {\r\n if (!THREE || !objectsGroupRef.current || currentView === 'solar-system') return;\r\n\r\n const group = objectsGroupRef.current;\r\n const meshMap = objectMeshMapRef.current;\r\n\r\n // Clear\r\n while (group.children.length > 0) {\r\n const child = group.children[0];\r\n group.remove(child);\r\n }\r\n meshMap.clear();\r\n\r\n const allObjects: SpaceObject[] = [...satellites, ...debris, ...stations, ...customObjects];\r\n\r\n allObjects.slice(0, maxObjects).forEach((obj) => {\r\n const categoryLayer = obj.category === 'satellite' ? 'satellites' :\r\n obj.category === 'debris' ? 'debris' :\r\n obj.category === 'station' ? 'stations' : 'satellites';\r\n \r\n if (!effectiveLayers[categoryLayer]) return;\r\n\r\n let size = 50;\r\n if (obj.category === 'station') size = 100;\r\n else if (obj.category === 'debris') size = 25;\r\n\r\n const satelliteGroup = createSatelliteShape(THREE, obj.category, size);\r\n satelliteGroup.position.set(obj.position.x, obj.position.y, obj.position.z);\r\n satelliteGroup.lookAt(0, 0, 0);\r\n satelliteGroup.userData = { objectId: obj.id, category: obj.category, data: obj, isSelectable: true };\r\n satelliteGroup.name = obj.id;\r\n \r\n group.add(satelliteGroup);\r\n meshMap.set(obj.id, satelliteGroup);\r\n });\r\n }, [THREE, satellites, debris, stations, customObjects, maxObjects, effectiveLayers, currentView]);\r\n\r\n // ==========================================================================\r\n // Update Ground Stations\r\n // ==========================================================================\r\n \r\n const updateGroundStations = useCallback(() => {\r\n if (!THREE || !objectsGroupRef.current || currentView === 'solar-system') return;\r\n if (!effectiveLayers.groundStations) return;\r\n\r\n groundStations.forEach((gs) => {\r\n const pos = latLonAltToCartesian(gs.latitude, gs.longitude, 0);\r\n \r\n // Simple marker\r\n const geo = new THREE.SphereGeometry(35, 8, 6);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0x00ffff });\r\n const marker = new THREE.Mesh(geo, mat);\r\n marker.position.set(pos.x, pos.y, pos.z);\r\n marker.userData = { objectId: gs.id, category: 'groundStation', data: gs, isSelectable: true };\r\n \r\n objectsGroupRef.current.add(marker);\r\n objectMeshMapRef.current.set(gs.id, marker);\r\n\r\n // Glow ring\r\n const ringGeo = new THREE.RingGeometry(45, 65, 16);\r\n const ringMat = new THREE.MeshBasicMaterial({ color: 0x00ffff, transparent: true, opacity: 0.4, side: THREE.DoubleSide });\r\n const ring = new THREE.Mesh(ringGeo, ringMat);\r\n ring.position.set(pos.x, pos.y, pos.z);\r\n ring.lookAt(0, 0, 0);\r\n objectsGroupRef.current.add(ring);\r\n });\r\n }, [THREE, groundStations, effectiveLayers.groundStations, currentView]);\r\n\r\n // ==========================================================================\r\n // Update Coverage (Realistic satellite-to-ground cones + legacy region cones)\r\n // ==========================================================================\r\n \r\n const updateCoverage = useCallback(() => {\r\n const T = threeRef.current;\r\n if (!T || !conesGroupRef.current || currentView === 'solar-system') return;\r\n\r\n // Clear existing\r\n while (conesGroupRef.current.children.length > 0) {\r\n conesGroupRef.current.remove(conesGroupRef.current.children[0]);\r\n }\r\n\r\n if (!effectiveLayers.coverage) return;\r\n\r\n // ========================================\r\n // Satellite Coverage Visualization (NASA-style)\r\n // Renders coverage data provided by Zendir SDK\r\n // ========================================\r\n satelliteCoverages.forEach((coverage) => {\r\n // Get satellite position\r\n let satPos: any;\r\n if (coverage.satellitePosition) {\r\n satPos = new T.Vector3(coverage.satellitePosition.x, coverage.satellitePosition.y, coverage.satellitePosition.z);\r\n } else {\r\n const satMesh = objectMeshMapRef.current.get(coverage.satelliteId);\r\n if (!satMesh) return;\r\n satPos = satMesh.position.clone();\r\n }\r\n\r\n const satDistance = satPos.length();\r\n const coneColor = new T.Color(coverage.color || '#22d3ee');\r\n const highlightColor = new T.Color(coverage.color || '#22d3ee').multiplyScalar(1.3);\r\n\r\n // ====== 1. Render footprint border only (no filled plane - it cuts through sphere) ======\r\n if (coverage.footprintPolygon && coverage.footprintPolygon.length >= 3 && coverage.showFootprint !== false) {\r\n const cornerPoints = coverage.footprintPolygon.map(pt => latLonAltToCartesian(pt.latitude, pt.longitude, 0));\r\n \r\n // Curved border (follows sphere curvature via SLERP)\r\n const borderPts = subdivideSphericalPolygon(cornerPoints, SPHERICAL_SUBDIVISIONS, SCENE_EARTH_RADIUS * 1.003)\r\n .map(pt => new T.Vector3(pt.x, pt.y, pt.z));\r\n borderPts.push(borderPts[0].clone());\r\n const borderGeo = new T.BufferGeometry().setFromPoints(borderPts);\r\n const borderMat = new T.LineBasicMaterial({ color: highlightColor, transparent: true, opacity: 0.95, linewidth: 2 });\r\n conesGroupRef.current.add(new T.Line(borderGeo, borderMat));\r\n\r\n // Outer glow (slightly larger radius for glow effect)\r\n const glowPts = subdivideSphericalPolygon(cornerPoints, SPHERICAL_SUBDIVISIONS, SCENE_EARTH_RADIUS * 1.005)\r\n .map(pt => new T.Vector3(pt.x, pt.y, pt.z));\r\n glowPts.push(glowPts[0].clone());\r\n const glowGeo = new T.BufferGeometry().setFromPoints(glowPts);\r\n const glowMat = new T.LineBasicMaterial({ color: coneColor, transparent: true, opacity: 0.4 });\r\n conesGroupRef.current.add(new T.Line(glowGeo, glowMat));\r\n\r\n // Cone lines from satellite to corners (lines only, no filled surface)\r\n if (coverage.showCone !== false) {\r\n for (const corner of cornerPoints) {\r\n const edgePt = new T.Vector3(corner.x, corner.y, corner.z).normalize().multiplyScalar(SCENE_EARTH_RADIUS);\r\n const lineGeo = new T.BufferGeometry().setFromPoints([satPos, edgePt]);\r\n const lineMat = new T.LineBasicMaterial({ color: coneColor, transparent: true, opacity: 0.4 });\r\n conesGroupRef.current.add(new T.Line(lineGeo, lineMat));\r\n }\r\n }\r\n }\r\n\r\n // ====== 2. Simple cone (when no polygon, just halfAngle) ======\r\n else if (coverage.halfAngle && coverage.showCone !== false) {\r\n const halfAngleRad = coverage.halfAngle * (Math.PI / 180);\r\n const coneHeight = satDistance - SCENE_EARTH_RADIUS * 0.98;\r\n const coneRadius = coneHeight * Math.tan(halfAngleRad);\r\n\r\n // Cone mesh\r\n const coneGeo = new T.ConeGeometry(coneRadius, coneHeight, 48, 1, true);\r\n const coneMat = new T.MeshBasicMaterial({\r\n color: coneColor,\r\n transparent: true,\r\n opacity: 0.12,\r\n side: T.DoubleSide,\r\n depthWrite: false,\r\n });\r\n const cone = new T.Mesh(coneGeo, coneMat);\r\n cone.position.copy(satPos);\r\n cone.lookAt(0, 0, 0);\r\n cone.rotateX(Math.PI / 2);\r\n cone.translateY(-coneHeight / 2);\r\n conesGroupRef.current.add(cone);\r\n\r\n // Footprint circle\r\n if (coverage.showFootprint !== false) {\r\n const nadirDir = satPos.clone().normalize();\r\n const footprintPos = nadirDir.clone().multiplyScalar(SCENE_EARTH_RADIUS * 1.003);\r\n const footprintRadius = coneRadius * (SCENE_EARTH_RADIUS / satDistance);\r\n \r\n // Filled circle\r\n const footGeo = new T.CircleGeometry(footprintRadius, 64);\r\n const footMat = new T.MeshBasicMaterial({\r\n color: coneColor, transparent: true, opacity: 0.3, side: T.DoubleSide, depthWrite: false\r\n });\r\n const footprint = new T.Mesh(footGeo, footMat);\r\n footprint.position.copy(footprintPos);\r\n footprint.lookAt(satPos);\r\n conesGroupRef.current.add(footprint);\r\n\r\n // Edge ring\r\n const ringGeo = new T.RingGeometry(footprintRadius * 0.97, footprintRadius, 64);\r\n const ringMat = new T.MeshBasicMaterial({\r\n color: highlightColor, transparent: true, opacity: 0.7, side: T.DoubleSide\r\n });\r\n const ring = new T.Mesh(ringGeo, ringMat);\r\n ring.position.copy(footprintPos);\r\n ring.lookAt(satPos);\r\n conesGroupRef.current.add(ring);\r\n }\r\n }\r\n\r\n // ====== 3. Nadir line ======\r\n if (coverage.showNadirLine !== false) {\r\n let nadirGroundPoint: any;\r\n if (coverage.nadirPoint) {\r\n const np = latLonAltToCartesian(coverage.nadirPoint.latitude, coverage.nadirPoint.longitude, 0);\r\n nadirGroundPoint = new T.Vector3(np.x, np.y, np.z);\r\n } else {\r\n nadirGroundPoint = satPos.clone().normalize().multiplyScalar(SCENE_EARTH_RADIUS);\r\n }\r\n const lineGeo = new T.BufferGeometry().setFromPoints([satPos, nadirGroundPoint]);\r\n const lineMat = new T.LineBasicMaterial({ color: highlightColor, transparent: true, opacity: 0.7 });\r\n conesGroupRef.current.add(new T.Line(lineGeo, lineMat));\r\n }\r\n });\r\n\r\n // ========================================\r\n // Legacy Region-based Visibility Cones\r\n // ========================================\r\n visibilityCones.forEach((cone) => {\r\n const pos = latLonAltToCartesian(cone.center.latitude, cone.center.longitude, 0);\r\n \r\n const coneHeight = 1000 * KM_TO_SCENE;\r\n const minElev = cone.minElevation || 10;\r\n const coneRadius = coneHeight * Math.tan((90 - minElev) * (Math.PI / 180) * 0.4);\r\n const coneColor = new T.Color(cone.color || '#22d3ee');\r\n \r\n const coneGeo = new T.ConeGeometry(coneRadius, coneHeight, 24, 1, true);\r\n const coneMat = new T.MeshBasicMaterial({\r\n color: coneColor,\r\n transparent: true,\r\n opacity: cone.opacity || 0.12,\r\n side: T.DoubleSide,\r\n depthWrite: false,\r\n });\r\n \r\n const coneMesh = new T.Mesh(coneGeo, coneMat);\r\n coneMesh.position.set(pos.x, pos.y, pos.z);\r\n coneMesh.lookAt(0, 0, 0);\r\n coneMesh.rotateX(-Math.PI / 2);\r\n coneMesh.translateY(coneHeight / 2);\r\n conesGroupRef.current.add(coneMesh);\r\n\r\n // Footprint ring\r\n const footGeo = new T.RingGeometry(coneRadius * 0.7, coneRadius * 0.9, 32);\r\n const footMat = new T.MeshBasicMaterial({\r\n color: coneColor,\r\n transparent: true,\r\n opacity: 0.3,\r\n side: T.DoubleSide,\r\n });\r\n const foot = new T.Mesh(footGeo, footMat);\r\n foot.position.set(pos.x * 1.002, pos.y * 1.002, pos.z * 1.002);\r\n foot.lookAt(0, 0, 0);\r\n conesGroupRef.current.add(foot);\r\n });\r\n }, [visibilityCones, satelliteCoverages, effectiveLayers.coverage, currentView]);\r\n\r\n // ==========================================================================\r\n // Update Communication Links\r\n // ==========================================================================\r\n \r\n const updateLinks = useCallback(() => {\r\n if (!THREE || !linksGroupRef.current || currentView === 'solar-system') return;\r\n\r\n while (linksGroupRef.current.children.length > 0) {\r\n linksGroupRef.current.remove(linksGroupRef.current.children[0]);\r\n }\r\n\r\n communicationLinks.forEach((link) => {\r\n const fromMesh = objectMeshMapRef.current.get(link.fromId);\r\n const toMesh = objectMeshMapRef.current.get(link.toId);\r\n if (!fromMesh || !toMesh) return;\r\n\r\n const color = link.color || (link.status === 'active' ? '#00ff88' : '#666666');\r\n const geo = new THREE.BufferGeometry().setFromPoints([fromMesh.position.clone(), toMesh.position.clone()]);\r\n \r\n // Dashed animated line\r\n const mat = new THREE.LineDashedMaterial({ \r\n color: new THREE.Color(color), \r\n transparent: true, \r\n opacity: link.status === 'active' ? 0.8 : 0.4,\r\n dashSize: 30,\r\n gapSize: 20,\r\n });\r\n \r\n const line = new THREE.Line(geo, mat);\r\n line.computeLineDistances(); // Required for dashed lines - must be on Line, not geometry\r\n line.userData = { isAnimatedLink: true };\r\n linksGroupRef.current.add(line);\r\n });\r\n }, [THREE, communicationLinks, currentView]);\r\n\r\n // ==========================================================================\r\n // Update Orbits\r\n // ==========================================================================\r\n \r\n const updateOrbits = useCallback(() => {\r\n if (!THREE || !orbitsGroupRef.current || currentView === 'solar-system') return;\r\n\r\n while (orbitsGroupRef.current.children.length > 0) {\r\n orbitsGroupRef.current.remove(orbitsGroupRef.current.children[0]);\r\n }\r\n\r\n if (!effectiveLayers.orbits) return;\r\n\r\n orbitPaths.forEach((path) => {\r\n if (path.points.length < 2) return;\r\n const points = path.points.map(p => new THREE.Vector3(p.x, p.y, p.z));\r\n const geo = new THREE.BufferGeometry().setFromPoints(points);\r\n const mat = new THREE.LineBasicMaterial({ color: new THREE.Color(path.color || '#888888'), transparent: true, opacity: 0.5 });\r\n orbitsGroupRef.current.add(new THREE.Line(geo, mat));\r\n });\r\n }, [THREE, orbitPaths, effectiveLayers.orbits, currentView]);\r\n\r\n // ==========================================================================\r\n // Mouse Handlers\r\n // ==========================================================================\r\n \r\n const handleMouseMove = useCallback((event: MouseEvent) => {\r\n if (!containerRef.current || !raycasterRef.current || !cameraRef.current) return;\r\n\r\n const rect = containerRef.current.getBoundingClientRect();\r\n mouseRef.current.set(\r\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\r\n -((event.clientY - rect.top) / rect.height) * 2 + 1\r\n );\r\n\r\n raycasterRef.current.setFromCamera(mouseRef.current, cameraRef.current);\r\n\r\n const selectables: any[] = [];\r\n objectsGroupRef.current?.traverse((obj: any) => { if (obj.userData?.isSelectable) selectables.push(obj); });\r\n\r\n const intersects = raycasterRef.current.intersectObjects(selectables, true);\r\n\r\n if (intersects.length > 0) {\r\n let hit = intersects[0].object;\r\n while (hit && !hit.userData?.objectId) hit = hit.parent;\r\n \r\n if (hit?.userData) {\r\n setHoverTooltip({ visible: true, x: event.clientX - rect.left, y: event.clientY - rect.top, object: hit.userData.data });\r\n if (containerRef.current) containerRef.current.style.cursor = 'pointer';\r\n return;\r\n }\r\n }\r\n \r\n setHoverTooltip({ visible: false, x: 0, y: 0, object: null });\r\n if (containerRef.current) containerRef.current.style.cursor = 'grab';\r\n }, []);\r\n\r\n const handleClick = useCallback((event: MouseEvent) => {\r\n if (!containerRef.current || !raycasterRef.current || !cameraRef.current) return;\r\n\r\n const rect = containerRef.current.getBoundingClientRect();\r\n mouseRef.current.set(\r\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\r\n -((event.clientY - rect.top) / rect.height) * 2 + 1\r\n );\r\n\r\n raycasterRef.current.setFromCamera(mouseRef.current, cameraRef.current);\r\n\r\n // Check objects group\r\n const selectables: any[] = [];\r\n objectsGroupRef.current?.traverse((obj: any) => { if (obj.userData?.isSelectable) selectables.push(obj); });\r\n // Also check planets group for solar system view\r\n planetsGroupRef.current?.traverse((obj: any) => { if (obj.userData?.isSelectable) selectables.push(obj); });\r\n\r\n const intersects = raycasterRef.current.intersectObjects(selectables, true);\r\n\r\n if (intersects.length > 0) {\r\n let hit = intersects[0].object;\r\n while (hit && !hit.userData?.objectId) hit = hit.parent;\r\n \r\n if (hit?.userData?.objectId) {\r\n const objectId = hit.userData.objectId;\r\n setSelection({ selectedId: objectId, selectedObject: hit.userData.data, hoveredId: null });\r\n callbacks?.onSelect?.(hit.userData.data);\r\n \r\n // Fly to the clicked object\r\n flyTo(objectId, { animate: true });\r\n return;\r\n }\r\n }\r\n \r\n setSelection({ selectedId: null, selectedObject: null, hoveredId: null });\r\n callbacks?.onSelect?.(null);\r\n }, [callbacks]);\r\n\r\n // ==========================================================================\r\n // Fly To Object (comprehensive camera navigation)\r\n // ==========================================================================\r\n \r\n const flyTo = useCallback((objectId: string, options?: { zoom?: number; animate?: boolean; distance?: number; offset?: Vector3D }) => {\r\n if (!THREE || !cameraRef.current || !controlsRef.current) return;\r\n\r\n const mesh = objectMeshMapRef.current.get(objectId);\r\n if (!mesh) {\r\n if (import.meta.env.DEV) {\r\n console.warn(`flyTo: Object \"${objectId}\" not found`);\r\n }\r\n return;\r\n }\r\n\r\n const targetPos = mesh.position.clone();\r\n const camera = cameraRef.current;\r\n const controls = controlsRef.current;\r\n const category = mesh.userData?.category;\r\n const isGroundStation = category === 'groundStation';\r\n\r\n // Determine viewing distance based on object type\r\n let viewDistance: number;\r\n if (options?.distance) {\r\n viewDistance = options.distance;\r\n } else {\r\n // Auto-calculate based on object size/type\r\n const isPlanet = mesh.userData?.isPlanet;\r\n const targetDist = targetPos.length();\r\n \r\n if (isPlanet) {\r\n // For planets, get closer based on planet size\r\n const planetRadius = mesh.geometry?.parameters?.radius || 100;\r\n viewDistance = planetRadius * 5;\r\n } else if (isGroundStation) {\r\n // Ground stations - close view from above\r\n viewDistance = 200;\r\n } else if (category === 'station') {\r\n // Space stations - extremely close side view\r\n viewDistance = 80;\r\n } else if (category === 'satellite') {\r\n // Satellites - extremely close side view\r\n viewDistance = 60;\r\n } else if (targetDist > SCENE_EARTH_RADIUS * 2) {\r\n // Far object (high orbit) - close view\r\n viewDistance = 150;\r\n } else {\r\n // Near-Earth object - very close view\r\n viewDistance = 100 * (options?.zoom || 1);\r\n }\r\n }\r\n\r\n // Calculate camera position - offset from object\r\n let cameraTargetPos: any;\r\n if (options?.offset) {\r\n cameraTargetPos = targetPos.clone().add(new THREE.Vector3(options.offset.x, options.offset.y, options.offset.z));\r\n } else if (isGroundStation) {\r\n // Ground station: view from above (radially outward from Earth center)\r\n const upDir = targetPos.clone().normalize();\r\n cameraTargetPos = targetPos.clone().add(upDir.multiplyScalar(viewDistance));\r\n } else {\r\n // Satellites/stations: view from the side\r\n const dir = targetPos.clone().normalize();\r\n const side = new THREE.Vector3(-dir.z, 0.2, dir.x).normalize();\r\n cameraTargetPos = targetPos.clone().add(side.multiplyScalar(viewDistance));\r\n }\r\n\r\n if (options?.animate !== false) {\r\n focusTransitionRef.current = {\r\n startTime: Date.now(),\r\n startPos: { x: camera.position.x, y: camera.position.y, z: camera.position.z },\r\n targetPos: { x: cameraTargetPos.x, y: cameraTargetPos.y, z: cameraTargetPos.z },\r\n startTarget: { x: controls.target.x, y: controls.target.y, z: controls.target.z },\r\n targetTarget: { x: targetPos.x, y: targetPos.y, z: targetPos.z },\r\n duration: CAMERA_TRANSITION_DURATION,\r\n isActive: true,\r\n };\r\n } else {\r\n camera.position.copy(cameraTargetPos);\r\n controls.target.copy(targetPos);\r\n controls.update();\r\n }\r\n\r\n // Fire callback\r\n callbacks?.onFocus?.(mesh.userData?.data || { id: objectId });\r\n }, [THREE, callbacks]);\r\n\r\n // Alias for backward compatibility\r\n const focusOn = flyTo;\r\n\r\n // ==========================================================================\r\n // Animation\r\n // ==========================================================================\r\n \r\n const animate = useCallback(() => {\r\n // Guard: Only one animation loop should run at a time\r\n if (!isAnimatingRef.current) return;\r\n if (!rendererRef.current || !sceneRef.current || !cameraRef.current) return;\r\n\r\n const camera = cameraRef.current;\r\n const controls = controlsRef.current;\r\n\r\n // Transition\r\n if (focusTransitionRef.current?.isActive) {\r\n const t = focusTransitionRef.current;\r\n const progress = Math.min((Date.now() - t.startTime) / t.duration, 1);\r\n const e = easeOutCubic(progress);\r\n\r\n camera.position.x = t.startPos.x + (t.targetPos.x - t.startPos.x) * e;\r\n camera.position.y = t.startPos.y + (t.targetPos.y - t.startPos.y) * e;\r\n camera.position.z = t.startPos.z + (t.targetPos.z - t.startPos.z) * e;\r\n\r\n controls.target.x = t.startTarget.x + (t.targetTarget.x - t.startTarget.x) * e;\r\n controls.target.y = t.startTarget.y + (t.targetTarget.y - t.startTarget.y) * e;\r\n controls.target.z = t.startTarget.z + (t.targetTarget.z - t.startTarget.z) * e;\r\n\r\n if (progress >= 1) t.isActive = false;\r\n }\r\n\r\n if (controls) controls.update();\r\n\r\n timeRef.current += 0.016;\r\n if (starsMaterialRef.current) starsMaterialRef.current.uniforms.time.value = timeRef.current;\r\n\r\n // Animate communication link dashes (moving dotted lines)\r\n if (linksGroupRef.current) {\r\n linksGroupRef.current.children.forEach((child: any) => {\r\n if (child.userData?.isAnimatedLink && child.material) {\r\n child.material.dashOffset -= 1.5; // Speed of animation\r\n }\r\n });\r\n }\r\n\r\n rendererRef.current.render(sceneRef.current, camera);\r\n animationRef.current = requestAnimationFrame(animate);\r\n }, []);\r\n\r\n // ==========================================================================\r\n // Imperative Handle\r\n // ==========================================================================\r\n \r\n useImperativeHandle(ref, () => ({\r\n focusOn,\r\n flyTo,\r\n setView: (mode: ViewMode) => setCurrentView(mode),\r\n setTime: () => {},\r\n setTimeScale: () => {},\r\n togglePlay: () => {},\r\n setLayerVisibility: (layer: keyof LayerVisibility, visible: boolean) => setLayers(prev => ({ ...prev, [layer]: visible })),\r\n getCameraState: (): CameraState => {\r\n if (!cameraRef.current) return { position: { x: 0, y: 0, z: 10000 }, target: { x: 0, y: 0, z: 0 }, up: { x: 0, y: 1, z: 0 }, fov: 45, near: 0.1, far: 100000 };\r\n const c = cameraRef.current;\r\n return { position: { x: c.position.x, y: c.position.y, z: c.position.z }, target: { x: controlsRef.current?.target.x || 0, y: controlsRef.current?.target.y || 0, z: controlsRef.current?.target.z || 0 }, up: { x: c.up.x, y: c.up.y, z: c.up.z }, fov: c.fov, near: c.near, far: c.far };\r\n },\r\n setCameraState: (state: Partial<CameraState>) => {\r\n if (!cameraRef.current) return;\r\n if (state.position) cameraRef.current.position.set(state.position.x, state.position.y, state.position.z);\r\n if (state.target && controlsRef.current) controlsRef.current.target.set(state.target.x, state.target.y, state.target.z);\r\n },\r\n exportImage: (format: 'png' | 'jpeg' = 'png'): string => rendererRef.current?.domElement.toDataURL(`image/${format}`) || '',\r\n exportScene: (): Blob => new Blob(),\r\n getVisibleObjects: (): SpaceObject[] => [...satellites, ...debris, ...stations, ...customObjects],\r\n findObjects: (q: string): SpaceObject[] => [...satellites, ...debris, ...stations, ...customObjects].filter(obj => obj.name.toLowerCase().includes(q.toLowerCase()) || obj.id.toLowerCase().includes(q.toLowerCase())),\r\n addObject: () => {},\r\n removeObject: () => {},\r\n updateObject: () => {},\r\n measureDistance: (_from: string | Vector3D, _to: string | Vector3D): number => 0,\r\n }), [satellites, debris, stations, customObjects, focusOn]);\r\n\r\n // ==========================================================================\r\n // Effects\r\n // ==========================================================================\r\n \r\n useEffect(() => { if (THREE && OrbitControlsClass) return initScene(); }, [THREE, OrbitControlsClass, initScene]);\r\n\r\n useEffect(() => {\r\n if (!isLoading && THREE) {\r\n // Cancel any existing animation loop first (prevents stacking)\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current);\r\n animationRef.current = null;\r\n }\r\n \r\n // Start animation loop with guard\r\n isAnimatingRef.current = true;\r\n animate();\r\n \r\n return () => {\r\n // Stop animation loop cleanly\r\n isAnimatingRef.current = false;\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current);\r\n animationRef.current = null;\r\n }\r\n };\r\n }\r\n }, [isLoading, THREE, animate]);\r\n\r\n useEffect(() => {\r\n if (THREE && !isLoading) {\r\n updateObjects();\r\n updateGroundStations();\r\n updateCoverage();\r\n updateOrbits();\r\n updateLinks();\r\n }\r\n }, [THREE, isLoading, updateObjects, updateGroundStations, updateCoverage, updateOrbits, updateLinks]);\r\n\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container || isLoading) return;\r\n container.addEventListener('mousemove', handleMouseMove);\r\n container.addEventListener('click', handleClick);\r\n return () => { container.removeEventListener('mousemove', handleMouseMove); container.removeEventListener('click', handleClick); };\r\n }, [isLoading, handleMouseMove, handleClick]);\r\n\r\n useEffect(() => {\r\n const handleResize = () => {\r\n if (!containerRef.current || !rendererRef.current || !cameraRef.current) return;\r\n const rect = containerRef.current.getBoundingClientRect();\r\n const h = typeof height === 'number' ? height : rect.height;\r\n cameraRef.current.aspect = rect.width / h;\r\n cameraRef.current.updateProjectionMatrix();\r\n rendererRef.current.setSize(rect.width, h);\r\n };\r\n window.addEventListener('resize', handleResize);\r\n return () => window.removeEventListener('resize', handleResize);\r\n }, [height]);\r\n\r\n useEffect(() => { if (focusedObjectId) focusOn(focusedObjectId, { animate: true }); }, [focusedObjectId, focusOn]);\r\n\r\n // Update sun direction for atmosphere glow (from Zendir SDK)\r\n useEffect(() => {\r\n if (THREE && atmosphereMaterialRef.current && sunDirection) {\r\n const dir = new THREE.Vector3(sunDirection.x, sunDirection.y, sunDirection.z).normalize();\r\n atmosphereMaterialRef.current.uniforms.uSunDirection.value = dir;\r\n }\r\n }, [THREE, sunDirection]);\r\n\r\n // Update planet positions from Zendir SDK\r\n useEffect(() => {\r\n if (!THREE || !planetPositions || !planetsGroupRef.current) return;\r\n \r\n planetsGroupRef.current.traverse((child: any) => {\r\n if (child.userData?.planetId && planetPositions[child.userData.planetId]) {\r\n const pos = planetPositions[child.userData.planetId];\r\n child.position.set(pos.x, pos.y, pos.z);\r\n }\r\n });\r\n }, [THREE, planetPositions]);\r\n\r\n // ==========================================================================\r\n // Render\r\n // ==========================================================================\r\n \r\n if (!webglCapabilities.available) {\r\n return (\r\n <div className={`zenspace3d-fallback ${className}`} style={{ width, height: typeof height === 'number' ? height : 600, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', backgroundColor: '#030508', borderRadius: 8, fontFamily: 'ui-monospace, monospace', ...style }}>\r\n <div style={{ marginBottom: 16 }}>\r\n <AstroIcon name=\"public\" size=\"large\" label=\"Globe\" style={{ color: '#22d3ee', opacity: 0.5 }} />\r\n </div>\r\n <div style={{ color: '#b8bcc8' /* WCAG: improved contrast */, fontSize: 14 }}>WebGL is not available</div>\r\n </div>\r\n );\r\n }\r\n\r\n if (error) return <div style={{ width, height, display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: '#0a0a0f', color: '#ff4444' }}><p>Error: {error}</p></div>;\r\n\r\n return (\r\n <div className={`zenspace3d ${className}`} style={{ width, height: typeof height === 'number' ? height : '100%', position: 'relative', backgroundColor: '#000', borderRadius: 8, overflow: 'hidden', cursor: 'grab', ...style }}>\r\n <div ref={containerRef} style={{ width: '100%', height: '100%' }} />\r\n\r\n {isLoading && <div style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: 'rgba(0,0,0,0.9)' }}><div style={{ color: '#22d3ee', fontSize: 14 }}>Loading...</div></div>}\r\n\r\n {showTools && !isLoading && (\r\n <div style={{ position: 'absolute', top: 12, left: 12, display: 'flex', flexDirection: 'column', gap: 4 }}>\r\n <LayerBtn icon=\"satellite\" label=\"Satellites\" active={layers.satellites} onClick={() => setLayers(l => ({ ...l, satellites: !l.satellites }))} />\r\n <LayerBtn icon=\"home\" label=\"Stations\" active={layers.stations} onClick={() => setLayers(l => ({ ...l, stations: !l.stations }))} />\r\n <LayerBtn icon=\"antenna\" label=\"Ground\" active={layers.groundStations} onClick={() => setLayers(l => ({ ...l, groundStations: !l.groundStations }))} />\r\n <LayerBtn icon=\"timeline\" label=\"Orbits\" active={layers.orbits} onClick={() => setLayers(l => ({ ...l, orbits: !l.orbits }))} />\r\n <LayerBtn icon=\"signal-cellular-4-bar\" label=\"Coverage\" active={layers.coverage} onClick={() => setLayers(l => ({ ...l, coverage: !l.coverage }))} />\r\n </div>\r\n )}\r\n\r\n {!isLoading && (\r\n <ObjectLegend \r\n currentView={currentView}\r\n satellites={satellites}\r\n stations={stations}\r\n groundStations={groundStations}\r\n onObjectClick={(id, objectData) => {\r\n // Same behavior as clicking in 3D: select, callback, fly\r\n setSelection({ selectedId: id, selectedObject: objectData, hoveredId: null });\r\n callbacks?.onSelect?.(objectData);\r\n flyTo(id, { animate: true });\r\n }}\r\n />\r\n )}\r\n\r\n {hoverTooltip.visible && hoverTooltip.object && (\r\n <div style={{ \r\n position: 'absolute', \r\n left: hoverTooltip.x + 15, \r\n top: hoverTooltip.y - 10, \r\n backgroundColor: 'rgba(20, 25, 35, 0.95)', \r\n color: '#e4e4e7', \r\n padding: '10px 14px', \r\n borderRadius: 4, \r\n fontSize: 12, \r\n fontFamily: 'system-ui, -apple-system, sans-serif', \r\n boxShadow: '0 4px 20px rgba(0,0,0,0.5)',\r\n pointerEvents: 'none', \r\n zIndex: 100,\r\n minWidth: 140,\r\n }}>\r\n <div style={{ color: '#ffffff', fontWeight: 500, marginBottom: 4 }}>\r\n {hoverTooltip.object.name || hoverTooltip.object.targetName || 'Unknown'}\r\n </div>\r\n {hoverTooltip.object.category && (\r\n <div style={{ color: '#9ca3af', fontSize: 11 }}>{hoverTooltip.object.category}</div>\r\n )}\r\n {hoverTooltip.object.overpassTime && (\r\n <div style={{ color: '#9ca3af', fontSize: 11, marginTop: 4 }}>\r\n Overpass time: {hoverTooltip.object.overpassTime}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Overpass labels removed - now shown only on hover */}\r\n\r\n {showInfoPanel && selection.selectedObject && (\r\n <div style={{ position: 'absolute', bottom: 16, right: 12, backgroundColor: 'rgba(0,0,0,0.9)', color: '#e4e4e7', padding: '14px 18px', borderRadius: 10, fontSize: 12, fontFamily: 'ui-monospace, monospace', border: '1px solid rgba(34,211,238,0.3)', minWidth: 180 }}>\r\n <div style={{ color: '#22d3ee', fontWeight: 500, marginBottom: 8 }}>{selection.selectedObject.name}</div>\r\n <div style={{ color: '#b8bcc8' /* WCAG: improved contrast */, fontSize: 10 }}>{selection.selectedObject.category}</div>\r\n <button onClick={() => setSelection({ selectedId: null, selectedObject: null, hoveredId: null })} style={{ marginTop: 10, padding: '5px 10px', backgroundColor: 'rgba(255,255,255,0.1)', border: 'none', borderRadius: 4, color: '#a1a1aa', cursor: 'pointer', fontSize: 10, width: '100%' }}>Close</button>\r\n </div>\r\n )}\r\n\r\n {!isLoading && <div style={{ position: 'absolute', bottom: 12, left: 12, backgroundColor: 'rgba(0,0,0,0.5)', color: '#b8bcc8' /* WCAG: improved contrast */, padding: '5px 10px', borderRadius: 6, fontSize: 10 }}>Drag to rotate • Scroll to zoom</div>}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\n// =============================================================================\r\n// Sub-Components\r\n// =============================================================================\r\n\r\nfunction LayerBtn({ icon, label, active, onClick }: { icon: AstroIconName; label: string; active: boolean; onClick: () => void }) {\r\n return (\r\n <button \r\n onClick={onClick} \r\n aria-label={`Toggle ${label} layer`}\r\n aria-pressed={active}\r\n style={{ \r\n display: 'flex', \r\n alignItems: 'center', \r\n gap: 6, \r\n padding: '6px 10px', \r\n backgroundColor: active ? 'rgba(34,211,238,0.15)' : 'rgba(0,0,0,0.7)', \r\n border: active ? '1px solid rgba(34,211,238,0.4)' : '1px solid rgba(255,255,255,0.1)', \r\n borderRadius: 6, \r\n cursor: 'pointer', \r\n fontSize: '0.6875rem', // 11px in rem\r\n color: active ? '#22d3ee' : '#b8bcc8', // WCAG: improved contrast from #71717a\r\n minWidth: 110,\r\n }}\r\n >\r\n <span aria-hidden=\"true\"><AstroIcon name={icon} size=\"extra-small\" label=\"\" /></span>\r\n <span>{label}</span>\r\n </button>\r\n );\r\n}\r\n\r\nfunction _OverpassLabel({ overpass, index }: { overpass: OverpassInfo; index: number }) {\r\n return (\r\n <div style={{ position: 'absolute', top: 70 + index * 60, left: '28%', backgroundColor: 'rgba(0,0,0,0.85)', color: '#e4e4e7', padding: '8px 12px', borderRadius: 6, fontSize: 11, fontFamily: 'ui-monospace, monospace', border: '1px solid rgba(34,211,238,0.3)', pointerEvents: 'none' }}>\r\n <div style={{ fontWeight: 500, marginBottom: 2 }}>{overpass.targetName}</div>\r\n <div style={{ color: '#22d3ee' }}>Overpass: {formatDuration(overpass.timeToOverpass)}</div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction ObjectLegend({ currentView, satellites, stations, groundStations, onObjectClick }: {\r\n currentView: string;\r\n satellites: any[];\r\n stations: any[];\r\n groundStations: any[];\r\n onObjectClick: (id: string, objectData: any) => void;\r\n}) {\r\n const [hoveredSection, setHoveredSection] = React.useState<string | null>(null);\r\n const [pinnedSection, setPinnedSection] = React.useState<string | null>(null);\r\n\r\n // Show section if hovered OR pinned\r\n const isExpanded = (section: string) => hoveredSection === section || pinnedSection === section;\r\n\r\n // Click toggles pin state\r\n const togglePin = (section: string) => {\r\n setPinnedSection(prev => prev === section ? null : section);\r\n };\r\n\r\n const sectionStyle: React.CSSProperties = {\r\n cursor: 'pointer',\r\n padding: '4px 0',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n transition: 'background-color 0.15s',\r\n };\r\n\r\n const itemStyle: React.CSSProperties = {\r\n padding: '3px 8px',\r\n marginLeft: 12,\r\n cursor: 'pointer',\r\n borderRadius: 4,\r\n fontSize: 10,\r\n color: '#a1a1aa',\r\n transition: 'all 0.15s',\r\n };\r\n\r\n return (\r\n <div style={{ \r\n position: 'absolute', \r\n top: 12, \r\n right: 12, \r\n backgroundColor: 'rgba(0,0,0,0.85)', \r\n color: '#e4e4e7', \r\n padding: '10px 14px', \r\n borderRadius: 8, \r\n fontSize: 11, \r\n fontFamily: 'ui-monospace, monospace',\r\n minWidth: 160,\r\n maxHeight: 400,\r\n overflowY: 'auto',\r\n }}>\r\n <div style={{ color: '#b8bcc8' /* WCAG: improved contrast */, fontSize: 10, marginBottom: 8 }}>\r\n {currentView === 'solar-system' ? 'Solar System' : 'Earth Orbit'}\r\n </div>\r\n\r\n {satellites.length > 0 && (\r\n <div\r\n onMouseEnter={() => setHoveredSection('satellites')}\r\n onMouseLeave={() => setHoveredSection(null)}\r\n >\r\n <div \r\n style={{\r\n ...sectionStyle,\r\n backgroundColor: isExpanded('satellites') ? 'rgba(255,255,255,0.05)' : 'transparent',\r\n }}\r\n onClick={() => togglePin('satellites')}\r\n >\r\n <span><span style={{ color: '#00ff88' }}>●</span> {satellites.length} Satellites</span>\r\n <span style={{ color: pinnedSection === 'satellites' ? '#00ff88' : '#666', fontSize: 9 }}>\r\n {isExpanded('satellites') ? '▼' : '▶'}{pinnedSection === 'satellites' ? <><AstroIcon name=\"bookmark\" size=\"extra-small\" label=\"\" style={{ marginLeft: 4, verticalAlign: 'middle' }} /></> : null}\r\n </span>\r\n </div>\r\n {isExpanded('satellites') && (\r\n <div style={{ marginBottom: 4, paddingBottom: 4 }}>\r\n {satellites.map(sat => (\r\n <div\r\n key={sat.id}\r\n style={itemStyle}\r\n onClick={(e) => { e.stopPropagation(); onObjectClick(sat.id, sat); }}\r\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(0,255,136,0.15)'; e.currentTarget.style.color = '#00ff88'; }}\r\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; e.currentTarget.style.color = '#a1a1aa'; }}\r\n >\r\n {sat.name || sat.id}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {stations.length > 0 && (\r\n <div\r\n onMouseEnter={() => setHoveredSection('stations')}\r\n onMouseLeave={() => setHoveredSection(null)}\r\n >\r\n <div \r\n style={{\r\n ...sectionStyle,\r\n backgroundColor: isExpanded('stations') ? 'rgba(255,255,255,0.05)' : 'transparent',\r\n }}\r\n onClick={() => togglePin('stations')}\r\n >\r\n <span><span style={{ color: '#ffd700' }}>●</span> {stations.length} Stations</span>\r\n <span style={{ color: pinnedSection === 'stations' ? '#ffd700' : '#666', fontSize: 9 }}>\r\n {isExpanded('stations') ? '▼' : '▶'}{pinnedSection === 'stations' ? <><AstroIcon name=\"bookmark\" size=\"extra-small\" label=\"\" style={{ marginLeft: 4, verticalAlign: 'middle' }} /></> : null}\r\n </span>\r\n </div>\r\n {isExpanded('stations') && (\r\n <div style={{ marginBottom: 4, paddingBottom: 4 }}>\r\n {stations.map(st => (\r\n <div\r\n key={st.id}\r\n style={itemStyle}\r\n onClick={(e) => { e.stopPropagation(); onObjectClick(st.id, st); }}\r\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(255,215,0,0.15)'; e.currentTarget.style.color = '#ffd700'; }}\r\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; e.currentTarget.style.color = '#a1a1aa'; }}\r\n >\r\n {st.name || st.id}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {groundStations.length > 0 && (\r\n <div\r\n onMouseEnter={() => setHoveredSection('groundStations')}\r\n onMouseLeave={() => setHoveredSection(null)}\r\n >\r\n <div \r\n style={{\r\n ...sectionStyle,\r\n backgroundColor: isExpanded('groundStations') ? 'rgba(255,255,255,0.05)' : 'transparent',\r\n }}\r\n onClick={() => togglePin('groundStations')}\r\n >\r\n <span><span style={{ color: '#00ffff' }}>▲</span> {groundStations.length} Ground Stations</span>\r\n <span style={{ color: pinnedSection === 'groundStations' ? '#00ffff' : '#666', fontSize: 9 }}>\r\n {isExpanded('groundStations') ? '▼' : '▶'}{pinnedSection === 'groundStations' ? <><AstroIcon name=\"bookmark\" size=\"extra-small\" label=\"\" style={{ marginLeft: 4, verticalAlign: 'middle' }} /></> : null}\r\n </span>\r\n </div>\r\n {isExpanded('groundStations') && (\r\n <div style={{ marginBottom: 4, paddingBottom: 4 }}>\r\n {groundStations.map(gs => (\r\n <div\r\n key={gs.id}\r\n style={itemStyle}\r\n onClick={(e) => { e.stopPropagation(); onObjectClick(gs.id, gs); }}\r\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(0,255,255,0.15)'; e.currentTarget.style.color = '#00ffff'; }}\r\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; e.currentTarget.style.color = '#a1a1aa'; }}\r\n >\r\n {gs.name || gs.id}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default ZenSpace3D;\r\n"],"names":["ZenSpace3D","ZenSpace3DThree","THREE","_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ZenSpace3D.js","names":[],"sources":["../../../src/react/3d/ZenSpace3D.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - ZenSpace3D Component (Optimized)\r\n *\r\n * Professional 3D space visualization with smooth interactions.\r\n * Optimized for performance with settings from EarthViewer.\r\n */\r\n\r\nimport React, {\r\n useRef,\r\n useEffect,\r\n useState,\r\n useCallback,\r\n useImperativeHandle,\r\n forwardRef,\r\n useMemo,\r\n} from \"react\";\r\nimport { useTheme } from \"../theme\";\r\nimport { AstroIcon, type AstroIconName } from \"../core/display/AstroIcon\";\r\nimport type { GroundStation as _GroundStation } from \"../types\";\r\nimport type {\r\n ZenSpace3DProps,\r\n ZenSpace3DHandle,\r\n ViewMode,\r\n SpaceObject,\r\n Vector3D,\r\n CameraState,\r\n LayerVisibility,\r\n SelectionState,\r\n OverpassInfo,\r\n} from \"./ZenSpace3DTypes\";\r\nimport {\r\n latLonAltToCartesian,\r\n SCENE_EARTH_RADIUS,\r\n KM_TO_SCENE,\r\n easeOutCubic,\r\n} from \"./ZenSpace3DUtils\";\r\nimport { formatDuration } from \"../utils\";\r\n\r\n// Import shaders as raw text (like EarthViewer)\r\nimport atmosphereVertexShader from \"../../shaders/atmosphere.vert\";\r\nimport atmosphereFragmentShader from \"../../shaders/atmosphere.frag\";\r\nimport starsVertexShader from \"../../shaders/stars.vert\";\r\nimport starsFragmentShader from \"../../shaders/stars.frag\";\r\nimport { loadThree, ThreeModule } from \"./threeLoader\";\r\nimport { ZenSpace3DCesium } from \"./ZenSpace3DCesium\";\r\n\r\n// =============================================================================\r\n// Communication Link Types\r\n// =============================================================================\r\n\r\nexport interface CommunicationLink {\r\n id: string;\r\n fromId: string;\r\n toId: string;\r\n type: \"uplink\" | \"downlink\" | \"crosslink\" | \"relay\";\r\n status: \"active\" | \"idle\" | \"blocked\";\r\n color?: string;\r\n bandwidth?: number;\r\n latency?: number;\r\n signalStrength?: number;\r\n}\r\n\r\n// =============================================================================\r\n// Configuration - Optimized for smooth interactions\r\n// =============================================================================\r\n\r\nconst DEFAULT_LAYERS: LayerVisibility = {\r\n planets: true,\r\n moons: true,\r\n satellites: true,\r\n debris: false,\r\n stations: true,\r\n asteroids: false,\r\n groundStations: true,\r\n orbits: true,\r\n labels: true,\r\n constellations: false,\r\n coverage: true,\r\n atmosphere: true,\r\n stars: true,\r\n grid: false,\r\n terminator: true,\r\n};\r\n\r\nconst CAMERA_TRANSITION_DURATION = 2000;\r\nconst STARS_COUNT = 5000; // Reduced from 8000\r\nconst EARTH_SEGMENTS = 64; // Reduced from 128\r\nconst EARTH_SEGMENTS_V = 32; // Reduced from 64\r\nconst SPHERICAL_SUBDIVISIONS = 16; // Subdivisions for curved edges on coverage\r\n\r\nfunction checkWebGLCapabilities(): { available: boolean; version: number } {\r\n try {\r\n const canvas = document.createElement(\"canvas\");\r\n const gl2 = canvas.getContext(\"webgl2\");\r\n if (gl2) return { available: true, version: 2 };\r\n const gl = canvas.getContext(\"webgl\");\r\n if (gl) return { available: true, version: 1 };\r\n } catch {\r\n /* WebGL not available */\r\n }\r\n return { available: false, version: 0 };\r\n}\r\n\r\n// =============================================================================\r\n// Spherical Geometry Helpers - For realistic curved coverage on sphere\r\n// =============================================================================\r\n\r\n/**\r\n * Spherical linear interpolation (SLERP) between two unit vectors\r\n * Creates smooth arc along the sphere surface\r\n */\r\nfunction slerp(\r\n v1: { x: number; y: number; z: number },\r\n v2: { x: number; y: number; z: number },\r\n t: number,\r\n): { x: number; y: number; z: number } {\r\n // Normalize inputs\r\n const len1 = Math.sqrt(v1.x * v1.x + v1.y * v1.y + v1.z * v1.z);\r\n const len2 = Math.sqrt(v2.x * v2.x + v2.y * v2.y + v2.z * v2.z);\r\n\r\n // Handle zero-length vectors\r\n if (len1 < 0.0001 || len2 < 0.0001) {\r\n return { x: v1.x, y: v1.y, z: v1.z };\r\n }\r\n\r\n const n1 = { x: v1.x / len1, y: v1.y / len1, z: v1.z / len1 };\r\n const n2 = { x: v2.x / len2, y: v2.y / len2, z: v2.z / len2 };\r\n\r\n // Calculate angle between vectors\r\n let dot = n1.x * n2.x + n1.y * n2.y + n1.z * n2.z;\r\n dot = Math.max(-1, Math.min(1, dot)); // Clamp for numerical stability\r\n const theta = Math.acos(dot);\r\n\r\n if (theta < 0.001) {\r\n // Vectors are nearly parallel, use linear interpolation\r\n return {\r\n x: n1.x + t * (n2.x - n1.x),\r\n y: n1.y + t * (n2.y - n1.y),\r\n z: n1.z + t * (n2.z - n1.z),\r\n };\r\n }\r\n\r\n const sinTheta = Math.sin(theta);\r\n if (Math.abs(sinTheta) < 0.0001) {\r\n // Near zero sin, use linear interpolation\r\n return {\r\n x: n1.x + t * (n2.x - n1.x),\r\n y: n1.y + t * (n2.y - n1.y),\r\n z: n1.z + t * (n2.z - n1.z),\r\n };\r\n }\r\n\r\n const a = Math.sin((1 - t) * theta) / sinTheta;\r\n const b = Math.sin(t * theta) / sinTheta;\r\n\r\n return {\r\n x: a * n1.x + b * n2.x,\r\n y: a * n1.y + b * n2.y,\r\n z: a * n1.z + b * n2.z,\r\n };\r\n}\r\n\r\n/**\r\n * Subdivide polygon edges along great circles for spherical rendering\r\n * Takes corner points and returns a densely sampled spherical polygon\r\n */\r\nfunction subdivideSphericalPolygon(\r\n corners: Array<{ x: number; y: number; z: number }>,\r\n subdivisions: number,\r\n radius: number,\r\n): Array<{ x: number; y: number; z: number }> {\r\n if (corners.length < 3 || subdivisions < 1 || radius <= 0) {\r\n return corners; // Return as-is if invalid params\r\n }\r\n\r\n const result: Array<{ x: number; y: number; z: number }> = [];\r\n\r\n for (let i = 0; i < corners.length; i++) {\r\n const p1 = corners[i];\r\n const p2 = corners[(i + 1) % corners.length];\r\n\r\n // Validate points\r\n if (\r\n !isFinite(p1.x) ||\r\n !isFinite(p1.y) ||\r\n !isFinite(p1.z) ||\r\n !isFinite(p2.x) ||\r\n !isFinite(p2.y) ||\r\n !isFinite(p2.z)\r\n ) {\r\n continue; // Skip invalid points\r\n }\r\n\r\n // Add interpolated points along the great circle arc\r\n for (let j = 0; j < subdivisions; j++) {\r\n const t = j / subdivisions;\r\n const interpolated = slerp(p1, p2, t);\r\n\r\n // Validate interpolation result\r\n if (\r\n !isFinite(interpolated.x) ||\r\n !isFinite(interpolated.y) ||\r\n !isFinite(interpolated.z)\r\n ) {\r\n continue;\r\n }\r\n\r\n // Project onto sphere surface at given radius\r\n const len = Math.sqrt(\r\n interpolated.x ** 2 + interpolated.y ** 2 + interpolated.z ** 2,\r\n );\r\n if (len < 0.0001) continue; // Skip zero-length vectors\r\n\r\n result.push({\r\n x: (interpolated.x / len) * radius,\r\n y: (interpolated.y / len) * radius,\r\n z: (interpolated.z / len) * radius,\r\n });\r\n }\r\n }\r\n\r\n return result.length > 0 ? result : corners; // Fallback to original if all failed\r\n}\r\n\r\n// =============================================================================\r\n// Satellite Shape Builders (simplified for performance)\r\n// =============================================================================\r\n\r\nfunction createSatelliteShape(\r\n THREE: ThreeModule,\r\n category: string,\r\n size: number,\r\n): any {\r\n const group = new THREE.Group();\r\n\r\n if (category === \"station\") {\r\n // Simple station shape\r\n const geo = new THREE.BoxGeometry(size * 1.2, size * 0.6, size * 0.6);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0xcccccc });\r\n group.add(new THREE.Mesh(geo, mat));\r\n\r\n // Solar panels\r\n const panelGeo = new THREE.BoxGeometry(size * 2.5, size * 0.03, size * 0.6);\r\n const panelMat = new THREE.MeshBasicMaterial({ color: 0x1a4a7a });\r\n const leftPanel = new THREE.Mesh(panelGeo, panelMat);\r\n leftPanel.position.x = -size * 1.5;\r\n group.add(leftPanel);\r\n const rightPanel = new THREE.Mesh(panelGeo, panelMat);\r\n rightPanel.position.x = size * 1.5;\r\n group.add(rightPanel);\r\n } else if (category === \"satellite\") {\r\n // Simple satellite\r\n const geo = new THREE.BoxGeometry(size * 0.5, size * 0.5, size * 0.6);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0xaaaaaa });\r\n group.add(new THREE.Mesh(geo, mat));\r\n\r\n const panelGeo = new THREE.BoxGeometry(size * 1.2, size * 0.02, size * 0.4);\r\n const panelMat = new THREE.MeshBasicMaterial({ color: 0x1a3a6a });\r\n const leftPanel = new THREE.Mesh(panelGeo, panelMat);\r\n leftPanel.position.x = -size * 0.7;\r\n group.add(leftPanel);\r\n const rightPanel = new THREE.Mesh(panelGeo, panelMat);\r\n rightPanel.position.x = size * 0.7;\r\n group.add(rightPanel);\r\n } else if (category === \"debris\") {\r\n const geo = new THREE.IcosahedronGeometry(size * 0.3, 0);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0x666666 });\r\n group.add(new THREE.Mesh(geo, mat));\r\n } else {\r\n const geo = new THREE.SphereGeometry(size * 0.4, 8, 6);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0x888888 });\r\n group.add(new THREE.Mesh(geo, mat));\r\n }\r\n\r\n return group;\r\n}\r\n\r\n// =============================================================================\r\n// Component\r\n// =============================================================================\r\n\r\nexport const ZenSpace3D = forwardRef<ZenSpace3DHandle, ZenSpace3DProps>(\r\n function ZenSpace3D(props, ref) {\r\n // Prefer Cesium when available (default 3D backend); fall back to Three.js\r\n const [cesiumModule, setCesiumModule] = useState<unknown>(null);\r\n useEffect(() => {\r\n // Cesium is optional peer; fallback to Three.js when not installed\r\n import(\"cesium\")\r\n .then((m) => setCesiumModule(m))\r\n .catch(() => setCesiumModule(null));\r\n }, []);\r\n if (cesiumModule) {\r\n return <ZenSpace3DCesium ref={ref} cesium={cesiumModule} {...props} />;\r\n }\r\n return <ZenSpace3DThree ref={ref} {...props} />;\r\n },\r\n);\r\n\r\n// Three.js implementation — separate component so hook count is consistent (avoids React #300)\r\nconst ZenSpace3DThree = forwardRef<ZenSpace3DHandle, ZenSpace3DProps>(\r\n function ZenSpace3DThree(props, ref) {\r\n const {\r\n satellites = [],\r\n debris = [],\r\n stations = [],\r\n groundStations = [],\r\n customObjects = [],\r\n view = \"earth-orbit\",\r\n focusedObjectId,\r\n initialCamera,\r\n sunDirection,\r\n planetPositions,\r\n visibilityCones = [],\r\n satelliteCoverages = [],\r\n overpasses: _overpasses = [],\r\n orbitPaths = [],\r\n orbitDesignArcs: _orbitDesignArcs = [],\r\n communicationLinks = [],\r\n showAxisHelper = false,\r\n layers: layerOverrides,\r\n showTools = true,\r\n showInfoPanel = true,\r\n width = \"100%\",\r\n height = 600,\r\n callbacks,\r\n maxObjects = 10000,\r\n className = \"\",\r\n style,\r\n } = props;\r\n\r\n const { tokens: _tokens } = useTheme();\r\n const [webglCapabilities] = useState(() => checkWebGLCapabilities());\r\n\r\n // Refs\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const rendererRef = useRef<any>(null);\r\n const sceneRef = useRef<any>(null);\r\n const cameraRef = useRef<any>(null);\r\n const controlsRef = useRef<any>(null);\r\n const animationRef = useRef<number | null>(null);\r\n const raycasterRef = useRef<any>(null);\r\n const mouseRef = useRef<any>(null);\r\n\r\n const earthRef = useRef<any>(null);\r\n const starsMaterialRef = useRef<any>(null);\r\n const atmosphereMaterialRef = useRef<any>(null);\r\n const objectsGroupRef = useRef<any>(null);\r\n const linksGroupRef = useRef<any>(null);\r\n const conesGroupRef = useRef<any>(null);\r\n const orbitsGroupRef = useRef<any>(null);\r\n const planetsGroupRef = useRef<any>(null);\r\n\r\n const timeRef = useRef(0);\r\n const focusTransitionRef = useRef<any>(null);\r\n const isUserInteractingRef = useRef(false);\r\n const objectMeshMapRef = useRef<Map<string, any>>(new Map());\r\n const isAnimatingRef = useRef(false); // Guard against multiple animation loops\r\n const _sceneInitializedRef = useRef(false); // Prevent duplicate initialization\r\n\r\n // State\r\n const [THREE, setTHREE] = useState<ThreeModule | null>(null);\r\n const threeRef = useRef<ThreeModule | null>(null);\r\n threeRef.current = THREE;\r\n const [OrbitControlsClass, setOrbitControlsClass] = useState<any>(null);\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const [layers, setLayers] = useState<LayerVisibility>({\r\n ...DEFAULT_LAYERS,\r\n ...layerOverrides,\r\n });\r\n const [selection, setSelection] = useState<SelectionState>({\r\n selectedId: null,\r\n selectedObject: null,\r\n hoveredId: null,\r\n });\r\n const [hoverTooltip, setHoverTooltip] = useState<{\r\n visible: boolean;\r\n x: number;\r\n y: number;\r\n object: any;\r\n }>({ visible: false, x: 0, y: 0, object: null });\r\n const [currentView, setCurrentView] = useState<ViewMode>(view);\r\n\r\n // Ref for view to prevent initScene recreation (fixes flickering on view change)\r\n const currentViewRef = useRef<ViewMode>(view);\r\n\r\n const effectiveLayers = useMemo(\r\n () => ({ ...layers, ...layerOverrides }),\r\n [layers, layerOverrides],\r\n );\r\n\r\n useEffect(() => {\r\n setCurrentView(view);\r\n currentViewRef.current = view;\r\n }, [view]);\r\n\r\n // ==========================================================================\r\n // Load Three.js\r\n // ==========================================================================\r\n\r\n useEffect(() => {\r\n if (!webglCapabilities.available) {\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n loadThree()\r\n .then(({ THREE: threeModule, OrbitControls: controls }) => {\r\n setTHREE(threeModule);\r\n setOrbitControlsClass(() => controls);\r\n })\r\n .catch((err) => {\r\n if (import.meta.env.DEV) {\r\n console.error(\"Failed to load Three.js:\", err);\r\n }\r\n setError(\"Failed to load 3D library\");\r\n setIsLoading(false);\r\n });\r\n }, [webglCapabilities.available]);\r\n\r\n // ==========================================================================\r\n // Initialize Scene (Optimized like EarthViewer)\r\n // ==========================================================================\r\n\r\n const initScene = useCallback(() => {\r\n if (!THREE || !containerRef.current || !OrbitControlsClass) return;\r\n\r\n // Clean up any existing scene first (prevents duplicates)\r\n if (rendererRef.current) {\r\n isAnimatingRef.current = false;\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current);\r\n animationRef.current = null;\r\n }\r\n controlsRef.current?.dispose();\r\n rendererRef.current.dispose();\r\n if (containerRef.current?.contains(rendererRef.current.domElement)) {\r\n containerRef.current.removeChild(rendererRef.current.domElement);\r\n }\r\n }\r\n\r\n const container = containerRef.current;\r\n const rect = container.getBoundingClientRect();\r\n const w = rect.width;\r\n const h = typeof height === \"number\" ? height : rect.height;\r\n\r\n // Scene\r\n const scene = new THREE.Scene();\r\n sceneRef.current = scene;\r\n\r\n // Use ref for view mode to prevent initScene recreation (fixes flickering)\r\n const viewMode = currentViewRef.current;\r\n\r\n // Camera (adjusted per view mode)\r\n const farClip = viewMode === \"solar-system\" ? 1000000 : 100000;\r\n const camera = new THREE.PerspectiveCamera(45, w / h, 1, farClip);\r\n // Solar system: position to see inner planets, Earth orbit view: standard distance\r\n const initialDistance = viewMode === \"solar-system\" ? 5000 : 10000;\r\n camera.position.set(0, initialDistance * 0.3, initialDistance);\r\n cameraRef.current = camera;\r\n\r\n if (initialCamera?.position) {\r\n camera.position.set(\r\n initialCamera.position.x,\r\n initialCamera.position.y,\r\n initialCamera.position.z,\r\n );\r\n }\r\n\r\n // Renderer (optimized settings - preserveDrawingBuffer prevents flickering)\r\n const renderer = new THREE.WebGLRenderer({\r\n antialias: true,\r\n alpha: true,\r\n powerPreference: \"high-performance\",\r\n preserveDrawingBuffer: true, // Prevents flickering from buffer swaps\r\n });\r\n renderer.setSize(w, h);\r\n renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\r\n container.appendChild(renderer.domElement);\r\n rendererRef.current = renderer;\r\n\r\n // Controls (smooth damping, adjusted per view)\r\n const controls = new OrbitControlsClass(camera, renderer.domElement);\r\n controls.enableDamping = true;\r\n controls.dampingFactor = 0.05;\r\n controls.rotateSpeed = 0.5;\r\n controls.minDistance = viewMode === \"solar-system\" ? 500 : 3050; // Very close to Earth/objects\r\n controls.maxDistance = viewMode === \"solar-system\" ? 100000 : 25000;\r\n controls.enablePan = viewMode === \"solar-system\"; // Allow pan in solar system\r\n let interactionTimer: ReturnType<typeof setTimeout>;\r\n const handleControlStart = () => {\r\n isUserInteractingRef.current = true;\r\n };\r\n const handleControlEnd = () => {\r\n clearTimeout(interactionTimer);\r\n interactionTimer = setTimeout(() => {\r\n isUserInteractingRef.current = false;\r\n }, 3000);\r\n };\r\n controls.addEventListener(\"start\", handleControlStart);\r\n controls.addEventListener(\"end\", handleControlEnd);\r\n controlsRef.current = controls;\r\n\r\n raycasterRef.current = new THREE.Raycaster();\r\n mouseRef.current = new THREE.Vector2();\r\n\r\n // Groups\r\n objectsGroupRef.current = new THREE.Group();\r\n objectsGroupRef.current.name = \"objects\";\r\n scene.add(objectsGroupRef.current);\r\n\r\n linksGroupRef.current = new THREE.Group();\r\n linksGroupRef.current.name = \"links\";\r\n scene.add(linksGroupRef.current);\r\n\r\n conesGroupRef.current = new THREE.Group();\r\n conesGroupRef.current.name = \"cones\";\r\n scene.add(conesGroupRef.current);\r\n\r\n orbitsGroupRef.current = new THREE.Group();\r\n orbitsGroupRef.current.name = \"orbits\";\r\n scene.add(orbitsGroupRef.current);\r\n\r\n planetsGroupRef.current = new THREE.Group();\r\n planetsGroupRef.current.name = \"planets\";\r\n scene.add(planetsGroupRef.current);\r\n\r\n if (viewMode === \"solar-system\") {\r\n createSolarSystem(THREE, scene);\r\n } else {\r\n createEarth(THREE, scene);\r\n createAtmosphere(THREE, scene);\r\n }\r\n\r\n createStars(THREE, scene);\r\n createLighting(THREE, scene);\r\n\r\n if (showAxisHelper && viewMode !== \"solar-system\") {\r\n createAxisHelper(THREE, scene);\r\n }\r\n\r\n setIsLoading(false);\r\n\r\n return () => {\r\n clearTimeout(interactionTimer);\r\n if (animationRef.current) cancelAnimationFrame(animationRef.current);\r\n controls.removeEventListener(\"start\", handleControlStart);\r\n controls.removeEventListener(\"end\", handleControlEnd);\r\n controls.dispose();\r\n renderer.dispose();\r\n if (container.contains(renderer.domElement))\r\n container.removeChild(renderer.domElement);\r\n };\r\n }, [THREE, OrbitControlsClass, height, initialCamera, showAxisHelper]); // Uses currentViewRef to prevent recreation\r\n\r\n // ==========================================================================\r\n // Create Solar System (scaled for visibility)\r\n // ==========================================================================\r\n\r\n const createSolarSystem = useCallback(\r\n (THREE: ThreeModule, _scene: unknown) => {\r\n const planetsGroup = planetsGroupRef.current;\r\n if (!planetsGroup) return;\r\n\r\n // Scale factor to make solar system viewable (1 unit = ~1000 km)\r\n const DISTANCE_SCALE = 0.000005;\r\n const SIZE_SCALE = 0.01;\r\n\r\n // Sun (emissive glow)\r\n const sunRadius = 696340 * SIZE_SCALE;\r\n const sunGeo = new THREE.SphereGeometry(sunRadius, 32, 24);\r\n const sunMat = new THREE.MeshBasicMaterial({ color: 0xffdd44 });\r\n const sunMesh = new THREE.Mesh(sunGeo, sunMat);\r\n sunMesh.name = \"sun\";\r\n sunMesh.userData = {\r\n objectId: \"sun\",\r\n planetId: \"sun\",\r\n isPlanet: true,\r\n isSelectable: true,\r\n };\r\n planetsGroup.add(sunMesh);\r\n\r\n // Sun glow\r\n const glowGeo = new THREE.SphereGeometry(sunRadius * 1.3, 24, 16);\r\n const glowMat = new THREE.MeshBasicMaterial({\r\n color: 0xffaa00,\r\n transparent: true,\r\n opacity: 0.2,\r\n });\r\n planetsGroup.add(new THREE.Mesh(glowGeo, glowMat));\r\n\r\n // Planets with proper scaling\r\n const configs = [\r\n {\r\n id: \"mercury\",\r\n color: 0x8c7853,\r\n radius: 2439.7,\r\n distance: 57900000,\r\n },\r\n { id: \"venus\", color: 0xffc649, radius: 6051.8, distance: 108200000 },\r\n { id: \"earth\", color: 0x6b93d6, radius: 6371, distance: 149600000 },\r\n { id: \"mars\", color: 0xc1440e, radius: 3389.5, distance: 227900000 },\r\n {\r\n id: \"jupiter\",\r\n color: 0xd8ca9d,\r\n radius: 69911,\r\n distance: 778500000,\r\n },\r\n {\r\n id: \"saturn\",\r\n color: 0xf4d59e,\r\n radius: 58232,\r\n distance: 1434000000,\r\n },\r\n {\r\n id: \"uranus\",\r\n color: 0xd1e7e7,\r\n radius: 25362,\r\n distance: 2871000000,\r\n },\r\n {\r\n id: \"neptune\",\r\n color: 0x5b5ddf,\r\n radius: 24622,\r\n distance: 4495000000,\r\n },\r\n ];\r\n\r\n configs.forEach((c) => {\r\n // Make inner planets larger for visibility\r\n const visualScale = c.distance < 300000000 ? 15 : 5;\r\n const planetRadius = c.radius * SIZE_SCALE * visualScale;\r\n const geo = new THREE.SphereGeometry(planetRadius, 24, 16);\r\n const mat = new THREE.MeshPhongMaterial({\r\n color: c.color,\r\n shininess: 30,\r\n });\r\n const mesh = new THREE.Mesh(geo, mat);\r\n\r\n const orbitDist = c.distance * DISTANCE_SCALE;\r\n mesh.position.x = orbitDist;\r\n mesh.name = c.id;\r\n mesh.userData = {\r\n objectId: c.id,\r\n planetId: c.id,\r\n isPlanet: true,\r\n isSelectable: true,\r\n data: {\r\n id: c.id,\r\n name: c.id.charAt(0).toUpperCase() + c.id.slice(1),\r\n category: \"planet\",\r\n },\r\n };\r\n planetsGroup.add(mesh);\r\n objectMeshMapRef.current.set(c.id, mesh);\r\n\r\n // Saturn's rings\r\n if (c.id === \"saturn\") {\r\n const ringGeo = new THREE.RingGeometry(\r\n planetRadius * 1.4,\r\n planetRadius * 2.2,\r\n 32,\r\n );\r\n const ringMat = new THREE.MeshBasicMaterial({\r\n color: 0xc9b896,\r\n transparent: true,\r\n opacity: 0.6,\r\n side: THREE.DoubleSide,\r\n });\r\n const ring = new THREE.Mesh(ringGeo, ringMat);\r\n ring.rotation.x = Math.PI / 2.5;\r\n ring.position.copy(mesh.position);\r\n planetsGroup.add(ring);\r\n }\r\n\r\n // Orbit line\r\n const points: any[] = [];\r\n for (let i = 0; i <= 64; i++) {\r\n const angle = (i / 64) * Math.PI * 2;\r\n points.push(\r\n new THREE.Vector3(\r\n orbitDist * Math.cos(angle),\r\n 0,\r\n orbitDist * Math.sin(angle),\r\n ),\r\n );\r\n }\r\n const orbitGeo = new THREE.BufferGeometry().setFromPoints(points);\r\n const orbitMat = new THREE.LineBasicMaterial({\r\n color: 0x444466,\r\n transparent: true,\r\n opacity: 0.3,\r\n });\r\n planetsGroup.add(new THREE.Line(orbitGeo, orbitMat));\r\n });\r\n\r\n // Add a point light at Sun\r\n const sunLight = new THREE.PointLight(0xffffee, 2, 100000);\r\n sunLight.position.set(0, 0, 0);\r\n planetsGroup.add(sunLight);\r\n },\r\n [],\r\n );\r\n\r\n // ==========================================================================\r\n // Create Earth (optimized segments like EarthViewer)\r\n // ==========================================================================\r\n\r\n const createEarth = useCallback((THREE: ThreeModule, scene: any) => {\r\n const earthGeometry = new THREE.SphereGeometry(\r\n SCENE_EARTH_RADIUS,\r\n EARTH_SEGMENTS,\r\n EARTH_SEGMENTS_V,\r\n );\r\n const earthMaterial = new THREE.MeshPhongMaterial({\r\n color: 0x2244aa,\r\n shininess: 10,\r\n });\r\n\r\n const textureLoader = new THREE.TextureLoader();\r\n textureLoader.load(\r\n \"/world.topo.jpg\",\r\n (texture: any) => {\r\n texture.wrapS = THREE.RepeatWrapping;\r\n texture.wrapT = THREE.ClampToEdgeWrapping;\r\n texture.minFilter = THREE.LinearFilter;\r\n texture.magFilter = THREE.LinearFilter;\r\n earthMaterial.map = texture;\r\n earthMaterial.needsUpdate = true;\r\n },\r\n undefined,\r\n () => {},\r\n );\r\n\r\n const earth = new THREE.Mesh(earthGeometry, earthMaterial);\r\n earth.rotation.y = -Math.PI / 2 + Math.PI;\r\n earth.name = \"earth\";\r\n scene.add(earth);\r\n earthRef.current = earth;\r\n }, []);\r\n\r\n // ==========================================================================\r\n // Create Atmosphere (sun-reactive glow)\r\n // ==========================================================================\r\n\r\n const createAtmosphere = useCallback(\r\n (THREE: ThreeModule, scene: any) => {\r\n if (!effectiveLayers.atmosphere) return;\r\n\r\n // Default sun direction (can be updated via props)\r\n const defaultSunDir = new THREE.Vector3(1, 0.3, 0.5).normalize();\r\n\r\n const atmosphereGeometry = new THREE.SphereGeometry(\r\n SCENE_EARTH_RADIUS * 1.15,\r\n 32,\r\n 16,\r\n );\r\n const atmosphereMaterial = new THREE.ShaderMaterial({\r\n uniforms: {\r\n uSunDirection: { value: defaultSunDir },\r\n },\r\n vertexShader: atmosphereVertexShader,\r\n fragmentShader: atmosphereFragmentShader,\r\n blending: THREE.AdditiveBlending,\r\n side: THREE.BackSide,\r\n transparent: true,\r\n depthWrite: false,\r\n });\r\n const atmosphere = new THREE.Mesh(\r\n atmosphereGeometry,\r\n atmosphereMaterial,\r\n );\r\n atmosphere.rotation.y = -Math.PI / 2;\r\n atmosphere.name = \"atmosphere\";\r\n scene.add(atmosphere);\r\n\r\n // Store ref for dynamic updates\r\n atmosphereMaterialRef.current = atmosphereMaterial;\r\n },\r\n [effectiveLayers.atmosphere],\r\n );\r\n\r\n // ==========================================================================\r\n // Create Stars (optimized like EarthViewer)\r\n // ==========================================================================\r\n\r\n const createStars = useCallback(\r\n (THREE: ThreeModule, scene: any) => {\r\n const starsGeometry = new THREE.BufferGeometry();\r\n const starsDist = currentView === \"solar-system\" ? 50000000000 : 50000;\r\n const positions = new Float32Array(STARS_COUNT * 3);\r\n const opacities = new Float32Array(STARS_COUNT);\r\n\r\n for (let i = 0; i < STARS_COUNT; i++) {\r\n const radius = starsDist + Math.random() * starsDist;\r\n const theta = Math.random() * Math.PI * 2;\r\n const phi = Math.acos(2 * Math.random() - 1);\r\n\r\n positions[i * 3] = radius * Math.sin(phi) * Math.cos(theta);\r\n positions[i * 3 + 1] = radius * Math.sin(phi) * Math.sin(theta);\r\n positions[i * 3 + 2] = radius * Math.cos(phi);\r\n opacities[i] = Math.random();\r\n }\r\n\r\n starsGeometry.setAttribute(\r\n \"position\",\r\n new THREE.BufferAttribute(positions, 3),\r\n );\r\n starsGeometry.setAttribute(\r\n \"opacity\",\r\n new THREE.BufferAttribute(opacities, 1),\r\n );\r\n\r\n const starsMaterial = new THREE.ShaderMaterial({\r\n uniforms: { time: { value: 0 } },\r\n vertexShader: starsVertexShader,\r\n fragmentShader: starsFragmentShader,\r\n transparent: true,\r\n depthWrite: false,\r\n blending: THREE.AdditiveBlending,\r\n });\r\n\r\n scene.add(new THREE.Points(starsGeometry, starsMaterial));\r\n starsMaterialRef.current = starsMaterial;\r\n },\r\n [currentView],\r\n );\r\n\r\n // ==========================================================================\r\n // Create Lighting (simple like EarthViewer)\r\n // ==========================================================================\r\n\r\n const createLighting = useCallback((THREE: ThreeModule, scene: any) => {\r\n scene.add(new THREE.AmbientLight(0x404040, 0.6));\r\n const sunLight = new THREE.DirectionalLight(0xffffff, 1.2);\r\n sunLight.position.set(10000, 5000, 10000);\r\n scene.add(sunLight);\r\n }, []);\r\n\r\n // ==========================================================================\r\n // Create Axis Helper\r\n // ==========================================================================\r\n\r\n const createAxisHelper = useCallback((THREE: ThreeModule, scene: any) => {\r\n const len = SCENE_EARTH_RADIUS * 1.5;\r\n const group = new THREE.Group();\r\n\r\n [\r\n { color: 0xff3333, dir: [1, 0, 0] },\r\n { color: 0x33ff33, dir: [0, 1, 0] },\r\n { color: 0x3333ff, dir: [0, 0, 1] },\r\n ].forEach(({ color, dir }) => {\r\n const points = [\r\n new THREE.Vector3(0, 0, 0),\r\n new THREE.Vector3(dir[0] * len, dir[1] * len, dir[2] * len),\r\n ];\r\n const geo = new THREE.BufferGeometry().setFromPoints(points);\r\n const mat = new THREE.LineBasicMaterial({ color });\r\n group.add(new THREE.Line(geo, mat));\r\n });\r\n\r\n scene.add(group);\r\n }, []);\r\n\r\n // ==========================================================================\r\n // Update Objects\r\n // ==========================================================================\r\n\r\n const updateObjects = useCallback(() => {\r\n if (!THREE || !objectsGroupRef.current || currentView === \"solar-system\")\r\n return;\r\n\r\n const group = objectsGroupRef.current;\r\n const meshMap = objectMeshMapRef.current;\r\n\r\n // Clear\r\n while (group.children.length > 0) {\r\n const child = group.children[0];\r\n group.remove(child);\r\n }\r\n meshMap.clear();\r\n\r\n const allObjects: SpaceObject[] = [\r\n ...satellites,\r\n ...debris,\r\n ...stations,\r\n ...customObjects,\r\n ];\r\n\r\n allObjects.slice(0, maxObjects).forEach((obj) => {\r\n const categoryLayer =\r\n obj.category === \"satellite\"\r\n ? \"satellites\"\r\n : obj.category === \"debris\"\r\n ? \"debris\"\r\n : obj.category === \"station\"\r\n ? \"stations\"\r\n : \"satellites\";\r\n\r\n if (!effectiveLayers[categoryLayer]) return;\r\n\r\n let size = 50;\r\n if (obj.category === \"station\") size = 100;\r\n else if (obj.category === \"debris\") size = 25;\r\n\r\n const satelliteGroup = createSatelliteShape(THREE, obj.category, size);\r\n satelliteGroup.position.set(\r\n obj.position.x,\r\n obj.position.y,\r\n obj.position.z,\r\n );\r\n satelliteGroup.lookAt(0, 0, 0);\r\n satelliteGroup.userData = {\r\n objectId: obj.id,\r\n category: obj.category,\r\n data: obj,\r\n isSelectable: true,\r\n };\r\n satelliteGroup.name = obj.id;\r\n\r\n group.add(satelliteGroup);\r\n meshMap.set(obj.id, satelliteGroup);\r\n });\r\n }, [\r\n THREE,\r\n satellites,\r\n debris,\r\n stations,\r\n customObjects,\r\n maxObjects,\r\n effectiveLayers,\r\n currentView,\r\n ]);\r\n\r\n // ==========================================================================\r\n // Update Ground Stations\r\n // ==========================================================================\r\n\r\n const updateGroundStations = useCallback(() => {\r\n if (!THREE || !objectsGroupRef.current || currentView === \"solar-system\")\r\n return;\r\n if (!effectiveLayers.groundStations) return;\r\n\r\n groundStations.forEach((gs) => {\r\n const pos = latLonAltToCartesian(gs.latitude, gs.longitude, 0);\r\n\r\n // Simple marker\r\n const geo = new THREE.SphereGeometry(35, 8, 6);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0x00ffff });\r\n const marker = new THREE.Mesh(geo, mat);\r\n marker.position.set(pos.x, pos.y, pos.z);\r\n marker.userData = {\r\n objectId: gs.id,\r\n category: \"groundStation\",\r\n data: gs,\r\n isSelectable: true,\r\n };\r\n\r\n objectsGroupRef.current.add(marker);\r\n objectMeshMapRef.current.set(gs.id, marker);\r\n\r\n // Glow ring\r\n const ringGeo = new THREE.RingGeometry(45, 65, 16);\r\n const ringMat = new THREE.MeshBasicMaterial({\r\n color: 0x00ffff,\r\n transparent: true,\r\n opacity: 0.4,\r\n side: THREE.DoubleSide,\r\n });\r\n const ring = new THREE.Mesh(ringGeo, ringMat);\r\n ring.position.set(pos.x, pos.y, pos.z);\r\n ring.lookAt(0, 0, 0);\r\n objectsGroupRef.current.add(ring);\r\n });\r\n }, [THREE, groundStations, effectiveLayers.groundStations, currentView]);\r\n\r\n // ==========================================================================\r\n // Update Coverage (Realistic satellite-to-ground cones + legacy region cones)\r\n // ==========================================================================\r\n\r\n const updateCoverage = useCallback(() => {\r\n const T = threeRef.current;\r\n if (!T || !conesGroupRef.current || currentView === \"solar-system\")\r\n return;\r\n\r\n // Clear existing\r\n while (conesGroupRef.current.children.length > 0) {\r\n conesGroupRef.current.remove(conesGroupRef.current.children[0]);\r\n }\r\n\r\n if (!effectiveLayers.coverage) return;\r\n\r\n // ========================================\r\n // Satellite Coverage Visualization (NASA-style)\r\n // Renders coverage data provided by Zendir SDK\r\n // ========================================\r\n satelliteCoverages.forEach((coverage) => {\r\n // Get satellite position\r\n let satPos: any;\r\n if (coverage.satellitePosition) {\r\n satPos = new T.Vector3(\r\n coverage.satellitePosition.x,\r\n coverage.satellitePosition.y,\r\n coverage.satellitePosition.z,\r\n );\r\n } else {\r\n const satMesh = objectMeshMapRef.current.get(coverage.satelliteId);\r\n if (!satMesh) return;\r\n satPos = satMesh.position.clone();\r\n }\r\n\r\n const satDistance = satPos.length();\r\n const coneColor = new T.Color(coverage.color || \"#22d3ee\");\r\n const highlightColor = new T.Color(\r\n coverage.color || \"#22d3ee\",\r\n ).multiplyScalar(1.3);\r\n\r\n // ====== 1. Render footprint border only (no filled plane - it cuts through sphere) ======\r\n if (\r\n coverage.footprintPolygon &&\r\n coverage.footprintPolygon.length >= 3 &&\r\n coverage.showFootprint !== false\r\n ) {\r\n const cornerPoints = coverage.footprintPolygon.map((pt) =>\r\n latLonAltToCartesian(pt.latitude, pt.longitude, 0),\r\n );\r\n\r\n // Curved border (follows sphere curvature via SLERP)\r\n const borderPts = subdivideSphericalPolygon(\r\n cornerPoints,\r\n SPHERICAL_SUBDIVISIONS,\r\n SCENE_EARTH_RADIUS * 1.003,\r\n ).map((pt) => new T.Vector3(pt.x, pt.y, pt.z));\r\n borderPts.push(borderPts[0].clone());\r\n const borderGeo = new T.BufferGeometry().setFromPoints(borderPts);\r\n const borderMat = new T.LineBasicMaterial({\r\n color: highlightColor,\r\n transparent: true,\r\n opacity: 0.95,\r\n linewidth: 2,\r\n });\r\n conesGroupRef.current.add(new T.Line(borderGeo, borderMat));\r\n\r\n // Outer glow (slightly larger radius for glow effect)\r\n const glowPts = subdivideSphericalPolygon(\r\n cornerPoints,\r\n SPHERICAL_SUBDIVISIONS,\r\n SCENE_EARTH_RADIUS * 1.005,\r\n ).map((pt) => new T.Vector3(pt.x, pt.y, pt.z));\r\n glowPts.push(glowPts[0].clone());\r\n const glowGeo = new T.BufferGeometry().setFromPoints(glowPts);\r\n const glowMat = new T.LineBasicMaterial({\r\n color: coneColor,\r\n transparent: true,\r\n opacity: 0.4,\r\n });\r\n conesGroupRef.current.add(new T.Line(glowGeo, glowMat));\r\n\r\n // Cone lines from satellite to corners (lines only, no filled surface)\r\n if (coverage.showCone !== false) {\r\n for (const corner of cornerPoints) {\r\n const edgePt = new T.Vector3(corner.x, corner.y, corner.z)\r\n .normalize()\r\n .multiplyScalar(SCENE_EARTH_RADIUS);\r\n const lineGeo = new T.BufferGeometry().setFromPoints([\r\n satPos,\r\n edgePt,\r\n ]);\r\n const lineMat = new T.LineBasicMaterial({\r\n color: coneColor,\r\n transparent: true,\r\n opacity: 0.4,\r\n });\r\n conesGroupRef.current.add(new T.Line(lineGeo, lineMat));\r\n }\r\n }\r\n }\r\n\r\n // ====== 2. Simple cone (when no polygon, just halfAngle) ======\r\n else if (coverage.halfAngle && coverage.showCone !== false) {\r\n const halfAngleRad = coverage.halfAngle * (Math.PI / 180);\r\n const coneHeight = satDistance - SCENE_EARTH_RADIUS * 0.98;\r\n const coneRadius = coneHeight * Math.tan(halfAngleRad);\r\n\r\n // Cone mesh\r\n const coneGeo = new T.ConeGeometry(\r\n coneRadius,\r\n coneHeight,\r\n 48,\r\n 1,\r\n true,\r\n );\r\n const coneMat = new T.MeshBasicMaterial({\r\n color: coneColor,\r\n transparent: true,\r\n opacity: 0.12,\r\n side: T.DoubleSide,\r\n depthWrite: false,\r\n });\r\n const cone = new T.Mesh(coneGeo, coneMat);\r\n cone.position.copy(satPos);\r\n cone.lookAt(0, 0, 0);\r\n cone.rotateX(Math.PI / 2);\r\n cone.translateY(-coneHeight / 2);\r\n conesGroupRef.current.add(cone);\r\n\r\n // Footprint circle\r\n if (coverage.showFootprint !== false) {\r\n const nadirDir = satPos.clone().normalize();\r\n const footprintPos = nadirDir\r\n .clone()\r\n .multiplyScalar(SCENE_EARTH_RADIUS * 1.003);\r\n const footprintRadius =\r\n coneRadius * (SCENE_EARTH_RADIUS / satDistance);\r\n\r\n // Filled circle\r\n const footGeo = new T.CircleGeometry(footprintRadius, 64);\r\n const footMat = new T.MeshBasicMaterial({\r\n color: coneColor,\r\n transparent: true,\r\n opacity: 0.3,\r\n side: T.DoubleSide,\r\n depthWrite: false,\r\n });\r\n const footprint = new T.Mesh(footGeo, footMat);\r\n footprint.position.copy(footprintPos);\r\n footprint.lookAt(satPos);\r\n conesGroupRef.current.add(footprint);\r\n\r\n // Edge ring\r\n const ringGeo = new T.RingGeometry(\r\n footprintRadius * 0.97,\r\n footprintRadius,\r\n 64,\r\n );\r\n const ringMat = new T.MeshBasicMaterial({\r\n color: highlightColor,\r\n transparent: true,\r\n opacity: 0.7,\r\n side: T.DoubleSide,\r\n });\r\n const ring = new T.Mesh(ringGeo, ringMat);\r\n ring.position.copy(footprintPos);\r\n ring.lookAt(satPos);\r\n conesGroupRef.current.add(ring);\r\n }\r\n }\r\n\r\n // ====== 3. Nadir line ======\r\n if (coverage.showNadirLine !== false) {\r\n let nadirGroundPoint: any;\r\n if (coverage.nadirPoint) {\r\n const np = latLonAltToCartesian(\r\n coverage.nadirPoint.latitude,\r\n coverage.nadirPoint.longitude,\r\n 0,\r\n );\r\n nadirGroundPoint = new T.Vector3(np.x, np.y, np.z);\r\n } else {\r\n nadirGroundPoint = satPos\r\n .clone()\r\n .normalize()\r\n .multiplyScalar(SCENE_EARTH_RADIUS);\r\n }\r\n const lineGeo = new T.BufferGeometry().setFromPoints([\r\n satPos,\r\n nadirGroundPoint,\r\n ]);\r\n const lineMat = new T.LineBasicMaterial({\r\n color: highlightColor,\r\n transparent: true,\r\n opacity: 0.7,\r\n });\r\n conesGroupRef.current.add(new T.Line(lineGeo, lineMat));\r\n }\r\n });\r\n\r\n // ========================================\r\n // Legacy Region-based Visibility Cones\r\n // ========================================\r\n visibilityCones.forEach((cone) => {\r\n const pos = latLonAltToCartesian(\r\n cone.center.latitude,\r\n cone.center.longitude,\r\n 0,\r\n );\r\n\r\n const coneHeight = 1000 * KM_TO_SCENE;\r\n const minElev = cone.minElevation || 10;\r\n const coneRadius =\r\n coneHeight * Math.tan((90 - minElev) * (Math.PI / 180) * 0.4);\r\n const coneColor = new T.Color(cone.color || \"#22d3ee\");\r\n\r\n const coneGeo = new T.ConeGeometry(coneRadius, coneHeight, 24, 1, true);\r\n const coneMat = new T.MeshBasicMaterial({\r\n color: coneColor,\r\n transparent: true,\r\n opacity: cone.opacity || 0.12,\r\n side: T.DoubleSide,\r\n depthWrite: false,\r\n });\r\n\r\n const coneMesh = new T.Mesh(coneGeo, coneMat);\r\n coneMesh.position.set(pos.x, pos.y, pos.z);\r\n coneMesh.lookAt(0, 0, 0);\r\n coneMesh.rotateX(-Math.PI / 2);\r\n coneMesh.translateY(coneHeight / 2);\r\n conesGroupRef.current.add(coneMesh);\r\n\r\n // Footprint ring\r\n const footGeo = new T.RingGeometry(\r\n coneRadius * 0.7,\r\n coneRadius * 0.9,\r\n 32,\r\n );\r\n const footMat = new T.MeshBasicMaterial({\r\n color: coneColor,\r\n transparent: true,\r\n opacity: 0.3,\r\n side: T.DoubleSide,\r\n });\r\n const foot = new T.Mesh(footGeo, footMat);\r\n foot.position.set(pos.x * 1.002, pos.y * 1.002, pos.z * 1.002);\r\n foot.lookAt(0, 0, 0);\r\n conesGroupRef.current.add(foot);\r\n });\r\n }, [\r\n visibilityCones,\r\n satelliteCoverages,\r\n effectiveLayers.coverage,\r\n currentView,\r\n ]);\r\n\r\n // ==========================================================================\r\n // Update Communication Links\r\n // ==========================================================================\r\n\r\n const updateLinks = useCallback(() => {\r\n if (!THREE || !linksGroupRef.current || currentView === \"solar-system\")\r\n return;\r\n\r\n while (linksGroupRef.current.children.length > 0) {\r\n linksGroupRef.current.remove(linksGroupRef.current.children[0]);\r\n }\r\n\r\n communicationLinks.forEach((link) => {\r\n const fromMesh = objectMeshMapRef.current.get(link.fromId);\r\n const toMesh = objectMeshMapRef.current.get(link.toId);\r\n if (!fromMesh || !toMesh) return;\r\n\r\n const color =\r\n link.color || (link.status === \"active\" ? \"#00ff88\" : \"#666666\");\r\n const geo = new THREE.BufferGeometry().setFromPoints([\r\n fromMesh.position.clone(),\r\n toMesh.position.clone(),\r\n ]);\r\n\r\n // Dashed animated line\r\n const mat = new THREE.LineDashedMaterial({\r\n color: new THREE.Color(color),\r\n transparent: true,\r\n opacity: link.status === \"active\" ? 0.8 : 0.4,\r\n dashSize: 30,\r\n gapSize: 20,\r\n });\r\n\r\n const line = new THREE.Line(geo, mat);\r\n line.computeLineDistances(); // Required for dashed lines - must be on Line, not geometry\r\n line.userData = { isAnimatedLink: true };\r\n linksGroupRef.current.add(line);\r\n });\r\n }, [THREE, communicationLinks, currentView]);\r\n\r\n // ==========================================================================\r\n // Update Orbits\r\n // ==========================================================================\r\n\r\n const updateOrbits = useCallback(() => {\r\n if (!THREE || !orbitsGroupRef.current || currentView === \"solar-system\")\r\n return;\r\n\r\n while (orbitsGroupRef.current.children.length > 0) {\r\n orbitsGroupRef.current.remove(orbitsGroupRef.current.children[0]);\r\n }\r\n\r\n if (!effectiveLayers.orbits) return;\r\n\r\n orbitPaths.forEach((path) => {\r\n if (path.points.length < 2) return;\r\n const points = path.points.map((p) => new THREE.Vector3(p.x, p.y, p.z));\r\n const geo = new THREE.BufferGeometry().setFromPoints(points);\r\n const mat = new THREE.LineBasicMaterial({\r\n color: new THREE.Color(path.color || \"#888888\"),\r\n transparent: true,\r\n opacity: 0.5,\r\n });\r\n orbitsGroupRef.current.add(new THREE.Line(geo, mat));\r\n });\r\n }, [THREE, orbitPaths, effectiveLayers.orbits, currentView]);\r\n\r\n // ==========================================================================\r\n // Mouse Handlers\r\n // ==========================================================================\r\n\r\n const handleMouseMove = useCallback((event: MouseEvent) => {\r\n if (!containerRef.current || !raycasterRef.current || !cameraRef.current)\r\n return;\r\n\r\n const rect = containerRef.current.getBoundingClientRect();\r\n mouseRef.current.set(\r\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\r\n -((event.clientY - rect.top) / rect.height) * 2 + 1,\r\n );\r\n\r\n raycasterRef.current.setFromCamera(mouseRef.current, cameraRef.current);\r\n\r\n const selectables: any[] = [];\r\n objectsGroupRef.current?.traverse((obj: any) => {\r\n if (obj.userData?.isSelectable) selectables.push(obj);\r\n });\r\n\r\n const intersects = raycasterRef.current.intersectObjects(\r\n selectables,\r\n true,\r\n );\r\n\r\n if (intersects.length > 0) {\r\n let hit = intersects[0].object;\r\n while (hit && !hit.userData?.objectId) hit = hit.parent;\r\n\r\n if (hit?.userData) {\r\n setHoverTooltip({\r\n visible: true,\r\n x: event.clientX - rect.left,\r\n y: event.clientY - rect.top,\r\n object: hit.userData.data,\r\n });\r\n if (containerRef.current)\r\n containerRef.current.style.cursor = \"pointer\";\r\n return;\r\n }\r\n }\r\n\r\n setHoverTooltip({ visible: false, x: 0, y: 0, object: null });\r\n if (containerRef.current) containerRef.current.style.cursor = \"grab\";\r\n }, []);\r\n\r\n const handleClick = useCallback(\r\n (event: MouseEvent) => {\r\n if (\r\n !containerRef.current ||\r\n !raycasterRef.current ||\r\n !cameraRef.current\r\n )\r\n return;\r\n\r\n const rect = containerRef.current.getBoundingClientRect();\r\n mouseRef.current.set(\r\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\r\n -((event.clientY - rect.top) / rect.height) * 2 + 1,\r\n );\r\n\r\n raycasterRef.current.setFromCamera(mouseRef.current, cameraRef.current);\r\n\r\n // Check objects group\r\n const selectables: any[] = [];\r\n objectsGroupRef.current?.traverse((obj: any) => {\r\n if (obj.userData?.isSelectable) selectables.push(obj);\r\n });\r\n // Also check planets group for solar system view\r\n planetsGroupRef.current?.traverse((obj: any) => {\r\n if (obj.userData?.isSelectable) selectables.push(obj);\r\n });\r\n\r\n const intersects = raycasterRef.current.intersectObjects(\r\n selectables,\r\n true,\r\n );\r\n\r\n if (intersects.length > 0) {\r\n let hit = intersects[0].object;\r\n while (hit && !hit.userData?.objectId) hit = hit.parent;\r\n\r\n if (hit?.userData?.objectId) {\r\n const objectId = hit.userData.objectId;\r\n setSelection({\r\n selectedId: objectId,\r\n selectedObject: hit.userData.data,\r\n hoveredId: null,\r\n });\r\n callbacks?.onSelect?.(hit.userData.data);\r\n\r\n // Fly to the clicked object\r\n flyTo(objectId, { animate: true });\r\n return;\r\n }\r\n }\r\n\r\n setSelection({\r\n selectedId: null,\r\n selectedObject: null,\r\n hoveredId: null,\r\n });\r\n callbacks?.onSelect?.(null);\r\n },\r\n [callbacks],\r\n );\r\n\r\n // ==========================================================================\r\n // Fly To Object (comprehensive camera navigation)\r\n // ==========================================================================\r\n\r\n const flyTo = useCallback(\r\n (\r\n objectId: string,\r\n options?: {\r\n zoom?: number;\r\n animate?: boolean;\r\n distance?: number;\r\n offset?: Vector3D;\r\n },\r\n ) => {\r\n if (!THREE || !cameraRef.current || !controlsRef.current) return;\r\n\r\n const mesh = objectMeshMapRef.current.get(objectId);\r\n if (!mesh) {\r\n if (import.meta.env.DEV) {\r\n console.warn(`flyTo: Object \"${objectId}\" not found`);\r\n }\r\n return;\r\n }\r\n\r\n const targetPos = mesh.position.clone();\r\n const camera = cameraRef.current;\r\n const controls = controlsRef.current;\r\n const category = mesh.userData?.category;\r\n const isGroundStation = category === \"groundStation\";\r\n\r\n // Determine viewing distance based on object type\r\n let viewDistance: number;\r\n if (options?.distance) {\r\n viewDistance = options.distance;\r\n } else {\r\n // Auto-calculate based on object size/type\r\n const isPlanet = mesh.userData?.isPlanet;\r\n const targetDist = targetPos.length();\r\n\r\n if (isPlanet) {\r\n // For planets, get closer based on planet size\r\n const planetRadius = mesh.geometry?.parameters?.radius || 100;\r\n viewDistance = planetRadius * 5;\r\n } else if (isGroundStation) {\r\n // Ground stations - close view from above\r\n viewDistance = 200;\r\n } else if (category === \"station\") {\r\n // Space stations - extremely close side view\r\n viewDistance = 80;\r\n } else if (category === \"satellite\") {\r\n // Satellites - extremely close side view\r\n viewDistance = 60;\r\n } else if (targetDist > SCENE_EARTH_RADIUS * 2) {\r\n // Far object (high orbit) - close view\r\n viewDistance = 150;\r\n } else {\r\n // Near-Earth object - very close view\r\n viewDistance = 100 * (options?.zoom || 1);\r\n }\r\n }\r\n\r\n // Calculate camera position - offset from object\r\n let cameraTargetPos: any;\r\n if (options?.offset) {\r\n cameraTargetPos = targetPos\r\n .clone()\r\n .add(\r\n new THREE.Vector3(\r\n options.offset.x,\r\n options.offset.y,\r\n options.offset.z,\r\n ),\r\n );\r\n } else if (isGroundStation) {\r\n // Ground station: view from above (radially outward from Earth center)\r\n const upDir = targetPos.clone().normalize();\r\n cameraTargetPos = targetPos\r\n .clone()\r\n .add(upDir.multiplyScalar(viewDistance));\r\n } else {\r\n // Satellites/stations: view from the side\r\n const dir = targetPos.clone().normalize();\r\n const side = new THREE.Vector3(-dir.z, 0.2, dir.x).normalize();\r\n cameraTargetPos = targetPos\r\n .clone()\r\n .add(side.multiplyScalar(viewDistance));\r\n }\r\n\r\n if (options?.animate !== false) {\r\n focusTransitionRef.current = {\r\n startTime: Date.now(),\r\n startPos: {\r\n x: camera.position.x,\r\n y: camera.position.y,\r\n z: camera.position.z,\r\n },\r\n targetPos: {\r\n x: cameraTargetPos.x,\r\n y: cameraTargetPos.y,\r\n z: cameraTargetPos.z,\r\n },\r\n startTarget: {\r\n x: controls.target.x,\r\n y: controls.target.y,\r\n z: controls.target.z,\r\n },\r\n targetTarget: { x: targetPos.x, y: targetPos.y, z: targetPos.z },\r\n duration: CAMERA_TRANSITION_DURATION,\r\n isActive: true,\r\n };\r\n } else {\r\n camera.position.copy(cameraTargetPos);\r\n controls.target.copy(targetPos);\r\n controls.update();\r\n }\r\n\r\n // Fire callback\r\n callbacks?.onFocus?.(mesh.userData?.data || { id: objectId });\r\n },\r\n [THREE, callbacks],\r\n );\r\n\r\n // Alias for backward compatibility\r\n const focusOn = flyTo;\r\n\r\n // ==========================================================================\r\n // Animation\r\n // ==========================================================================\r\n\r\n const animate = useCallback(() => {\r\n // Guard: Only one animation loop should run at a time\r\n if (!isAnimatingRef.current) return;\r\n if (!rendererRef.current || !sceneRef.current || !cameraRef.current)\r\n return;\r\n\r\n const camera = cameraRef.current;\r\n const controls = controlsRef.current;\r\n\r\n // Transition\r\n if (focusTransitionRef.current?.isActive) {\r\n const t = focusTransitionRef.current;\r\n const progress = Math.min((Date.now() - t.startTime) / t.duration, 1);\r\n const e = easeOutCubic(progress);\r\n\r\n camera.position.x = t.startPos.x + (t.targetPos.x - t.startPos.x) * e;\r\n camera.position.y = t.startPos.y + (t.targetPos.y - t.startPos.y) * e;\r\n camera.position.z = t.startPos.z + (t.targetPos.z - t.startPos.z) * e;\r\n\r\n controls.target.x =\r\n t.startTarget.x + (t.targetTarget.x - t.startTarget.x) * e;\r\n controls.target.y =\r\n t.startTarget.y + (t.targetTarget.y - t.startTarget.y) * e;\r\n controls.target.z =\r\n t.startTarget.z + (t.targetTarget.z - t.startTarget.z) * e;\r\n\r\n if (progress >= 1) t.isActive = false;\r\n }\r\n\r\n if (controls) controls.update();\r\n\r\n timeRef.current += 0.016;\r\n if (starsMaterialRef.current)\r\n starsMaterialRef.current.uniforms.time.value = timeRef.current;\r\n\r\n // Animate communication link dashes (moving dotted lines)\r\n if (linksGroupRef.current) {\r\n linksGroupRef.current.children.forEach((child: any) => {\r\n if (child.userData?.isAnimatedLink && child.material) {\r\n child.material.dashOffset -= 1.5; // Speed of animation\r\n }\r\n });\r\n }\r\n\r\n rendererRef.current.render(sceneRef.current, camera);\r\n animationRef.current = requestAnimationFrame(animate);\r\n }, []);\r\n\r\n // ==========================================================================\r\n // Imperative Handle\r\n // ==========================================================================\r\n\r\n useImperativeHandle(\r\n ref,\r\n () => ({\r\n focusOn,\r\n flyTo,\r\n setView: (mode: ViewMode) => setCurrentView(mode),\r\n setTime: () => {},\r\n setTimeScale: () => {},\r\n togglePlay: () => {},\r\n setLayerVisibility: (layer: keyof LayerVisibility, visible: boolean) =>\r\n setLayers((prev) => ({ ...prev, [layer]: visible })),\r\n getCameraState: (): CameraState => {\r\n if (!cameraRef.current)\r\n return {\r\n position: { x: 0, y: 0, z: 10000 },\r\n target: { x: 0, y: 0, z: 0 },\r\n up: { x: 0, y: 1, z: 0 },\r\n fov: 45,\r\n near: 0.1,\r\n far: 100000,\r\n };\r\n const c = cameraRef.current;\r\n return {\r\n position: { x: c.position.x, y: c.position.y, z: c.position.z },\r\n target: {\r\n x: controlsRef.current?.target.x || 0,\r\n y: controlsRef.current?.target.y || 0,\r\n z: controlsRef.current?.target.z || 0,\r\n },\r\n up: { x: c.up.x, y: c.up.y, z: c.up.z },\r\n fov: c.fov,\r\n near: c.near,\r\n far: c.far,\r\n };\r\n },\r\n setCameraState: (state: Partial<CameraState>) => {\r\n if (!cameraRef.current) return;\r\n if (state.position)\r\n cameraRef.current.position.set(\r\n state.position.x,\r\n state.position.y,\r\n state.position.z,\r\n );\r\n if (state.target && controlsRef.current)\r\n controlsRef.current.target.set(\r\n state.target.x,\r\n state.target.y,\r\n state.target.z,\r\n );\r\n },\r\n exportImage: (format: \"png\" | \"jpeg\" = \"png\"): string =>\r\n rendererRef.current?.domElement.toDataURL(`image/${format}`) || \"\",\r\n exportScene: (): Blob => new Blob(),\r\n getVisibleObjects: (): SpaceObject[] => [\r\n ...satellites,\r\n ...debris,\r\n ...stations,\r\n ...customObjects,\r\n ],\r\n findObjects: (q: string): SpaceObject[] =>\r\n [...satellites, ...debris, ...stations, ...customObjects].filter(\r\n (obj) =>\r\n obj.name.toLowerCase().includes(q.toLowerCase()) ||\r\n obj.id.toLowerCase().includes(q.toLowerCase()),\r\n ),\r\n addObject: () => {},\r\n removeObject: () => {},\r\n updateObject: () => {},\r\n measureDistance: (\r\n _from: string | Vector3D,\r\n _to: string | Vector3D,\r\n ): number => 0,\r\n }),\r\n [satellites, debris, stations, customObjects, focusOn],\r\n );\r\n\r\n // ==========================================================================\r\n // Effects\r\n // ==========================================================================\r\n\r\n useEffect(() => {\r\n if (THREE && OrbitControlsClass) return initScene();\r\n }, [THREE, OrbitControlsClass, initScene]);\r\n\r\n useEffect(() => {\r\n if (!isLoading && THREE) {\r\n // Cancel any existing animation loop first (prevents stacking)\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current);\r\n animationRef.current = null;\r\n }\r\n\r\n // Start animation loop with guard\r\n isAnimatingRef.current = true;\r\n animate();\r\n\r\n return () => {\r\n // Stop animation loop cleanly\r\n isAnimatingRef.current = false;\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current);\r\n animationRef.current = null;\r\n }\r\n };\r\n }\r\n }, [isLoading, THREE, animate]);\r\n\r\n useEffect(() => {\r\n if (THREE && !isLoading) {\r\n updateObjects();\r\n updateGroundStations();\r\n updateCoverage();\r\n updateOrbits();\r\n updateLinks();\r\n }\r\n }, [\r\n THREE,\r\n isLoading,\r\n updateObjects,\r\n updateGroundStations,\r\n updateCoverage,\r\n updateOrbits,\r\n updateLinks,\r\n ]);\r\n\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container || isLoading) return;\r\n container.addEventListener(\"mousemove\", handleMouseMove);\r\n container.addEventListener(\"click\", handleClick);\r\n return () => {\r\n container.removeEventListener(\"mousemove\", handleMouseMove);\r\n container.removeEventListener(\"click\", handleClick);\r\n };\r\n }, [isLoading, handleMouseMove, handleClick]);\r\n\r\n useEffect(() => {\r\n const handleResize = () => {\r\n if (!containerRef.current || !rendererRef.current || !cameraRef.current)\r\n return;\r\n const rect = containerRef.current.getBoundingClientRect();\r\n const h = typeof height === \"number\" ? height : rect.height;\r\n cameraRef.current.aspect = rect.width / h;\r\n cameraRef.current.updateProjectionMatrix();\r\n rendererRef.current.setSize(rect.width, h);\r\n };\r\n window.addEventListener(\"resize\", handleResize);\r\n return () => window.removeEventListener(\"resize\", handleResize);\r\n }, [height]);\r\n\r\n useEffect(() => {\r\n if (focusedObjectId) focusOn(focusedObjectId, { animate: true });\r\n }, [focusedObjectId, focusOn]);\r\n\r\n // Update sun direction for atmosphere glow (from Zendir SDK)\r\n useEffect(() => {\r\n if (THREE && atmosphereMaterialRef.current && sunDirection) {\r\n const dir = new THREE.Vector3(\r\n sunDirection.x,\r\n sunDirection.y,\r\n sunDirection.z,\r\n ).normalize();\r\n atmosphereMaterialRef.current.uniforms.uSunDirection.value = dir;\r\n }\r\n }, [THREE, sunDirection]);\r\n\r\n // Update planet positions from Zendir SDK\r\n useEffect(() => {\r\n if (!THREE || !planetPositions || !planetsGroupRef.current) return;\r\n\r\n planetsGroupRef.current.traverse((child: any) => {\r\n if (\r\n child.userData?.planetId &&\r\n planetPositions[child.userData.planetId]\r\n ) {\r\n const pos = planetPositions[child.userData.planetId];\r\n child.position.set(pos.x, pos.y, pos.z);\r\n }\r\n });\r\n }, [THREE, planetPositions]);\r\n\r\n // ==========================================================================\r\n // Render\r\n // ==========================================================================\r\n\r\n if (!webglCapabilities.available) {\r\n return (\r\n <div\r\n className={`zenspace3d-fallback ${className}`}\r\n style={{\r\n width,\r\n height: typeof height === \"number\" ? height : 600,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n backgroundColor: \"#030508\",\r\n borderRadius: 8,\r\n fontFamily: \"ui-monospace, monospace\",\r\n ...style,\r\n }}\r\n >\r\n <div style={{ marginBottom: 16 }}>\r\n <AstroIcon\r\n name=\"public\"\r\n size=\"large\"\r\n label=\"Globe\"\r\n style={{ color: \"#22d3ee\", opacity: 0.5 }}\r\n />\r\n </div>\r\n <div\r\n style={{\r\n color: \"#b8bcc8\" /* WCAG: improved contrast */,\r\n fontSize: 14,\r\n }}\r\n >\r\n WebGL is not available\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (error)\r\n return (\r\n <div\r\n style={{\r\n width,\r\n height,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n backgroundColor: \"#0a0a0f\",\r\n color: \"#ff4444\",\r\n }}\r\n >\r\n <p>Error: {error}</p>\r\n </div>\r\n );\r\n\r\n return (\r\n <div\r\n className={`zenspace3d ${className}`}\r\n style={{\r\n width,\r\n height: typeof height === \"number\" ? height : \"100%\",\r\n position: \"relative\",\r\n backgroundColor: \"#000\",\r\n borderRadius: 8,\r\n overflow: \"hidden\",\r\n cursor: \"grab\",\r\n ...style,\r\n }}\r\n >\r\n <div ref={containerRef} style={{ width: \"100%\", height: \"100%\" }} />\r\n\r\n {isLoading && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n backgroundColor: \"rgba(0,0,0,0.9)\",\r\n }}\r\n >\r\n <div style={{ color: \"#22d3ee\", fontSize: 14 }}>Loading...</div>\r\n </div>\r\n )}\r\n\r\n {showTools && !isLoading && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: 12,\r\n left: 12,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 4,\r\n }}\r\n >\r\n <LayerBtn\r\n icon=\"satellite\"\r\n label=\"Satellites\"\r\n active={layers.satellites}\r\n onClick={() =>\r\n setLayers((l) => ({ ...l, satellites: !l.satellites }))\r\n }\r\n />\r\n <LayerBtn\r\n icon=\"home\"\r\n label=\"Stations\"\r\n active={layers.stations}\r\n onClick={() =>\r\n setLayers((l) => ({ ...l, stations: !l.stations }))\r\n }\r\n />\r\n <LayerBtn\r\n icon=\"antenna\"\r\n label=\"Ground\"\r\n active={layers.groundStations}\r\n onClick={() =>\r\n setLayers((l) => ({ ...l, groundStations: !l.groundStations }))\r\n }\r\n />\r\n <LayerBtn\r\n icon=\"timeline\"\r\n label=\"Orbits\"\r\n active={layers.orbits}\r\n onClick={() => setLayers((l) => ({ ...l, orbits: !l.orbits }))}\r\n />\r\n <LayerBtn\r\n icon=\"signal-cellular-4-bar\"\r\n label=\"Coverage\"\r\n active={layers.coverage}\r\n onClick={() =>\r\n setLayers((l) => ({ ...l, coverage: !l.coverage }))\r\n }\r\n />\r\n </div>\r\n )}\r\n\r\n {!isLoading && (\r\n <ObjectLegend\r\n currentView={currentView}\r\n satellites={satellites}\r\n stations={stations}\r\n groundStations={groundStations}\r\n onObjectClick={(id, objectData) => {\r\n // Same behavior as clicking in 3D: select, callback, fly\r\n setSelection({\r\n selectedId: id,\r\n selectedObject: objectData,\r\n hoveredId: null,\r\n });\r\n callbacks?.onSelect?.(objectData);\r\n flyTo(id, { animate: true });\r\n }}\r\n />\r\n )}\r\n\r\n {hoverTooltip.visible && hoverTooltip.object && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n left: hoverTooltip.x + 15,\r\n top: hoverTooltip.y - 10,\r\n backgroundColor: \"rgba(20, 25, 35, 0.95)\",\r\n color: \"#e4e4e7\",\r\n padding: \"10px 14px\",\r\n borderRadius: 4,\r\n fontSize: 12,\r\n fontFamily: \"system-ui, -apple-system, sans-serif\",\r\n boxShadow: \"0 4px 20px rgba(0,0,0,0.5)\",\r\n pointerEvents: \"none\",\r\n zIndex: 100,\r\n minWidth: 140,\r\n }}\r\n >\r\n <div style={{ color: \"#ffffff\", fontWeight: 500, marginBottom: 4 }}>\r\n {hoverTooltip.object.name ||\r\n hoverTooltip.object.targetName ||\r\n \"Unknown\"}\r\n </div>\r\n {hoverTooltip.object.category && (\r\n <div style={{ color: \"#9ca3af\", fontSize: 11 }}>\r\n {hoverTooltip.object.category}\r\n </div>\r\n )}\r\n {hoverTooltip.object.overpassTime && (\r\n <div style={{ color: \"#9ca3af\", fontSize: 11, marginTop: 4 }}>\r\n Overpass time: {hoverTooltip.object.overpassTime}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Overpass labels removed - now shown only on hover */}\r\n\r\n {showInfoPanel && selection.selectedObject && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n bottom: 16,\r\n right: 12,\r\n backgroundColor: \"rgba(0,0,0,0.9)\",\r\n color: \"#e4e4e7\",\r\n padding: \"14px 18px\",\r\n borderRadius: 10,\r\n fontSize: 12,\r\n fontFamily: \"ui-monospace, monospace\",\r\n border: \"1px solid rgba(34,211,238,0.3)\",\r\n minWidth: 180,\r\n }}\r\n >\r\n <div style={{ color: \"#22d3ee\", fontWeight: 500, marginBottom: 8 }}>\r\n {selection.selectedObject.name}\r\n </div>\r\n <div\r\n style={{\r\n color: \"#b8bcc8\" /* WCAG: improved contrast */,\r\n fontSize: 10,\r\n }}\r\n >\r\n {selection.selectedObject.category}\r\n </div>\r\n <button\r\n onClick={() =>\r\n setSelection({\r\n selectedId: null,\r\n selectedObject: null,\r\n hoveredId: null,\r\n })\r\n }\r\n style={{\r\n marginTop: 10,\r\n padding: \"5px 10px\",\r\n backgroundColor: \"rgba(255,255,255,0.1)\",\r\n border: \"none\",\r\n borderRadius: 4,\r\n color: \"#a1a1aa\",\r\n cursor: \"pointer\",\r\n fontSize: 10,\r\n width: \"100%\",\r\n }}\r\n >\r\n Close\r\n </button>\r\n </div>\r\n )}\r\n\r\n {!isLoading && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n bottom: 12,\r\n left: 12,\r\n backgroundColor: \"rgba(0,0,0,0.5)\",\r\n color: \"#b8bcc8\" /* WCAG: improved contrast */,\r\n padding: \"5px 10px\",\r\n borderRadius: 6,\r\n fontSize: 10,\r\n }}\r\n >\r\n Drag to rotate • Scroll to zoom\r\n </div>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\n// =============================================================================\r\n// Sub-Components\r\n// =============================================================================\r\n\r\nfunction LayerBtn({\r\n icon,\r\n label,\r\n active,\r\n onClick,\r\n}: {\r\n icon: AstroIconName;\r\n label: string;\r\n active: boolean;\r\n onClick: () => void;\r\n}) {\r\n return (\r\n <button\r\n onClick={onClick}\r\n aria-label={`Toggle ${label} layer`}\r\n aria-pressed={active}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 6,\r\n padding: \"6px 10px\",\r\n backgroundColor: active ? \"rgba(34,211,238,0.15)\" : \"rgba(0,0,0,0.7)\",\r\n border: active\r\n ? \"1px solid rgba(34,211,238,0.4)\"\r\n : \"1px solid rgba(255,255,255,0.1)\",\r\n borderRadius: 6,\r\n cursor: \"pointer\",\r\n fontSize: \"0.6875rem\", // 11px in rem\r\n color: active ? \"#22d3ee\" : \"#b8bcc8\", // WCAG: improved contrast from #71717a\r\n minWidth: 110,\r\n }}\r\n >\r\n <span aria-hidden=\"true\">\r\n <AstroIcon name={icon} size=\"extra-small\" label=\"\" />\r\n </span>\r\n <span>{label}</span>\r\n </button>\r\n );\r\n}\r\n\r\nfunction _OverpassLabel({\r\n overpass,\r\n index,\r\n}: {\r\n overpass: OverpassInfo;\r\n index: number;\r\n}) {\r\n return (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: 70 + index * 60,\r\n left: \"28%\",\r\n backgroundColor: \"rgba(0,0,0,0.85)\",\r\n color: \"#e4e4e7\",\r\n padding: \"8px 12px\",\r\n borderRadius: 6,\r\n fontSize: 11,\r\n fontFamily: \"ui-monospace, monospace\",\r\n border: \"1px solid rgba(34,211,238,0.3)\",\r\n pointerEvents: \"none\",\r\n }}\r\n >\r\n <div style={{ fontWeight: 500, marginBottom: 2 }}>\r\n {overpass.targetName}\r\n </div>\r\n <div style={{ color: \"#22d3ee\" }}>\r\n Overpass: {formatDuration(overpass.timeToOverpass)}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction ObjectLegend({\r\n currentView,\r\n satellites,\r\n stations,\r\n groundStations,\r\n onObjectClick,\r\n}: {\r\n currentView: string;\r\n satellites: any[];\r\n stations: any[];\r\n groundStations: any[];\r\n onObjectClick: (id: string, objectData: any) => void;\r\n}) {\r\n const [hoveredSection, setHoveredSection] = React.useState<string | null>(\r\n null,\r\n );\r\n const [pinnedSection, setPinnedSection] = React.useState<string | null>(null);\r\n\r\n // Show section if hovered OR pinned\r\n const isExpanded = (section: string) =>\r\n hoveredSection === section || pinnedSection === section;\r\n\r\n // Click toggles pin state\r\n const togglePin = (section: string) => {\r\n setPinnedSection((prev) => (prev === section ? null : section));\r\n };\r\n\r\n const sectionStyle: React.CSSProperties = {\r\n cursor: \"pointer\",\r\n padding: \"4px 0\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n transition: \"background-color 0.15s\",\r\n };\r\n\r\n const itemStyle: React.CSSProperties = {\r\n padding: \"3px 8px\",\r\n marginLeft: 12,\r\n cursor: \"pointer\",\r\n borderRadius: 4,\r\n fontSize: 10,\r\n color: \"#a1a1aa\",\r\n transition: \"all 0.15s\",\r\n };\r\n\r\n return (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: 12,\r\n right: 12,\r\n backgroundColor: \"rgba(0,0,0,0.85)\",\r\n color: \"#e4e4e7\",\r\n padding: \"10px 14px\",\r\n borderRadius: 8,\r\n fontSize: 11,\r\n fontFamily: \"ui-monospace, monospace\",\r\n minWidth: 160,\r\n maxHeight: 400,\r\n overflowY: \"auto\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n color: \"#b8bcc8\" /* WCAG: improved contrast */,\r\n fontSize: 10,\r\n marginBottom: 8,\r\n }}\r\n >\r\n {currentView === \"solar-system\" ? \"Solar System\" : \"Earth Orbit\"}\r\n </div>\r\n\r\n {satellites.length > 0 && (\r\n <div\r\n onMouseEnter={() => setHoveredSection(\"satellites\")}\r\n onMouseLeave={() => setHoveredSection(null)}\r\n >\r\n <div\r\n style={{\r\n ...sectionStyle,\r\n backgroundColor: isExpanded(\"satellites\")\r\n ? \"rgba(255,255,255,0.05)\"\r\n : \"transparent\",\r\n }}\r\n onClick={() => togglePin(\"satellites\")}\r\n >\r\n <span>\r\n <span style={{ color: \"#00ff88\" }}>●</span> {satellites.length}{\" \"}\r\n Satellites\r\n </span>\r\n <span\r\n style={{\r\n color: pinnedSection === \"satellites\" ? \"#00ff88\" : \"#666\",\r\n fontSize: 9,\r\n }}\r\n >\r\n {isExpanded(\"satellites\") ? \"▼\" : \"▶\"}\r\n {pinnedSection === \"satellites\" ? (\r\n <>\r\n <AstroIcon\r\n name=\"bookmark\"\r\n size=\"extra-small\"\r\n label=\"\"\r\n style={{ marginLeft: 4, verticalAlign: \"middle\" }}\r\n />\r\n </>\r\n ) : null}\r\n </span>\r\n </div>\r\n {isExpanded(\"satellites\") && (\r\n <div style={{ marginBottom: 4, paddingBottom: 4 }}>\r\n {satellites.map((sat) => (\r\n <div\r\n key={sat.id}\r\n style={itemStyle}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onObjectClick(sat.id, sat);\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor =\r\n \"rgba(0,255,136,0.15)\";\r\n e.currentTarget.style.color = \"#00ff88\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n e.currentTarget.style.color = \"#a1a1aa\";\r\n }}\r\n >\r\n {sat.name || sat.id}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {stations.length > 0 && (\r\n <div\r\n onMouseEnter={() => setHoveredSection(\"stations\")}\r\n onMouseLeave={() => setHoveredSection(null)}\r\n >\r\n <div\r\n style={{\r\n ...sectionStyle,\r\n backgroundColor: isExpanded(\"stations\")\r\n ? \"rgba(255,255,255,0.05)\"\r\n : \"transparent\",\r\n }}\r\n onClick={() => togglePin(\"stations\")}\r\n >\r\n <span>\r\n <span style={{ color: \"#ffd700\" }}>●</span> {stations.length}{\" \"}\r\n Stations\r\n </span>\r\n <span\r\n style={{\r\n color: pinnedSection === \"stations\" ? \"#ffd700\" : \"#666\",\r\n fontSize: 9,\r\n }}\r\n >\r\n {isExpanded(\"stations\") ? \"▼\" : \"▶\"}\r\n {pinnedSection === \"stations\" ? (\r\n <>\r\n <AstroIcon\r\n name=\"bookmark\"\r\n size=\"extra-small\"\r\n label=\"\"\r\n style={{ marginLeft: 4, verticalAlign: \"middle\" }}\r\n />\r\n </>\r\n ) : null}\r\n </span>\r\n </div>\r\n {isExpanded(\"stations\") && (\r\n <div style={{ marginBottom: 4, paddingBottom: 4 }}>\r\n {stations.map((st) => (\r\n <div\r\n key={st.id}\r\n style={itemStyle}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onObjectClick(st.id, st);\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor =\r\n \"rgba(255,215,0,0.15)\";\r\n e.currentTarget.style.color = \"#ffd700\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n e.currentTarget.style.color = \"#a1a1aa\";\r\n }}\r\n >\r\n {st.name || st.id}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {groundStations.length > 0 && (\r\n <div\r\n onMouseEnter={() => setHoveredSection(\"groundStations\")}\r\n onMouseLeave={() => setHoveredSection(null)}\r\n >\r\n <div\r\n style={{\r\n ...sectionStyle,\r\n backgroundColor: isExpanded(\"groundStations\")\r\n ? \"rgba(255,255,255,0.05)\"\r\n : \"transparent\",\r\n }}\r\n onClick={() => togglePin(\"groundStations\")}\r\n >\r\n <span>\r\n <span style={{ color: \"#00ffff\" }}>▲</span>{\" \"}\r\n {groundStations.length} Ground Stations\r\n </span>\r\n <span\r\n style={{\r\n color: pinnedSection === \"groundStations\" ? \"#00ffff\" : \"#666\",\r\n fontSize: 9,\r\n }}\r\n >\r\n {isExpanded(\"groundStations\") ? \"▼\" : \"▶\"}\r\n {pinnedSection === \"groundStations\" ? (\r\n <>\r\n <AstroIcon\r\n name=\"bookmark\"\r\n size=\"extra-small\"\r\n label=\"\"\r\n style={{ marginLeft: 4, verticalAlign: \"middle\" }}\r\n />\r\n </>\r\n ) : null}\r\n </span>\r\n </div>\r\n {isExpanded(\"groundStations\") && (\r\n <div style={{ marginBottom: 4, paddingBottom: 4 }}>\r\n {groundStations.map((gs) => (\r\n <div\r\n key={gs.id}\r\n style={itemStyle}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onObjectClick(gs.id, gs);\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor =\r\n \"rgba(0,255,255,0.15)\";\r\n e.currentTarget.style.color = \"#00ffff\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = \"transparent\";\r\n e.currentTarget.style.color = \"#a1a1aa\";\r\n }}\r\n >\r\n {gs.name || gs.id}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default ZenSpace3D;\r\n"],"mappings":"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"}
|