@zendir/ui 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/README.md +640 -631
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/index.js +17 -221
- package/dist/react/3d/CesiumCaptureSource.d.ts +0 -1
- package/dist/react/3d/CesiumCaptureSource.js +364 -283
- package/dist/react/3d/CesiumCaptureSource.js.map +1 -1
- package/dist/react/3d/ZenSpace3D.d.ts +2 -3
- package/dist/react/3d/ZenSpace3D.js +1681 -1237
- package/dist/react/3d/ZenSpace3D.js.map +1 -1
- package/dist/react/3d/ZenSpace3DCesium.d.ts +0 -1
- package/dist/react/3d/ZenSpace3DCesium.js +513 -560
- package/dist/react/3d/ZenSpace3DCesium.js.map +1 -1
- package/dist/react/3d/ZenSpace3DShaders.js +61 -66
- package/dist/react/3d/ZenSpace3DShaders.js.map +1 -1
- package/dist/react/3d/ZenSpace3DTypes.d.ts +19 -20
- package/dist/react/3d/ZenSpace3DUtils.d.ts +0 -1
- package/dist/react/3d/ZenSpace3DUtils.js +37 -24
- package/dist/react/3d/ZenSpace3DUtils.js.map +1 -1
- package/dist/react/3d/capturePngAnalysis.js +42 -36
- package/dist/react/3d/capturePngAnalysis.js.map +1 -1
- package/dist/react/3d/index.d.ts +3 -3
- package/dist/react/3d/index.js +5 -53
- package/dist/react/3d/threeLoader.d.ts +1 -1
- package/dist/react/3d/threeLoader.js +23 -18
- package/dist/react/3d/threeLoader.js.map +1 -1
- package/dist/react/astro/ClassificationBanner.d.ts +2 -3
- package/dist/react/astro/ClassificationBanner.js +95 -79
- package/dist/react/astro/ClassificationBanner.js.map +1 -1
- package/dist/react/astro/GlobalStatusBar.d.ts +0 -1
- package/dist/react/astro/GlobalStatusBar.js +157 -163
- package/dist/react/astro/GlobalStatusBar.js.map +1 -1
- package/dist/react/astro/MissionClock.d.ts +7 -8
- package/dist/react/astro/MissionClock.js +377 -400
- package/dist/react/astro/MissionClock.js.map +1 -1
- package/dist/react/astro/MonitoringIcon.d.ts +1 -2
- package/dist/react/astro/MonitoringIcon.js +422 -358
- package/dist/react/astro/MonitoringIcon.js.map +1 -1
- package/dist/react/astro/Notification.d.ts +1 -2
- package/dist/react/astro/Notification.js +229 -126
- package/dist/react/astro/Notification.js.map +1 -1
- package/dist/react/astro/Progress.d.ts +0 -1
- package/dist/react/astro/Progress.js +199 -141
- package/dist/react/astro/Progress.js.map +1 -1
- package/dist/react/astro/SimulationControls.d.ts +3 -4
- package/dist/react/astro/SimulationControls.js +596 -650
- package/dist/react/astro/SimulationControls.js.map +1 -1
- package/dist/react/astro/StatusIndicator.d.ts +0 -1
- package/dist/react/astro/StatusIndicator.js +236 -170
- package/dist/react/astro/StatusIndicator.js.map +1 -1
- package/dist/react/astro/UnifiedTimeline.d.ts +9 -10
- package/dist/react/astro/UnifiedTimeline.js +2345 -2392
- package/dist/react/astro/UnifiedTimeline.js.map +1 -1
- package/dist/react/astro/index.d.ts +5 -5
- package/dist/react/astro/index.js +1 -25
- package/dist/react/cards/AccessCard.d.ts +0 -1
- package/dist/react/cards/AccessCard.js +471 -405
- package/dist/react/cards/AccessCard.js.map +1 -1
- package/dist/react/cards/OrbitCard.d.ts +0 -1
- package/dist/react/cards/OrbitCard.js +487 -364
- package/dist/react/cards/OrbitCard.js.map +1 -1
- package/dist/react/cards/SpacecraftCard.d.ts +0 -1
- package/dist/react/cards/SpacecraftCard.js +813 -925
- package/dist/react/cards/SpacecraftCard.js.map +1 -1
- package/dist/react/cards/TelemetryCard.d.ts +0 -1
- package/dist/react/cards/TelemetryCard.js +1055 -732
- package/dist/react/cards/TelemetryCard.js.map +1 -1
- package/dist/react/cards/TelemetryStreamCard.d.ts +0 -1
- package/dist/react/cards/TelemetryStreamCard.js +323 -297
- package/dist/react/cards/TelemetryStreamCard.js.map +1 -1
- package/dist/react/cards/index.d.ts +1 -1
- package/dist/react/cards/index.js +1 -8
- package/dist/react/charts/GroundTrackMap.d.ts +6 -7
- package/dist/react/charts/GroundTrackMap.js +1377 -1256
- package/dist/react/charts/GroundTrackMap.js.map +1 -1
- package/dist/react/charts/GroundTrackMapLeaflet.d.ts +1 -2
- package/dist/react/charts/GroundTrackMapLeaflet.js +1065 -987
- package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -1
- package/dist/react/charts/groundTrackMapLeafletTiles.js +34 -25
- package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -1
- package/dist/react/charts/groundTrackMapLeafletUtils.js +70 -61
- package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -1
- package/dist/react/charts/index.d.ts +1 -1
- package/dist/react/charts/index.js +7 -100
- package/dist/react/charts/unified/AstroChart.d.ts +1 -2
- package/dist/react/charts/unified/AstroChart.js +1331 -1411
- package/dist/react/charts/unified/AstroChart.js.map +1 -1
- package/dist/react/charts/unified/PowerOverviewChart.d.ts +3 -3
- package/dist/react/charts/unified/PowerOverviewChart.js +495 -478
- package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -1
- package/dist/react/charts/unified/domain.d.ts +12 -13
- package/dist/react/charts/unified/domain.js +3999 -3145
- package/dist/react/charts/unified/domain.js.map +1 -1
- package/dist/react/charts/unified/generators.d.ts +3 -4
- package/dist/react/charts/unified/generators.js +561 -498
- package/dist/react/charts/unified/generators.js.map +1 -1
- package/dist/react/charts/unified/index.d.ts +1 -1
- package/dist/react/charts/unified/presets.d.ts +14 -15
- package/dist/react/charts/unified/presets.js +857 -994
- package/dist/react/charts/unified/presets.js.map +1 -1
- package/dist/react/charts/unified/sync.d.ts +2 -3
- package/dist/react/charts/unified/sync.js +229 -195
- package/dist/react/charts/unified/sync.js.map +1 -1
- package/dist/react/charts/unified/theme.d.ts +11 -12
- package/dist/react/charts/unified/theme.js +606 -642
- package/dist/react/charts/unified/theme.js.map +1 -1
- package/dist/react/charts/unified/types.d.ts +32 -33
- package/dist/react/charts/unified/useChartStream.d.ts +1 -2
- package/dist/react/charts/unified/useChartStream.js +203 -216
- package/dist/react/charts/unified/useChartStream.js.map +1 -1
- package/dist/react/chatgpt/AppCard.d.ts +1 -2
- package/dist/react/chatgpt/index.d.ts +7 -7
- package/dist/react/chatgpt/index.js +160 -139
- package/dist/react/chatgpt/index.js.map +1 -1
- package/dist/react/context/CategoryContext.d.ts +0 -1
- package/dist/react/context/CategoryContext.js +78 -29
- package/dist/react/context/CategoryContext.js.map +1 -1
- package/dist/react/context/DisplaySettingsContext.d.ts +1 -2
- package/dist/react/context/DisplaySettingsContext.js +205 -156
- package/dist/react/context/DisplaySettingsContext.js.map +1 -1
- package/dist/react/context/SpatialSelectionContext.d.ts +0 -1
- package/dist/react/context/SpatialSelectionContext.js +36 -7
- package/dist/react/context/SpatialSelectionContext.js.map +1 -1
- package/dist/react/core/data/DataTable.d.ts +3 -4
- package/dist/react/core/data/DataTable.js +473 -440
- package/dist/react/core/data/DataTable.js.map +1 -1
- package/dist/react/core/data/DataValue.d.ts +4 -5
- package/dist/react/core/data/DataValue.js +605 -571
- package/dist/react/core/data/DataValue.js.map +1 -1
- package/dist/react/core/data/propertyConfig.d.ts +1 -2
- package/dist/react/core/data/propertyConfig.js +446 -382
- package/dist/react/core/data/propertyConfig.js.map +1 -1
- package/dist/react/core/display/AstroIcon.d.ts +4 -5
- package/dist/react/core/display/AstroIcon.js +339 -429
- package/dist/react/core/display/AstroIcon.js.map +1 -1
- package/dist/react/core/display/Badge.d.ts +2 -3
- package/dist/react/core/display/Badge.js +131 -131
- package/dist/react/core/display/Badge.js.map +1 -1
- package/dist/react/core/display/CardHeader.d.ts +0 -1
- package/dist/react/core/display/CardHeader.js +398 -311
- package/dist/react/core/display/CardHeader.js.map +1 -1
- package/dist/react/core/display/Container.d.ts +2 -3
- package/dist/react/core/display/Container.js +640 -668
- package/dist/react/core/display/Container.js.map +1 -1
- package/dist/react/core/display/CopyButton.d.ts +1 -2
- package/dist/react/core/display/CopyButton.js +158 -101
- package/dist/react/core/display/CopyButton.js.map +1 -1
- package/dist/react/core/display/GlassCard.d.ts +3 -4
- package/dist/react/core/display/GlassCard.js +416 -369
- package/dist/react/core/display/GlassCard.js.map +1 -1
- package/dist/react/core/display/HeaderIconWithStatus.d.ts +0 -1
- package/dist/react/core/display/HeaderIconWithStatus.js +152 -152
- package/dist/react/core/display/HeaderIconWithStatus.js.map +1 -1
- package/dist/react/core/display/Icon.d.ts +2 -3
- package/dist/react/core/display/Icon.js +172 -143
- package/dist/react/core/display/Icon.js.map +1 -1
- package/dist/react/core/display/Typography.d.ts +24 -25
- package/dist/react/core/display/Typography.js +360 -178
- package/dist/react/core/display/Typography.js.map +1 -1
- package/dist/react/core/feedback/ConfirmDialog.d.ts +1 -2
- package/dist/react/core/feedback/ConfirmDialog.js +343 -304
- package/dist/react/core/feedback/ConfirmDialog.js.map +1 -1
- package/dist/react/core/feedback/Dialog.d.ts +2 -3
- package/dist/react/core/feedback/Dialog.js +189 -197
- package/dist/react/core/feedback/Dialog.js.map +1 -1
- package/dist/react/core/feedback/Toast.d.ts +2 -3
- package/dist/react/core/feedback/Toast.js +346 -207
- package/dist/react/core/feedback/Toast.js.map +1 -1
- package/dist/react/core/index.d.ts +26 -26
- package/dist/react/core/index.js +7 -119
- package/dist/react/core/inputs/Button.d.ts +2 -3
- package/dist/react/core/inputs/Button.js +281 -304
- package/dist/react/core/inputs/Button.js.map +1 -1
- package/dist/react/core/inputs/Checkbox.d.ts +2 -3
- package/dist/react/core/inputs/Checkbox.js +139 -127
- package/dist/react/core/inputs/Checkbox.js.map +1 -1
- package/dist/react/core/inputs/Input.d.ts +3 -4
- package/dist/react/core/inputs/Input.js +277 -285
- package/dist/react/core/inputs/Input.js.map +1 -1
- package/dist/react/core/inputs/LimitsBar.d.ts +1 -2
- package/dist/react/core/inputs/LimitsBar.js +271 -196
- package/dist/react/core/inputs/LimitsBar.js.map +1 -1
- package/dist/react/core/inputs/NumberInput.d.ts +2 -3
- package/dist/react/core/inputs/NumberInput.js +531 -503
- package/dist/react/core/inputs/NumberInput.js.map +1 -1
- package/dist/react/core/inputs/PinInput.d.ts +2 -3
- package/dist/react/core/inputs/PinInput.js +224 -207
- package/dist/react/core/inputs/PinInput.js.map +1 -1
- package/dist/react/core/inputs/Select.d.ts +1 -2
- package/dist/react/core/inputs/Select.js +298 -299
- package/dist/react/core/inputs/Select.js.map +1 -1
- package/dist/react/core/inputs/Toggle.d.ts +2 -3
- package/dist/react/core/inputs/Toggle.js +142 -148
- package/dist/react/core/inputs/Toggle.js.map +1 -1
- package/dist/react/core/layout/Box.d.ts +3 -4
- package/dist/react/core/layout/Box.js +118 -122
- package/dist/react/core/layout/Box.js.map +1 -1
- package/dist/react/core/layout/Center.d.ts +0 -1
- package/dist/react/core/layout/Center.js +45 -32
- package/dist/react/core/layout/Center.js.map +1 -1
- package/dist/react/core/layout/Divider.d.ts +1 -2
- package/dist/react/core/layout/Divider.js +112 -106
- package/dist/react/core/layout/Divider.js.map +1 -1
- package/dist/react/core/layout/Flex.d.ts +4 -5
- package/dist/react/core/layout/Flex.js +120 -124
- package/dist/react/core/layout/Flex.js.map +1 -1
- package/dist/react/core/layout/Grid.d.ts +5 -6
- package/dist/react/core/layout/Grid.js +131 -138
- package/dist/react/core/layout/Grid.js.map +1 -1
- package/dist/react/core/layout/Spacer.d.ts +0 -1
- package/dist/react/core/layout/Spacer.js +36 -29
- package/dist/react/core/layout/Spacer.js.map +1 -1
- package/dist/react/core/layout/Stack.d.ts +4 -5
- package/dist/react/core/layout/Stack.js +127 -70
- package/dist/react/core/layout/Stack.js.map +1 -1
- package/dist/react/core/layout/responsive.d.ts +1 -2
- package/dist/react/core/layout/responsive.js +25 -19
- package/dist/react/core/layout/responsive.js.map +1 -1
- package/dist/react/core/layout/useBreakpoint.d.ts +1 -1
- package/dist/react/core/layout/useBreakpoint.js +119 -66
- package/dist/react/core/layout/useBreakpoint.js.map +1 -1
- package/dist/react/core/navigation/AppBar.d.ts +1 -2
- package/dist/react/core/navigation/AppBar.js +827 -805
- package/dist/react/core/navigation/AppBar.js.map +1 -1
- package/dist/react/core/navigation/Pagination.d.ts +2 -3
- package/dist/react/core/navigation/Pagination.js +207 -187
- package/dist/react/core/navigation/Pagination.js.map +1 -1
- package/dist/react/core/navigation/SideNav.d.ts +5 -6
- package/dist/react/core/navigation/SideNav.js +855 -629
- package/dist/react/core/navigation/SideNav.js.map +1 -1
- package/dist/react/core/navigation/Tabs.d.ts +0 -1
- package/dist/react/core/navigation/Tabs.js +113 -119
- package/dist/react/core/navigation/Tabs.js.map +1 -1
- package/dist/react/core/overlays/Popover.d.ts +2 -3
- package/dist/react/core/overlays/Popover.js +303 -282
- package/dist/react/core/overlays/Popover.js.map +1 -1
- package/dist/react/core/overlays/SidePanel.d.ts +1 -2
- package/dist/react/core/overlays/SidePanel.js +217 -212
- package/dist/react/core/overlays/SidePanel.js.map +1 -1
- package/dist/react/core/overlays/Tooltip.d.ts +1 -2
- package/dist/react/core/overlays/Tooltip.js +170 -176
- package/dist/react/core/overlays/Tooltip.js.map +1 -1
- package/dist/react/core/widgets/ActivityPlanner.d.ts +0 -1
- package/dist/react/core/widgets/ActivityPlanner.js +855 -517
- package/dist/react/core/widgets/ActivityPlanner.js.map +1 -1
- package/dist/react/core/widgets/Capture.d.ts +2 -3
- package/dist/react/core/widgets/Capture.js +965 -779
- package/dist/react/core/widgets/Capture.js.map +1 -1
- package/dist/react/core/widgets/ChatPanel.d.ts +16 -17
- package/dist/react/core/widgets/ChatPanel.js +1734 -1034
- package/dist/react/core/widgets/ChatPanel.js.map +1 -1
- package/dist/react/core/widgets/ColorPickerPanel.d.ts +0 -1
- package/dist/react/core/widgets/ColorPickerPanel.js +298 -287
- package/dist/react/core/widgets/ColorPickerPanel.js.map +1 -1
- package/dist/react/core/widgets/CommandBuilder.d.ts +2 -3
- package/dist/react/core/widgets/CommandBuilder.js +624 -516
- package/dist/react/core/widgets/CommandBuilder.js.map +1 -1
- package/dist/react/core/widgets/ConnectionForm.d.ts +2 -3
- package/dist/react/core/widgets/ConnectionForm.js +528 -492
- package/dist/react/core/widgets/ConnectionForm.js.map +1 -1
- package/dist/react/core/widgets/FileExplorer.d.ts +3 -4
- package/dist/react/core/widgets/FileExplorer.js +617 -505
- package/dist/react/core/widgets/FileExplorer.js.map +1 -1
- package/dist/react/core/widgets/HexViewer.d.ts +2 -3
- package/dist/react/core/widgets/HexViewer.js +1353 -1091
- package/dist/react/core/widgets/HexViewer.js.map +1 -1
- package/dist/react/core/widgets/ImageFrame.d.ts +1 -2
- package/dist/react/core/widgets/ImageFrame.js +230 -193
- package/dist/react/core/widgets/ImageFrame.js.map +1 -1
- package/dist/react/core/widgets/ImageGallery.d.ts +2 -1
- package/dist/react/core/widgets/ImageGallery.js +380 -314
- package/dist/react/core/widgets/ImageGallery.js.map +1 -1
- package/dist/react/core/widgets/ImagePanel.d.ts +0 -1
- package/dist/react/core/widgets/ImagePanel.js +110 -101
- package/dist/react/core/widgets/ImagePanel.js.map +1 -1
- package/dist/react/core/widgets/LogViewer.d.ts +2 -3
- package/dist/react/core/widgets/LogViewer.js +711 -607
- package/dist/react/core/widgets/LogViewer.js.map +1 -1
- package/dist/react/core/widgets/MessageStream.d.ts +3 -4
- package/dist/react/core/widgets/MessageStream.js +514 -444
- package/dist/react/core/widgets/MessageStream.js.map +1 -1
- package/dist/react/core/widgets/MissionCalendar.d.ts +3 -4
- package/dist/react/core/widgets/MissionCalendar.js +1488 -1020
- package/dist/react/core/widgets/MissionCalendar.js.map +1 -1
- package/dist/react/core/widgets/PacketViewer.d.ts +2 -3
- package/dist/react/core/widgets/PacketViewer.js +550 -421
- package/dist/react/core/widgets/PacketViewer.js.map +1 -1
- package/dist/react/core/widgets/capture-placeholder.png.js +6 -5
- package/dist/react/core/widgets/capture-placeholder.png.js.map +1 -1
- package/dist/react/hooks/index.d.ts +5 -5
- package/dist/react/hooks/useAccessWindows.d.ts +0 -1
- package/dist/react/hooks/useCompactMode.d.ts +1 -1
- package/dist/react/hooks/useCompactMode.js +104 -58
- package/dist/react/hooks/useCompactMode.js.map +1 -1
- package/dist/react/hooks/useGroundTrackHistory.d.ts +0 -1
- package/dist/react/hooks/useSimulationScene.d.ts +1 -2
- package/dist/react/hooks/useSimulationScene.js +481 -374
- package/dist/react/hooks/useSimulationScene.js.map +1 -1
- package/dist/react/index.d.ts +3 -3
- package/dist/react/panels/LayerControlPanel.d.ts +1 -2
- package/dist/react/panels/LayerControlPanel.js +223 -180
- package/dist/react/panels/LayerControlPanel.js.map +1 -1
- package/dist/react/panels/ObjectInventoryPanel.d.ts +2 -3
- package/dist/react/panels/ObjectInventoryPanel.js +315 -250
- package/dist/react/panels/ObjectInventoryPanel.js.map +1 -1
- package/dist/react/panels/index.d.ts +1 -1
- package/dist/react/panels/index.js +1 -6
- package/dist/react/shared/ErrorBoundary.d.ts +1 -2
- package/dist/react/shared/ErrorBoundary.js +170 -139
- package/dist/react/shared/ErrorBoundary.js.map +1 -1
- package/dist/react/shared/Skeleton.d.ts +1 -2
- package/dist/react/shared/Skeleton.js +300 -301
- package/dist/react/shared/Skeleton.js.map +1 -1
- package/dist/react/theme/ThemeProvider.d.ts +2 -321
- package/dist/react/theme/ThemeProvider.js +312 -939
- package/dist/react/theme/ThemeProvider.js.map +1 -1
- package/dist/react/theme/cardAccent.d.ts +1 -2
- package/dist/react/theme/cardAccent.js +196 -126
- package/dist/react/theme/cardAccent.js.map +1 -1
- package/dist/react/theme/config.d.ts +0 -1
- package/dist/react/theme/config.js +47 -25
- package/dist/react/theme/config.js.map +1 -1
- package/dist/react/theme/index.d.ts +2 -2
- package/dist/react/theme/index.js +1 -16
- package/dist/react/theme/types.d.ts +332 -0
- package/dist/react/theme/types.js +39 -0
- package/dist/react/theme/types.js.map +1 -0
- package/dist/react/types.d.ts +8 -8
- package/dist/react/types.js +147 -47
- package/dist/react/types.js.map +1 -1
- package/dist/react/utils/categoryPalette.d.ts +0 -1
- package/dist/react/utils/categoryPalette.js +91 -102
- package/dist/react/utils/categoryPalette.js.map +1 -1
- package/dist/react/utils/index.d.ts +5 -5
- package/dist/react/utils/index.js +457 -371
- package/dist/react/utils/index.js.map +1 -1
- package/dist/react/visualizations/EclipseTimerCard.d.ts +0 -1
- package/dist/react/visualizations/LinkBudgetCard.d.ts +0 -1
- package/dist/react/visualizations/NavBallCard.d.ts +0 -1
- package/dist/react/visualizations/PropulsionCard.d.ts +1 -2
- package/dist/react/visualizations/SensorFootprintCard.d.ts +1 -2
- package/dist/react/visualizations/ThermalHeatmapCard.d.ts +0 -1
- package/dist/react/visualizations/index.d.ts +3 -3
- package/dist/react.d.ts +2 -1
- package/dist/react.js +17 -221
- package/dist/shaders/atmosphere.frag.js +6 -5
- package/dist/shaders/atmosphere.frag.js.map +1 -1
- package/dist/shaders/atmosphere.vert.js +6 -5
- package/dist/shaders/atmosphere.vert.js.map +1 -1
- package/dist/shaders/stars.frag.js +6 -5
- package/dist/shaders/stars.frag.js.map +1 -1
- package/dist/shaders/stars.vert.js +6 -5
- package/dist/shaders/stars.vert.js.map +1 -1
- package/dist/style.css +217 -194
- package/dist/tokens/core.d.ts +159 -0
- package/dist/tokens/core.js +144 -0
- package/dist/tokens/core.js.map +1 -0
- package/dist/tokens/css-vars.d.ts +213 -2
- package/dist/tokens/css-vars.js +590 -227
- package/dist/tokens/css-vars.js.map +1 -1
- package/dist/tokens/index.d.ts +31 -228
- package/dist/tokens/index.js +281 -366
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/palettes/astro.d.ts +129 -0
- package/dist/tokens/palettes/astro.js +112 -0
- package/dist/tokens/palettes/astro.js.map +1 -0
- package/dist/tokens/palettes/index.d.ts +288 -0
- package/dist/tokens/palettes/index.js +35 -0
- package/dist/tokens/palettes/index.js.map +1 -0
- package/dist/tokens/palettes/tailwind.d.ts +324 -0
- package/dist/tokens/palettes/tailwind.js +201 -0
- package/dist/tokens/palettes/tailwind.js.map +1 -0
- package/dist/tokens/palettes/zendir.d.ts +126 -0
- package/dist/tokens/palettes/zendir.js +92 -0
- package/dist/tokens/palettes/zendir.js.map +1 -0
- package/dist/tokens/themes.d.ts +30 -0
- package/dist/tokens/themes.js +704 -0
- package/dist/tokens/themes.js.map +1 -0
- package/dist/tokens/tokens.css +419 -41
- package/dist/types/index.d.ts +2 -2
- package/package.json +310 -313
- package/dist/index.js.map +0 -1
- package/dist/react/3d/index.js.map +0 -1
- package/dist/react/astro/index.js.map +0 -1
- package/dist/react/cards/index.js.map +0 -1
- package/dist/react/charts/index.js.map +0 -1
- package/dist/react/core/index.js.map +0 -1
- package/dist/react/panels/index.js.map +0 -1
- package/dist/react/theme/astro-tokens.d.ts +0 -153
- package/dist/react/theme/index.js.map +0 -1
- package/dist/react.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TelemetryCard.js","sources":["../../../src/react/cards/TelemetryCard.tsx"],"sourcesContent":["/**\n * @zendir/ui - TelemetryCard Component\n * \n * Enterprise-grade spacecraft telemetry data card.\n * \n * AstroUXDS Compliance:\n * - Status colors used semantically (battery level, health status)\n * - Dual-coded status indicators (color + shape via StatusIndicator)\n * - Zendir accent colors for non-status elements (icons, decorative)\n * - Tabular numbers with fontVariantNumeric for data display\n * - Sentence-case labels per Tier 3 compliance\n * \n * Features:\n * - Full null-safety with graceful fallbacks\n * - WCAG 2.1 AA accessibility\n * - Subsystem toggles (power, attitude, comms)\n * - Anomaly alerts\n * - Loading and empty states\n */\n\nimport React, { memo, useMemo, useState } from 'react';\nimport type { TelemetryData } from '../types';\nimport { useTheme } from '../theme';\nimport { StatusIndicator } from '../astro';\nimport { DataValue, DataValueGroup } from '../core/data/DataValue';\nimport { getPropertyConfig } from '../core/data/propertyConfig';\nimport { AstroIcon } from '../core/display/AstroIcon';\nimport { CardHeader } from '../core/display/CardHeader';\nimport { HeaderIconWithStatus } from '../core/display/HeaderIconWithStatus';\nimport { Icon, type IconName } from '../core/display/Icon';\nimport { useCompactMode } from '../hooks';\nimport { useCardBorderStyle } from '../context/DisplaySettingsContext';\nimport {\n safeNumber,\n formatTime,\n classNames,\n getStatusColor,\n deriveBatteryStatus,\n normalizeStatus,\n type StatusLevel,\n} from '../utils';\n\nexport interface TelemetryCardProps {\n /** Telemetry data */\n telemetry?: TelemetryData;\n /** Spacecraft name */\n spacecraftName?: string;\n /** Show power subsystem */\n showPower?: boolean;\n /** Show attitude subsystem */\n showAttitude?: boolean;\n /** Show communications */\n showComms?: boolean;\n /** Loading state */\n loading?: boolean;\n /** Custom className */\n className?: string;\n /** Enable compact mode - shows condensed view that expands on hover/click */\n compact?: boolean;\n /** Start expanded when in compact mode (pinned state) */\n defaultExpanded?: boolean;\n /** Callback when pin state changes in compact mode */\n onPinChange?: (isPinned: boolean) => void;\n}\n\n/**\n * Get health status level\n * Uses normalizeStatus utility to convert SDK terms to StatusLevel\n */\nfunction getHealthStatus(healthStatus: string | undefined): StatusLevel {\n return normalizeStatus(healthStatus);\n}\n\n/**\n * Get battery status based on level\n * @deprecated Use deriveBatteryStatus from utils instead\n */\nfunction getBatteryStatus(level: number | undefined): StatusLevel {\n return deriveBatteryStatus(level);\n}\n\n/**\n * TelemetryCard - Displays spacecraft telemetry data\n * \n * @example\n * ```tsx\n * <TelemetryCard\n * telemetry={telemetryData}\n * spacecraftName=\"ISS\"\n * showPower\n * showAttitude\n * showComms\n * />\n * ```\n */\nexport const TelemetryCard = memo(function TelemetryCard({\n telemetry,\n spacecraftName,\n showPower = true,\n showAttitude = true,\n showComms = true,\n loading = false,\n className = '',\n compact = false,\n defaultExpanded = false,\n onPinChange,\n}: TelemetryCardProps): React.ReactElement {\n const { tokens, theme, prefersReducedMotion } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n const isBoldVariant = theme === 'transparent-bold';\n const isMinimalVariant = theme === 'transparent-minimal';\n const useGlassMode = isBoldVariant || isMinimalVariant;\n \n // Glass accent colors for bold/minimal themes (matching Container/AstroChart)\n const glassAccentColor = tokens.colors.accent.primary;\n const glassAccentMuted = `${glassAccentColor}66`;\n \n // Use transparent background with blur for transparent themes (matching Timeline)\n const cardBg = isTransparentTheme ? 'transparent' : tokens.colors.background.surface;\n const cardGlass = isTransparentTheme ? { \n backdropFilter: 'blur(12px)' as const, \n WebkitBackdropFilter: 'blur(12px)' as const,\n } : {};\n // Get card border style based on accentBorders setting\n const cardBorderStyle = useCardBorderStyle(tokens, isTransparentTheme);\n \n // Glass mode container style (matching Container/AstroChart for bold/minimal)\n const glassContainerStyle: React.CSSProperties = useGlassMode ? {\n backgroundColor: 'rgba(10, 15, 25, 0.35)',\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n border: `1px solid ${glassAccentMuted}`,\n borderTop: isBoldVariant ? `2px solid ${glassAccentColor}` : `1px solid ${glassAccentColor}`,\n } : {};\n\n // Compact mode state management\n const { expanded, isPinned, isHovered: _isHovered, handlers, transitionDuration: compactTransition } = useCompactMode({\n compact,\n defaultExpanded,\n onPinChange,\n });\n \n // Track if we're animating to prevent flicker\n const [_isAnimating, _setIsAnimating] = useState(false);\n \n // Smooth animation timing\n const animationDuration = prefersReducedMotion ? 0 : 250;\n const animationEasing = 'cubic-bezier(0.4, 0, 0.2, 1)';\n\n // Computed statuses\n const healthStatus = useMemo(\n () => getHealthStatus(telemetry?.health?.status),\n [telemetry?.health?.status]\n );\n\n const batteryStatus = useMemo(\n () => getBatteryStatus(telemetry?.power?.batteryLevel),\n [telemetry?.power?.batteryLevel]\n );\n\n const transitionDuration = prefersReducedMotion ? '0ms' : '200ms';\n\n // Loading state\n if (loading) {\n return (\n <div\n className={classNames('zendir-telemetry-card', 'loading', className)}\n role=\"article\"\n aria-busy=\"true\"\n aria-label=\"Loading telemetry data\"\n style={{\n backgroundColor: cardBg,\n ...cardGlass,\n ...cardBorderStyle,\n borderRadius: tokens.borderRadius.lg,\n padding: tokens.spacing.md,\n minHeight: 200,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 16 }}>\n <div\n style={{\n width: 24,\n height: 24,\n borderRadius: 4,\n backgroundColor: 'rgba(255,255,255,0.1)',\n }}\n />\n <div\n style={{\n height: 16,\n width: '40%',\n backgroundColor: 'rgba(255,255,255,0.1)',\n borderRadius: 4,\n }}\n />\n </div>\n {[1, 2, 3].map((i) => (\n <div key={i} style={{ marginBottom: 16 }}>\n <div\n style={{\n height: 12,\n width: '30%',\n backgroundColor: 'rgba(255,255,255,0.08)',\n borderRadius: 2,\n marginBottom: 8,\n }}\n />\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: 8,\n }}\n >\n {[1, 2, 3, 4].map((j) => (\n <div\n key={j}\n style={{\n height: 32,\n backgroundColor: 'rgba(255,255,255,0.06)',\n borderRadius: 4,\n }}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n // Empty state\n if (!telemetry) {\n return (\n <div\n className={classNames('zendir-telemetry-card', 'empty', className)}\n role=\"article\"\n aria-label=\"No telemetry data\"\n style={{\n backgroundColor: cardBg,\n ...cardGlass,\n ...(tokens.colors.border.cardStyleDashed ?? {}),\n borderRadius: tokens.borderRadius.lg,\n padding: tokens.spacing.lg,\n textAlign: 'center',\n color: tokens.colors.text.tertiary,\n }}\n >\n <AstroIcon name=\"antenna\" size=\"normal\" label=\"\" style={{ opacity: 0.5 }} />\n <p style={{ margin: '8px 0 0 0', fontSize: tokens.typography.body[2].fontSize }}>No telemetry data available</p>\n </div>\n );\n }\n\n const sectionStyle: React.CSSProperties = {\n marginBottom: tokens.spacing.md,\n paddingBottom: tokens.spacing.md,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n };\n\n /** Fixed width so all section and metric icons align on one vertical line */\n const iconColumnWidth = 20;\n const iconGap = tokens.spacing.sm;\n const rowGap = tokens.spacing.smd;\n const sectionGridColumns = `${iconColumnWidth}px 1fr ${iconColumnWidth}px 1fr`;\n\n // Compact metric item component for consistent styling\n const CompactMetric = ({ \n icon, \n label, \n value, \n color, \n astroIcon \n }: { \n icon?: string; \n label: string; \n value: string | number; \n color?: string;\n astroIcon?: string;\n }) => (\n <div style={{ \n display: 'flex', \n alignItems: 'center', \n gap: 3,\n padding: `2px 0`,\n }}>\n {astroIcon ? (\n <AstroIcon name={astroIcon} size={12} color={color ?? tokens.colors.text.secondary} />\n ) : icon ? (\n <Icon name={icon as IconName} size={12} color={color ?? tokens.colors.text.secondary} />\n ) : null}\n <span style={{ \n fontSize: tokens.typography.fontSize.micro, // 0.5625rem / 9px (AstroUXDS micro)\n fontWeight: tokens.typography.fontWeight.medium,\n fontFamily: tokens.typography.fontFamily.primary, // Public Sans → Roboto fallback → system stack\n color: tokens.colors.text.tertiary,\n textTransform: 'uppercase',\n minWidth: 8,\n }}>\n {label.charAt(0)}\n </span>\n <span style={{ \n fontVariantNumeric: 'tabular-nums', \n fontFamily: tokens.typography.fontFamily.mono,\n fontSize: tokens.typography.fontSize.xs,\n color: color ?? tokens.colors.text.primary,\n fontWeight: tokens.typography.fontWeight.medium,\n }}>\n {value}\n </span>\n </div>\n );\n\n // Compact view content - reusable for both states\n const renderCompactContent = () => {\n const power = telemetry?.power ?? telemetry?.subsystems?.power;\n const attitude = telemetry?.attitude ?? telemetry?.subsystems?.attitude;\n const comms = telemetry?.communications ?? telemetry?.subsystems?.comms;\n const thermal = telemetry?.subsystems?.thermal;\n const compactStatusColor = getStatusColor(healthStatus);\n\n return (\n <>\n {/* Header: Icon with status badge overlay → Name → (flex) → Badges on right */}\n {/* Follows MonitoringIcon layout pattern for consistency */}\n <div style={{ \n display: 'flex', \n alignItems: 'center', \n justifyContent: 'space-between', \n marginBottom: tokens.spacing.xs,\n paddingBottom: tokens.spacing.xs,\n borderBottom: useGlassMode ? 'none' : `1px solid ${tokens.colors.border.muted}`,\n position: 'relative',\n zIndex: 1,\n }}>\n {/* Left side: Icon with status badge + Name */}\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.sm, minWidth: 0, flex: 1 }}>\n {/* Icon with status badge - MonitoringIcon pattern */}\n <HeaderIconWithStatus \n icon=\"antenna-receive\" \n size={20} \n status={healthStatus}\n statusColor={compactStatusColor}\n />\n {/* Name - accent color for glass mode */}\n <span style={{ \n fontWeight: tokens.typography.fontWeight.semibold, \n fontSize: tokens.typography.fontSize.sm,\n fontFamily: tokens.typography.fontFamily.primary,\n color: useGlassMode ? glassAccentColor : undefined,\n textShadow: useGlassMode ? `0 0 16px ${glassAccentMuted}` : undefined,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n minWidth: 0,\n }}>\n {spacecraftName ? spacecraftName.split(' ')[0] : 'Telemetry'}\n </span>\n {/* Accent line for glass mode */}\n {useGlassMode && (\n <div style={{\n flex: 1,\n height: isBoldVariant ? '2px' : '1px',\n minWidth: 20,\n background: `linear-gradient(90deg, ${glassAccentColor} 0%, ${glassAccentMuted} 60%, transparent 100%)`,\n boxShadow: isBoldVariant ? `0 0 8px ${glassAccentMuted}` : undefined,\n }} />\n )}\n </div>\n \n {/* Right side: Badges (pin indicator, etc.) */}\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.xs, flexShrink: 0 }}>\n {isPinned && (\n <Icon name=\"lock\" size={10} color={tokens.colors.accent.primary} />\n )}\n </div>\n </div>\n\n {/* Metrics grid */}\n <div style={{ \n display: 'grid', \n gridTemplateColumns: 'repeat(3, 1fr)',\n gap: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n }}>\n {/* Power metrics */}\n {showPower && power && (\n <>\n {power.batteryLevel !== undefined && (\n <CompactMetric \n icon=\"battery\" \n label=\"Battery\" \n value={`${safeNumber(power.batteryLevel, 0)}%`}\n color={getStatusColor(batteryStatus)}\n />\n )}\n {(power.solarGeneration ?? power.solarArrayOutput) !== undefined && (\n <CompactMetric \n astroIcon=\"solar\" \n label=\"Solar\" \n value={`${safeNumber(power.solarGeneration ?? power.solarArrayOutput, 1)}W`}\n color={tokens.colors.status.standby}\n />\n )}\n {power.voltage !== undefined && (\n <CompactMetric \n astroIcon=\"propulsion-power\" \n label=\"Voltage\" \n value={`${safeNumber(power.voltage, 1)}V`}\n />\n )}\n </>\n )}\n\n {/* Attitude metrics */}\n {showAttitude && attitude && (\n <>\n {attitude.pointingError !== undefined && (\n <CompactMetric \n astroIcon=\"explore\" \n label=\"Pointing\" \n value={`${safeNumber(attitude.pointingError, 2)}°`}\n />\n )}\n {attitude.targetMode && (\n <CompactMetric \n astroIcon=\"explore\" \n label=\"Mode\" \n value={attitude.targetMode}\n />\n )}\n </>\n )}\n\n {/* Thermal metrics */}\n {thermal && (\n <>\n {thermal.cpuTemp !== undefined && (\n <CompactMetric \n icon=\"thermometer\" \n label=\"CPU\" \n value={`${safeNumber(thermal.cpuTemp, 0)}°C`}\n color={thermal.cpuTemp > 50 ? tokens.colors.status.caution : undefined}\n />\n )}\n </>\n )}\n\n {/* Comms metrics */}\n {showComms && comms && (\n <>\n {comms.signalStrength !== undefined && (\n <CompactMetric \n astroIcon=\"antenna\" \n label=\"Signal\" \n value={`${safeNumber(comms.signalStrength, 0)}%`}\n />\n )}\n {(comms.downlinkRate ?? comms.dataRate) !== undefined && (\n <CompactMetric \n astroIcon=\"antenna-transmit\" \n label=\"Rate\" \n value={`${safeNumber(comms.downlinkRate ?? comms.dataRate, 0)}Mb`}\n />\n )}\n {comms.transmitterStatus && (\n <CompactMetric \n astroIcon=\"antenna-receive\" \n label=\"TX\" \n value={comms.transmitterStatus === 'transmitting' ? 'ON' : 'OFF'}\n color={comms.transmitterStatus === 'transmitting' ? tokens.colors.status.normal : tokens.colors.status.off}\n />\n )}\n </>\n )}\n </div>\n </>\n );\n };\n\n // Compact mode with overlay expansion - prevents layout shift\n if (compact) {\n return (\n <article\n className={classNames('zendir-telemetry-card', 'compact', expanded ? 'expanded' : '', className)}\n {...handlers}\n aria-label={spacecraftName ? `${spacecraftName} Telemetry${expanded ? '' : ' (compact)'}` : 'Telemetry Data'}\n style={{\n position: 'relative',\n overflow: 'hidden',\n // Use glass container style for bold/minimal themes\n ...(useGlassMode ? glassContainerStyle : {\n backgroundColor: cardBg,\n ...cardGlass,\n ...cardBorderStyle,\n }),\n borderRadius: tokens.borderRadius.lg,\n padding: expanded ? tokens.spacing.md : tokens.spacing.sm,\n fontFamily: tokens.typography.fontFamily.primary,\n color: tokens.colors.text.primary,\n fontSize: expanded ? tokens.typography.fontSize.base : tokens.typography.fontSize.sm,\n cursor: 'pointer',\n transition: `all ${animationDuration}ms ${animationEasing}`,\n boxShadow: expanded \n ? `0 12px 40px rgba(0,0,0,0.4), 0 0 0 1px ${tokens.colors.accent.primary}30` \n : 'none',\n zIndex: expanded ? 50 : 1,\n }}\n >\n {/* Glass gradient overlay for bold/minimal themes */}\n {useGlassMode && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n background: 'linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%, rgba(0,0,0,0.1) 100%)',\n pointerEvents: 'none',\n zIndex: 0,\n }}\n />\n )}\n {expanded ? (\n // Full expanded content - resolve data with fallbacks like compact view\n (() => {\n const power = telemetry?.power ?? telemetry?.subsystems?.power;\n const attitude = telemetry?.attitude ?? telemetry?.subsystems?.attitude;\n const comms = telemetry?.communications ?? telemetry?.subsystems?.comms;\n return (\n <>\n {/* Header - consistent icon/status with compact view */}\n <header\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: tokens.spacing.md,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.sm }}>\n {/* Icon with status badge - MonitoringIcon pattern */}\n <HeaderIconWithStatus \n icon=\"antenna-receive\" \n size={24} \n status={healthStatus}\n />\n <h3\n style={{\n margin: 0,\n fontSize: tokens.typography.fontSize.md,\n fontWeight: tokens.typography.fontWeight.semibold,\n }}\n >\n {spacecraftName ? `${spacecraftName} Telemetry` : 'Telemetry'}\n </h3>\n {isPinned && (\n <Icon name=\"lock\" size={12} color={tokens.colors.accent.primary} style={{ marginLeft: 4 }} />\n )}\n </div>\n <StatusIndicator status={healthStatus} label={healthStatus} small />\n </header>\n\n {/* Power Section - fixed icon column so all icons align vertically */}\n {showPower && (\n <section style={sectionStyle} aria-label=\"Power subsystem\">\n <div style={{ display: 'grid', gridTemplateColumns: sectionGridColumns, gap: `${rowGap} ${iconGap}`, alignItems: 'center' }}>\n <AstroIcon name=\"propulsion-power\" size={12} color={tokens.colors.text.tertiary} />\n <h4 style={{ margin: 0, gridColumn: '2 / -1', fontSize: tokens.typography.fontSize.xs, fontWeight: tokens.typography.fontWeight.medium, color: tokens.colors.text.secondary }}>\n Power\n </h4>\n <AstroIcon name={getPropertyConfig('battery').icon} size={16} color={getStatusColor(batteryStatus)} />\n <DataValue property=\"battery\" value={power?.batteryLevel} size=\"sm\" variant=\"card\" showIcon={false} />\n <AstroIcon name={getPropertyConfig('voltage').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"voltage\" value={power?.voltage} size=\"sm\" variant=\"card\" showIcon={false} />\n <AstroIcon name={getPropertyConfig('solarPower').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"solarPower\" value={power?.solarGeneration ?? power?.solarArrayOutput} size=\"sm\" variant=\"card\" status=\"standby\" showIcon={false} />\n <AstroIcon name={getPropertyConfig('load').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"load\" value={power?.consumption} size=\"sm\" variant=\"card\" showIcon={false} />\n </div>\n\n {/* Battery progress bar */}\n <div\n style={{\n marginTop: tokens.spacing.sm,\n height: 4,\n backgroundColor: tokens.colors.border.muted,\n borderRadius: 2,\n overflow: 'hidden',\n }}\n >\n <div\n role=\"progressbar\"\n aria-valuenow={power?.batteryLevel ?? 0}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label=\"Battery level\"\n style={{\n height: '100%',\n width: `${Math.min(100, Math.max(0, power?.batteryLevel ?? 0))}%`,\n backgroundColor: getStatusColor(batteryStatus),\n borderRadius: 2,\n transition: `width ${transitionDuration} ease-out`,\n }}\n />\n </div>\n </section>\n )}\n\n {/* Attitude Section - fixed icon column so all icons align vertically */}\n {showAttitude && (\n <section style={sectionStyle} aria-label=\"Attitude subsystem\">\n <div style={{ display: 'grid', gridTemplateColumns: sectionGridColumns, gap: `${rowGap} ${iconGap}`, alignItems: 'center' }}>\n <AstroIcon name=\"explore\" size={12} color={tokens.colors.text.tertiary} />\n <h4 style={{ margin: 0, gridColumn: '2 / -1', fontSize: tokens.typography.fontSize.xs, fontWeight: tokens.typography.fontWeight.medium, color: tokens.colors.text.secondary }}>\n Attitude\n </h4>\n <AstroIcon name={getPropertyConfig('roll').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"roll\" value={attitude?.eulerAngles?.roll ?? attitude?.pointingError} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n <AstroIcon name={getPropertyConfig('pitch').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"pitch\" value={attitude?.eulerAngles?.pitch} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n <AstroIcon name={getPropertyConfig('yaw').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"yaw\" value={attitude?.eulerAngles?.yaw} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n <AstroIcon name=\"explore\" size={16} color={tokens.colors.text.tertiary} />\n <DataValue label=\"Mode\" icon=\"explore\" value={attitude?.targetMode ?? '--'} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n </div>\n </section>\n )}\n\n {/* Communications Section - fixed icon column so all icons align vertically */}\n {showComms && (\n <section style={{ marginBottom: tokens.spacing.sm }} aria-label=\"Communications subsystem\">\n <div style={{ display: 'grid', gridTemplateColumns: sectionGridColumns, gap: `${rowGap} ${iconGap}`, alignItems: 'center' }}>\n <AstroIcon name=\"antenna\" size={12} color={tokens.colors.text.tertiary} />\n <h4 style={{ margin: 0, gridColumn: '2 / -1', fontSize: tokens.typography.fontSize.xs, fontWeight: tokens.typography.fontWeight.medium, color: tokens.colors.text.secondary }}>\n Communications\n </h4>\n <AstroIcon name=\"antenna-transmit\" size={16} color={tokens.colors.text.tertiary} />\n <DataValue label=\"Status\" icon=\"antenna-transmit\" value={comms?.transmitterStatus ?? comms?.status ?? '--'} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n <AstroIcon name={getPropertyConfig('signalStrength').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"signalStrength\" value={comms?.signalStrength} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n <AstroIcon name=\"antenna-receive\" size={16} color={tokens.colors.text.tertiary} />\n <DataValue label=\"Transmitted\" icon=\"antenna-receive\" value={comms?.packetsTransmitted ?? comms?.dataRate ?? '--'} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n <span style={{ gridColumn: '4 / -1' }} />\n </div>\n </section>\n )}\n\n {/* Timestamp */}\n {telemetry?.timestamp && (\n <time\n dateTime={telemetry.timestamp}\n style={{\n display: 'block',\n fontSize: tokens.typography.fontSize.xs,\n color: tokens.colors.text.tertiary,\n marginTop: tokens.spacing.sm,\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {formatTime(telemetry.timestamp)}\n </time>\n )}\n </>\n );\n })()\n ) : (\n // Compact content\n renderCompactContent()\n )}\n </article>\n );\n }\n\n return (\n <article\n className={classNames('zendir-telemetry-card', compact ? 'expanded' : '', className)}\n {...(compact ? handlers : {})}\n role={compact ? handlers.role : 'article'}\n tabIndex={compact ? handlers.tabIndex : undefined}\n aria-expanded={compact ? handlers['aria-expanded'] : undefined}\n aria-label={spacecraftName ? `${spacecraftName} Telemetry` : 'Telemetry Data'}\n style={{\n position: 'relative',\n overflow: 'hidden',\n ...(useGlassMode ? glassContainerStyle : {\n backgroundColor: cardBg,\n ...cardGlass,\n ...cardBorderStyle,\n }),\n borderRadius: tokens.borderRadius.lg,\n padding: tokens.spacing.md,\n fontFamily: tokens.typography.fontFamily.primary,\n color: tokens.colors.text.primary,\n fontSize: tokens.typography.fontSize.sm,\n cursor: compact ? 'pointer' : undefined,\n transition: compact ? `all ${compactTransition} ease-out` : undefined,\n }}\n >\n {/* Glass gradient overlay for bold/minimal themes */}\n {useGlassMode && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n background: 'linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%, rgba(0,0,0,0.1) 100%)',\n pointerEvents: 'none',\n zIndex: 0,\n }}\n />\n )}\n \n {/* Unified Card Header - handles all theme variants */}\n <CardHeader\n icon=\"antenna-receive\"\n title={spacecraftName ? `${spacecraftName} Telemetry` : 'Telemetry'}\n status={healthStatus}\n isPinned={compact && isPinned}\n />\n\n {/* Power Section - fixed icon column so all icons align vertically */}\n {showPower && (\n <section style={sectionStyle} aria-label=\"Power subsystem\">\n <div style={{ display: 'grid', gridTemplateColumns: sectionGridColumns, gap: `${rowGap} ${iconGap}`, alignItems: 'center' }}>\n <AstroIcon name=\"propulsion-power\" size={12} color={tokens.colors.text.tertiary} />\n <h4 style={{ margin: 0, gridColumn: '2 / -1', fontSize: tokens.typography.fontSize.xs, fontWeight: tokens.typography.fontWeight.medium, color: tokens.colors.text.secondary }}>\n Power\n </h4>\n <AstroIcon name={getPropertyConfig('battery').icon} size={16} color={getStatusColor(batteryStatus)} />\n <DataValue property=\"battery\" value={telemetry.power?.batteryLevel} size=\"sm\" variant=\"card\" showIcon={false} />\n <AstroIcon name={getPropertyConfig('voltage').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"voltage\" value={telemetry.power?.voltage} size=\"sm\" variant=\"card\" showIcon={false} />\n <AstroIcon name={getPropertyConfig('solarPower').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"solarPower\" value={telemetry.power?.solarGeneration} size=\"sm\" variant=\"card\" status=\"standby\" showIcon={false} />\n <AstroIcon name={getPropertyConfig('load').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"load\" value={telemetry.power?.consumption} size=\"sm\" variant=\"card\" showIcon={false} />\n </div>\n\n {/* Battery progress bar */}\n <div\n style={{\n marginTop: tokens.spacing.sm,\n height: 4,\n backgroundColor: tokens.colors.border.muted,\n borderRadius: 2,\n overflow: 'hidden',\n }}\n >\n <div\n role=\"progressbar\"\n aria-valuenow={telemetry.power?.batteryLevel ?? 0}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label=\"Battery level\"\n style={{\n height: '100%',\n width: `${Math.min(100, Math.max(0, telemetry.power?.batteryLevel ?? 0))}%`,\n backgroundColor: getStatusColor(batteryStatus),\n borderRadius: 2,\n transition: `width ${transitionDuration} ease-out`,\n }}\n />\n </div>\n </section>\n )}\n\n {/* Attitude Section - fixed icon column so all icons align vertically */}\n {showAttitude && (\n <section style={sectionStyle} aria-label=\"Attitude subsystem\">\n <div style={{ display: 'grid', gridTemplateColumns: sectionGridColumns, gap: `${rowGap} ${iconGap}`, alignItems: 'center' }}>\n <AstroIcon name=\"explore\" size={12} color={tokens.colors.text.tertiary} />\n <h4 style={{ margin: 0, gridColumn: '2 / -1', fontSize: tokens.typography.fontSize.xs, fontWeight: tokens.typography.fontWeight.medium, color: tokens.colors.text.secondary }}>\n Attitude\n </h4>\n <AstroIcon name={getPropertyConfig('roll').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"roll\" value={telemetry.attitude?.eulerAngles?.roll} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n <AstroIcon name={getPropertyConfig('pitch').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"pitch\" value={telemetry.attitude?.eulerAngles?.pitch} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n <AstroIcon name={getPropertyConfig('yaw').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"yaw\" value={telemetry.attitude?.eulerAngles?.yaw} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n <AstroIcon name=\"explore\" size={16} color={tokens.colors.text.tertiary} />\n <DataValue label=\"Mode\" icon=\"explore\" value={telemetry.attitude?.targetMode ?? '--'} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n </div>\n {telemetry.attitude?.pointingError !== undefined && (\n <div style={{ display: 'flex', alignItems: 'center', gap: iconGap, marginTop: tokens.spacing.sm }}>\n <AstroIcon name={getPropertyConfig('pointingError').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"pointingError\" value={telemetry.attitude.pointingError} size=\"sm\" variant=\"inline\" showIcon={false} />\n </div>\n )}\n </section>\n )}\n\n {/* Communications Section - fixed icon column so all icons align vertically */}\n {showComms && (\n <section style={{ marginBottom: tokens.spacing.md }} aria-label=\"Communications subsystem\">\n <div style={{ display: 'grid', gridTemplateColumns: sectionGridColumns, gap: `${rowGap} ${iconGap}`, alignItems: 'center' }}>\n <AstroIcon name=\"antenna\" size={12} color={tokens.colors.text.tertiary} />\n <h4 style={{ margin: 0, gridColumn: '2 / -1', fontSize: tokens.typography.fontSize.xs, fontWeight: tokens.typography.fontWeight.medium, color: tokens.colors.text.secondary }}>\n Communications\n </h4>\n <AstroIcon name=\"antenna-transmit\" size={16} color={tokens.colors.text.tertiary} />\n <DataValue\n label=\"Status\"\n icon=\"antenna-transmit\"\n value={telemetry.communications?.transmitterStatus ?? '--'}\n size=\"sm\"\n variant=\"card\"\n showIcon={false}\n status={\n telemetry.communications?.transmitterStatus === 'transmitting'\n ? 'normal'\n : telemetry.communications?.transmitterStatus === 'error'\n ? 'critical'\n : 'off'\n }\n />\n <AstroIcon name={getPropertyConfig('queue').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"queue\" value={telemetry.communications?.packetsQueued} size=\"sm\" variant=\"card\" showIcon={false} />\n <AstroIcon name=\"antenna-receive\" size={16} color={tokens.colors.text.tertiary} />\n <DataValue\n label=\"Transmitted\"\n icon=\"antenna-receive\"\n value={safeNumber((telemetry.communications?.bytesTransmitted ?? 0) / 1024, 1)}\n unit=\"KB\"\n size=\"sm\"\n variant=\"card\"\n showStatus={false}\n showIcon={false}\n />\n <span style={{ gridColumn: '4 / -1' }} />\n </div>\n </section>\n )}\n\n {/* Anomalies Alert */}\n {telemetry.health?.anomalies && telemetry.health.anomalies.length > 0 && (\n <div\n role=\"alert\"\n style={{\n backgroundColor: `${tokens.colors.status.critical}15`,\n border: `1px solid ${tokens.colors.status.critical}40`,\n borderRadius: tokens.borderRadius.md,\n padding: tokens.spacing.sm,\n marginTop: tokens.spacing.md,\n }}\n >\n <h4\n style={{\n margin: `0 0 ${tokens.spacing.xs} 0`,\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.medium,\n color: tokens.colors.status.critical,\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n }}\n >\n ⚠️ Anomalies ({telemetry.health.anomalies.length})\n </h4>\n <ul style={{ margin: 0, paddingLeft: 16 }}>\n {telemetry.health.anomalies.map((anomaly: { id: string; message: string; severity?: string }, idx: number) => (\n <li\n key={idx}\n style={{\n fontSize: tokens.typography.fontSize.xs,\n color: tokens.colors.status.critical,\n marginTop: 2,\n }}\n >\n {typeof anomaly === 'object' && anomaly !== null && 'message' in anomaly ? anomaly.message : String(anomaly)}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {/* Timestamp Footer */}\n <footer\n style={{\n marginTop: tokens.spacing.md,\n fontSize: tokens.typography.fontSize.xs,\n color: tokens.colors.text.secondary, // WCAG AA compliant - 4.5:1 contrast\n textAlign: 'right',\n }}\n >\n <time dateTime={telemetry.timestamp}>{formatTime(telemetry.timestamp)} UTC</time>\n </footer>\n </article>\n );\n});\n\n// Note: DataCell is deprecated in favor of DataValue from core.\n// Use <DataValue property=\"...\" value={...} /> for automatic icon/status integration.\n"],"names":["TelemetryCard","_a","_b","_c","_d","_e","_f"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TelemetryCard.js","names":[],"sources":["../../../src/react/cards/TelemetryCard.tsx"],"sourcesContent":["/**\n * @zendir/ui - TelemetryCard Component\n *\n * Enterprise-grade spacecraft telemetry data card.\n *\n * AstroUXDS Compliance:\n * - Status colors used semantically (battery level, health status)\n * - Dual-coded status indicators (color + shape via StatusIndicator)\n * - Zendir accent colors for non-status elements (icons, decorative)\n * - Tabular numbers with fontVariantNumeric for data display\n * - Sentence-case labels per Tier 3 compliance\n *\n * Features:\n * - Full null-safety with graceful fallbacks\n * - WCAG 2.1 AA accessibility\n * - Subsystem toggles (power, attitude, comms)\n * - Anomaly alerts\n * - Loading and empty states\n */\n\nimport React, { memo, useMemo, useState } from \"react\";\nimport type { TelemetryData } from \"../types\";\nimport { useTheme } from \"../theme\";\nimport { StatusIndicator } from \"../astro\";\nimport { DataValue, DataValueGroup } from \"../core/data/DataValue\";\nimport { getPropertyConfig } from \"../core/data/propertyConfig\";\nimport { AstroIcon } from \"../core/display/AstroIcon\";\nimport { CardHeader } from \"../core/display/CardHeader\";\nimport { HeaderIconWithStatus } from \"../core/display/HeaderIconWithStatus\";\nimport { Icon, type IconName } from \"../core/display/Icon\";\nimport { useCompactMode } from \"../hooks\";\nimport { useCardBorderStyle } from \"../context/DisplaySettingsContext\";\nimport {\n safeNumber,\n formatTime,\n classNames,\n getStatusColor,\n deriveBatteryStatus,\n normalizeStatus,\n type StatusLevel,\n} from \"../utils\";\n\nexport interface TelemetryCardProps {\n /** Telemetry data */\n telemetry?: TelemetryData;\n /** Spacecraft name */\n spacecraftName?: string;\n /** Show power subsystem */\n showPower?: boolean;\n /** Show attitude subsystem */\n showAttitude?: boolean;\n /** Show communications */\n showComms?: boolean;\n /** Loading state */\n loading?: boolean;\n /** Custom className */\n className?: string;\n /** Enable compact mode - shows condensed view that expands on hover/click */\n compact?: boolean;\n /** Start expanded when in compact mode (pinned state) */\n defaultExpanded?: boolean;\n /** Callback when pin state changes in compact mode */\n onPinChange?: (isPinned: boolean) => void;\n}\n\n/**\n * Get health status level\n * Uses normalizeStatus utility to convert SDK terms to StatusLevel\n */\nfunction getHealthStatus(healthStatus: string | undefined): StatusLevel {\n return normalizeStatus(healthStatus);\n}\n\n/**\n * Get battery status based on level\n * @deprecated Use deriveBatteryStatus from utils instead\n */\nfunction getBatteryStatus(level: number | undefined): StatusLevel {\n return deriveBatteryStatus(level);\n}\n\n/**\n * TelemetryCard - Displays spacecraft telemetry data\n *\n * @example\n * ```tsx\n * <TelemetryCard\n * telemetry={telemetryData}\n * spacecraftName=\"ISS\"\n * showPower\n * showAttitude\n * showComms\n * />\n * ```\n */\nexport const TelemetryCard = memo(function TelemetryCard({\n telemetry,\n spacecraftName,\n showPower = true,\n showAttitude = true,\n showComms = true,\n loading = false,\n className = \"\",\n compact = false,\n defaultExpanded = false,\n onPinChange,\n}: TelemetryCardProps): React.ReactElement {\n const { tokens, theme, prefersReducedMotion } = useTheme();\n const isTransparentTheme =\n theme === \"transparent\" ||\n theme === \"transparent-bold\" ||\n theme === \"transparent-minimal\";\n const isBoldVariant = theme === \"transparent-bold\";\n const isMinimalVariant = theme === \"transparent-minimal\";\n const useGlassMode = isBoldVariant || isMinimalVariant;\n\n // Glass accent colors for bold/minimal themes (matching Container/AstroChart)\n const glassAccentColor = tokens.colors.accent.primary;\n const glassAccentMuted = `${glassAccentColor}66`;\n\n // Use transparent background with blur for transparent themes (matching Timeline)\n const cardBg = isTransparentTheme\n ? \"transparent\"\n : tokens.colors.background.surface;\n const cardGlass = isTransparentTheme\n ? {\n backdropFilter: \"blur(12px)\" as const,\n WebkitBackdropFilter: \"blur(12px)\" as const,\n }\n : {};\n // Get card border style based on accentBorders setting\n const cardBorderStyle = useCardBorderStyle(tokens, isTransparentTheme);\n\n // Glass mode container style (matching Container/AstroChart for bold/minimal)\n const glassContainerStyle: React.CSSProperties = useGlassMode\n ? {\n backgroundColor: \"rgba(10, 15, 25, 0.35)\",\n backdropFilter: \"blur(12px)\",\n WebkitBackdropFilter: \"blur(12px)\",\n border: `1px solid ${glassAccentMuted}`,\n borderTop: isBoldVariant\n ? `2px solid ${glassAccentColor}`\n : `1px solid ${glassAccentColor}`,\n }\n : {};\n\n // Compact mode state management\n const {\n expanded,\n isPinned,\n isHovered: _isHovered,\n handlers,\n transitionDuration: compactTransition,\n } = useCompactMode({\n compact,\n defaultExpanded,\n onPinChange,\n });\n\n // Track if we're animating to prevent flicker\n const [_isAnimating, _setIsAnimating] = useState(false);\n\n // Smooth animation timing\n const animationDuration = prefersReducedMotion ? 0 : 250;\n const animationEasing = \"cubic-bezier(0.4, 0, 0.2, 1)\";\n\n // Computed statuses\n const healthStatus = useMemo(\n () => getHealthStatus(telemetry?.health?.status),\n [telemetry?.health?.status],\n );\n\n const batteryStatus = useMemo(\n () => getBatteryStatus(telemetry?.power?.batteryLevel),\n [telemetry?.power?.batteryLevel],\n );\n\n const transitionDuration = prefersReducedMotion ? \"0ms\" : \"200ms\";\n\n // Loading state\n if (loading) {\n return (\n <div\n className={classNames(\"zendir-telemetry-card\", \"loading\", className)}\n role=\"article\"\n aria-busy=\"true\"\n aria-label=\"Loading telemetry data\"\n style={{\n backgroundColor: cardBg,\n ...cardGlass,\n ...cardBorderStyle,\n borderRadius: tokens.borderRadius.lg,\n padding: tokens.spacing.md,\n minHeight: 200,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 16,\n }}\n >\n <div\n style={{\n width: 24,\n height: 24,\n borderRadius: 4,\n backgroundColor: \"rgba(255,255,255,0.1)\",\n }}\n />\n <div\n style={{\n height: 16,\n width: \"40%\",\n backgroundColor: \"rgba(255,255,255,0.1)\",\n borderRadius: 4,\n }}\n />\n </div>\n {[1, 2, 3].map((i) => (\n <div key={i} style={{ marginBottom: 16 }}>\n <div\n style={{\n height: 12,\n width: \"30%\",\n backgroundColor: \"rgba(255,255,255,0.08)\",\n borderRadius: 2,\n marginBottom: 8,\n }}\n />\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(2, 1fr)\",\n gap: 8,\n }}\n >\n {[1, 2, 3, 4].map((j) => (\n <div\n key={j}\n style={{\n height: 32,\n backgroundColor: \"rgba(255,255,255,0.06)\",\n borderRadius: 4,\n }}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n // Empty state\n if (!telemetry) {\n return (\n <div\n className={classNames(\"zendir-telemetry-card\", \"empty\", className)}\n role=\"article\"\n aria-label=\"No telemetry data\"\n style={{\n backgroundColor: cardBg,\n ...cardGlass,\n ...(tokens.colors.border.cardStyleDashed ?? {}),\n borderRadius: tokens.borderRadius.lg,\n padding: tokens.spacing.lg,\n textAlign: \"center\",\n color: tokens.colors.text.tertiary,\n }}\n >\n <AstroIcon\n name=\"antenna\"\n size=\"normal\"\n label=\"\"\n style={{ opacity: 0.5 }}\n />\n <p\n style={{\n margin: \"8px 0 0 0\",\n fontSize: tokens.typography.body[2].fontSize,\n }}\n >\n No telemetry data available\n </p>\n </div>\n );\n }\n\n const sectionStyle: React.CSSProperties = {\n marginBottom: tokens.spacing.md,\n paddingBottom: tokens.spacing.md,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n };\n\n /** Fixed width so all section and metric icons align on one vertical line */\n const iconColumnWidth = 20;\n const iconGap = tokens.spacing.sm;\n const rowGap = tokens.spacing.smd;\n const sectionGridColumns = `${iconColumnWidth}px 1fr ${iconColumnWidth}px 1fr`;\n\n // Compact metric item component for consistent styling\n const CompactMetric = ({\n icon,\n label,\n value,\n color,\n astroIcon,\n }: {\n icon?: string;\n label: string;\n value: string | number;\n color?: string;\n astroIcon?: string;\n }) => (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 3,\n padding: `2px 0`,\n }}\n >\n {astroIcon ? (\n <AstroIcon\n name={astroIcon}\n size={12}\n color={color ?? tokens.colors.text.secondary}\n />\n ) : icon ? (\n <Icon\n name={icon as IconName}\n size={12}\n color={color ?? tokens.colors.text.secondary}\n />\n ) : null}\n <span\n style={{\n fontSize: tokens.typography.fontSize.micro, // 0.5625rem / 9px (AstroUXDS micro)\n fontWeight: tokens.typography.fontWeight.medium,\n fontFamily: tokens.typography.fontFamily.primary, // Public Sans → Roboto fallback → system stack\n color: tokens.colors.text.tertiary,\n textTransform: \"uppercase\",\n minWidth: 8,\n }}\n >\n {label.charAt(0)}\n </span>\n <span\n style={{\n fontVariantNumeric: \"tabular-nums\",\n fontFamily: tokens.typography.fontFamily.mono,\n fontSize: tokens.typography.fontSize.xs,\n color: color ?? tokens.colors.text.primary,\n fontWeight: tokens.typography.fontWeight.medium,\n }}\n >\n {value}\n </span>\n </div>\n );\n\n // Compact view content - reusable for both states\n const renderCompactContent = () => {\n const power = telemetry?.power ?? telemetry?.subsystems?.power;\n const attitude = telemetry?.attitude ?? telemetry?.subsystems?.attitude;\n const comms = telemetry?.communications ?? telemetry?.subsystems?.comms;\n const thermal = telemetry?.subsystems?.thermal;\n const compactStatusColor = getStatusColor(healthStatus);\n\n return (\n <>\n {/* Header: Icon with status badge overlay → Name → (flex) → Badges on right */}\n {/* Follows MonitoringIcon layout pattern for consistency */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: tokens.spacing.xs,\n paddingBottom: tokens.spacing.xs,\n borderBottom: useGlassMode\n ? \"none\"\n : `1px solid ${tokens.colors.border.muted}`,\n position: \"relative\",\n zIndex: 1,\n }}\n >\n {/* Left side: Icon with status badge + Name */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: tokens.spacing.sm,\n minWidth: 0,\n flex: 1,\n }}\n >\n {/* Icon with status badge - MonitoringIcon pattern */}\n <HeaderIconWithStatus\n icon=\"antenna-receive\"\n size={20}\n status={healthStatus}\n statusColor={compactStatusColor}\n />\n {/* Name - accent color for glass mode */}\n <span\n style={{\n fontWeight: tokens.typography.fontWeight.semibold,\n fontSize: tokens.typography.fontSize.sm,\n fontFamily: tokens.typography.fontFamily.primary,\n color: useGlassMode ? glassAccentColor : undefined,\n textShadow: useGlassMode\n ? `0 0 16px ${glassAccentMuted}`\n : undefined,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n minWidth: 0,\n }}\n >\n {spacecraftName ? spacecraftName.split(\" \")[0] : \"Telemetry\"}\n </span>\n {/* Accent line for glass mode */}\n {useGlassMode && (\n <div\n style={{\n flex: 1,\n height: isBoldVariant ? \"2px\" : \"1px\",\n minWidth: 20,\n background: `linear-gradient(90deg, ${glassAccentColor} 0%, ${glassAccentMuted} 60%, transparent 100%)`,\n boxShadow: isBoldVariant\n ? `0 0 8px ${glassAccentMuted}`\n : undefined,\n }}\n />\n )}\n </div>\n\n {/* Right side: Badges (pin indicator, etc.) */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: tokens.spacing.xs,\n flexShrink: 0,\n }}\n >\n {isPinned && (\n <Icon\n name=\"lock\"\n size={10}\n color={tokens.colors.accent.primary}\n />\n )}\n </div>\n </div>\n\n {/* Metrics grid */}\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(3, 1fr)\",\n gap: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n }}\n >\n {/* Power metrics */}\n {showPower && power && (\n <>\n {power.batteryLevel !== undefined && (\n <CompactMetric\n icon=\"battery\"\n label=\"Battery\"\n value={`${safeNumber(power.batteryLevel, 0)}%`}\n color={getStatusColor(batteryStatus)}\n />\n )}\n {(power.solarGeneration ?? power.solarArrayOutput) !==\n undefined && (\n <CompactMetric\n astroIcon=\"solar\"\n label=\"Solar\"\n value={`${safeNumber(power.solarGeneration ?? power.solarArrayOutput, 1)}W`}\n color={tokens.colors.status.standby}\n />\n )}\n {power.voltage !== undefined && (\n <CompactMetric\n astroIcon=\"propulsion-power\"\n label=\"Voltage\"\n value={`${safeNumber(power.voltage, 1)}V`}\n />\n )}\n </>\n )}\n\n {/* Attitude metrics */}\n {showAttitude && attitude && (\n <>\n {attitude.pointingError !== undefined && (\n <CompactMetric\n astroIcon=\"explore\"\n label=\"Pointing\"\n value={`${safeNumber(attitude.pointingError, 2)}°`}\n />\n )}\n {attitude.targetMode && (\n <CompactMetric\n astroIcon=\"explore\"\n label=\"Mode\"\n value={attitude.targetMode}\n />\n )}\n </>\n )}\n\n {/* Thermal metrics */}\n {thermal && (\n <>\n {thermal.cpuTemp !== undefined && (\n <CompactMetric\n icon=\"thermometer\"\n label=\"CPU\"\n value={`${safeNumber(thermal.cpuTemp, 0)}°C`}\n color={\n thermal.cpuTemp > 50\n ? tokens.colors.status.caution\n : undefined\n }\n />\n )}\n </>\n )}\n\n {/* Comms metrics */}\n {showComms && comms && (\n <>\n {comms.signalStrength !== undefined && (\n <CompactMetric\n astroIcon=\"antenna\"\n label=\"Signal\"\n value={`${safeNumber(comms.signalStrength, 0)}%`}\n />\n )}\n {(comms.downlinkRate ?? comms.dataRate) !== undefined && (\n <CompactMetric\n astroIcon=\"antenna-transmit\"\n label=\"Rate\"\n value={`${safeNumber(comms.downlinkRate ?? comms.dataRate, 0)}Mb`}\n />\n )}\n {comms.transmitterStatus && (\n <CompactMetric\n astroIcon=\"antenna-receive\"\n label=\"TX\"\n value={\n comms.transmitterStatus === \"transmitting\" ? \"ON\" : \"OFF\"\n }\n color={\n comms.transmitterStatus === \"transmitting\"\n ? tokens.colors.status.normal\n : tokens.colors.status.off\n }\n />\n )}\n </>\n )}\n </div>\n </>\n );\n };\n\n // Compact mode with overlay expansion - prevents layout shift\n if (compact) {\n return (\n <article\n className={classNames(\n \"zendir-telemetry-card\",\n \"compact\",\n expanded ? \"expanded\" : \"\",\n className,\n )}\n {...handlers}\n aria-label={\n spacecraftName\n ? `${spacecraftName} Telemetry${expanded ? \"\" : \" (compact)\"}`\n : \"Telemetry Data\"\n }\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n // Use glass container style for bold/minimal themes\n ...(useGlassMode\n ? glassContainerStyle\n : {\n backgroundColor: cardBg,\n ...cardGlass,\n ...cardBorderStyle,\n }),\n borderRadius: tokens.borderRadius.lg,\n padding: expanded ? tokens.spacing.md : tokens.spacing.sm,\n fontFamily: tokens.typography.fontFamily.primary,\n color: tokens.colors.text.primary,\n fontSize: expanded\n ? tokens.typography.fontSize.base\n : tokens.typography.fontSize.sm,\n cursor: \"pointer\",\n transition: `all ${animationDuration}ms ${animationEasing}`,\n boxShadow: expanded\n ? `0 12px 40px rgba(0,0,0,0.4), 0 0 0 1px ${tokens.colors.accent.primary}30`\n : \"none\",\n zIndex: expanded ? 50 : 1,\n }}\n >\n {/* Glass gradient overlay for bold/minimal themes */}\n {useGlassMode && (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n background:\n \"linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%, rgba(0,0,0,0.1) 100%)\",\n pointerEvents: \"none\",\n zIndex: 0,\n }}\n />\n )}\n {expanded\n ? // Full expanded content - resolve data with fallbacks like compact view\n (() => {\n const power = telemetry?.power ?? telemetry?.subsystems?.power;\n const attitude =\n telemetry?.attitude ?? telemetry?.subsystems?.attitude;\n const comms =\n telemetry?.communications ?? telemetry?.subsystems?.comms;\n return (\n <>\n {/* Header - consistent icon/status with compact view */}\n <header\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: tokens.spacing.md,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: tokens.spacing.sm,\n }}\n >\n {/* Icon with status badge - MonitoringIcon pattern */}\n <HeaderIconWithStatus\n icon=\"antenna-receive\"\n size={24}\n status={healthStatus}\n />\n <h3\n style={{\n margin: 0,\n fontSize: tokens.typography.fontSize.md,\n fontWeight: tokens.typography.fontWeight.semibold,\n }}\n >\n {spacecraftName\n ? `${spacecraftName} Telemetry`\n : \"Telemetry\"}\n </h3>\n {isPinned && (\n <Icon\n name=\"lock\"\n size={12}\n color={tokens.colors.accent.primary}\n style={{ marginLeft: 4 }}\n />\n )}\n </div>\n <StatusIndicator\n status={healthStatus}\n label={healthStatus}\n small\n />\n </header>\n\n {/* Power Section - fixed icon column so all icons align vertically */}\n {showPower && (\n <section style={sectionStyle} aria-label=\"Power subsystem\">\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: sectionGridColumns,\n gap: `${rowGap} ${iconGap}`,\n alignItems: \"center\",\n }}\n >\n <AstroIcon\n name=\"propulsion-power\"\n size={12}\n color={tokens.colors.text.tertiary}\n />\n <h4\n style={{\n margin: 0,\n gridColumn: \"2 / -1\",\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.medium,\n color: tokens.colors.text.secondary,\n }}\n >\n Power\n </h4>\n <AstroIcon\n name={getPropertyConfig(\"battery\").icon}\n size={16}\n color={getStatusColor(batteryStatus)}\n />\n <DataValue\n property=\"battery\"\n value={power?.batteryLevel}\n size=\"sm\"\n variant=\"card\"\n showIcon={false}\n />\n <AstroIcon\n name={getPropertyConfig(\"voltage\").icon}\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n property=\"voltage\"\n value={power?.voltage}\n size=\"sm\"\n variant=\"card\"\n showIcon={false}\n />\n <AstroIcon\n name={getPropertyConfig(\"solarPower\").icon}\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n property=\"solarPower\"\n value={\n power?.solarGeneration ?? power?.solarArrayOutput\n }\n size=\"sm\"\n variant=\"card\"\n status=\"standby\"\n showIcon={false}\n />\n <AstroIcon\n name={getPropertyConfig(\"load\").icon}\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n property=\"load\"\n value={power?.consumption}\n size=\"sm\"\n variant=\"card\"\n showIcon={false}\n />\n </div>\n\n {/* Battery progress bar */}\n <div\n style={{\n marginTop: tokens.spacing.sm,\n height: 4,\n backgroundColor: tokens.colors.border.muted,\n borderRadius: 2,\n overflow: \"hidden\",\n }}\n >\n <div\n role=\"progressbar\"\n aria-valuenow={power?.batteryLevel ?? 0}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label=\"Battery level\"\n style={{\n height: \"100%\",\n width: `${Math.min(100, Math.max(0, power?.batteryLevel ?? 0))}%`,\n backgroundColor: getStatusColor(batteryStatus),\n borderRadius: 2,\n transition: `width ${transitionDuration} ease-out`,\n }}\n />\n </div>\n </section>\n )}\n\n {/* Attitude Section - fixed icon column so all icons align vertically */}\n {showAttitude && (\n <section\n style={sectionStyle}\n aria-label=\"Attitude subsystem\"\n >\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: sectionGridColumns,\n gap: `${rowGap} ${iconGap}`,\n alignItems: \"center\",\n }}\n >\n <AstroIcon\n name=\"explore\"\n size={12}\n color={tokens.colors.text.tertiary}\n />\n <h4\n style={{\n margin: 0,\n gridColumn: \"2 / -1\",\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.medium,\n color: tokens.colors.text.secondary,\n }}\n >\n Attitude\n </h4>\n <AstroIcon\n name={getPropertyConfig(\"roll\").icon}\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n property=\"roll\"\n value={\n attitude?.eulerAngles?.roll ??\n attitude?.pointingError\n }\n size=\"sm\"\n variant=\"card\"\n showStatus={false}\n showIcon={false}\n />\n <AstroIcon\n name={getPropertyConfig(\"pitch\").icon}\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n property=\"pitch\"\n value={attitude?.eulerAngles?.pitch}\n size=\"sm\"\n variant=\"card\"\n showStatus={false}\n showIcon={false}\n />\n <AstroIcon\n name={getPropertyConfig(\"yaw\").icon}\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n property=\"yaw\"\n value={attitude?.eulerAngles?.yaw}\n size=\"sm\"\n variant=\"card\"\n showStatus={false}\n showIcon={false}\n />\n <AstroIcon\n name=\"explore\"\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n label=\"Mode\"\n icon=\"explore\"\n value={attitude?.targetMode ?? \"--\"}\n size=\"sm\"\n variant=\"card\"\n showStatus={false}\n showIcon={false}\n />\n </div>\n </section>\n )}\n\n {/* Communications Section - fixed icon column so all icons align vertically */}\n {showComms && (\n <section\n style={{ marginBottom: tokens.spacing.sm }}\n aria-label=\"Communications subsystem\"\n >\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: sectionGridColumns,\n gap: `${rowGap} ${iconGap}`,\n alignItems: \"center\",\n }}\n >\n <AstroIcon\n name=\"antenna\"\n size={12}\n color={tokens.colors.text.tertiary}\n />\n <h4\n style={{\n margin: 0,\n gridColumn: \"2 / -1\",\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.medium,\n color: tokens.colors.text.secondary,\n }}\n >\n Communications\n </h4>\n <AstroIcon\n name=\"antenna-transmit\"\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n label=\"Status\"\n icon=\"antenna-transmit\"\n value={\n comms?.transmitterStatus ?? comms?.status ?? \"--\"\n }\n size=\"sm\"\n variant=\"card\"\n showStatus={false}\n showIcon={false}\n />\n <AstroIcon\n name={getPropertyConfig(\"signalStrength\").icon}\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n property=\"signalStrength\"\n value={comms?.signalStrength}\n size=\"sm\"\n variant=\"card\"\n showStatus={false}\n showIcon={false}\n />\n <AstroIcon\n name=\"antenna-receive\"\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n label=\"Transmitted\"\n icon=\"antenna-receive\"\n value={\n comms?.packetsTransmitted ?? comms?.dataRate ?? \"--\"\n }\n size=\"sm\"\n variant=\"card\"\n showStatus={false}\n showIcon={false}\n />\n <span style={{ gridColumn: \"4 / -1\" }} />\n </div>\n </section>\n )}\n\n {/* Timestamp */}\n {telemetry?.timestamp && (\n <time\n dateTime={telemetry.timestamp}\n style={{\n display: \"block\",\n fontSize: tokens.typography.fontSize.xs,\n color: tokens.colors.text.tertiary,\n marginTop: tokens.spacing.sm,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {formatTime(telemetry.timestamp)}\n </time>\n )}\n </>\n );\n })()\n : // Compact content\n renderCompactContent()}\n </article>\n );\n }\n\n return (\n <article\n className={classNames(\n \"zendir-telemetry-card\",\n compact ? \"expanded\" : \"\",\n className,\n )}\n {...(compact ? handlers : {})}\n role={compact ? handlers.role : \"article\"}\n tabIndex={compact ? handlers.tabIndex : undefined}\n aria-expanded={compact ? handlers[\"aria-expanded\"] : undefined}\n aria-label={\n spacecraftName ? `${spacecraftName} Telemetry` : \"Telemetry Data\"\n }\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n ...(useGlassMode\n ? glassContainerStyle\n : {\n backgroundColor: cardBg,\n ...cardGlass,\n ...cardBorderStyle,\n }),\n borderRadius: tokens.borderRadius.lg,\n padding: tokens.spacing.md,\n fontFamily: tokens.typography.fontFamily.primary,\n color: tokens.colors.text.primary,\n fontSize: tokens.typography.fontSize.sm,\n cursor: compact ? \"pointer\" : undefined,\n transition: compact ? `all ${compactTransition} ease-out` : undefined,\n }}\n >\n {/* Glass gradient overlay for bold/minimal themes */}\n {useGlassMode && (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n background:\n \"linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%, rgba(0,0,0,0.1) 100%)\",\n pointerEvents: \"none\",\n zIndex: 0,\n }}\n />\n )}\n\n {/* Unified Card Header - handles all theme variants */}\n <CardHeader\n icon=\"antenna-receive\"\n title={spacecraftName ? `${spacecraftName} Telemetry` : \"Telemetry\"}\n status={healthStatus}\n isPinned={compact && isPinned}\n />\n\n {/* Power Section - fixed icon column so all icons align vertically */}\n {showPower && (\n <section style={sectionStyle} aria-label=\"Power subsystem\">\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: sectionGridColumns,\n gap: `${rowGap} ${iconGap}`,\n alignItems: \"center\",\n }}\n >\n <AstroIcon\n name=\"propulsion-power\"\n size={12}\n color={tokens.colors.text.tertiary}\n />\n <h4\n style={{\n margin: 0,\n gridColumn: \"2 / -1\",\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.medium,\n color: tokens.colors.text.secondary,\n }}\n >\n Power\n </h4>\n <AstroIcon\n name={getPropertyConfig(\"battery\").icon}\n size={16}\n color={getStatusColor(batteryStatus)}\n />\n <DataValue\n property=\"battery\"\n value={telemetry.power?.batteryLevel}\n size=\"sm\"\n variant=\"card\"\n showIcon={false}\n />\n <AstroIcon\n name={getPropertyConfig(\"voltage\").icon}\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n property=\"voltage\"\n value={telemetry.power?.voltage}\n size=\"sm\"\n variant=\"card\"\n showIcon={false}\n />\n <AstroIcon\n name={getPropertyConfig(\"solarPower\").icon}\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n property=\"solarPower\"\n value={telemetry.power?.solarGeneration}\n size=\"sm\"\n variant=\"card\"\n status=\"standby\"\n showIcon={false}\n />\n <AstroIcon\n name={getPropertyConfig(\"load\").icon}\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n property=\"load\"\n value={telemetry.power?.consumption}\n size=\"sm\"\n variant=\"card\"\n showIcon={false}\n />\n </div>\n\n {/* Battery progress bar */}\n <div\n style={{\n marginTop: tokens.spacing.sm,\n height: 4,\n backgroundColor: tokens.colors.border.muted,\n borderRadius: 2,\n overflow: \"hidden\",\n }}\n >\n <div\n role=\"progressbar\"\n aria-valuenow={telemetry.power?.batteryLevel ?? 0}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label=\"Battery level\"\n style={{\n height: \"100%\",\n width: `${Math.min(100, Math.max(0, telemetry.power?.batteryLevel ?? 0))}%`,\n backgroundColor: getStatusColor(batteryStatus),\n borderRadius: 2,\n transition: `width ${transitionDuration} ease-out`,\n }}\n />\n </div>\n </section>\n )}\n\n {/* Attitude Section - fixed icon column so all icons align vertically */}\n {showAttitude && (\n <section style={sectionStyle} aria-label=\"Attitude subsystem\">\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: sectionGridColumns,\n gap: `${rowGap} ${iconGap}`,\n alignItems: \"center\",\n }}\n >\n <AstroIcon\n name=\"explore\"\n size={12}\n color={tokens.colors.text.tertiary}\n />\n <h4\n style={{\n margin: 0,\n gridColumn: \"2 / -1\",\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.medium,\n color: tokens.colors.text.secondary,\n }}\n >\n Attitude\n </h4>\n <AstroIcon\n name={getPropertyConfig(\"roll\").icon}\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n property=\"roll\"\n value={telemetry.attitude?.eulerAngles?.roll}\n size=\"sm\"\n variant=\"card\"\n showStatus={false}\n showIcon={false}\n />\n <AstroIcon\n name={getPropertyConfig(\"pitch\").icon}\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n property=\"pitch\"\n value={telemetry.attitude?.eulerAngles?.pitch}\n size=\"sm\"\n variant=\"card\"\n showStatus={false}\n showIcon={false}\n />\n <AstroIcon\n name={getPropertyConfig(\"yaw\").icon}\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n property=\"yaw\"\n value={telemetry.attitude?.eulerAngles?.yaw}\n size=\"sm\"\n variant=\"card\"\n showStatus={false}\n showIcon={false}\n />\n <AstroIcon\n name=\"explore\"\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n label=\"Mode\"\n icon=\"explore\"\n value={telemetry.attitude?.targetMode ?? \"--\"}\n size=\"sm\"\n variant=\"card\"\n showStatus={false}\n showIcon={false}\n />\n </div>\n {telemetry.attitude?.pointingError !== undefined && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: iconGap,\n marginTop: tokens.spacing.sm,\n }}\n >\n <AstroIcon\n name={getPropertyConfig(\"pointingError\").icon}\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n property=\"pointingError\"\n value={telemetry.attitude.pointingError}\n size=\"sm\"\n variant=\"inline\"\n showIcon={false}\n />\n </div>\n )}\n </section>\n )}\n\n {/* Communications Section - fixed icon column so all icons align vertically */}\n {showComms && (\n <section\n style={{ marginBottom: tokens.spacing.md }}\n aria-label=\"Communications subsystem\"\n >\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: sectionGridColumns,\n gap: `${rowGap} ${iconGap}`,\n alignItems: \"center\",\n }}\n >\n <AstroIcon\n name=\"antenna\"\n size={12}\n color={tokens.colors.text.tertiary}\n />\n <h4\n style={{\n margin: 0,\n gridColumn: \"2 / -1\",\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.medium,\n color: tokens.colors.text.secondary,\n }}\n >\n Communications\n </h4>\n <AstroIcon\n name=\"antenna-transmit\"\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n label=\"Status\"\n icon=\"antenna-transmit\"\n value={telemetry.communications?.transmitterStatus ?? \"--\"}\n size=\"sm\"\n variant=\"card\"\n showIcon={false}\n status={\n telemetry.communications?.transmitterStatus === \"transmitting\"\n ? \"normal\"\n : telemetry.communications?.transmitterStatus === \"error\"\n ? \"critical\"\n : \"off\"\n }\n />\n <AstroIcon\n name={getPropertyConfig(\"queue\").icon}\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n property=\"queue\"\n value={telemetry.communications?.packetsQueued}\n size=\"sm\"\n variant=\"card\"\n showIcon={false}\n />\n <AstroIcon\n name=\"antenna-receive\"\n size={16}\n color={tokens.colors.text.tertiary}\n />\n <DataValue\n label=\"Transmitted\"\n icon=\"antenna-receive\"\n value={safeNumber(\n (telemetry.communications?.bytesTransmitted ?? 0) / 1024,\n 1,\n )}\n unit=\"KB\"\n size=\"sm\"\n variant=\"card\"\n showStatus={false}\n showIcon={false}\n />\n <span style={{ gridColumn: \"4 / -1\" }} />\n </div>\n </section>\n )}\n\n {/* Anomalies Alert */}\n {telemetry.health?.anomalies && telemetry.health.anomalies.length > 0 && (\n <div\n role=\"alert\"\n style={{\n backgroundColor: `${tokens.colors.status.critical}15`,\n border: `1px solid ${tokens.colors.status.critical}40`,\n borderRadius: tokens.borderRadius.md,\n padding: tokens.spacing.sm,\n marginTop: tokens.spacing.md,\n }}\n >\n <h4\n style={{\n margin: `0 0 ${tokens.spacing.xs} 0`,\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.medium,\n color: tokens.colors.status.critical,\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n }}\n >\n ⚠️ Anomalies ({telemetry.health.anomalies.length})\n </h4>\n <ul style={{ margin: 0, paddingLeft: 16 }}>\n {telemetry.health.anomalies.map(\n (\n anomaly: { id: string; message: string; severity?: string },\n idx: number,\n ) => (\n <li\n key={idx}\n style={{\n fontSize: tokens.typography.fontSize.xs,\n color: tokens.colors.status.critical,\n marginTop: 2,\n }}\n >\n {typeof anomaly === \"object\" &&\n anomaly !== null &&\n \"message\" in anomaly\n ? anomaly.message\n : String(anomaly)}\n </li>\n ),\n )}\n </ul>\n </div>\n )}\n\n {/* Timestamp Footer */}\n <footer\n style={{\n marginTop: tokens.spacing.md,\n fontSize: tokens.typography.fontSize.xs,\n color: tokens.colors.text.secondary, // WCAG AA compliant - 4.5:1 contrast\n textAlign: \"right\",\n }}\n >\n <time dateTime={telemetry.timestamp}>\n {formatTime(telemetry.timestamp)} UTC\n </time>\n </footer>\n </article>\n );\n});\n\n// Note: DataCell is deprecated in favor of DataValue from core.\n// Use <DataValue property=\"...\" value={...} /> for automatic icon/status integration.\n"],"mappings":"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"}
|