@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,184 +1,227 @@
|
|
|
1
|
-
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
-
import { memo, useCallback } from "react";
|
|
3
1
|
import { useThemeTokens } from "../theme/ThemeProvider.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
2
|
+
import { memo, useCallback } from "react";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
//#region src/react/panels/LayerControlPanel.tsx
|
|
5
|
+
/**
|
|
6
|
+
* @zendir/ui - LayerControlPanel
|
|
7
|
+
*
|
|
8
|
+
* Floating layer-toggle panel for the 3D viewer (mirrors the
|
|
9
|
+
* `MapLayerDef` pattern from `<GroundTrackMap />`). Three sections:
|
|
10
|
+
*
|
|
11
|
+
* 1. Render flags — labels / coverage / orbits (HOW objects draw)
|
|
12
|
+
* 2. Object groups — spacecraft / GS / celestial (WHICH objects draw)
|
|
13
|
+
* 3. Custom layers — app-defined overlays (caller renders them)
|
|
14
|
+
*
|
|
15
|
+
* The panel is **toggle UI only**. It emits `onChange` callbacks; the
|
|
16
|
+
* consumer wires them to `<ZenSpace3D layers={...} visibility={...} />`
|
|
17
|
+
* (or to its own overlay state for custom layers). Same contract as
|
|
18
|
+
* `MapLayerDef` — keeps the panel reusable and the renderer
|
|
19
|
+
* untouched.
|
|
20
|
+
*
|
|
21
|
+
* ```tsx
|
|
22
|
+
* const [layers, setLayers] = useState({ orbits: true, labels: false, coverage: false });
|
|
23
|
+
* const [visibility, setVisibility] = useState({
|
|
24
|
+
* spacecraft: true, groundStations: true, celestialBodies: true,
|
|
25
|
+
* });
|
|
26
|
+
* const [customLayers, setCustomLayers] = useState<Record<string, boolean>>({ rf: false });
|
|
27
|
+
*
|
|
28
|
+
* <ZenSpace3D layers={layers} visibility={visibility} ... />
|
|
29
|
+
* <LayerControlPanel
|
|
30
|
+
* layers={layers}
|
|
31
|
+
* visibility={visibility}
|
|
32
|
+
* customLayers={[{ id: 'rf', label: 'RF Coverage' }]}
|
|
33
|
+
* customLayerState={customLayers}
|
|
34
|
+
* groupCounts={{ spacecraft: scene.satellites.length, ... }}
|
|
35
|
+
* onLayersChange={setLayers}
|
|
36
|
+
* onVisibilityChange={setVisibility}
|
|
37
|
+
* onCustomLayerChange={(id, on) => setCustomLayers((c) => ({ ...c, [id]: on }))}
|
|
38
|
+
* />
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
var LayerControlPanel = memo(function LayerControlPanel({ layers, onLayersChange, visibility, onVisibilityChange, groupCounts, customLayers, customLayerState, onCustomLayerChange, position = "top-right", offset, hidden = false, style, hideRenderFlags = false, hideGroups = false, hideCustomLayers = false }) {
|
|
42
|
+
const tokens = useThemeTokens();
|
|
43
|
+
const showLabels = layers?.labels === true;
|
|
44
|
+
const showCoverage = layers?.coverage === true;
|
|
45
|
+
const showOrbits = layers?.orbits !== false;
|
|
46
|
+
const showSpacecraft = visibility?.spacecraft !== false;
|
|
47
|
+
const showGroundStations = visibility?.groundStations !== false;
|
|
48
|
+
const showCelestialBodies = visibility?.celestialBodies !== false;
|
|
49
|
+
const toggleLayer = useCallback((key) => {
|
|
50
|
+
if (!onLayersChange) return;
|
|
51
|
+
const current = key === "orbits" ? showOrbits : key === "labels" ? showLabels : showCoverage;
|
|
52
|
+
onLayersChange({
|
|
53
|
+
...layers ?? {},
|
|
54
|
+
[key]: !current
|
|
55
|
+
});
|
|
56
|
+
}, [
|
|
57
|
+
layers,
|
|
58
|
+
onLayersChange,
|
|
59
|
+
showLabels,
|
|
60
|
+
showCoverage,
|
|
61
|
+
showOrbits
|
|
62
|
+
]);
|
|
63
|
+
const toggleVisibility = useCallback((key) => {
|
|
64
|
+
if (!onVisibilityChange) return;
|
|
65
|
+
const current = key === "spacecraft" ? showSpacecraft : key === "groundStations" ? showGroundStations : showCelestialBodies;
|
|
66
|
+
onVisibilityChange({
|
|
67
|
+
...visibility ?? {},
|
|
68
|
+
[key]: !current
|
|
69
|
+
});
|
|
70
|
+
}, [
|
|
71
|
+
visibility,
|
|
72
|
+
onVisibilityChange,
|
|
73
|
+
showSpacecraft,
|
|
74
|
+
showGroundStations,
|
|
75
|
+
showCelestialBodies
|
|
76
|
+
]);
|
|
77
|
+
const offX = offset?.x ?? 16;
|
|
78
|
+
const offY = offset?.y ?? 16;
|
|
79
|
+
const anchor = (() => {
|
|
80
|
+
switch (position) {
|
|
81
|
+
case "top-left": return {
|
|
82
|
+
top: offY,
|
|
83
|
+
left: offX
|
|
84
|
+
};
|
|
85
|
+
case "bottom-left": return {
|
|
86
|
+
bottom: offY,
|
|
87
|
+
left: offX
|
|
88
|
+
};
|
|
89
|
+
case "bottom-right": return {
|
|
90
|
+
bottom: offY,
|
|
91
|
+
right: offX
|
|
92
|
+
};
|
|
93
|
+
default: return {
|
|
94
|
+
top: offY,
|
|
95
|
+
right: offX
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
})();
|
|
99
|
+
if (hidden) return null;
|
|
100
|
+
const showRender = !hideRenderFlags && onLayersChange != null;
|
|
101
|
+
const showGroupsSection = !hideGroups && onVisibilityChange != null;
|
|
102
|
+
const showCustom = !hideCustomLayers && (customLayers?.length ?? 0) > 0;
|
|
103
|
+
if (!showRender && !showGroupsSection && !showCustom) return null;
|
|
104
|
+
const cnt = (n) => typeof n === "number" ? ` (${n})` : "";
|
|
105
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
106
|
+
"data-testid": "zendir-layer-control",
|
|
107
|
+
style: {
|
|
108
|
+
position: "absolute",
|
|
109
|
+
zIndex: 2,
|
|
110
|
+
display: "flex",
|
|
111
|
+
flexDirection: "column",
|
|
112
|
+
gap: 6,
|
|
113
|
+
padding: tokens.spacing.sm,
|
|
114
|
+
borderRadius: tokens.borderRadius?.md ?? 6,
|
|
115
|
+
border: "1px solid rgba(255,255,255,0.12)",
|
|
116
|
+
background: "rgba(0,0,0,0.72)",
|
|
117
|
+
color: tokens.colors.text.primary,
|
|
118
|
+
fontSize: tokens.typography.fontSize.xs,
|
|
119
|
+
lineHeight: 1.2,
|
|
120
|
+
...anchor,
|
|
121
|
+
...style
|
|
122
|
+
},
|
|
123
|
+
children: [
|
|
124
|
+
showRender && /* @__PURE__ */ jsxs(Section, {
|
|
125
|
+
title: "Render",
|
|
126
|
+
children: [
|
|
127
|
+
/* @__PURE__ */ jsx(Toggle, {
|
|
128
|
+
label: "Orbits",
|
|
129
|
+
active: showOrbits,
|
|
130
|
+
onClick: () => toggleLayer("orbits")
|
|
131
|
+
}),
|
|
132
|
+
/* @__PURE__ */ jsx(Toggle, {
|
|
133
|
+
label: "Labels",
|
|
134
|
+
active: showLabels,
|
|
135
|
+
onClick: () => toggleLayer("labels")
|
|
136
|
+
}),
|
|
137
|
+
/* @__PURE__ */ jsx(Toggle, {
|
|
138
|
+
label: "Coverage",
|
|
139
|
+
active: showCoverage,
|
|
140
|
+
onClick: () => toggleLayer("coverage")
|
|
141
|
+
})
|
|
142
|
+
]
|
|
143
|
+
}),
|
|
144
|
+
showGroupsSection && /* @__PURE__ */ jsxs(Section, {
|
|
145
|
+
title: "Objects",
|
|
146
|
+
children: [
|
|
147
|
+
/* @__PURE__ */ jsx(Toggle, {
|
|
148
|
+
label: `Spacecraft${cnt(groupCounts?.spacecraft)}`,
|
|
149
|
+
active: showSpacecraft,
|
|
150
|
+
onClick: () => toggleVisibility("spacecraft")
|
|
151
|
+
}),
|
|
152
|
+
/* @__PURE__ */ jsx(Toggle, {
|
|
153
|
+
label: `Ground Stations${cnt(groupCounts?.groundStations)}`,
|
|
154
|
+
active: showGroundStations,
|
|
155
|
+
onClick: () => toggleVisibility("groundStations")
|
|
156
|
+
}),
|
|
157
|
+
/* @__PURE__ */ jsx(Toggle, {
|
|
158
|
+
label: `Celestial${cnt(groupCounts?.celestialBodies)}`,
|
|
159
|
+
active: showCelestialBodies,
|
|
160
|
+
onClick: () => toggleVisibility("celestialBodies")
|
|
161
|
+
})
|
|
162
|
+
]
|
|
163
|
+
}),
|
|
164
|
+
showCustom && /* @__PURE__ */ jsx(Section, {
|
|
165
|
+
title: "Overlays",
|
|
166
|
+
children: (customLayers ?? []).map((layer) => /* @__PURE__ */ jsx(Toggle, {
|
|
167
|
+
label: layer.label,
|
|
168
|
+
active: customLayerState?.[layer.id] ?? layer.defaultEnabled ?? false,
|
|
169
|
+
onClick: () => {
|
|
170
|
+
const current = customLayerState?.[layer.id] ?? layer.defaultEnabled ?? false;
|
|
171
|
+
onCustomLayerChange?.(layer.id, !current);
|
|
172
|
+
}
|
|
173
|
+
}, layer.id))
|
|
174
|
+
})
|
|
175
|
+
]
|
|
176
|
+
});
|
|
133
177
|
});
|
|
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
|
-
const tokens = useThemeTokens();
|
|
160
|
-
return /* @__PURE__ */ jsx(
|
|
161
|
-
"button",
|
|
162
|
-
{
|
|
163
|
-
type: "button",
|
|
164
|
-
onClick,
|
|
165
|
-
"aria-pressed": active,
|
|
166
|
-
style: {
|
|
167
|
-
padding: `${tokens.spacing.xs}px ${tokens.spacing.sm}px`,
|
|
168
|
-
borderRadius: ((_a = tokens.borderRadius) == null ? void 0 : _a.sm) ?? 4,
|
|
169
|
-
background: active ? "rgba(100,200,255,0.2)" : "rgba(0,0,0,0.6)",
|
|
170
|
-
border: `1px solid ${active ? "rgba(100,200,255,0.6)" : "rgba(255,255,255,0.15)"}`,
|
|
171
|
-
color: active ? "rgba(100,200,255,1)" : tokens.colors.text.secondary,
|
|
172
|
-
fontSize: tokens.typography.fontSize.xs,
|
|
173
|
-
cursor: "pointer",
|
|
174
|
-
letterSpacing: 0.3,
|
|
175
|
-
textAlign: "left"
|
|
176
|
-
},
|
|
177
|
-
children: label
|
|
178
|
-
}
|
|
179
|
-
);
|
|
178
|
+
var Section = ({ title, children }) => {
|
|
179
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
180
|
+
style: {
|
|
181
|
+
display: "flex",
|
|
182
|
+
flexDirection: "column",
|
|
183
|
+
gap: 4
|
|
184
|
+
},
|
|
185
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
186
|
+
style: {
|
|
187
|
+
opacity: .6,
|
|
188
|
+
fontSize: "0.85em",
|
|
189
|
+
textTransform: "uppercase",
|
|
190
|
+
letterSpacing: .5,
|
|
191
|
+
color: useThemeTokens().colors.text.secondary
|
|
192
|
+
},
|
|
193
|
+
children: title
|
|
194
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
195
|
+
style: {
|
|
196
|
+
display: "flex",
|
|
197
|
+
flexDirection: "column",
|
|
198
|
+
gap: 4
|
|
199
|
+
},
|
|
200
|
+
children
|
|
201
|
+
})]
|
|
202
|
+
});
|
|
180
203
|
};
|
|
181
|
-
|
|
182
|
-
|
|
204
|
+
var Toggle = ({ label, active, onClick }) => {
|
|
205
|
+
const tokens = useThemeTokens();
|
|
206
|
+
return /* @__PURE__ */ jsx("button", {
|
|
207
|
+
type: "button",
|
|
208
|
+
onClick,
|
|
209
|
+
"aria-pressed": active,
|
|
210
|
+
style: {
|
|
211
|
+
padding: `${tokens.spacing.xs}px ${tokens.spacing.sm}px`,
|
|
212
|
+
borderRadius: tokens.borderRadius?.sm ?? 4,
|
|
213
|
+
background: active ? "rgba(100,200,255,0.2)" : "rgba(0,0,0,0.6)",
|
|
214
|
+
border: `1px solid ${active ? "rgba(100,200,255,0.6)" : "rgba(255,255,255,0.15)"}`,
|
|
215
|
+
color: active ? "rgba(100,200,255,1)" : tokens.colors.text.secondary,
|
|
216
|
+
fontSize: tokens.typography.fontSize.xs,
|
|
217
|
+
cursor: "pointer",
|
|
218
|
+
letterSpacing: .3,
|
|
219
|
+
textAlign: "left"
|
|
220
|
+
},
|
|
221
|
+
children: label
|
|
222
|
+
});
|
|
183
223
|
};
|
|
184
|
-
//#
|
|
224
|
+
//#endregion
|
|
225
|
+
export { LayerControlPanel, LayerControlPanel as default };
|
|
226
|
+
|
|
227
|
+
//# sourceMappingURL=LayerControlPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LayerControlPanel.js","sources":["../../../src/react/panels/LayerControlPanel.tsx"],"sourcesContent":["/**\n * @zendir/ui - LayerControlPanel\n *\n * Floating layer-toggle panel for the 3D viewer (mirrors the\n * `MapLayerDef` pattern from `<GroundTrackMap />`). Three sections:\n *\n * 1. Render flags — labels / coverage / orbits (HOW objects draw)\n * 2. Object groups — spacecraft / GS / celestial (WHICH objects draw)\n * 3. Custom layers — app-defined overlays (caller renders them)\n *\n * The panel is **toggle UI only**. It emits `onChange` callbacks; the\n * consumer wires them to `<ZenSpace3D layers={...} visibility={...} />`\n * (or to its own overlay state for custom layers). Same contract as\n * `MapLayerDef` — keeps the panel reusable and the renderer\n * untouched.\n *\n * ```tsx\n * const [layers, setLayers] = useState({ orbits: true, labels: false, coverage: false });\n * const [visibility, setVisibility] = useState({\n * spacecraft: true, groundStations: true, celestialBodies: true,\n * });\n * const [customLayers, setCustomLayers] = useState<Record<string, boolean>>({ rf: false });\n *\n * <ZenSpace3D layers={layers} visibility={visibility} ... />\n * <LayerControlPanel\n * layers={layers}\n * visibility={visibility}\n * customLayers={[{ id: 'rf', label: 'RF Coverage' }]}\n * customLayerState={customLayers}\n * groupCounts={{ spacecraft: scene.satellites.length, ... }}\n * onLayersChange={setLayers}\n * onVisibilityChange={setVisibility}\n * onCustomLayerChange={(id, on) => setCustomLayers((c) => ({ ...c, [id]: on }))}\n * />\n * ```\n */\n\nimport { memo, useCallback } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { useThemeTokens } from '../theme/ThemeProvider';\nimport type { LayerDef } from '../types';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/** Render-flag layers — passed straight through to `<ZenSpace3D layers={...} />`. */\nexport interface RenderLayers {\n labels?: boolean;\n coverage?: boolean;\n orbits?: boolean;\n}\n\n/** Object-group visibility — passed straight through to `<ZenSpace3D visibility={...} />`. */\nexport interface GroupVisibility {\n spacecraft?: boolean;\n groundStations?: boolean;\n celestialBodies?: boolean;\n}\n\n/** Counts shown in the group toggles (\"Spacecraft (5)\"). All optional. */\nexport interface GroupCounts {\n spacecraft?: number;\n groundStations?: number;\n celestialBodies?: number;\n}\n\nexport interface LayerControlPanelProps {\n // ─── Render flags ─────────────────────────────────────────────────────────\n /** Current render-flag state. Each key defaults to: orbits=on, labels=off, coverage=off. */\n layers?: RenderLayers;\n /** Called with the next render-flag state when any toggle is clicked. */\n onLayersChange?: (next: RenderLayers) => void;\n\n // ─── Object-group visibility ──────────────────────────────────────────────\n /** Current group-visibility state. Each key defaults to true (visible). */\n visibility?: GroupVisibility;\n /** Called with the next visibility state when any toggle is clicked. */\n onVisibilityChange?: (next: GroupVisibility) => void;\n /** Counts to render in group toggle labels (e.g. \"Spacecraft (5)\"). */\n groupCounts?: GroupCounts;\n\n // ─── Custom layers (app-defined overlays) ─────────────────────────────────\n /** App-defined layer toggles. The panel only renders the toggle UI. */\n customLayers?: LayerDef[];\n /** Current state of each custom layer (id → on/off). */\n customLayerState?: Record<string, boolean>;\n /** Fires when a custom layer is toggled. The consumer renders the overlay itself. */\n onCustomLayerChange?: (id: string, enabled: boolean) => void;\n\n // ─── Layout / theming ─────────────────────────────────────────────────────\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n offset?: { x?: number; y?: number };\n hidden?: boolean;\n style?: CSSProperties;\n\n /** Hide the render-flags section (`true` to suppress). */\n hideRenderFlags?: boolean;\n /** Hide the object-group section. */\n hideGroups?: boolean;\n /** Hide the custom-layers section even if `customLayers` is non-empty. */\n hideCustomLayers?: boolean;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport const LayerControlPanel = memo(function LayerControlPanel({\n layers,\n onLayersChange,\n visibility,\n onVisibilityChange,\n groupCounts,\n customLayers,\n customLayerState,\n onCustomLayerChange,\n position = 'top-right',\n offset,\n hidden = false,\n style,\n hideRenderFlags = false,\n hideGroups = false,\n hideCustomLayers = false,\n}: LayerControlPanelProps) {\n const tokens = useThemeTokens();\n\n // Default render-flag state — matches ZenSpace3D's defaults.\n const showLabels = layers?.labels === true;\n const showCoverage = layers?.coverage === true;\n const showOrbits = layers?.orbits !== false;\n\n // Default group-visibility — matches ZenSpace3D's defaults (everything on).\n const showSpacecraft = visibility?.spacecraft !== false;\n const showGroundStations = visibility?.groundStations !== false;\n const showCelestialBodies = visibility?.celestialBodies !== false;\n\n const toggleLayer = useCallback(\n (key: keyof RenderLayers) => {\n if (!onLayersChange) return;\n const current =\n key === 'orbits'\n ? showOrbits\n : key === 'labels'\n ? showLabels\n : showCoverage;\n onLayersChange({ ...(layers ?? {}), [key]: !current });\n },\n [layers, onLayersChange, showLabels, showCoverage, showOrbits],\n );\n\n const toggleVisibility = useCallback(\n (key: keyof GroupVisibility) => {\n if (!onVisibilityChange) return;\n const current =\n key === 'spacecraft'\n ? showSpacecraft\n : key === 'groundStations'\n ? showGroundStations\n : showCelestialBodies;\n onVisibilityChange({ ...(visibility ?? {}), [key]: !current });\n },\n [visibility, onVisibilityChange, showSpacecraft, showGroundStations, showCelestialBodies],\n );\n\n const offX = offset?.x ?? 16;\n const offY = offset?.y ?? 16;\n const anchor: CSSProperties = (() => {\n switch (position) {\n case 'top-left': return { top: offY, left: offX };\n case 'bottom-left': return { bottom: offY, left: offX };\n case 'bottom-right': return { bottom: offY, right: offX };\n case 'top-right':\n default: return { top: offY, right: offX };\n }\n })();\n\n if (hidden) return null;\n\n const showRender = !hideRenderFlags && onLayersChange != null;\n const showGroupsSection = !hideGroups && onVisibilityChange != null;\n const showCustom = !hideCustomLayers && (customLayers?.length ?? 0) > 0;\n\n if (!showRender && !showGroupsSection && !showCustom) return null;\n\n const cnt = (n: number | undefined) =>\n typeof n === 'number' ? ` (${n})` : '';\n\n return (\n <div\n data-testid=\"zendir-layer-control\"\n style={{\n position: 'absolute',\n zIndex: 2,\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n padding: tokens.spacing.sm,\n borderRadius: tokens.borderRadius?.md ?? 6,\n border: '1px solid rgba(255,255,255,0.12)',\n background: 'rgba(0,0,0,0.72)',\n color: tokens.colors.text.primary,\n fontSize: tokens.typography.fontSize.xs,\n lineHeight: 1.2,\n ...anchor,\n ...style,\n }}\n >\n {showRender && (\n <Section title=\"Render\">\n <Toggle label=\"Orbits\" active={showOrbits} onClick={() => toggleLayer('orbits')} />\n <Toggle label=\"Labels\" active={showLabels} onClick={() => toggleLayer('labels')} />\n <Toggle label=\"Coverage\" active={showCoverage} onClick={() => toggleLayer('coverage')} />\n </Section>\n )}\n\n {showGroupsSection && (\n <Section title=\"Objects\">\n <Toggle\n label={`Spacecraft${cnt(groupCounts?.spacecraft)}`}\n active={showSpacecraft}\n onClick={() => toggleVisibility('spacecraft')}\n />\n <Toggle\n label={`Ground Stations${cnt(groupCounts?.groundStations)}`}\n active={showGroundStations}\n onClick={() => toggleVisibility('groundStations')}\n />\n <Toggle\n label={`Celestial${cnt(groupCounts?.celestialBodies)}`}\n active={showCelestialBodies}\n onClick={() => toggleVisibility('celestialBodies')}\n />\n </Section>\n )}\n\n {showCustom && (\n <Section title=\"Overlays\">\n {(customLayers ?? []).map((layer) => (\n <Toggle\n key={layer.id}\n label={layer.label}\n active={\n customLayerState?.[layer.id] ??\n layer.defaultEnabled ??\n false\n }\n onClick={() => {\n const current =\n customLayerState?.[layer.id] ??\n layer.defaultEnabled ??\n false;\n onCustomLayerChange?.(layer.id, !current);\n }}\n />\n ))}\n </Section>\n )}\n </div>\n );\n});\n\n// ─── Sub-components ───────────────────────────────────────────────────────────\n\nconst Section = ({ title, children }: { title: string; children: ReactNode }) => {\n const tokens = useThemeTokens();\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n <div\n style={{\n opacity: 0.6,\n fontSize: '0.85em',\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n color: tokens.colors.text.secondary,\n }}\n >\n {title}\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>{children}</div>\n </div>\n );\n};\n\nconst Toggle = ({\n label,\n active,\n onClick,\n}: {\n label: string;\n active: boolean;\n onClick: () => void;\n}) => {\n const tokens = useThemeTokens();\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-pressed={active}\n style={{\n padding: `${tokens.spacing.xs}px ${tokens.spacing.sm}px`,\n borderRadius: tokens.borderRadius?.sm ?? 4,\n background: active ? 'rgba(100,200,255,0.2)' : 'rgba(0,0,0,0.6)',\n border: `1px solid ${active ? 'rgba(100,200,255,0.6)' : 'rgba(255,255,255,0.15)'}`,\n color: active ? 'rgba(100,200,255,1)' : tokens.colors.text.secondary,\n fontSize: tokens.typography.fontSize.xs,\n cursor: 'pointer',\n letterSpacing: 0.3,\n textAlign: 'left',\n }}\n >\n {label}\n </button>\n );\n};\n\nexport default LayerControlPanel;\n"],"names":["LayerControlPanel"],"mappings":";;;AAwGO,MAAM,oBAAoB,KAAK,SAASA,mBAAkB;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,mBAAmB;AACrB,GAA2B;;AACzB,QAAM,SAAS,eAAA;AAGf,QAAM,cAAe,iCAAQ,YAAa;AAC1C,QAAM,gBAAe,iCAAQ,cAAa;AAC1C,QAAM,cAAe,iCAAQ,YAAa;AAG1C,QAAM,kBAAsB,yCAAY,gBAAoB;AAC5D,QAAM,sBAAsB,yCAAY,oBAAoB;AAC5D,QAAM,uBAAsB,yCAAY,qBAAoB;AAE5D,QAAM,cAAc;AAAA,IAClB,CAAC,QAA4B;AAC3B,UAAI,CAAC,eAAgB;AACrB,YAAM,UACJ,QAAQ,WACJ,aACA,QAAQ,WACN,aACA;AACR,qBAAe,EAAE,GAAI,UAAU,CAAA,GAAK,CAAC,GAAG,GAAG,CAAC,SAAS;AAAA,IACvD;AAAA,IACA,CAAC,QAAQ,gBAAgB,YAAY,cAAc,UAAU;AAAA,EAAA;AAG/D,QAAM,mBAAmB;AAAA,IACvB,CAAC,QAA+B;AAC9B,UAAI,CAAC,mBAAoB;AACzB,YAAM,UACJ,QAAQ,eACJ,iBACA,QAAQ,mBACN,qBACA;AACR,yBAAmB,EAAE,GAAI,cAAc,CAAA,GAAK,CAAC,GAAG,GAAG,CAAC,SAAS;AAAA,IAC/D;AAAA,IACA,CAAC,YAAY,oBAAoB,gBAAgB,oBAAoB,mBAAmB;AAAA,EAAA;AAG1F,QAAM,QAAO,iCAAQ,MAAK;AAC1B,QAAM,QAAO,iCAAQ,MAAK;AAC1B,QAAM,UAAyB,MAAM;AACnC,YAAQ,UAAA;AAAA,MACN,KAAK;AAAgB,eAAO,EAAE,KAAK,MAAM,MAAM,KAAA;AAAA,MAC/C,KAAK;AAAgB,eAAO,EAAE,QAAQ,MAAM,MAAM,KAAA;AAAA,MAClD,KAAK;AAAgB,eAAO,EAAE,QAAQ,MAAM,OAAO,KAAA;AAAA,MACnD,KAAK;AAAA,MACL;AAAqB,eAAO,EAAE,KAAK,MAAM,OAAO,KAAA;AAAA,IAAK;AAAA,EAEzD,GAAA;AAEA,MAAI,OAAQ,QAAO;AAEnB,QAAM,aAAa,CAAC,mBAAmB,kBAAkB;AACzD,QAAM,oBAAoB,CAAC,cAAc,sBAAsB;AAC/D,QAAM,aAAa,CAAC,sBAAqB,6CAAc,WAAU,KAAK;AAEtE,MAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,WAAY,QAAO;AAE7D,QAAM,MAAM,CAAC,MACX,OAAO,MAAM,WAAW,KAAK,CAAC,MAAM;AAEtC,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAY;AAAA,MACZ,OAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,eAAe;AAAA,QACf,KAAK;AAAA,QACL,SAAS,OAAO,QAAQ;AAAA,QACxB,gBAAc,YAAO,iBAAP,mBAAqB,OAAM;AAAA,QACzC,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,OAAO,OAAO,OAAO,KAAK;AAAA,QAC1B,UAAU,OAAO,WAAW,SAAS;AAAA,QACrC,YAAY;AAAA,QACZ,GAAG;AAAA,QACH,GAAG;AAAA,MAAA;AAAA,MAGJ,UAAA;AAAA,QAAA,cACC,qBAAC,SAAA,EAAQ,OAAM,UACb,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAO,OAAM,UAAW,QAAQ,YAAc,SAAS,MAAM,YAAY,QAAQ,EAAA,CAAG;AAAA,UACrF,oBAAC,QAAA,EAAO,OAAM,UAAW,QAAQ,YAAc,SAAS,MAAM,YAAY,QAAQ,EAAA,CAAG;AAAA,UACrF,oBAAC,QAAA,EAAO,OAAM,YAAW,QAAQ,cAAc,SAAS,MAAM,YAAY,UAAU,EAAA,CAAG;AAAA,QAAA,GACzF;AAAA,QAGD,qBACC,qBAAC,SAAA,EAAQ,OAAM,WACb,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO,aAAa,IAAI,2CAAa,UAAU,CAAC;AAAA,cAChD,QAAQ;AAAA,cACR,SAAS,MAAM,iBAAiB,YAAY;AAAA,YAAA;AAAA,UAAA;AAAA,UAE9C;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO,kBAAkB,IAAI,2CAAa,cAAc,CAAC;AAAA,cACzD,QAAQ;AAAA,cACR,SAAS,MAAM,iBAAiB,gBAAgB;AAAA,YAAA;AAAA,UAAA;AAAA,UAElD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO,YAAY,IAAI,2CAAa,eAAe,CAAC;AAAA,cACpD,QAAQ;AAAA,cACR,SAAS,MAAM,iBAAiB,iBAAiB;AAAA,YAAA;AAAA,UAAA;AAAA,QACnD,GACF;AAAA,QAGD,cACC,oBAAC,SAAA,EAAQ,OAAM,YACX,2BAAgB,CAAA,GAAI,IAAI,CAAC,UACzB;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,OAAO,MAAM;AAAA,YACb,SACE,qDAAmB,MAAM,QACzB,MAAM,kBACN;AAAA,YAEF,SAAS,MAAM;AACb,oBAAM,WACJ,qDAAmB,MAAM,QACzB,MAAM,kBACN;AACF,yEAAsB,MAAM,IAAI,CAAC;AAAA,YACnC;AAAA,UAAA;AAAA,UAbK,MAAM;AAAA,QAAA,CAed,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR,CAAC;AAID,MAAM,UAAU,CAAC,EAAE,OAAO,eAAuD;AAC/E,QAAM,SAAS,eAAA;AACf,SACE,qBAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAA,GAC3D,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,eAAe;AAAA,UACf,eAAe;AAAA,UACf,OAAO,OAAO,OAAO,KAAK;AAAA,QAAA;AAAA,QAG3B,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEH,oBAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAA,GAAM,SAAA,CAAS;AAAA,EAAA,GAC9E;AAEJ;AAEA,MAAM,SAAS,CAAC;AAAA,EACd;AAAA,EACA;AAAA,EACA;AACF,MAIM;;AACJ,QAAM,SAAS,eAAA;AACf,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL;AAAA,MACA,gBAAc;AAAA,MACd,OAAO;AAAA,QACL,SAAS,GAAG,OAAO,QAAQ,EAAE,MAAM,OAAO,QAAQ,EAAE;AAAA,QACpD,gBAAc,YAAO,iBAAP,mBAAqB,OAAM;AAAA,QACzC,YAAY,SAAS,0BAA0B;AAAA,QAC/C,QAAQ,aAAa,SAAS,0BAA0B,wBAAwB;AAAA,QAChF,OAAO,SAAS,wBAAwB,OAAO,OAAO,KAAK;AAAA,QAC3D,UAAU,OAAO,WAAW,SAAS;AAAA,QACrC,QAAQ;AAAA,QACR,eAAe;AAAA,QACf,WAAW;AAAA,MAAA;AAAA,MAGZ,UAAA;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
1
|
+
{"version":3,"file":"LayerControlPanel.js","names":[],"sources":["../../../src/react/panels/LayerControlPanel.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - LayerControlPanel\r\n *\r\n * Floating layer-toggle panel for the 3D viewer (mirrors the\r\n * `MapLayerDef` pattern from `<GroundTrackMap />`). Three sections:\r\n *\r\n * 1. Render flags — labels / coverage / orbits (HOW objects draw)\r\n * 2. Object groups — spacecraft / GS / celestial (WHICH objects draw)\r\n * 3. Custom layers — app-defined overlays (caller renders them)\r\n *\r\n * The panel is **toggle UI only**. It emits `onChange` callbacks; the\r\n * consumer wires them to `<ZenSpace3D layers={...} visibility={...} />`\r\n * (or to its own overlay state for custom layers). Same contract as\r\n * `MapLayerDef` — keeps the panel reusable and the renderer\r\n * untouched.\r\n *\r\n * ```tsx\r\n * const [layers, setLayers] = useState({ orbits: true, labels: false, coverage: false });\r\n * const [visibility, setVisibility] = useState({\r\n * spacecraft: true, groundStations: true, celestialBodies: true,\r\n * });\r\n * const [customLayers, setCustomLayers] = useState<Record<string, boolean>>({ rf: false });\r\n *\r\n * <ZenSpace3D layers={layers} visibility={visibility} ... />\r\n * <LayerControlPanel\r\n * layers={layers}\r\n * visibility={visibility}\r\n * customLayers={[{ id: 'rf', label: 'RF Coverage' }]}\r\n * customLayerState={customLayers}\r\n * groupCounts={{ spacecraft: scene.satellites.length, ... }}\r\n * onLayersChange={setLayers}\r\n * onVisibilityChange={setVisibility}\r\n * onCustomLayerChange={(id, on) => setCustomLayers((c) => ({ ...c, [id]: on }))}\r\n * />\r\n * ```\r\n */\r\n\r\nimport { memo, useCallback } from \"react\";\r\nimport type { CSSProperties, ReactNode } from \"react\";\r\nimport { useThemeTokens } from \"../theme/ThemeProvider\";\r\nimport type { LayerDef } from \"../types\";\r\n\r\n// ─── Types ────────────────────────────────────────────────────────────────────\r\n\r\n/** Render-flag layers — passed straight through to `<ZenSpace3D layers={...} />`. */\r\nexport interface RenderLayers {\r\n labels?: boolean;\r\n coverage?: boolean;\r\n orbits?: boolean;\r\n}\r\n\r\n/** Object-group visibility — passed straight through to `<ZenSpace3D visibility={...} />`. */\r\nexport interface GroupVisibility {\r\n spacecraft?: boolean;\r\n groundStations?: boolean;\r\n celestialBodies?: boolean;\r\n}\r\n\r\n/** Counts shown in the group toggles (\"Spacecraft (5)\"). All optional. */\r\nexport interface GroupCounts {\r\n spacecraft?: number;\r\n groundStations?: number;\r\n celestialBodies?: number;\r\n}\r\n\r\nexport interface LayerControlPanelProps {\r\n // ─── Render flags ─────────────────────────────────────────────────────────\r\n /** Current render-flag state. Each key defaults to: orbits=on, labels=off, coverage=off. */\r\n layers?: RenderLayers;\r\n /** Called with the next render-flag state when any toggle is clicked. */\r\n onLayersChange?: (next: RenderLayers) => void;\r\n\r\n // ─── Object-group visibility ──────────────────────────────────────────────\r\n /** Current group-visibility state. Each key defaults to true (visible). */\r\n visibility?: GroupVisibility;\r\n /** Called with the next visibility state when any toggle is clicked. */\r\n onVisibilityChange?: (next: GroupVisibility) => void;\r\n /** Counts to render in group toggle labels (e.g. \"Spacecraft (5)\"). */\r\n groupCounts?: GroupCounts;\r\n\r\n // ─── Custom layers (app-defined overlays) ─────────────────────────────────\r\n /** App-defined layer toggles. The panel only renders the toggle UI. */\r\n customLayers?: LayerDef[];\r\n /** Current state of each custom layer (id → on/off). */\r\n customLayerState?: Record<string, boolean>;\r\n /** Fires when a custom layer is toggled. The consumer renders the overlay itself. */\r\n onCustomLayerChange?: (id: string, enabled: boolean) => void;\r\n\r\n // ─── Layout / theming ─────────────────────────────────────────────────────\r\n position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\r\n offset?: { x?: number; y?: number };\r\n hidden?: boolean;\r\n style?: CSSProperties;\r\n\r\n /** Hide the render-flags section (`true` to suppress). */\r\n hideRenderFlags?: boolean;\r\n /** Hide the object-group section. */\r\n hideGroups?: boolean;\r\n /** Hide the custom-layers section even if `customLayers` is non-empty. */\r\n hideCustomLayers?: boolean;\r\n}\r\n\r\n// ─── Component ────────────────────────────────────────────────────────────────\r\n\r\nexport const LayerControlPanel = memo(function LayerControlPanel({\r\n layers,\r\n onLayersChange,\r\n visibility,\r\n onVisibilityChange,\r\n groupCounts,\r\n customLayers,\r\n customLayerState,\r\n onCustomLayerChange,\r\n position = \"top-right\",\r\n offset,\r\n hidden = false,\r\n style,\r\n hideRenderFlags = false,\r\n hideGroups = false,\r\n hideCustomLayers = false,\r\n}: LayerControlPanelProps) {\r\n const tokens = useThemeTokens();\r\n\r\n // Default render-flag state — matches ZenSpace3D's defaults.\r\n const showLabels = layers?.labels === true;\r\n const showCoverage = layers?.coverage === true;\r\n const showOrbits = layers?.orbits !== false;\r\n\r\n // Default group-visibility — matches ZenSpace3D's defaults (everything on).\r\n const showSpacecraft = visibility?.spacecraft !== false;\r\n const showGroundStations = visibility?.groundStations !== false;\r\n const showCelestialBodies = visibility?.celestialBodies !== false;\r\n\r\n const toggleLayer = useCallback(\r\n (key: keyof RenderLayers) => {\r\n if (!onLayersChange) return;\r\n const current =\r\n key === \"orbits\"\r\n ? showOrbits\r\n : key === \"labels\"\r\n ? showLabels\r\n : showCoverage;\r\n onLayersChange({ ...(layers ?? {}), [key]: !current });\r\n },\r\n [layers, onLayersChange, showLabels, showCoverage, showOrbits],\r\n );\r\n\r\n const toggleVisibility = useCallback(\r\n (key: keyof GroupVisibility) => {\r\n if (!onVisibilityChange) return;\r\n const current =\r\n key === \"spacecraft\"\r\n ? showSpacecraft\r\n : key === \"groundStations\"\r\n ? showGroundStations\r\n : showCelestialBodies;\r\n onVisibilityChange({ ...(visibility ?? {}), [key]: !current });\r\n },\r\n [\r\n visibility,\r\n onVisibilityChange,\r\n showSpacecraft,\r\n showGroundStations,\r\n showCelestialBodies,\r\n ],\r\n );\r\n\r\n const offX = offset?.x ?? 16;\r\n const offY = offset?.y ?? 16;\r\n const anchor: CSSProperties = (() => {\r\n switch (position) {\r\n case \"top-left\":\r\n return { top: offY, left: offX };\r\n case \"bottom-left\":\r\n return { bottom: offY, left: offX };\r\n case \"bottom-right\":\r\n return { bottom: offY, right: offX };\r\n case \"top-right\":\r\n default:\r\n return { top: offY, right: offX };\r\n }\r\n })();\r\n\r\n if (hidden) return null;\r\n\r\n const showRender = !hideRenderFlags && onLayersChange != null;\r\n const showGroupsSection = !hideGroups && onVisibilityChange != null;\r\n const showCustom = !hideCustomLayers && (customLayers?.length ?? 0) > 0;\r\n\r\n if (!showRender && !showGroupsSection && !showCustom) return null;\r\n\r\n const cnt = (n: number | undefined) =>\r\n typeof n === \"number\" ? ` (${n})` : \"\";\r\n\r\n return (\r\n <div\r\n data-testid=\"zendir-layer-control\"\r\n style={{\r\n position: \"absolute\",\r\n zIndex: 2,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 6,\r\n padding: tokens.spacing.sm,\r\n borderRadius: tokens.borderRadius?.md ?? 6,\r\n border: \"1px solid rgba(255,255,255,0.12)\",\r\n background: \"rgba(0,0,0,0.72)\",\r\n color: tokens.colors.text.primary,\r\n fontSize: tokens.typography.fontSize.xs,\r\n lineHeight: 1.2,\r\n ...anchor,\r\n ...style,\r\n }}\r\n >\r\n {showRender && (\r\n <Section title=\"Render\">\r\n <Toggle\r\n label=\"Orbits\"\r\n active={showOrbits}\r\n onClick={() => toggleLayer(\"orbits\")}\r\n />\r\n <Toggle\r\n label=\"Labels\"\r\n active={showLabels}\r\n onClick={() => toggleLayer(\"labels\")}\r\n />\r\n <Toggle\r\n label=\"Coverage\"\r\n active={showCoverage}\r\n onClick={() => toggleLayer(\"coverage\")}\r\n />\r\n </Section>\r\n )}\r\n\r\n {showGroupsSection && (\r\n <Section title=\"Objects\">\r\n <Toggle\r\n label={`Spacecraft${cnt(groupCounts?.spacecraft)}`}\r\n active={showSpacecraft}\r\n onClick={() => toggleVisibility(\"spacecraft\")}\r\n />\r\n <Toggle\r\n label={`Ground Stations${cnt(groupCounts?.groundStations)}`}\r\n active={showGroundStations}\r\n onClick={() => toggleVisibility(\"groundStations\")}\r\n />\r\n <Toggle\r\n label={`Celestial${cnt(groupCounts?.celestialBodies)}`}\r\n active={showCelestialBodies}\r\n onClick={() => toggleVisibility(\"celestialBodies\")}\r\n />\r\n </Section>\r\n )}\r\n\r\n {showCustom && (\r\n <Section title=\"Overlays\">\r\n {(customLayers ?? []).map((layer) => (\r\n <Toggle\r\n key={layer.id}\r\n label={layer.label}\r\n active={\r\n customLayerState?.[layer.id] ?? layer.defaultEnabled ?? false\r\n }\r\n onClick={() => {\r\n const current =\r\n customLayerState?.[layer.id] ?? layer.defaultEnabled ?? false;\r\n onCustomLayerChange?.(layer.id, !current);\r\n }}\r\n />\r\n ))}\r\n </Section>\r\n )}\r\n </div>\r\n );\r\n});\r\n\r\n// ─── Sub-components ───────────────────────────────────────────────────────────\r\n\r\nconst Section = ({\r\n title,\r\n children,\r\n}: {\r\n title: string;\r\n children: ReactNode;\r\n}) => {\r\n const tokens = useThemeTokens();\r\n return (\r\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\r\n <div\r\n style={{\r\n opacity: 0.6,\r\n fontSize: \"0.85em\",\r\n textTransform: \"uppercase\",\r\n letterSpacing: 0.5,\r\n color: tokens.colors.text.secondary,\r\n }}\r\n >\r\n {title}\r\n </div>\r\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nconst Toggle = ({\r\n label,\r\n active,\r\n onClick,\r\n}: {\r\n label: string;\r\n active: boolean;\r\n onClick: () => void;\r\n}) => {\r\n const tokens = useThemeTokens();\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={onClick}\r\n aria-pressed={active}\r\n style={{\r\n padding: `${tokens.spacing.xs}px ${tokens.spacing.sm}px`,\r\n borderRadius: tokens.borderRadius?.sm ?? 4,\r\n background: active ? \"rgba(100,200,255,0.2)\" : \"rgba(0,0,0,0.6)\",\r\n border: `1px solid ${active ? \"rgba(100,200,255,0.6)\" : \"rgba(255,255,255,0.15)\"}`,\r\n color: active ? \"rgba(100,200,255,1)\" : tokens.colors.text.secondary,\r\n fontSize: tokens.typography.fontSize.xs,\r\n cursor: \"pointer\",\r\n letterSpacing: 0.3,\r\n textAlign: \"left\",\r\n }}\r\n >\r\n {label}\r\n </button>\r\n );\r\n};\r\n\r\nexport default LayerControlPanel;\r\n"],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { CSSProperties, ReactNode } from 'react';
|
|
2
2
|
import { SimulationSceneObject, StructureDiag, PositionTickDiag } from '../hooks/useSimulationScene';
|
|
3
|
-
|
|
4
|
-
export type ObjectInventoryKind = SimulationSceneObject['kind'];
|
|
3
|
+
export type ObjectInventoryKind = SimulationSceneObject["kind"];
|
|
5
4
|
export interface ObjectInventoryPanelProps {
|
|
6
5
|
/** Objects to list. Typically `useSimulationScene().objects`. */
|
|
7
6
|
objects: SimulationSceneObject[];
|
|
@@ -11,7 +10,7 @@ export interface ObjectInventoryPanelProps {
|
|
|
11
10
|
/** Currently selected object id (highlights the row). Pass `null` for none. */
|
|
12
11
|
selectedId?: string | null;
|
|
13
12
|
/** Where to anchor the panel on its parent. Default: `top-left`. */
|
|
14
|
-
position?:
|
|
13
|
+
position?: "top-left" | "top-right" | "bottom-left" | "bottom-right";
|
|
15
14
|
/** Pixel offsets from the anchor. Defaults to (16, 56) so a top bar fits above. */
|
|
16
15
|
offset?: {
|
|
17
16
|
x?: number;
|