@zendir/ui 0.5.0 → 0.6.0
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 +20 -0
- 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 +312 -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 +217 -194
- 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 +419 -41
- 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,401 +1,508 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
2
|
+
//#region src/react/hooks/useSimulationScene.ts
|
|
3
|
+
/**
|
|
4
|
+
* @zendir/ui - useSimulationScene Hook
|
|
5
|
+
*
|
|
6
|
+
* Bridge between a `zendir-ts` `ZendirClient` and the `ZenSpace3D`
|
|
7
|
+
* Cesium component. On mount the hook calls `getSimulationStructure`
|
|
8
|
+
* to bucket simulation objects (spacecraft / ground stations) and then
|
|
9
|
+
* polls each spacecraft's `Position_BN_N` on a fixed interval, emitting
|
|
10
|
+
* ZenSpace3D-shaped state.
|
|
11
|
+
*
|
|
12
|
+
* Ground stations are resolved once per structure load (lat/lon is
|
|
13
|
+
* static — no ECI polling).
|
|
14
|
+
*
|
|
15
|
+
* Structure JSON may use `ID`/`id` and `Type`/`type` interchangeably;
|
|
16
|
+
* the walker accepts common variants. Call `refresh()` to re-fetch the
|
|
17
|
+
* structure (e.g. on a consumer-owned timer) so newly spawned objects
|
|
18
|
+
* appear without remounting.
|
|
19
|
+
*
|
|
20
|
+
* `referenceDate` is the wall-clock instant of the last successful tick
|
|
21
|
+
* — pass it to `<ZenSpace3D referenceTime={...} />` so ECI/J2000
|
|
22
|
+
* positions rotate to ECEF at the engine's "now".
|
|
23
|
+
*
|
|
24
|
+
* OPTIONAL DEPENDENCY: requires a `zendir-ts` client instance. The
|
|
25
|
+
* client is passed in to avoid coupling this hook to a specific
|
|
26
|
+
* session-management strategy (the consumer app owns sessions).
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Non-zero ECI placeholder (km) used until the first `Position_BN_N`
|
|
30
|
+
* poll lands. The 3D viewer expects ECI / J2000 km positions; the
|
|
31
|
+
* origin (0,0,0) sits at Earth's centre and would crash Cesium's
|
|
32
|
+
* `Cartesian3.normalize` with "normalized result is not a number".
|
|
33
|
+
*
|
|
34
|
+
* Value: ~400 km altitude on the +X axis (vernal-equinox direction).
|
|
35
|
+
* Renders just above the equator and is invisible after one tick.
|
|
36
|
+
*/
|
|
37
|
+
var PLACEHOLDER_SCENECRAFT_POSITION = {
|
|
38
|
+
x: 6771,
|
|
39
|
+
y: 0,
|
|
40
|
+
z: 0
|
|
7
41
|
};
|
|
8
|
-
|
|
9
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Per-tick retry config for the position-polling loop.
|
|
44
|
+
*
|
|
45
|
+
* The SDK defaults `getProperties` to `engineWarmup` (24 retries /
|
|
46
|
+
* ~3.6 min). That budget is right for a one-shot mount call, but
|
|
47
|
+
* disastrous for a 2-second polling tick — a single warmup blip would
|
|
48
|
+
* stall every subsequent tick (skip-if-busy guard) for minutes, freezing
|
|
49
|
+
* the viewer. We override with a tight 2-attempt budget that rides
|
|
50
|
+
* through quick blips (~1.5 s total) but cedes to the next tick fast.
|
|
51
|
+
*/
|
|
52
|
+
var TICK_RETRY = {
|
|
53
|
+
maxRetries: 2,
|
|
54
|
+
initialDelayMs: 500,
|
|
55
|
+
maxDelayMs: 1500
|
|
56
|
+
};
|
|
57
|
+
var DEFAULT_POLL_MS = 2e3;
|
|
58
|
+
var M_TO_KM = 1 / 1e3;
|
|
10
59
|
function useSimulationScene(options) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
error,
|
|
247
|
-
refresh,
|
|
248
|
-
referenceDate,
|
|
249
|
-
structureDiag,
|
|
250
|
-
positionTickDiag
|
|
251
|
-
};
|
|
60
|
+
const { client, containerId, simulationId, pollIntervalMs = DEFAULT_POLL_MS, enabled = true } = options;
|
|
61
|
+
const [satellites, setSatellites] = useState([]);
|
|
62
|
+
const [groundStations, setGroundStations] = useState([]);
|
|
63
|
+
const [celestialBodies, setCelestialBodies] = useState([]);
|
|
64
|
+
const [objects, setObjects] = useState([]);
|
|
65
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
66
|
+
const [error, setError] = useState(null);
|
|
67
|
+
const [referenceDate, setReferenceDate] = useState(() => /* @__PURE__ */ new Date());
|
|
68
|
+
const [structureDiag, setStructureDiag] = useState(null);
|
|
69
|
+
const [positionTickDiag, setPositionTickDiag] = useState(null);
|
|
70
|
+
const spacecraftIdsRef = useRef([]);
|
|
71
|
+
const celestialBodyIdsRef = useRef([]);
|
|
72
|
+
const celestialBodyNamesRef = useRef([]);
|
|
73
|
+
const intervalRef = useRef(null);
|
|
74
|
+
const abortRef = useRef(null);
|
|
75
|
+
const tickInFlightRef = useRef(false);
|
|
76
|
+
const positionPropsRef = useRef(null);
|
|
77
|
+
const tickPositions = useCallback(async (signal) => {
|
|
78
|
+
if (!client) return;
|
|
79
|
+
const ids = spacecraftIdsRef.current;
|
|
80
|
+
if (ids.length === 0) return;
|
|
81
|
+
if (tickInFlightRef.current) return;
|
|
82
|
+
tickInFlightRef.current = true;
|
|
83
|
+
try {
|
|
84
|
+
const propsToFetch = positionPropsRef.current;
|
|
85
|
+
const useFallbackAll = !propsToFetch || propsToFetch.length === 0;
|
|
86
|
+
const updates = await Promise.allSettled(ids.map((id) => useFallbackAll ? client.getAllProperties(id, containerId, {
|
|
87
|
+
signal,
|
|
88
|
+
retry: TICK_RETRY
|
|
89
|
+
}) : client.getProperties(id, propsToFetch, containerId, {
|
|
90
|
+
signal,
|
|
91
|
+
retry: TICK_RETRY
|
|
92
|
+
})));
|
|
93
|
+
if (signal.aborted) return;
|
|
94
|
+
let parsedOk = 0;
|
|
95
|
+
let parseFailed = 0;
|
|
96
|
+
let requestFailed = 0;
|
|
97
|
+
let firstResponseKeys = [];
|
|
98
|
+
let firstResponseSample = "";
|
|
99
|
+
for (let i = 0; i < ids.length; i++) {
|
|
100
|
+
const result = updates[i];
|
|
101
|
+
if (result.status !== "fulfilled") {
|
|
102
|
+
requestFailed += 1;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (i === 0) {
|
|
106
|
+
const v = result.value;
|
|
107
|
+
if (v && typeof v === "object") firstResponseKeys = Object.keys(v);
|
|
108
|
+
try {
|
|
109
|
+
const json = JSON.stringify(v);
|
|
110
|
+
firstResponseSample = json.length > 200 ? `${json.slice(0, 200)}…` : json;
|
|
111
|
+
} catch {
|
|
112
|
+
firstResponseSample = String(v);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (parsePositionVelocity(result.value)) parsedOk += 1;
|
|
116
|
+
else parseFailed += 1;
|
|
117
|
+
}
|
|
118
|
+
setPositionTickDiag({
|
|
119
|
+
attemptedAt: /* @__PURE__ */ new Date(),
|
|
120
|
+
requested: ids.length,
|
|
121
|
+
parsedOk,
|
|
122
|
+
parseFailed,
|
|
123
|
+
requestFailed,
|
|
124
|
+
requestedProps: useFallbackAll ? null : propsToFetch,
|
|
125
|
+
firstResponseKeys,
|
|
126
|
+
firstResponseSample
|
|
127
|
+
});
|
|
128
|
+
setSatellites((prev) => {
|
|
129
|
+
if (prev.length === 0) return prev;
|
|
130
|
+
const next = prev.slice();
|
|
131
|
+
for (let i = 0; i < ids.length; i++) {
|
|
132
|
+
const result = updates[i];
|
|
133
|
+
if (result.status !== "fulfilled") continue;
|
|
134
|
+
const idx = next.findIndex((sc) => sc.id === ids[i]);
|
|
135
|
+
if (idx < 0) continue;
|
|
136
|
+
const parsed = parsePositionVelocity(result.value);
|
|
137
|
+
if (!parsed) continue;
|
|
138
|
+
next[idx] = {
|
|
139
|
+
...next[idx],
|
|
140
|
+
position: parsed.position,
|
|
141
|
+
velocity: parsed.velocity
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
return next;
|
|
145
|
+
});
|
|
146
|
+
const celIds = celestialBodyIdsRef.current;
|
|
147
|
+
if (celIds.length > 0) {
|
|
148
|
+
const celResults = await Promise.allSettled(celIds.map((id) => client.getProperties(id, ["Position", "IsCentralBody"], containerId, {
|
|
149
|
+
signal,
|
|
150
|
+
retry: TICK_RETRY
|
|
151
|
+
})));
|
|
152
|
+
if (signal.aborted) return;
|
|
153
|
+
const next = [];
|
|
154
|
+
for (let i = 0; i < celIds.length; i++) {
|
|
155
|
+
const result = celResults[i];
|
|
156
|
+
if (result.status !== "fulfilled") continue;
|
|
157
|
+
const raw = result.value;
|
|
158
|
+
const obj = raw && typeof raw === "object" ? raw : null;
|
|
159
|
+
if (!obj) continue;
|
|
160
|
+
if (obj.IsCentralBody === true) continue;
|
|
161
|
+
const posVec = parseVec3(obj.Position);
|
|
162
|
+
if (!posVec) continue;
|
|
163
|
+
const positionKm = scaleVec(posVec, M_TO_KM);
|
|
164
|
+
const id = celIds[i];
|
|
165
|
+
const name = celestialBodyNamesRef.current[i] ?? `CelestialBody ${shortId(id)}`;
|
|
166
|
+
next.push({
|
|
167
|
+
id,
|
|
168
|
+
name,
|
|
169
|
+
position: positionKm
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
setCelestialBodies(next);
|
|
173
|
+
}
|
|
174
|
+
} catch {} finally {
|
|
175
|
+
tickInFlightRef.current = false;
|
|
176
|
+
if (!signal.aborted) setReferenceDate(/* @__PURE__ */ new Date());
|
|
177
|
+
}
|
|
178
|
+
}, [client, containerId]);
|
|
179
|
+
const loadStructure = useCallback(async (signal) => {
|
|
180
|
+
if (!client) return;
|
|
181
|
+
setIsLoading(true);
|
|
182
|
+
setError(null);
|
|
183
|
+
try {
|
|
184
|
+
const structure = await client.getSimulationStructure(simulationId, containerId, { signal });
|
|
185
|
+
if (signal.aborted) return;
|
|
186
|
+
setStructureDiag({
|
|
187
|
+
topLevelKeys: Object.keys(structure),
|
|
188
|
+
rawObjectCount: Array.isArray(structure.Objects) ? structure.Objects.length : Array.isArray(structure.objects) ? structure.objects.length : -1,
|
|
189
|
+
rawSystemCount: Array.isArray(structure.Systems) ? structure.Systems.length : Array.isArray(structure.systems) ? structure.systems.length : -1
|
|
190
|
+
});
|
|
191
|
+
const buckets = bucketStructure(structure);
|
|
192
|
+
spacecraftIdsRef.current = buckets.spacecraft.map((s) => s.id);
|
|
193
|
+
celestialBodyIdsRef.current = buckets.celestialBodyIds;
|
|
194
|
+
celestialBodyNamesRef.current = buckets.celestialBodyNames;
|
|
195
|
+
setSatellites(buckets.spacecraft);
|
|
196
|
+
setObjects(buckets.objects);
|
|
197
|
+
if (buckets.spacecraft.length > 0) try {
|
|
198
|
+
const probeId = buckets.spacecraft[0].id;
|
|
199
|
+
const all = await client.getAllProperties(probeId, containerId, { signal });
|
|
200
|
+
if (signal.aborted) return;
|
|
201
|
+
positionPropsRef.current = detectPositionPropertyNames(all);
|
|
202
|
+
} catch {
|
|
203
|
+
positionPropsRef.current = null;
|
|
204
|
+
}
|
|
205
|
+
else positionPropsRef.current = null;
|
|
206
|
+
const stationResults = await Promise.allSettled(buckets.groundStationIds.map((id) => client.getAllProperties(id, containerId, { signal })));
|
|
207
|
+
if (signal.aborted) return;
|
|
208
|
+
const stations = [];
|
|
209
|
+
for (let i = 0; i < buckets.groundStationIds.length; i++) {
|
|
210
|
+
const result = stationResults[i];
|
|
211
|
+
const id = buckets.groundStationIds[i];
|
|
212
|
+
const fallbackName = buckets.groundStationNames[i] ?? shortId(id);
|
|
213
|
+
if (result.status !== "fulfilled") {
|
|
214
|
+
stations.push({
|
|
215
|
+
id,
|
|
216
|
+
name: fallbackName,
|
|
217
|
+
latitude: 0,
|
|
218
|
+
longitude: 0
|
|
219
|
+
});
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
stations.push(toGroundStation(id, fallbackName, result.value));
|
|
223
|
+
}
|
|
224
|
+
setGroundStations(stations);
|
|
225
|
+
setIsLoading(false);
|
|
226
|
+
if (spacecraftIdsRef.current.length > 0) await tickPositions(signal);
|
|
227
|
+
} catch (err) {
|
|
228
|
+
if (signal.aborted) return;
|
|
229
|
+
setError(err instanceof Error ? err.message : "Failed to load simulation structure");
|
|
230
|
+
setIsLoading(false);
|
|
231
|
+
}
|
|
232
|
+
}, [
|
|
233
|
+
client,
|
|
234
|
+
containerId,
|
|
235
|
+
simulationId,
|
|
236
|
+
tickPositions
|
|
237
|
+
]);
|
|
238
|
+
useEffect(() => {
|
|
239
|
+
if (!client || !containerId || !simulationId) {
|
|
240
|
+
setIsLoading(false);
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
const controller = new AbortController();
|
|
244
|
+
abortRef.current = controller;
|
|
245
|
+
loadStructure(controller.signal);
|
|
246
|
+
return () => {
|
|
247
|
+
controller.abort();
|
|
248
|
+
if (abortRef.current === controller) abortRef.current = null;
|
|
249
|
+
};
|
|
250
|
+
}, [
|
|
251
|
+
client,
|
|
252
|
+
containerId,
|
|
253
|
+
simulationId,
|
|
254
|
+
loadStructure
|
|
255
|
+
]);
|
|
256
|
+
useEffect(() => {
|
|
257
|
+
if (!enabled || !client || error) {
|
|
258
|
+
if (intervalRef.current) {
|
|
259
|
+
clearInterval(intervalRef.current);
|
|
260
|
+
intervalRef.current = null;
|
|
261
|
+
}
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const interval = setInterval(() => {
|
|
265
|
+
const controller = new AbortController();
|
|
266
|
+
tickPositions(controller.signal).catch(() => void 0);
|
|
267
|
+
}, pollIntervalMs);
|
|
268
|
+
intervalRef.current = interval;
|
|
269
|
+
return () => {
|
|
270
|
+
clearInterval(interval);
|
|
271
|
+
if (intervalRef.current === interval) intervalRef.current = null;
|
|
272
|
+
};
|
|
273
|
+
}, [
|
|
274
|
+
client,
|
|
275
|
+
enabled,
|
|
276
|
+
error,
|
|
277
|
+
pollIntervalMs,
|
|
278
|
+
tickPositions
|
|
279
|
+
]);
|
|
280
|
+
return {
|
|
281
|
+
satellites,
|
|
282
|
+
groundStations,
|
|
283
|
+
celestialBodies,
|
|
284
|
+
objects,
|
|
285
|
+
isLoading,
|
|
286
|
+
error,
|
|
287
|
+
refresh: useCallback(async () => {
|
|
288
|
+
const controller = new AbortController();
|
|
289
|
+
await loadStructure(controller.signal);
|
|
290
|
+
}, [loadStructure]),
|
|
291
|
+
referenceDate,
|
|
292
|
+
structureDiag,
|
|
293
|
+
positionTickDiag
|
|
294
|
+
};
|
|
252
295
|
}
|
|
296
|
+
/**
|
|
297
|
+
* First non-empty string among PascalCase / camelCase keys for one logical field.
|
|
298
|
+
*/
|
|
253
299
|
function firstStringField(obj, keys) {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
return void 0;
|
|
300
|
+
for (const key of keys) {
|
|
301
|
+
const v = obj[key];
|
|
302
|
+
if (typeof v === "string" && v.length > 0) return v;
|
|
303
|
+
}
|
|
259
304
|
}
|
|
305
|
+
/**
|
|
306
|
+
* Walk a `GetSimulationStructure` response and bucket objects by Type.
|
|
307
|
+
*
|
|
308
|
+
* Tolerant of:
|
|
309
|
+
* - PascalCase (`Objects`, `Systems`, `Children`) and camelCase
|
|
310
|
+
* (`objects`, `systems`, `children`) — the engine has shipped both.
|
|
311
|
+
* - Objects nested at the top level, inside Systems children, or under
|
|
312
|
+
* any depth of `Children` / `children` arrays.
|
|
313
|
+
*/
|
|
260
314
|
function bucketStructure(structure) {
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
315
|
+
const out = {
|
|
316
|
+
spacecraft: [],
|
|
317
|
+
groundStationIds: [],
|
|
318
|
+
groundStationNames: [],
|
|
319
|
+
celestialBodyIds: [],
|
|
320
|
+
celestialBodyNames: [],
|
|
321
|
+
objects: []
|
|
322
|
+
};
|
|
323
|
+
const topObjects = pickArray(structure, ["Objects", "objects"]);
|
|
324
|
+
for (const obj of topObjects) walkObject(obj, out);
|
|
325
|
+
const topSystems = pickArray(structure, ["Systems", "systems"]);
|
|
326
|
+
for (const sys of topSystems) walkObject(sys, out);
|
|
327
|
+
return out;
|
|
274
328
|
}
|
|
329
|
+
/**
|
|
330
|
+
* Return the first non-empty array found under any of `keys` on `obj`.
|
|
331
|
+
* Allows the caller to tolerate PascalCase / camelCase top-level array keys
|
|
332
|
+
* without duplicating logic at every call site.
|
|
333
|
+
*/
|
|
275
334
|
function pickArray(obj, keys) {
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
335
|
+
for (const key of keys) {
|
|
336
|
+
const v = obj[key];
|
|
337
|
+
if (Array.isArray(v) && v.length > 0) return v;
|
|
338
|
+
}
|
|
339
|
+
for (const key of keys) {
|
|
340
|
+
const v = obj[key];
|
|
341
|
+
if (Array.isArray(v)) return v;
|
|
342
|
+
}
|
|
343
|
+
return [];
|
|
285
344
|
}
|
|
286
345
|
function walkObject(node, out) {
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
346
|
+
if (!node || typeof node !== "object") return;
|
|
347
|
+
const obj = node;
|
|
348
|
+
const id = firstStringField(obj, [
|
|
349
|
+
"ID",
|
|
350
|
+
"id",
|
|
351
|
+
"Id"
|
|
352
|
+
]);
|
|
353
|
+
const type = firstStringField(obj, ["Type", "type"]);
|
|
354
|
+
const name = firstStringField(obj, ["Name", "name"]);
|
|
355
|
+
if (id && type) {
|
|
356
|
+
if (type === "Spacecraft" || type.endsWith(".Spacecraft")) {
|
|
357
|
+
upsertObjectSummary(out, {
|
|
358
|
+
id,
|
|
359
|
+
name: name ?? `Spacecraft ${shortId(id)}`,
|
|
360
|
+
kind: "spacecraft"
|
|
361
|
+
});
|
|
362
|
+
out.spacecraft.push({
|
|
363
|
+
id,
|
|
364
|
+
name: name ?? `Spacecraft ${shortId(id)}`,
|
|
365
|
+
category: "satellite",
|
|
366
|
+
position: { ...PLACEHOLDER_SCENECRAFT_POSITION },
|
|
367
|
+
visualRadius: 50
|
|
368
|
+
});
|
|
369
|
+
} else if (type === "GroundStation" || type.endsWith(".GroundStation")) {
|
|
370
|
+
upsertObjectSummary(out, {
|
|
371
|
+
id,
|
|
372
|
+
name: name ?? `GroundStation ${shortId(id)}`,
|
|
373
|
+
kind: "groundStation"
|
|
374
|
+
});
|
|
375
|
+
out.groundStationIds.push(id);
|
|
376
|
+
out.groundStationNames.push(name);
|
|
377
|
+
} else if (type === "CelestialBody" || type.endsWith(".CelestialBody")) {
|
|
378
|
+
upsertObjectSummary(out, {
|
|
379
|
+
id,
|
|
380
|
+
name: name ?? `CelestialBody ${shortId(id)}`,
|
|
381
|
+
kind: "celestialBody"
|
|
382
|
+
});
|
|
383
|
+
out.celestialBodyIds.push(id);
|
|
384
|
+
out.celestialBodyNames.push(name);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
const children = pickArray(obj, ["Children", "children"]);
|
|
388
|
+
for (const child of children) walkObject(child, out);
|
|
326
389
|
}
|
|
327
390
|
function upsertObjectSummary(out, next) {
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
391
|
+
const idx = out.objects.findIndex((o) => o.id === next.id);
|
|
392
|
+
if (idx >= 0) {
|
|
393
|
+
out.objects[idx] = next;
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
out.objects.push(next);
|
|
334
397
|
}
|
|
398
|
+
/**
|
|
399
|
+
* Inspect a `getAllProperties` response and return the position property name
|
|
400
|
+
* this engine exposes on a spacecraft.
|
|
401
|
+
*
|
|
402
|
+
* Only position is probed — velocity is intentionally excluded. The engine's
|
|
403
|
+
* `/get` endpoint validates names more strictly than `getAllProperties`, and
|
|
404
|
+
* `Velocity_BN_N` exists in the probe response but triggers a 400 when passed
|
|
405
|
+
* to `getProperties`. Since velocity is optional (only position is used for
|
|
406
|
+
* rendering), we never request it in the polling tick.
|
|
407
|
+
*
|
|
408
|
+
* Returns at most one name — the first position candidate whose value parses
|
|
409
|
+
* as a 3-vector in the probe response.
|
|
410
|
+
*/
|
|
335
411
|
function detectPositionPropertyNames(props) {
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
412
|
+
for (const name of [
|
|
413
|
+
"Position_BN_N",
|
|
414
|
+
"Position",
|
|
415
|
+
"r_BN_N",
|
|
416
|
+
"r_N"
|
|
417
|
+
]) if (name in props && parseVec3(props[name]) !== null) return [name];
|
|
418
|
+
return [];
|
|
343
419
|
}
|
|
420
|
+
/**
|
|
421
|
+
* Engines have shipped two property-naming conventions for spacecraft state:
|
|
422
|
+
*
|
|
423
|
+
* - Basilisk-style ECI: `Position_BN_N`, `Velocity_BN_N` (m, m/s)
|
|
424
|
+
* - Shorter form: `Position`, `Velocity` (m, m/s)
|
|
425
|
+
*
|
|
426
|
+
* Both are in metres. ZenSpace3D's `Vector3D` is documented as km / km/s,
|
|
427
|
+
* so we scale by 1e-3. The first key that produces a parseable 3-vector wins.
|
|
428
|
+
*/
|
|
344
429
|
function parsePositionVelocity(raw) {
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
430
|
+
if (!raw || typeof raw !== "object") return null;
|
|
431
|
+
const obj = raw;
|
|
432
|
+
const position = parseVec3(obj.Position_BN_N) ?? parseVec3(obj.Position) ?? parseVec3(obj.position);
|
|
433
|
+
if (!position) return null;
|
|
434
|
+
if (position.x === 0 && position.y === 0 && position.z === 0) return null;
|
|
435
|
+
const velocity = parseVec3(obj.Velocity_BN_N) ?? parseVec3(obj.Velocity) ?? parseVec3(obj.velocity);
|
|
436
|
+
return {
|
|
437
|
+
position: scaleVec(position, M_TO_KM),
|
|
438
|
+
velocity: velocity ? scaleVec(velocity, M_TO_KM) : void 0
|
|
439
|
+
};
|
|
355
440
|
}
|
|
441
|
+
/**
|
|
442
|
+
* Accepts the engine's two known shapes for a 3-vector property:
|
|
443
|
+
* either a `[x, y, z]` array or an object with `X/Y/Z` keys (the
|
|
444
|
+
* gateway's JSON normalizer flips between the two depending on how
|
|
445
|
+
* the property is declared in the model).
|
|
446
|
+
*/
|
|
356
447
|
function parseVec3(raw) {
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
448
|
+
if (Array.isArray(raw) && raw.length >= 3) {
|
|
449
|
+
const [x, y, z] = raw;
|
|
450
|
+
if (typeof x === "number" && typeof y === "number" && typeof z === "number") return {
|
|
451
|
+
x,
|
|
452
|
+
y,
|
|
453
|
+
z
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
if (raw && typeof raw === "object") {
|
|
457
|
+
const obj = raw;
|
|
458
|
+
const x = obj.X ?? obj.x;
|
|
459
|
+
const y = obj.Y ?? obj.y;
|
|
460
|
+
const z = obj.Z ?? obj.z;
|
|
461
|
+
if (typeof x === "number" && typeof y === "number" && typeof z === "number") return {
|
|
462
|
+
x,
|
|
463
|
+
y,
|
|
464
|
+
z
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
return null;
|
|
373
468
|
}
|
|
374
469
|
function scaleVec(v, k) {
|
|
375
|
-
|
|
470
|
+
return {
|
|
471
|
+
x: v.x * k,
|
|
472
|
+
y: v.y * k,
|
|
473
|
+
z: v.z * k
|
|
474
|
+
};
|
|
376
475
|
}
|
|
377
476
|
function toGroundStation(id, fallbackName, props) {
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
477
|
+
const name = firstStringField(props, ["Name"]) ?? fallbackName;
|
|
478
|
+
const latitude = pickNumber(props, ["Latitude", "latitude"]) ?? 0;
|
|
479
|
+
const longitude = pickNumber(props, ["Longitude", "longitude"]) ?? 0;
|
|
480
|
+
const elevation = pickNumber(props, [
|
|
481
|
+
"Altitude",
|
|
482
|
+
"altitude",
|
|
483
|
+
"Elevation"
|
|
484
|
+
]);
|
|
485
|
+
const minElevation = pickNumber(props, ["MinElevation", "MinimumElevation"]);
|
|
486
|
+
const station = {
|
|
487
|
+
id,
|
|
488
|
+
name,
|
|
489
|
+
latitude,
|
|
490
|
+
longitude
|
|
491
|
+
};
|
|
492
|
+
if (elevation !== void 0) station.elevation = elevation;
|
|
493
|
+
if (minElevation !== void 0) station.minElevation = minElevation;
|
|
494
|
+
return station;
|
|
387
495
|
}
|
|
388
496
|
function pickNumber(obj, keys) {
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
return void 0;
|
|
497
|
+
for (const key of keys) {
|
|
498
|
+
const v = obj[key];
|
|
499
|
+
if (typeof v === "number" && Number.isFinite(v)) return v;
|
|
500
|
+
}
|
|
394
501
|
}
|
|
395
502
|
function shortId(id) {
|
|
396
|
-
|
|
503
|
+
return id.length > 8 ? id.slice(0, 8) : id;
|
|
397
504
|
}
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
//# sourceMappingURL=useSimulationScene.js.map
|
|
505
|
+
//#endregion
|
|
506
|
+
export { useSimulationScene as default, useSimulationScene };
|
|
507
|
+
|
|
508
|
+
//# sourceMappingURL=useSimulationScene.js.map
|