@zendir/ui 0.1.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 +19 -0
- package/LICENSE +21 -0
- package/README.md +589 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +421 -0
- package/dist/index.js.map +1 -0
- package/dist/react/3d/EarthViewer.d.ts +46 -0
- package/dist/react/3d/EarthViewer.js +836 -0
- package/dist/react/3d/EarthViewer.js.map +1 -0
- package/dist/react/3d/SolarSystemViewer.d.ts +43 -0
- package/dist/react/3d/SolarSystemViewer.js +372 -0
- package/dist/react/3d/SolarSystemViewer.js.map +1 -0
- package/dist/react/3d/ZenSpace3D.d.ts +16 -0
- package/dist/react/3d/ZenSpace3D.js +1253 -0
- package/dist/react/3d/ZenSpace3D.js.map +1 -0
- package/dist/react/3d/ZenSpace3DCesium.d.ts +9 -0
- package/dist/react/3d/ZenSpace3DCesium.js +186 -0
- package/dist/react/3d/ZenSpace3DCesium.js.map +1 -0
- package/dist/react/3d/ZenSpace3DShaders.d.ts +78 -0
- package/dist/react/3d/ZenSpace3DShaders.js +94 -0
- package/dist/react/3d/ZenSpace3DShaders.js.map +1 -0
- package/dist/react/3d/ZenSpace3DTypes.d.ts +614 -0
- package/dist/react/3d/ZenSpace3DUtils.d.ts +183 -0
- package/dist/react/3d/ZenSpace3DUtils.js +213 -0
- package/dist/react/3d/ZenSpace3DUtils.js.map +1 -0
- package/dist/react/3d/index.d.ts +23 -0
- package/dist/react/3d/threeLoader.d.ts +22 -0
- package/dist/react/3d/threeLoader.js +18 -0
- package/dist/react/3d/threeLoader.js.map +1 -0
- package/dist/react/astro/ClassificationBanner.d.ts +25 -0
- package/dist/react/astro/ClassificationBanner.js +83 -0
- package/dist/react/astro/ClassificationBanner.js.map +1 -0
- package/dist/react/astro/GlobalStatusBar.d.ts +42 -0
- package/dist/react/astro/GlobalStatusBar.js +165 -0
- package/dist/react/astro/GlobalStatusBar.js.map +1 -0
- package/dist/react/astro/MissionClock.d.ts +169 -0
- package/dist/react/astro/MissionClock.js +411 -0
- package/dist/react/astro/MissionClock.js.map +1 -0
- package/dist/react/astro/MonitoringIcon.d.ts +60 -0
- package/dist/react/astro/MonitoringIcon.js +369 -0
- package/dist/react/astro/MonitoringIcon.js.map +1 -0
- package/dist/react/astro/Notification.d.ts +42 -0
- package/dist/react/astro/Notification.js +156 -0
- package/dist/react/astro/Notification.js.map +1 -0
- package/dist/react/astro/Progress.d.ts +39 -0
- package/dist/react/astro/Progress.js +149 -0
- package/dist/react/astro/Progress.js.map +1 -0
- package/dist/react/astro/SimulationControls.d.ts +136 -0
- package/dist/react/astro/SimulationControls.js +668 -0
- package/dist/react/astro/SimulationControls.js.map +1 -0
- package/dist/react/astro/StatusIndicator.d.ts +34 -0
- package/dist/react/astro/StatusIndicator.js +189 -0
- package/dist/react/astro/StatusIndicator.js.map +1 -0
- package/dist/react/astro/UnifiedTimeline.d.ts +106 -0
- package/dist/react/astro/UnifiedTimeline.js +1768 -0
- package/dist/react/astro/UnifiedTimeline.js.map +1 -0
- package/dist/react/astro/index.d.ts +63 -0
- package/dist/react/cards/AccessCard.d.ts +37 -0
- package/dist/react/cards/AccessCard.js +410 -0
- package/dist/react/cards/AccessCard.js.map +1 -0
- package/dist/react/cards/OrbitCard.d.ts +31 -0
- package/dist/react/cards/OrbitCard.js +372 -0
- package/dist/react/cards/OrbitCard.js.map +1 -0
- package/dist/react/cards/SpacecraftCard.d.ts +54 -0
- package/dist/react/cards/SpacecraftCard.js +941 -0
- package/dist/react/cards/SpacecraftCard.js.map +1 -0
- package/dist/react/cards/TelemetryCard.d.ts +40 -0
- package/dist/react/cards/TelemetryCard.js +742 -0
- package/dist/react/cards/TelemetryCard.js.map +1 -0
- package/dist/react/cards/TelemetryStreamCard.d.ts +59 -0
- package/dist/react/cards/TelemetryStreamCard.js +309 -0
- package/dist/react/cards/TelemetryStreamCard.js.map +1 -0
- package/dist/react/cards/index.d.ts +13 -0
- package/dist/react/charts/GroundTrackMap.d.ts +112 -0
- package/dist/react/charts/GroundTrackMap.js +1123 -0
- package/dist/react/charts/GroundTrackMap.js.map +1 -0
- package/dist/react/charts/GroundTrackMapLeaflet.d.ts +26 -0
- package/dist/react/charts/GroundTrackMapLeaflet.js +571 -0
- package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -0
- package/dist/react/charts/groundTrackMapLeafletTiles.d.ts +22 -0
- package/dist/react/charts/groundTrackMapLeafletTiles.js +11 -0
- package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -0
- package/dist/react/charts/groundTrackMapLeafletUtils.d.ts +24 -0
- package/dist/react/charts/groundTrackMapLeafletUtils.js +109 -0
- package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -0
- package/dist/react/charts/index.d.ts +10 -0
- package/dist/react/charts/unified/AstroChart.d.ts +24 -0
- package/dist/react/charts/unified/AstroChart.js +1405 -0
- package/dist/react/charts/unified/AstroChart.js.map +1 -0
- package/dist/react/charts/unified/PowerOverviewChart.d.ts +73 -0
- package/dist/react/charts/unified/PowerOverviewChart.js +488 -0
- package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -0
- package/dist/react/charts/unified/domain.d.ts +845 -0
- package/dist/react/charts/unified/domain.js +3168 -0
- package/dist/react/charts/unified/domain.js.map +1 -0
- package/dist/react/charts/unified/generators.d.ts +276 -0
- package/dist/react/charts/unified/generators.js +518 -0
- package/dist/react/charts/unified/generators.js.map +1 -0
- package/dist/react/charts/unified/index.d.ts +55 -0
- package/dist/react/charts/unified/presets.d.ts +290 -0
- package/dist/react/charts/unified/presets.js +999 -0
- package/dist/react/charts/unified/presets.js.map +1 -0
- package/dist/react/charts/unified/sync.d.ts +69 -0
- package/dist/react/charts/unified/sync.js +219 -0
- package/dist/react/charts/unified/sync.js.map +1 -0
- package/dist/react/charts/unified/theme.d.ts +447 -0
- package/dist/react/charts/unified/theme.js +562 -0
- package/dist/react/charts/unified/theme.js.map +1 -0
- package/dist/react/charts/unified/types.d.ts +826 -0
- package/dist/react/charts/unified/useChartStream.d.ts +58 -0
- package/dist/react/charts/unified/useChartStream.js +226 -0
- package/dist/react/charts/unified/useChartStream.js.map +1 -0
- package/dist/react/chatgpt/AppCard.d.ts +59 -0
- package/dist/react/chatgpt/AppCard.js +306 -0
- package/dist/react/chatgpt/AppCard.js.map +1 -0
- package/dist/react/chatgpt/ChatGPTCard.d.ts +6 -0
- package/dist/react/chatgpt/index.d.ts +167 -0
- package/dist/react/chatgpt/index.js +166 -0
- package/dist/react/chatgpt/index.js.map +1 -0
- package/dist/react/context/DisplaySettingsContext.d.ts +107 -0
- package/dist/react/context/DisplaySettingsContext.js +169 -0
- package/dist/react/context/DisplaySettingsContext.js.map +1 -0
- package/dist/react/context/index.d.ts +5 -0
- package/dist/react/core/ActivityPlanner.d.ts +45 -0
- package/dist/react/core/ActivityPlanner.js +532 -0
- package/dist/react/core/ActivityPlanner.js.map +1 -0
- package/dist/react/core/AppBar.d.ts +71 -0
- package/dist/react/core/AppBar.js +817 -0
- package/dist/react/core/AppBar.js.map +1 -0
- package/dist/react/core/AstroIcon.d.ts +84 -0
- package/dist/react/core/AstroIcon.js +1243 -0
- package/dist/react/core/AstroIcon.js.map +1 -0
- package/dist/react/core/Badge.d.ts +27 -0
- package/dist/react/core/Badge.js +134 -0
- package/dist/react/core/Badge.js.map +1 -0
- package/dist/react/core/Button.d.ts +26 -0
- package/dist/react/core/Button.js +306 -0
- package/dist/react/core/Button.js.map +1 -0
- package/dist/react/core/CardHeader.d.ts +34 -0
- package/dist/react/core/CardHeader.js +316 -0
- package/dist/react/core/CardHeader.js.map +1 -0
- package/dist/react/core/ChatPanel.d.ts +627 -0
- package/dist/react/core/ChatPanel.js +1144 -0
- package/dist/react/core/ChatPanel.js.map +1 -0
- package/dist/react/core/Checkbox.d.ts +26 -0
- package/dist/react/core/Checkbox.js +130 -0
- package/dist/react/core/Checkbox.js.map +1 -0
- package/dist/react/core/ColorPickerPanel.d.ts +25 -0
- package/dist/react/core/ColorPickerPanel.js +293 -0
- package/dist/react/core/ColorPickerPanel.js.map +1 -0
- package/dist/react/core/CommandBuilder.d.ts +74 -0
- package/dist/react/core/CommandBuilder.js +518 -0
- package/dist/react/core/CommandBuilder.js.map +1 -0
- package/dist/react/core/ConfirmDialog.d.ts +45 -0
- package/dist/react/core/ConfirmDialog.js +315 -0
- package/dist/react/core/ConfirmDialog.js.map +1 -0
- package/dist/react/core/ConnectionForm.d.ts +57 -0
- package/dist/react/core/ConnectionForm.js +496 -0
- package/dist/react/core/ConnectionForm.js.map +1 -0
- package/dist/react/core/Container.d.ts +51 -0
- package/dist/react/core/Container.js +670 -0
- package/dist/react/core/Container.js.map +1 -0
- package/dist/react/core/CopyButton.d.ts +39 -0
- package/dist/react/core/CopyButton.js +105 -0
- package/dist/react/core/CopyButton.js.map +1 -0
- package/dist/react/core/DataTable.d.ts +113 -0
- package/dist/react/core/DataTable.js +446 -0
- package/dist/react/core/DataTable.js.map +1 -0
- package/dist/react/core/DataValue.d.ts +64 -0
- package/dist/react/core/DataValue.js +545 -0
- package/dist/react/core/DataValue.js.map +1 -0
- package/dist/react/core/Dialog.d.ts +32 -0
- package/dist/react/core/Dialog.js +201 -0
- package/dist/react/core/Dialog.js.map +1 -0
- package/dist/react/core/FileExplorer.d.ts +65 -0
- package/dist/react/core/FileExplorer.js +520 -0
- package/dist/react/core/FileExplorer.js.map +1 -0
- package/dist/react/core/GlassCard.d.ts +129 -0
- package/dist/react/core/GlassCard.js +375 -0
- package/dist/react/core/GlassCard.js.map +1 -0
- package/dist/react/core/HeaderIconWithStatus.d.ts +39 -0
- package/dist/react/core/HeaderIconWithStatus.js +157 -0
- package/dist/react/core/HeaderIconWithStatus.js.map +1 -0
- package/dist/react/core/HexViewer.d.ts +143 -0
- package/dist/react/core/HexViewer.js +1106 -0
- package/dist/react/core/HexViewer.js.map +1 -0
- package/dist/react/core/Icon.d.ts +32 -0
- package/dist/react/core/Icon.js +142 -0
- package/dist/react/core/Icon.js.map +1 -0
- package/dist/react/core/ImageGallery.d.ts +41 -0
- package/dist/react/core/ImageGallery.js +320 -0
- package/dist/react/core/ImageGallery.js.map +1 -0
- package/dist/react/core/Input.d.ts +38 -0
- package/dist/react/core/Input.js +288 -0
- package/dist/react/core/Input.js.map +1 -0
- package/dist/react/core/LimitsBar.d.ts +51 -0
- package/dist/react/core/LimitsBar.js +200 -0
- package/dist/react/core/LimitsBar.js.map +1 -0
- package/dist/react/core/LogViewer.d.ts +61 -0
- package/dist/react/core/LogViewer.js +599 -0
- package/dist/react/core/LogViewer.js.map +1 -0
- package/dist/react/core/MessageStream.d.ts +58 -0
- package/dist/react/core/MessageStream.js +455 -0
- package/dist/react/core/MessageStream.js.map +1 -0
- package/dist/react/core/MissionCalendar.d.ts +81 -0
- package/dist/react/core/MissionCalendar.js +1049 -0
- package/dist/react/core/MissionCalendar.js.map +1 -0
- package/dist/react/core/NumberInput.d.ts +85 -0
- package/dist/react/core/NumberInput.js +507 -0
- package/dist/react/core/NumberInput.js.map +1 -0
- package/dist/react/core/PacketViewer.d.ts +73 -0
- package/dist/react/core/PacketViewer.js +431 -0
- package/dist/react/core/PacketViewer.js.map +1 -0
- package/dist/react/core/Pagination.d.ts +30 -0
- package/dist/react/core/Pagination.js +190 -0
- package/dist/react/core/Pagination.js.map +1 -0
- package/dist/react/core/PinInput.d.ts +41 -0
- package/dist/react/core/PinInput.js +210 -0
- package/dist/react/core/PinInput.js.map +1 -0
- package/dist/react/core/Popover.d.ts +55 -0
- package/dist/react/core/Popover.js +288 -0
- package/dist/react/core/Popover.js.map +1 -0
- package/dist/react/core/Select.d.ts +42 -0
- package/dist/react/core/Select.js +303 -0
- package/dist/react/core/Select.js.map +1 -0
- package/dist/react/core/SideNav.d.ts +103 -0
- package/dist/react/core/SideNav.js +551 -0
- package/dist/react/core/SideNav.js.map +1 -0
- package/dist/react/core/SidePanel.d.ts +33 -0
- package/dist/react/core/SidePanel.js +199 -0
- package/dist/react/core/SidePanel.js.map +1 -0
- package/dist/react/core/Tabs.d.ts +47 -0
- package/dist/react/core/Tabs.js +129 -0
- package/dist/react/core/Tabs.js.map +1 -0
- package/dist/react/core/Toast.d.ts +56 -0
- package/dist/react/core/Toast.js +229 -0
- package/dist/react/core/Toast.js.map +1 -0
- package/dist/react/core/Toggle.d.ts +22 -0
- package/dist/react/core/Toggle.js +151 -0
- package/dist/react/core/Toggle.js.map +1 -0
- package/dist/react/core/Tooltip.d.ts +19 -0
- package/dist/react/core/Tooltip.js +179 -0
- package/dist/react/core/Tooltip.js.map +1 -0
- package/dist/react/core/Typography.d.ts +127 -0
- package/dist/react/core/Typography.js +187 -0
- package/dist/react/core/Typography.js.map +1 -0
- package/dist/react/core/index.d.ts +108 -0
- package/dist/react/core/layout/Box.d.ts +77 -0
- package/dist/react/core/layout/Box.js +126 -0
- package/dist/react/core/layout/Box.js.map +1 -0
- package/dist/react/core/layout/Center.d.ts +20 -0
- package/dist/react/core/layout/Center.js +34 -0
- package/dist/react/core/layout/Center.js.map +1 -0
- package/dist/react/core/layout/Divider.d.ts +16 -0
- package/dist/react/core/layout/Divider.js +108 -0
- package/dist/react/core/layout/Divider.js.map +1 -0
- package/dist/react/core/layout/Flex.d.ts +30 -0
- package/dist/react/core/layout/Flex.js +128 -0
- package/dist/react/core/layout/Flex.js.map +1 -0
- package/dist/react/core/layout/Grid.d.ts +36 -0
- package/dist/react/core/layout/Grid.js +142 -0
- package/dist/react/core/layout/Grid.js.map +1 -0
- package/dist/react/core/layout/Spacer.d.ts +8 -0
- package/dist/react/core/layout/Spacer.js +31 -0
- package/dist/react/core/layout/Spacer.js.map +1 -0
- package/dist/react/core/layout/Stack.d.ts +54 -0
- package/dist/react/core/layout/Stack.js +74 -0
- package/dist/react/core/layout/Stack.js.map +1 -0
- package/dist/react/core/layout/index.d.ts +38 -0
- package/dist/react/core/layout/responsive.d.ts +23 -0
- package/dist/react/core/layout/responsive.js +26 -0
- package/dist/react/core/layout/responsive.js.map +1 -0
- package/dist/react/core/layout/useBreakpoint.d.ts +77 -0
- package/dist/react/core/layout/useBreakpoint.js +73 -0
- package/dist/react/core/layout/useBreakpoint.js.map +1 -0
- package/dist/react/core/propertyConfig.d.ts +443 -0
- package/dist/react/core/propertyConfig.js +399 -0
- package/dist/react/core/propertyConfig.js.map +1 -0
- package/dist/react/hooks/index.d.ts +21 -0
- package/dist/react/hooks/useAccessWindows.d.ts +66 -0
- package/dist/react/hooks/useCompactMode.d.ts +82 -0
- package/dist/react/hooks/useCompactMode.js +62 -0
- package/dist/react/hooks/useCompactMode.js.map +1 -0
- package/dist/react/hooks/useLiveSelection.d.ts +57 -0
- package/dist/react/hooks/useSimulationPlayback.d.ts +97 -0
- package/dist/react/hooks/useSimulationTime.d.ts +61 -0
- package/dist/react/hooks/useSpacecraftPosition.d.ts +50 -0
- package/dist/react/hooks/useSpacecraftPosition.js +89 -0
- package/dist/react/hooks/useSpacecraftPosition.js.map +1 -0
- package/dist/react/hooks/useTelemetry.d.ts +55 -0
- package/dist/react/hooks/useTelemetry.js +73 -0
- package/dist/react/hooks/useTelemetry.js.map +1 -0
- package/dist/react/hooks/useZendirSession.d.ts +109 -0
- package/dist/react/hooks/useZendirSession.js +148 -0
- package/dist/react/hooks/useZendirSession.js.map +1 -0
- package/dist/react/index.d.ts +74 -0
- package/dist/react/shared/ErrorBoundary.d.ts +63 -0
- package/dist/react/shared/ErrorBoundary.js +142 -0
- package/dist/react/shared/ErrorBoundary.js.map +1 -0
- package/dist/react/shared/Skeleton.d.ts +110 -0
- package/dist/react/shared/Skeleton.js +324 -0
- package/dist/react/shared/Skeleton.js.map +1 -0
- package/dist/react/shared/index.d.ts +12 -0
- package/dist/react/theme/ThemeProvider.d.ts +385 -0
- package/dist/react/theme/ThemeProvider.js +1096 -0
- package/dist/react/theme/ThemeProvider.js.map +1 -0
- package/dist/react/theme/astro-tokens.d.ts +153 -0
- package/dist/react/theme/cardAccent.d.ts +75 -0
- package/dist/react/theme/cardAccent.js +137 -0
- package/dist/react/theme/cardAccent.js.map +1 -0
- package/dist/react/theme/config.d.ts +39 -0
- package/dist/react/theme/index.d.ts +9 -0
- package/dist/react/types.d.ts +360 -0
- package/dist/react/types.js +58 -0
- package/dist/react/types.js.map +1 -0
- package/dist/react/utils/index.d.ts +247 -0
- package/dist/react/utils/index.js +423 -0
- package/dist/react/utils/index.js.map +1 -0
- package/dist/react/visualizations/EclipseTimerCard.d.ts +17 -0
- package/dist/react/visualizations/EclipseTimerCard.js +250 -0
- package/dist/react/visualizations/EclipseTimerCard.js.map +1 -0
- package/dist/react/visualizations/LinkBudgetCard.d.ts +50 -0
- package/dist/react/visualizations/LinkBudgetCard.js +444 -0
- package/dist/react/visualizations/LinkBudgetCard.js.map +1 -0
- package/dist/react/visualizations/NavBallCard.d.ts +17 -0
- package/dist/react/visualizations/NavBallCard.js +243 -0
- package/dist/react/visualizations/NavBallCard.js.map +1 -0
- package/dist/react/visualizations/PropulsionCard.d.ts +37 -0
- package/dist/react/visualizations/PropulsionCard.js +298 -0
- package/dist/react/visualizations/PropulsionCard.js.map +1 -0
- package/dist/react/visualizations/SensorFootprintCard.d.ts +33 -0
- package/dist/react/visualizations/SensorFootprintCard.js +326 -0
- package/dist/react/visualizations/SensorFootprintCard.js.map +1 -0
- package/dist/react/visualizations/ThermalHeatmapCard.d.ts +38 -0
- package/dist/react/visualizations/ThermalHeatmapCard.js +372 -0
- package/dist/react/visualizations/ThermalHeatmapCard.js.map +1 -0
- package/dist/react/visualizations/index.d.ts +17 -0
- package/dist/react.d.ts +1 -0
- package/dist/react.js +421 -0
- package/dist/react.js.map +1 -0
- package/dist/shaders/atmosphere.frag.js +5 -0
- package/dist/shaders/atmosphere.frag.js.map +1 -0
- package/dist/shaders/atmosphere.vert.js +5 -0
- package/dist/shaders/atmosphere.vert.js.map +1 -0
- package/dist/shaders/stars.frag.js +5 -0
- package/dist/shaders/stars.frag.js.map +1 -0
- package/dist/shaders/stars.vert.js +5 -0
- package/dist/shaders/stars.vert.js.map +1 -0
- package/dist/style.css +143 -0
- package/dist/tokens/index.d.ts +296 -0
- package/dist/tokens/index.js +263 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/tokens.css +155 -0
- package/dist/types/index.d.ts +23 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +220 -0
- package/sdk-stub.js +22 -0
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
const PROPERTY_PRESETS = {
|
|
2
|
+
// === Power System ===
|
|
3
|
+
battery: {
|
|
4
|
+
label: "Battery",
|
|
5
|
+
icon: "battery-full",
|
|
6
|
+
unit: "%",
|
|
7
|
+
precision: 1,
|
|
8
|
+
category: "power",
|
|
9
|
+
// Low values are bad for battery (use *Low thresholds)
|
|
10
|
+
thresholds: { criticalLow: 10, seriousLow: 20, cautionLow: 30 },
|
|
11
|
+
description: "Battery state of charge"
|
|
12
|
+
},
|
|
13
|
+
voltage: {
|
|
14
|
+
label: "Voltage",
|
|
15
|
+
icon: "propulsion-power",
|
|
16
|
+
unit: "V",
|
|
17
|
+
precision: 2,
|
|
18
|
+
category: "power",
|
|
19
|
+
thresholds: { criticalLow: 24, cautionLow: 26 },
|
|
20
|
+
description: "Bus voltage"
|
|
21
|
+
},
|
|
22
|
+
current: {
|
|
23
|
+
label: "Current",
|
|
24
|
+
icon: "propulsion-power",
|
|
25
|
+
unit: "A",
|
|
26
|
+
precision: 2,
|
|
27
|
+
category: "power",
|
|
28
|
+
description: "Current draw"
|
|
29
|
+
},
|
|
30
|
+
power: {
|
|
31
|
+
label: "Power",
|
|
32
|
+
icon: "propulsion-power",
|
|
33
|
+
unit: "W",
|
|
34
|
+
precision: 1,
|
|
35
|
+
category: "power",
|
|
36
|
+
description: "Power consumption or generation"
|
|
37
|
+
},
|
|
38
|
+
solarPower: {
|
|
39
|
+
label: "Solar",
|
|
40
|
+
icon: "solar",
|
|
41
|
+
unit: "W",
|
|
42
|
+
precision: 1,
|
|
43
|
+
category: "power",
|
|
44
|
+
description: "Solar array output"
|
|
45
|
+
},
|
|
46
|
+
load: {
|
|
47
|
+
label: "Load",
|
|
48
|
+
icon: "propulsion-power",
|
|
49
|
+
unit: "W",
|
|
50
|
+
precision: 1,
|
|
51
|
+
category: "power",
|
|
52
|
+
description: "Power load"
|
|
53
|
+
},
|
|
54
|
+
// === Thermal ===
|
|
55
|
+
temperature: {
|
|
56
|
+
label: "Temperature",
|
|
57
|
+
icon: "thermal",
|
|
58
|
+
unit: "°C",
|
|
59
|
+
precision: 1,
|
|
60
|
+
category: "thermal",
|
|
61
|
+
thresholds: { critical: 80, serious: 70, caution: 60, cautionLow: -20, criticalLow: -40 },
|
|
62
|
+
description: "Component temperature"
|
|
63
|
+
},
|
|
64
|
+
heater: {
|
|
65
|
+
label: "Heater",
|
|
66
|
+
icon: "thermal",
|
|
67
|
+
unit: "",
|
|
68
|
+
category: "thermal",
|
|
69
|
+
description: "Heater status"
|
|
70
|
+
},
|
|
71
|
+
// === Attitude ===
|
|
72
|
+
roll: {
|
|
73
|
+
label: "Roll",
|
|
74
|
+
icon: "explore",
|
|
75
|
+
unit: "°",
|
|
76
|
+
precision: 2,
|
|
77
|
+
category: "attitude",
|
|
78
|
+
thresholds: { critical: 45, caution: 30 },
|
|
79
|
+
description: "Roll angle"
|
|
80
|
+
},
|
|
81
|
+
pitch: {
|
|
82
|
+
label: "Pitch",
|
|
83
|
+
icon: "explore",
|
|
84
|
+
unit: "°",
|
|
85
|
+
precision: 2,
|
|
86
|
+
category: "attitude",
|
|
87
|
+
thresholds: { critical: 45, caution: 30 },
|
|
88
|
+
description: "Pitch angle"
|
|
89
|
+
},
|
|
90
|
+
yaw: {
|
|
91
|
+
label: "Yaw",
|
|
92
|
+
icon: "explore",
|
|
93
|
+
unit: "°",
|
|
94
|
+
precision: 2,
|
|
95
|
+
category: "attitude",
|
|
96
|
+
thresholds: { critical: 45, caution: 30 },
|
|
97
|
+
description: "Yaw angle"
|
|
98
|
+
},
|
|
99
|
+
pointingError: {
|
|
100
|
+
label: "Pointing error",
|
|
101
|
+
icon: "explore",
|
|
102
|
+
unit: "°",
|
|
103
|
+
precision: 3,
|
|
104
|
+
category: "attitude",
|
|
105
|
+
thresholds: { critical: 1, serious: 0.5, caution: 0.1 },
|
|
106
|
+
description: "Attitude pointing error"
|
|
107
|
+
},
|
|
108
|
+
angularVelocity: {
|
|
109
|
+
label: "Angular velocity",
|
|
110
|
+
icon: "explore",
|
|
111
|
+
unit: "°/s",
|
|
112
|
+
precision: 3,
|
|
113
|
+
category: "attitude",
|
|
114
|
+
thresholds: { critical: 5, caution: 2 },
|
|
115
|
+
description: "Rotation rate"
|
|
116
|
+
},
|
|
117
|
+
// === Communications ===
|
|
118
|
+
signalStrength: {
|
|
119
|
+
label: "Signal",
|
|
120
|
+
icon: "antenna-receive",
|
|
121
|
+
unit: "dBm",
|
|
122
|
+
precision: 1,
|
|
123
|
+
category: "communications",
|
|
124
|
+
thresholds: { criticalLow: -100, cautionLow: -85 },
|
|
125
|
+
description: "Received signal strength"
|
|
126
|
+
},
|
|
127
|
+
dataRate: {
|
|
128
|
+
label: "Data rate",
|
|
129
|
+
icon: "antenna-transmit",
|
|
130
|
+
unit: "Mbps",
|
|
131
|
+
precision: 2,
|
|
132
|
+
category: "communications",
|
|
133
|
+
description: "Communication data rate"
|
|
134
|
+
},
|
|
135
|
+
packetLoss: {
|
|
136
|
+
label: "Packet loss",
|
|
137
|
+
icon: "netcom",
|
|
138
|
+
unit: "%",
|
|
139
|
+
precision: 2,
|
|
140
|
+
category: "communications",
|
|
141
|
+
thresholds: { critical: 10, serious: 5, caution: 1 },
|
|
142
|
+
description: "Communication packet loss rate"
|
|
143
|
+
},
|
|
144
|
+
snr: {
|
|
145
|
+
label: "SNR",
|
|
146
|
+
icon: "antenna",
|
|
147
|
+
unit: "dB",
|
|
148
|
+
precision: 1,
|
|
149
|
+
category: "communications",
|
|
150
|
+
thresholds: { criticalLow: 5, cautionLow: 10 },
|
|
151
|
+
description: "Signal-to-noise ratio"
|
|
152
|
+
},
|
|
153
|
+
queue: {
|
|
154
|
+
label: "Queue",
|
|
155
|
+
icon: "netcom",
|
|
156
|
+
unit: "pkts",
|
|
157
|
+
precision: 0,
|
|
158
|
+
category: "communications",
|
|
159
|
+
thresholds: { critical: 1e3, caution: 500 },
|
|
160
|
+
description: "Packet queue depth"
|
|
161
|
+
},
|
|
162
|
+
// === Propulsion ===
|
|
163
|
+
fuelLevel: {
|
|
164
|
+
label: "Fuel",
|
|
165
|
+
icon: "propulsion-power",
|
|
166
|
+
unit: "%",
|
|
167
|
+
precision: 1,
|
|
168
|
+
category: "propulsion",
|
|
169
|
+
thresholds: { critical: 5, serious: 10, caution: 20 },
|
|
170
|
+
description: "Propellant remaining"
|
|
171
|
+
},
|
|
172
|
+
deltaV: {
|
|
173
|
+
label: "Delta-V",
|
|
174
|
+
icon: "propulsion-power",
|
|
175
|
+
unit: "m/s",
|
|
176
|
+
precision: 1,
|
|
177
|
+
category: "propulsion",
|
|
178
|
+
description: "Available delta-V budget"
|
|
179
|
+
},
|
|
180
|
+
thrustLevel: {
|
|
181
|
+
label: "Thrust",
|
|
182
|
+
icon: "propulsion-power",
|
|
183
|
+
unit: "N",
|
|
184
|
+
precision: 2,
|
|
185
|
+
category: "propulsion",
|
|
186
|
+
description: "Current thrust output"
|
|
187
|
+
},
|
|
188
|
+
// === Navigation ===
|
|
189
|
+
altitude: {
|
|
190
|
+
label: "Altitude",
|
|
191
|
+
icon: "altitude",
|
|
192
|
+
unit: "km",
|
|
193
|
+
precision: 1,
|
|
194
|
+
category: "orbital",
|
|
195
|
+
thresholds: { criticalLow: 200, cautionLow: 250 },
|
|
196
|
+
description: "Orbital altitude"
|
|
197
|
+
},
|
|
198
|
+
velocity: {
|
|
199
|
+
label: "Velocity",
|
|
200
|
+
icon: "altitude",
|
|
201
|
+
unit: "km/s",
|
|
202
|
+
precision: 3,
|
|
203
|
+
category: "orbital",
|
|
204
|
+
description: "Orbital velocity"
|
|
205
|
+
},
|
|
206
|
+
inclination: {
|
|
207
|
+
label: "Inclination",
|
|
208
|
+
icon: "altitude",
|
|
209
|
+
unit: "°",
|
|
210
|
+
precision: 2,
|
|
211
|
+
category: "orbital",
|
|
212
|
+
description: "Orbital inclination"
|
|
213
|
+
},
|
|
214
|
+
eccentricity: {
|
|
215
|
+
label: "Eccentricity",
|
|
216
|
+
icon: "altitude",
|
|
217
|
+
unit: "",
|
|
218
|
+
precision: 6,
|
|
219
|
+
category: "orbital",
|
|
220
|
+
description: "Orbital eccentricity"
|
|
221
|
+
},
|
|
222
|
+
// === Payload ===
|
|
223
|
+
payloadStatus: {
|
|
224
|
+
label: "Payload",
|
|
225
|
+
icon: "payload",
|
|
226
|
+
unit: "",
|
|
227
|
+
category: "payload",
|
|
228
|
+
description: "Payload operational status"
|
|
229
|
+
},
|
|
230
|
+
storageUsed: {
|
|
231
|
+
label: "Storage",
|
|
232
|
+
icon: "hardware",
|
|
233
|
+
unit: "%",
|
|
234
|
+
precision: 1,
|
|
235
|
+
category: "payload",
|
|
236
|
+
thresholds: { critical: 95, serious: 90, caution: 80 },
|
|
237
|
+
description: "Onboard storage usage"
|
|
238
|
+
},
|
|
239
|
+
// === Health ===
|
|
240
|
+
cpuUsage: {
|
|
241
|
+
label: "CPU",
|
|
242
|
+
icon: "processor",
|
|
243
|
+
unit: "%",
|
|
244
|
+
precision: 1,
|
|
245
|
+
category: "health",
|
|
246
|
+
thresholds: { critical: 95, serious: 85, caution: 75 },
|
|
247
|
+
description: "Processor utilization"
|
|
248
|
+
},
|
|
249
|
+
memoryUsage: {
|
|
250
|
+
label: "Memory",
|
|
251
|
+
icon: "processor",
|
|
252
|
+
unit: "%",
|
|
253
|
+
precision: 1,
|
|
254
|
+
category: "health",
|
|
255
|
+
thresholds: { critical: 95, serious: 85, caution: 75 },
|
|
256
|
+
description: "Memory utilization"
|
|
257
|
+
},
|
|
258
|
+
uptime: {
|
|
259
|
+
label: "Uptime",
|
|
260
|
+
icon: "mission",
|
|
261
|
+
unit: "s",
|
|
262
|
+
precision: 0,
|
|
263
|
+
category: "health",
|
|
264
|
+
description: "System uptime"
|
|
265
|
+
},
|
|
266
|
+
// === General ===
|
|
267
|
+
count: {
|
|
268
|
+
label: "Count",
|
|
269
|
+
icon: "list",
|
|
270
|
+
unit: "",
|
|
271
|
+
precision: 0,
|
|
272
|
+
category: "general",
|
|
273
|
+
description: "Item count"
|
|
274
|
+
},
|
|
275
|
+
percentage: {
|
|
276
|
+
label: "Percentage",
|
|
277
|
+
icon: "info",
|
|
278
|
+
unit: "%",
|
|
279
|
+
precision: 1,
|
|
280
|
+
category: "general",
|
|
281
|
+
description: "Percentage value"
|
|
282
|
+
},
|
|
283
|
+
duration: {
|
|
284
|
+
label: "Duration",
|
|
285
|
+
icon: "schedule",
|
|
286
|
+
unit: "s",
|
|
287
|
+
precision: 0,
|
|
288
|
+
category: "general",
|
|
289
|
+
description: "Time duration"
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
const CATEGORY_ICONS = {
|
|
293
|
+
power: "propulsion-power",
|
|
294
|
+
thermal: "thermal",
|
|
295
|
+
attitude: "explore",
|
|
296
|
+
communications: "antenna",
|
|
297
|
+
propulsion: "propulsion-power",
|
|
298
|
+
navigation: "gps-fixed",
|
|
299
|
+
payload: "payload",
|
|
300
|
+
health: "favorite",
|
|
301
|
+
orbital: "altitude",
|
|
302
|
+
general: "info"
|
|
303
|
+
};
|
|
304
|
+
const CATEGORY_LABELS = {
|
|
305
|
+
power: "Power",
|
|
306
|
+
thermal: "Thermal",
|
|
307
|
+
attitude: "Attitude",
|
|
308
|
+
communications: "Communications",
|
|
309
|
+
propulsion: "Propulsion",
|
|
310
|
+
navigation: "Navigation",
|
|
311
|
+
payload: "Payload",
|
|
312
|
+
health: "Health",
|
|
313
|
+
orbital: "Orbital",
|
|
314
|
+
general: "General"
|
|
315
|
+
};
|
|
316
|
+
function getPropertyConfig(key) {
|
|
317
|
+
const preset = PROPERTY_PRESETS[key];
|
|
318
|
+
if (preset) {
|
|
319
|
+
return preset;
|
|
320
|
+
}
|
|
321
|
+
return {
|
|
322
|
+
label: formatPropertyLabel(key),
|
|
323
|
+
icon: "info",
|
|
324
|
+
unit: "",
|
|
325
|
+
precision: 2,
|
|
326
|
+
category: "general",
|
|
327
|
+
description: key
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
function formatPropertyLabel(key) {
|
|
331
|
+
const words = key.replace(/([A-Z])/g, " $1").replace(/[_-]/g, " ").trim().toLowerCase();
|
|
332
|
+
return words.charAt(0).toUpperCase() + words.slice(1);
|
|
333
|
+
}
|
|
334
|
+
function deriveStatus(value, thresholds) {
|
|
335
|
+
if (value === void 0 || value === null || !Number.isFinite(value)) {
|
|
336
|
+
return "off";
|
|
337
|
+
}
|
|
338
|
+
if (!thresholds) {
|
|
339
|
+
return "normal";
|
|
340
|
+
}
|
|
341
|
+
if (thresholds.critical !== void 0 && value >= thresholds.critical) {
|
|
342
|
+
return "critical";
|
|
343
|
+
}
|
|
344
|
+
if (thresholds.serious !== void 0 && value >= thresholds.serious) {
|
|
345
|
+
return "serious";
|
|
346
|
+
}
|
|
347
|
+
if (thresholds.caution !== void 0 && value >= thresholds.caution) {
|
|
348
|
+
return "caution";
|
|
349
|
+
}
|
|
350
|
+
if (thresholds.criticalLow !== void 0 && value <= thresholds.criticalLow) {
|
|
351
|
+
return "critical";
|
|
352
|
+
}
|
|
353
|
+
if (thresholds.seriousLow !== void 0 && value <= thresholds.seriousLow) {
|
|
354
|
+
return "serious";
|
|
355
|
+
}
|
|
356
|
+
if (thresholds.cautionLow !== void 0 && value <= thresholds.cautionLow) {
|
|
357
|
+
return "caution";
|
|
358
|
+
}
|
|
359
|
+
return "normal";
|
|
360
|
+
}
|
|
361
|
+
function deriveBatteryStatus(level) {
|
|
362
|
+
if (level === void 0 || level === null) return "off";
|
|
363
|
+
if (level <= 10) return "critical";
|
|
364
|
+
if (level <= 20) return "serious";
|
|
365
|
+
if (level <= 30) return "caution";
|
|
366
|
+
return "normal";
|
|
367
|
+
}
|
|
368
|
+
function formatPropertyValue(value, config) {
|
|
369
|
+
if (value === void 0 || value === null || !Number.isFinite(value)) {
|
|
370
|
+
return "--";
|
|
371
|
+
}
|
|
372
|
+
if (config.format) {
|
|
373
|
+
return config.format(value);
|
|
374
|
+
}
|
|
375
|
+
const precision = config.precision ?? 2;
|
|
376
|
+
const formatted = value.toFixed(precision);
|
|
377
|
+
const unit = config.unit ?? "";
|
|
378
|
+
return unit ? `${formatted}${unit.startsWith("°") || unit.startsWith("%") ? "" : " "}${unit}` : formatted;
|
|
379
|
+
}
|
|
380
|
+
function createPropertyConfig(baseKey, overrides) {
|
|
381
|
+
const base = getPropertyConfig(baseKey);
|
|
382
|
+
return { ...base, ...overrides };
|
|
383
|
+
}
|
|
384
|
+
function getPropertiesByCategory(category) {
|
|
385
|
+
return Object.entries(PROPERTY_PRESETS).filter(([_, config]) => config.category === category).map(([key, config]) => ({ key, config }));
|
|
386
|
+
}
|
|
387
|
+
export {
|
|
388
|
+
CATEGORY_ICONS,
|
|
389
|
+
CATEGORY_LABELS,
|
|
390
|
+
PROPERTY_PRESETS,
|
|
391
|
+
createPropertyConfig,
|
|
392
|
+
deriveBatteryStatus,
|
|
393
|
+
deriveStatus,
|
|
394
|
+
formatPropertyLabel,
|
|
395
|
+
formatPropertyValue,
|
|
396
|
+
getPropertiesByCategory,
|
|
397
|
+
getPropertyConfig
|
|
398
|
+
};
|
|
399
|
+
//# sourceMappingURL=propertyConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propertyConfig.js","sources":["../../../src/react/core/propertyConfig.ts"],"sourcesContent":["/**\n * @zendir/ui - Property Configuration System\n * \n * Enterprise-grade property-to-icon/status/unit mapping system.\n * Provides automatic icon, status, and formatting for common telemetry properties.\n * \n * AstroUXDS Compliance:\n * - Uses official Astro icon names\n * - Status colors per AstroUXDS status system\n * - Dual-coding (color + shape) for accessibility\n * \n * Features:\n * - Auto-derive status from value + thresholds\n * - Contextual icons for space operations properties\n * - Unit formatting with SI prefixes\n * - Extensible configuration\n * \n * @example\n * ```tsx\n * import { getPropertyConfig, deriveStatus, PROPERTY_PRESETS } from '@zendir/ui';\n * \n * // Get config for a known property\n * const tempConfig = getPropertyConfig('temperature');\n * // { icon: 'thermal', unit: '°C', thresholds: { caution: 60, critical: 80 }, ... }\n * \n * // Derive status from value\n * const status = deriveStatus(75, tempConfig.thresholds);\n * // 'caution'\n * ```\n */\n\nimport type { StatusLevel } from '../utils';\nimport type { AstroIconName } from './AstroIcon';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Threshold configuration for automatic status derivation\n * Values are compared: value >= threshold triggers that status (high thresholds)\n * or value <= threshold triggers that status (low thresholds)\n */\nexport interface StatusThresholds {\n /** Value at or above which status becomes 'critical' (high is bad) */\n critical?: number;\n /** Value at or above which status becomes 'serious' (high is bad) */\n serious?: number;\n /** Value at or above which status becomes 'caution' (high is bad) */\n caution?: number;\n /** Value at or below which status becomes 'caution' (low is bad) */\n cautionLow?: number;\n /** Value at or below which status becomes 'serious' (low is bad) */\n seriousLow?: number;\n /** Value at or below which status becomes 'critical' (low is bad) */\n criticalLow?: number;\n}\n\n/**\n * Complete property configuration\n */\nexport interface PropertyConfig {\n /** Display name (sentence case per AstroUXDS) */\n label: string;\n /** Astro icon name */\n icon: AstroIconName;\n /** Unit of measurement */\n unit?: string;\n /** Precision for number formatting */\n precision?: number;\n /** Status thresholds for auto-derivation */\n thresholds?: StatusThresholds;\n /** Category for grouping */\n category?: PropertyCategory;\n /** Description for tooltips */\n description?: string;\n /** Format function override */\n format?: (value: number) => string;\n}\n\n/**\n * Property categories for organization\n */\nexport type PropertyCategory = \n | 'power'\n | 'thermal'\n | 'attitude'\n | 'communications'\n | 'propulsion'\n | 'navigation'\n | 'payload'\n | 'health'\n | 'orbital'\n | 'general';\n\n/**\n * Property key - either a preset name or custom string\n */\nexport type PropertyKey = keyof typeof PROPERTY_PRESETS | (string & {});\n\n// =============================================================================\n// Property Presets\n// =============================================================================\n\n/**\n * Predefined property configurations for common space operations telemetry\n * \n * These provide sensible defaults that can be overridden per-use.\n */\nexport const PROPERTY_PRESETS = {\n // === Power System ===\n battery: {\n label: 'Battery',\n icon: 'battery-full' as AstroIconName,\n unit: '%',\n precision: 1,\n category: 'power' as PropertyCategory,\n // Low values are bad for battery (use *Low thresholds)\n thresholds: { criticalLow: 10, seriousLow: 20, cautionLow: 30 },\n description: 'Battery state of charge',\n },\n voltage: {\n label: 'Voltage',\n icon: 'propulsion-power' as AstroIconName,\n unit: 'V',\n precision: 2,\n category: 'power' as PropertyCategory,\n thresholds: { criticalLow: 24, cautionLow: 26 },\n description: 'Bus voltage',\n },\n current: {\n label: 'Current',\n icon: 'propulsion-power' as AstroIconName,\n unit: 'A',\n precision: 2,\n category: 'power' as PropertyCategory,\n description: 'Current draw',\n },\n power: {\n label: 'Power',\n icon: 'propulsion-power' as AstroIconName,\n unit: 'W',\n precision: 1,\n category: 'power' as PropertyCategory,\n description: 'Power consumption or generation',\n },\n solarPower: {\n label: 'Solar',\n icon: 'solar' as AstroIconName,\n unit: 'W',\n precision: 1,\n category: 'power' as PropertyCategory,\n description: 'Solar array output',\n },\n load: {\n label: 'Load',\n icon: 'propulsion-power' as AstroIconName,\n unit: 'W',\n precision: 1,\n category: 'power' as PropertyCategory,\n description: 'Power load',\n },\n\n // === Thermal ===\n temperature: {\n label: 'Temperature',\n icon: 'thermal' as AstroIconName,\n unit: '°C',\n precision: 1,\n category: 'thermal' as PropertyCategory,\n thresholds: { critical: 80, serious: 70, caution: 60, cautionLow: -20, criticalLow: -40 },\n description: 'Component temperature',\n },\n heater: {\n label: 'Heater',\n icon: 'thermal' as AstroIconName,\n unit: '',\n category: 'thermal' as PropertyCategory,\n description: 'Heater status',\n },\n\n // === Attitude ===\n roll: {\n label: 'Roll',\n icon: 'explore' as AstroIconName,\n unit: '°',\n precision: 2,\n category: 'attitude' as PropertyCategory,\n thresholds: { critical: 45, caution: 30 },\n description: 'Roll angle',\n },\n pitch: {\n label: 'Pitch',\n icon: 'explore' as AstroIconName,\n unit: '°',\n precision: 2,\n category: 'attitude' as PropertyCategory,\n thresholds: { critical: 45, caution: 30 },\n description: 'Pitch angle',\n },\n yaw: {\n label: 'Yaw',\n icon: 'explore' as AstroIconName,\n unit: '°',\n precision: 2,\n category: 'attitude' as PropertyCategory,\n thresholds: { critical: 45, caution: 30 },\n description: 'Yaw angle',\n },\n pointingError: {\n label: 'Pointing error',\n icon: 'explore' as AstroIconName,\n unit: '°',\n precision: 3,\n category: 'attitude' as PropertyCategory,\n thresholds: { critical: 1.0, serious: 0.5, caution: 0.1 },\n description: 'Attitude pointing error',\n },\n angularVelocity: {\n label: 'Angular velocity',\n icon: 'explore' as AstroIconName,\n unit: '°/s',\n precision: 3,\n category: 'attitude' as PropertyCategory,\n thresholds: { critical: 5.0, caution: 2.0 },\n description: 'Rotation rate',\n },\n\n // === Communications ===\n signalStrength: {\n label: 'Signal',\n icon: 'antenna-receive' as AstroIconName,\n unit: 'dBm',\n precision: 1,\n category: 'communications' as PropertyCategory,\n thresholds: { criticalLow: -100, cautionLow: -85 },\n description: 'Received signal strength',\n },\n dataRate: {\n label: 'Data rate',\n icon: 'antenna-transmit' as AstroIconName,\n unit: 'Mbps',\n precision: 2,\n category: 'communications' as PropertyCategory,\n description: 'Communication data rate',\n },\n packetLoss: {\n label: 'Packet loss',\n icon: 'netcom' as AstroIconName,\n unit: '%',\n precision: 2,\n category: 'communications' as PropertyCategory,\n thresholds: { critical: 10, serious: 5, caution: 1 },\n description: 'Communication packet loss rate',\n },\n snr: {\n label: 'SNR',\n icon: 'antenna' as AstroIconName,\n unit: 'dB',\n precision: 1,\n category: 'communications' as PropertyCategory,\n thresholds: { criticalLow: 5, cautionLow: 10 },\n description: 'Signal-to-noise ratio',\n },\n queue: {\n label: 'Queue',\n icon: 'netcom' as AstroIconName,\n unit: 'pkts',\n precision: 0,\n category: 'communications' as PropertyCategory,\n thresholds: { critical: 1000, caution: 500 },\n description: 'Packet queue depth',\n },\n\n // === Propulsion ===\n fuelLevel: {\n label: 'Fuel',\n icon: 'propulsion-power' as AstroIconName,\n unit: '%',\n precision: 1,\n category: 'propulsion' as PropertyCategory,\n thresholds: { critical: 5, serious: 10, caution: 20 },\n description: 'Propellant remaining',\n },\n deltaV: {\n label: 'Delta-V',\n icon: 'propulsion-power' as AstroIconName,\n unit: 'm/s',\n precision: 1,\n category: 'propulsion' as PropertyCategory,\n description: 'Available delta-V budget',\n },\n thrustLevel: {\n label: 'Thrust',\n icon: 'propulsion-power' as AstroIconName,\n unit: 'N',\n precision: 2,\n category: 'propulsion' as PropertyCategory,\n description: 'Current thrust output',\n },\n\n // === Navigation ===\n altitude: {\n label: 'Altitude',\n icon: 'altitude' as AstroIconName,\n unit: 'km',\n precision: 1,\n category: 'orbital' as PropertyCategory,\n thresholds: { criticalLow: 200, cautionLow: 250 },\n description: 'Orbital altitude',\n },\n velocity: {\n label: 'Velocity',\n icon: 'altitude' as AstroIconName,\n unit: 'km/s',\n precision: 3,\n category: 'orbital' as PropertyCategory,\n description: 'Orbital velocity',\n },\n inclination: {\n label: 'Inclination',\n icon: 'altitude' as AstroIconName,\n unit: '°',\n precision: 2,\n category: 'orbital' as PropertyCategory,\n description: 'Orbital inclination',\n },\n eccentricity: {\n label: 'Eccentricity',\n icon: 'altitude' as AstroIconName,\n unit: '',\n precision: 6,\n category: 'orbital' as PropertyCategory,\n description: 'Orbital eccentricity',\n },\n\n // === Payload ===\n payloadStatus: {\n label: 'Payload',\n icon: 'payload' as AstroIconName,\n unit: '',\n category: 'payload' as PropertyCategory,\n description: 'Payload operational status',\n },\n storageUsed: {\n label: 'Storage',\n icon: 'hardware' as AstroIconName,\n unit: '%',\n precision: 1,\n category: 'payload' as PropertyCategory,\n thresholds: { critical: 95, serious: 90, caution: 80 },\n description: 'Onboard storage usage',\n },\n\n // === Health ===\n cpuUsage: {\n label: 'CPU',\n icon: 'processor' as AstroIconName,\n unit: '%',\n precision: 1,\n category: 'health' as PropertyCategory,\n thresholds: { critical: 95, serious: 85, caution: 75 },\n description: 'Processor utilization',\n },\n memoryUsage: {\n label: 'Memory',\n icon: 'processor' as AstroIconName,\n unit: '%',\n precision: 1,\n category: 'health' as PropertyCategory,\n thresholds: { critical: 95, serious: 85, caution: 75 },\n description: 'Memory utilization',\n },\n uptime: {\n label: 'Uptime',\n icon: 'mission' as AstroIconName,\n unit: 's',\n precision: 0,\n category: 'health' as PropertyCategory,\n description: 'System uptime',\n },\n\n // === General ===\n count: {\n label: 'Count',\n icon: 'list' as AstroIconName,\n unit: '',\n precision: 0,\n category: 'general' as PropertyCategory,\n description: 'Item count',\n },\n percentage: {\n label: 'Percentage',\n icon: 'info' as AstroIconName,\n unit: '%',\n precision: 1,\n category: 'general' as PropertyCategory,\n description: 'Percentage value',\n },\n duration: {\n label: 'Duration',\n icon: 'schedule' as AstroIconName,\n unit: 's',\n precision: 0,\n category: 'general' as PropertyCategory,\n description: 'Time duration',\n },\n} as const satisfies Record<string, PropertyConfig>;\n\n// =============================================================================\n// Category Icons (for section headers)\n// =============================================================================\n\nexport const CATEGORY_ICONS: Record<PropertyCategory, AstroIconName> = {\n power: 'propulsion-power',\n thermal: 'thermal',\n attitude: 'explore',\n communications: 'antenna',\n propulsion: 'propulsion-power',\n navigation: 'gps-fixed',\n payload: 'payload',\n health: 'favorite',\n orbital: 'altitude',\n general: 'info',\n};\n\nexport const CATEGORY_LABELS: Record<PropertyCategory, string> = {\n power: 'Power',\n thermal: 'Thermal',\n attitude: 'Attitude',\n communications: 'Communications',\n propulsion: 'Propulsion',\n navigation: 'Navigation',\n payload: 'Payload',\n health: 'Health',\n orbital: 'Orbital',\n general: 'General',\n};\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Get property configuration by key\n * Returns preset config or a default config for unknown properties\n */\nexport function getPropertyConfig(key: PropertyKey): PropertyConfig {\n const preset = PROPERTY_PRESETS[key as keyof typeof PROPERTY_PRESETS];\n if (preset) {\n return preset;\n }\n\n // Return default config for unknown properties\n return {\n label: formatPropertyLabel(key),\n icon: 'info',\n unit: '',\n precision: 2,\n category: 'general',\n description: key,\n };\n}\n\n/**\n * Format a property key into a display label (sentence case)\n */\nexport function formatPropertyLabel(key: string): string {\n // Handle camelCase → Sentence case\n const words = key\n .replace(/([A-Z])/g, ' $1')\n .replace(/[_-]/g, ' ')\n .trim()\n .toLowerCase();\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/**\n * Derive status level from a value and thresholds\n * \n * @param value - Current value\n * @param thresholds - Status thresholds\n * @returns StatusLevel\n * \n * @example\n * ```tsx\n * deriveStatus(75, { caution: 60, critical: 80 }) // 'caution'\n * deriveStatus(25, { criticalLow: 10, cautionLow: 30 }) // 'caution'\n * deriveStatus(50, { caution: 60, critical: 80 }) // 'normal'\n * ```\n */\nexport function deriveStatus(\n value: number | undefined | null,\n thresholds?: StatusThresholds\n): StatusLevel {\n if (value === undefined || value === null || !Number.isFinite(value)) {\n return 'off';\n }\n\n if (!thresholds) {\n return 'normal';\n }\n\n // Check high thresholds (value >= threshold is bad)\n if (thresholds.critical !== undefined && value >= thresholds.critical) {\n return 'critical';\n }\n if (thresholds.serious !== undefined && value >= thresholds.serious) {\n return 'serious';\n }\n if (thresholds.caution !== undefined && value >= thresholds.caution) {\n return 'caution';\n }\n\n // Check low thresholds (value <= threshold is bad)\n if (thresholds.criticalLow !== undefined && value <= thresholds.criticalLow) {\n return 'critical';\n }\n if (thresholds.seriousLow !== undefined && value <= thresholds.seriousLow) {\n return 'serious';\n }\n if (thresholds.cautionLow !== undefined && value <= thresholds.cautionLow) {\n return 'caution';\n }\n\n return 'normal';\n}\n\n/**\n * Derive status for battery specifically (low is bad)\n */\nexport function deriveBatteryStatus(level: number | undefined): StatusLevel {\n if (level === undefined || level === null) return 'off';\n if (level <= 10) return 'critical';\n if (level <= 20) return 'serious';\n if (level <= 30) return 'caution';\n return 'normal';\n}\n\n/**\n * Format a value with its property config\n */\nexport function formatPropertyValue(\n value: number | undefined | null,\n config: PropertyConfig\n): string {\n if (value === undefined || value === null || !Number.isFinite(value)) {\n return '--';\n }\n\n if (config.format) {\n return config.format(value);\n }\n\n const precision = config.precision ?? 2;\n const formatted = value.toFixed(precision);\n const unit = config.unit ?? '';\n \n return unit ? `${formatted}${unit.startsWith('°') || unit.startsWith('%') ? '' : ' '}${unit}` : formatted;\n}\n\n/**\n * Create a custom property config by merging with a preset\n */\nexport function createPropertyConfig(\n baseKey: PropertyKey,\n overrides: Partial<PropertyConfig>\n): PropertyConfig {\n const base = getPropertyConfig(baseKey);\n return { ...base, ...overrides };\n}\n\n/**\n * Get all properties in a category\n */\nexport function getPropertiesByCategory(category: PropertyCategory): Array<{ key: string; config: PropertyConfig }> {\n return Object.entries(PROPERTY_PRESETS)\n .filter(([_, config]) => config.category === category)\n .map(([key, config]) => ({ key, config }));\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zendir/ui - React Hooks
|
|
3
|
+
*
|
|
4
|
+
* Hooks for integrating with Zendir SDK and space operations.
|
|
5
|
+
*/
|
|
6
|
+
export { useZendirSession } from './useZendirSession';
|
|
7
|
+
export type { UseZendirSessionOptions, UseZendirSessionResult } from './useZendirSession';
|
|
8
|
+
export { useTelemetry } from './useTelemetry';
|
|
9
|
+
export type { UseTelemetryOptions, UseTelemetryResult } from './useTelemetry';
|
|
10
|
+
export { useSpacecraftPosition } from './useSpacecraftPosition';
|
|
11
|
+
export type { UseSpacecraftPositionOptions, UseSpacecraftPositionResult } from './useSpacecraftPosition';
|
|
12
|
+
export { useCompactMode } from './useCompactMode';
|
|
13
|
+
export type { UseCompactModeOptions, UseCompactModeResult } from './useCompactMode';
|
|
14
|
+
export { useSimulationTime } from './useSimulationTime';
|
|
15
|
+
export type { SimulationTimeState, UseSimulationTimeOptions } from './useSimulationTime';
|
|
16
|
+
export { useSimulationPlayback } from './useSimulationPlayback';
|
|
17
|
+
export type { SimulationPlaybackState, UseSimulationPlaybackOptions, UseSimulationPlaybackResult, } from './useSimulationPlayback';
|
|
18
|
+
export { useAccessWindows, createDemoAccessWindows } from './useAccessWindows';
|
|
19
|
+
export type { AccessWindow, AccessWindowsState, UseAccessWindowsOptions } from './useAccessWindows';
|
|
20
|
+
export { useLiveSelection } from './useLiveSelection';
|
|
21
|
+
export type { UseLiveSelectionOptions, UseLiveSelectionResult } from './useLiveSelection';
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { TimerConfig } from '../astro/MissionClock';
|
|
2
|
+
|
|
3
|
+
export interface AccessWindow {
|
|
4
|
+
/** Start time (AOS) */
|
|
5
|
+
startTime: Date;
|
|
6
|
+
/** End time (LOS) */
|
|
7
|
+
endTime: Date;
|
|
8
|
+
/** Duration in seconds */
|
|
9
|
+
duration: number;
|
|
10
|
+
/** Maximum elevation during pass (degrees) */
|
|
11
|
+
maxElevation: number;
|
|
12
|
+
/** Time of maximum elevation (TCA) */
|
|
13
|
+
tcaTime?: Date;
|
|
14
|
+
/** Ground station ID */
|
|
15
|
+
groundStationId: string;
|
|
16
|
+
/** Ground station name */
|
|
17
|
+
groundStationName: string;
|
|
18
|
+
}
|
|
19
|
+
export interface AccessWindowsState {
|
|
20
|
+
/** Currently active pass (if any) */
|
|
21
|
+
currentPass: AccessWindow | null;
|
|
22
|
+
/** Next upcoming pass */
|
|
23
|
+
nextPass: AccessWindow | null;
|
|
24
|
+
/** All upcoming passes */
|
|
25
|
+
upcomingPasses: AccessWindow[];
|
|
26
|
+
/** Whether currently in a pass */
|
|
27
|
+
isInPass: boolean;
|
|
28
|
+
/** Current elevation (degrees, if in pass) */
|
|
29
|
+
currentElevation: number | null;
|
|
30
|
+
/** Current azimuth (degrees, if in pass) */
|
|
31
|
+
currentAzimuth: number | null;
|
|
32
|
+
/** Time until next AOS (seconds) */
|
|
33
|
+
timeToAOS: number | null;
|
|
34
|
+
/** Time until LOS (seconds, if in pass) */
|
|
35
|
+
timeToLOS: number | null;
|
|
36
|
+
/** Timer config for AOS (for MissionClock) */
|
|
37
|
+
aosTimer: TimerConfig | null;
|
|
38
|
+
/** Timer config for LOS (for MissionClock) */
|
|
39
|
+
losTimer: TimerConfig | null;
|
|
40
|
+
/** Timer config for TCA (for MissionClock) */
|
|
41
|
+
tcaTimer: TimerConfig | null;
|
|
42
|
+
/** Whether connected to SDK */
|
|
43
|
+
isConnected: boolean;
|
|
44
|
+
/** Whether SDK is available */
|
|
45
|
+
isSdkAvailable: boolean;
|
|
46
|
+
/** Error message if any */
|
|
47
|
+
error: string | null;
|
|
48
|
+
}
|
|
49
|
+
export interface UseAccessWindowsOptions {
|
|
50
|
+
/** Spacecraft ID to track */
|
|
51
|
+
spacecraftId?: string;
|
|
52
|
+
/** Ground station ID (or 'all' for all stations) */
|
|
53
|
+
groundStationId?: string;
|
|
54
|
+
/** Update interval in milliseconds (default: 1000) */
|
|
55
|
+
updateInterval?: number;
|
|
56
|
+
/** Number of passes to fetch (default: 5) */
|
|
57
|
+
passCount?: number;
|
|
58
|
+
/** Manual access windows (for demo/testing) */
|
|
59
|
+
manualWindows?: AccessWindow[];
|
|
60
|
+
}
|
|
61
|
+
export declare function useAccessWindows(options?: UseAccessWindowsOptions): AccessWindowsState;
|
|
62
|
+
/**
|
|
63
|
+
* Generate demo access windows for testing
|
|
64
|
+
*/
|
|
65
|
+
export declare function createDemoAccessWindows(count?: number): AccessWindow[];
|
|
66
|
+
export default useAccessWindows;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zendir/ui - useCompactMode Hook
|
|
3
|
+
*
|
|
4
|
+
* Provides compact mode functionality for data cards with:
|
|
5
|
+
* - Hover-to-expand behavior
|
|
6
|
+
* - Click-to-pin (stays expanded until clicked again)
|
|
7
|
+
* - Keyboard accessibility (Enter/Space to toggle pin)
|
|
8
|
+
* - Reduced motion support
|
|
9
|
+
* - Integration with DisplaySettingsContext for global compact mode
|
|
10
|
+
*
|
|
11
|
+
* Priority for compact mode:
|
|
12
|
+
* 1. Explicit `compact` prop (if provided)
|
|
13
|
+
* 2. Global compact mode from DisplaySettingsContext
|
|
14
|
+
* 3. Default: false
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
* ```tsx
|
|
18
|
+
* const { expanded, isPinned, handlers, transitionDuration } = useCompactMode({
|
|
19
|
+
* compact: true, // Optional - if omitted, uses global setting
|
|
20
|
+
* defaultExpanded: false,
|
|
21
|
+
* onPinChange: (pinned) => {},
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* return (
|
|
25
|
+
* <div {...handlers}>
|
|
26
|
+
* {expanded ? <FullContent /> : <CompactContent />}
|
|
27
|
+
* </div>
|
|
28
|
+
* );
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Options for useCompactMode hook
|
|
33
|
+
*/
|
|
34
|
+
export interface UseCompactModeOptions {
|
|
35
|
+
/** Whether compact mode is enabled */
|
|
36
|
+
compact?: boolean;
|
|
37
|
+
/** Start in expanded (pinned) state */
|
|
38
|
+
defaultExpanded?: boolean;
|
|
39
|
+
/** Callback when pin state changes */
|
|
40
|
+
onPinChange?: (isPinned: boolean) => void;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Result from useCompactMode hook
|
|
44
|
+
*/
|
|
45
|
+
export interface UseCompactModeResult {
|
|
46
|
+
/** Whether the component should render in expanded state */
|
|
47
|
+
expanded: boolean;
|
|
48
|
+
/** Whether the component is pinned (clicked to stay expanded) */
|
|
49
|
+
isPinned: boolean;
|
|
50
|
+
/** Whether the component is being hovered */
|
|
51
|
+
isHovered: boolean;
|
|
52
|
+
/** Whether compact mode is active */
|
|
53
|
+
isCompact: boolean;
|
|
54
|
+
/** Event handlers to spread on the container element */
|
|
55
|
+
handlers: {
|
|
56
|
+
onMouseEnter: () => void;
|
|
57
|
+
onMouseLeave: () => void;
|
|
58
|
+
onClick: () => void;
|
|
59
|
+
onKeyDown: (e: React.KeyboardEvent) => void;
|
|
60
|
+
tabIndex: number;
|
|
61
|
+
role: string;
|
|
62
|
+
'aria-expanded': boolean;
|
|
63
|
+
};
|
|
64
|
+
/** Transition duration respecting reduced motion */
|
|
65
|
+
transitionDuration: string;
|
|
66
|
+
/** Toggle the pinned state programmatically */
|
|
67
|
+
togglePin: () => void;
|
|
68
|
+
/** Set pinned state programmatically */
|
|
69
|
+
setPin: (pinned: boolean) => void;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Hook for managing compact mode state and interactions
|
|
73
|
+
*
|
|
74
|
+
* Provides hover-to-expand and click-to-pin functionality with
|
|
75
|
+
* full keyboard accessibility and reduced motion support.
|
|
76
|
+
*
|
|
77
|
+
* Priority for compact mode:
|
|
78
|
+
* 1. Explicit `compact` prop (if provided)
|
|
79
|
+
* 2. Global compact mode from DisplaySettingsContext
|
|
80
|
+
* 3. Default: false
|
|
81
|
+
*/
|
|
82
|
+
export declare function useCompactMode(options?: UseCompactModeOptions): UseCompactModeResult;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { useState, useCallback, useMemo } from "react";
|
|
2
|
+
import { useDisplaySettingsOptional } from "../context/DisplaySettingsContext.js";
|
|
3
|
+
import { useTheme } from "../theme/ThemeProvider.js";
|
|
4
|
+
function useCompactMode(options = {}) {
|
|
5
|
+
const { compact: compactProp, defaultExpanded = false, onPinChange } = options;
|
|
6
|
+
const { prefersReducedMotion } = useTheme();
|
|
7
|
+
const displaySettings = useDisplaySettingsOptional();
|
|
8
|
+
const compact = compactProp ?? (displaySettings == null ? void 0 : displaySettings.compactMode) ?? false;
|
|
9
|
+
const [isHovered, setIsHovered] = useState(false);
|
|
10
|
+
const [isPinned, setIsPinned] = useState(defaultExpanded);
|
|
11
|
+
const transitionDuration = prefersReducedMotion ? "0ms" : "200ms";
|
|
12
|
+
const expanded = !compact || isPinned || isHovered;
|
|
13
|
+
const togglePin = useCallback(() => {
|
|
14
|
+
const newPinned = !isPinned;
|
|
15
|
+
setIsPinned(newPinned);
|
|
16
|
+
onPinChange == null ? void 0 : onPinChange(newPinned);
|
|
17
|
+
}, [isPinned, onPinChange]);
|
|
18
|
+
const setPin = useCallback((pinned) => {
|
|
19
|
+
setIsPinned(pinned);
|
|
20
|
+
onPinChange == null ? void 0 : onPinChange(pinned);
|
|
21
|
+
}, [onPinChange]);
|
|
22
|
+
const onMouseEnter = useCallback(() => {
|
|
23
|
+
setIsHovered(true);
|
|
24
|
+
}, []);
|
|
25
|
+
const onMouseLeave = useCallback(() => {
|
|
26
|
+
setIsHovered(false);
|
|
27
|
+
}, []);
|
|
28
|
+
const onClick = useCallback(() => {
|
|
29
|
+
if (compact) {
|
|
30
|
+
togglePin();
|
|
31
|
+
}
|
|
32
|
+
}, [compact, togglePin]);
|
|
33
|
+
const onKeyDown = useCallback((e) => {
|
|
34
|
+
if (compact && (e.key === "Enter" || e.key === " ")) {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
togglePin();
|
|
37
|
+
}
|
|
38
|
+
}, [compact, togglePin]);
|
|
39
|
+
const handlers = useMemo(() => ({
|
|
40
|
+
onMouseEnter,
|
|
41
|
+
onMouseLeave,
|
|
42
|
+
onClick,
|
|
43
|
+
onKeyDown,
|
|
44
|
+
tabIndex: compact ? 0 : -1,
|
|
45
|
+
role: compact ? "button" : "article",
|
|
46
|
+
"aria-expanded": expanded
|
|
47
|
+
}), [onMouseEnter, onMouseLeave, onClick, onKeyDown, compact, expanded]);
|
|
48
|
+
return {
|
|
49
|
+
expanded,
|
|
50
|
+
isPinned,
|
|
51
|
+
isHovered,
|
|
52
|
+
isCompact: compact,
|
|
53
|
+
handlers,
|
|
54
|
+
transitionDuration,
|
|
55
|
+
togglePin,
|
|
56
|
+
setPin
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export {
|
|
60
|
+
useCompactMode
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=useCompactMode.js.map
|