@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,411 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useState, useMemo, useCallback, useEffect } from "react";
|
|
3
|
+
import { tabularNumsStyle, classNames } from "../utils/index.js";
|
|
4
|
+
import { useTheme } from "../theme/ThemeProvider.js";
|
|
5
|
+
function formatMET(ms, showMilliseconds = false) {
|
|
6
|
+
const totalSeconds = Math.floor(Math.abs(ms) / 1e3);
|
|
7
|
+
const days = Math.floor(totalSeconds / 86400);
|
|
8
|
+
const hours = Math.floor(totalSeconds % 86400 / 3600);
|
|
9
|
+
const minutes = Math.floor(totalSeconds % 3600 / 60);
|
|
10
|
+
const seconds = totalSeconds % 60;
|
|
11
|
+
const sign = ms < 0 ? "-" : "";
|
|
12
|
+
if (showMilliseconds) {
|
|
13
|
+
const millis = Math.floor(Math.abs(ms) % 1e3);
|
|
14
|
+
return `${sign}${days.toString().padStart(2, "0")}:${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}.${millis.toString().padStart(3, "0")}`;
|
|
15
|
+
}
|
|
16
|
+
return `${sign}${days.toString().padStart(2, "0")}:${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`;
|
|
17
|
+
}
|
|
18
|
+
function formatTimerDuration(ms, showDays = false) {
|
|
19
|
+
const totalSeconds = Math.floor(Math.abs(ms) / 1e3);
|
|
20
|
+
const days = Math.floor(totalSeconds / 86400);
|
|
21
|
+
const hours = Math.floor(totalSeconds % 86400 / 3600);
|
|
22
|
+
const minutes = Math.floor(totalSeconds % 3600 / 60);
|
|
23
|
+
const seconds = totalSeconds % 60;
|
|
24
|
+
const sign = ms < 0 ? "-" : "";
|
|
25
|
+
if (showDays && days > 0) {
|
|
26
|
+
return `${sign}${days}d ${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`;
|
|
27
|
+
}
|
|
28
|
+
if (hours > 0 || showDays) {
|
|
29
|
+
return `${sign}${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`;
|
|
30
|
+
}
|
|
31
|
+
return `${sign}${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`;
|
|
32
|
+
}
|
|
33
|
+
function getJulianDay(date) {
|
|
34
|
+
const start = new Date(Date.UTC(date.getUTCFullYear(), 0, 0));
|
|
35
|
+
const diff = date.getTime() - start.getTime();
|
|
36
|
+
const oneDay = 1e3 * 60 * 60 * 24;
|
|
37
|
+
const day = Math.floor(diff / oneDay);
|
|
38
|
+
return day.toString().padStart(3, "0");
|
|
39
|
+
}
|
|
40
|
+
function normalizeTimerConfig(timer, label) {
|
|
41
|
+
if (!timer) return void 0;
|
|
42
|
+
if (timer instanceof Date) {
|
|
43
|
+
return {
|
|
44
|
+
label,
|
|
45
|
+
timestamp: timer,
|
|
46
|
+
direction: "countdown"
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return timer;
|
|
50
|
+
}
|
|
51
|
+
const TimerDisplay = memo(function TimerDisplay2({
|
|
52
|
+
timer,
|
|
53
|
+
currentTime,
|
|
54
|
+
tokens,
|
|
55
|
+
compact = false
|
|
56
|
+
}) {
|
|
57
|
+
const diff = timer.direction === "countdown" ? timer.timestamp.getTime() - currentTime.getTime() : currentTime.getTime() - timer.timestamp.getTime();
|
|
58
|
+
const isNegative = diff < 0;
|
|
59
|
+
const statusColor = timer.status ? tokens.colors.status[timer.status] : isNegative ? tokens.colors.status.caution : tokens.colors.status.normal;
|
|
60
|
+
return /* @__PURE__ */ jsxs(
|
|
61
|
+
"div",
|
|
62
|
+
{
|
|
63
|
+
style: {
|
|
64
|
+
display: "flex",
|
|
65
|
+
alignItems: compact ? "center" : "flex-start",
|
|
66
|
+
flexDirection: compact ? "row" : "column",
|
|
67
|
+
gap: compact ? 8 : 2,
|
|
68
|
+
padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,
|
|
69
|
+
backgroundColor: `${statusColor}15`,
|
|
70
|
+
borderRadius: tokens.borderRadius.sm,
|
|
71
|
+
border: `1px solid ${statusColor}30`
|
|
72
|
+
},
|
|
73
|
+
children: [
|
|
74
|
+
/* @__PURE__ */ jsx(
|
|
75
|
+
"span",
|
|
76
|
+
{
|
|
77
|
+
style: {
|
|
78
|
+
fontSize: tokens.typography.fontSize.xs,
|
|
79
|
+
fontWeight: tokens.typography.fontWeight.semibold,
|
|
80
|
+
color: statusColor,
|
|
81
|
+
textTransform: "uppercase",
|
|
82
|
+
letterSpacing: tokens.typography.letterSpacing.wide
|
|
83
|
+
},
|
|
84
|
+
children: timer.label
|
|
85
|
+
}
|
|
86
|
+
),
|
|
87
|
+
/* @__PURE__ */ jsxs(
|
|
88
|
+
"span",
|
|
89
|
+
{
|
|
90
|
+
style: {
|
|
91
|
+
fontSize: compact ? tokens.typography.fontSize.sm : tokens.typography.fontSize.base,
|
|
92
|
+
fontWeight: tokens.typography.fontWeight.bold,
|
|
93
|
+
// Bold (700) for timer readability
|
|
94
|
+
fontFamily: tokens.typography.fontFamily.mono,
|
|
95
|
+
color: statusColor,
|
|
96
|
+
...tabularNumsStyle
|
|
97
|
+
},
|
|
98
|
+
children: [
|
|
99
|
+
isNegative ? "+" : "",
|
|
100
|
+
formatTimerDuration(diff, timer.showDays)
|
|
101
|
+
]
|
|
102
|
+
}
|
|
103
|
+
)
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
);
|
|
107
|
+
});
|
|
108
|
+
const MissionClock = memo(function MissionClock2({
|
|
109
|
+
format = "24h",
|
|
110
|
+
timezone = "UTC",
|
|
111
|
+
hideSeconds = false,
|
|
112
|
+
small = false,
|
|
113
|
+
showDate = false,
|
|
114
|
+
dateFormat = "iso",
|
|
115
|
+
className = "",
|
|
116
|
+
onClick,
|
|
117
|
+
aosTimer,
|
|
118
|
+
losTimer,
|
|
119
|
+
customTimers = [],
|
|
120
|
+
timeSource = "realtime",
|
|
121
|
+
simulationConfig,
|
|
122
|
+
customTime,
|
|
123
|
+
missionStart,
|
|
124
|
+
showMET = false,
|
|
125
|
+
updateInterval = 1e3,
|
|
126
|
+
compact = false,
|
|
127
|
+
showMilliseconds = false
|
|
128
|
+
}) {
|
|
129
|
+
const { tokens, theme } = useTheme();
|
|
130
|
+
const isTransparentTheme = theme === "transparent" || theme === "transparent-bold" || theme === "transparent-minimal";
|
|
131
|
+
const [time, setTime] = useState(() => getCurrentTimeFromSource());
|
|
132
|
+
const normalizedAOS = useMemo(() => normalizeTimerConfig(aosTimer, "AOS"), [aosTimer]);
|
|
133
|
+
const normalizedLOS = useMemo(() => normalizeTimerConfig(losTimer, "LOS"), [losTimer]);
|
|
134
|
+
const allTimers = useMemo(() => {
|
|
135
|
+
const timers = [];
|
|
136
|
+
if (normalizedAOS) timers.push(normalizedAOS);
|
|
137
|
+
if (normalizedLOS) timers.push(normalizedLOS);
|
|
138
|
+
return [...timers, ...customTimers];
|
|
139
|
+
}, [normalizedAOS, normalizedLOS, customTimers]);
|
|
140
|
+
function getCurrentTimeFromSource() {
|
|
141
|
+
switch (timeSource) {
|
|
142
|
+
case "simulation":
|
|
143
|
+
if (simulationConfig) {
|
|
144
|
+
if (simulationConfig.getCurrentTime) {
|
|
145
|
+
return simulationConfig.getCurrentTime();
|
|
146
|
+
}
|
|
147
|
+
const epoch = typeof simulationConfig.epoch === "string" ? new Date(simulationConfig.epoch) : simulationConfig.epoch;
|
|
148
|
+
const elapsed = (simulationConfig.elapsedSeconds || 0) * 1e3;
|
|
149
|
+
return new Date(epoch.getTime() + elapsed);
|
|
150
|
+
}
|
|
151
|
+
return /* @__PURE__ */ new Date();
|
|
152
|
+
case "custom":
|
|
153
|
+
if (customTime) {
|
|
154
|
+
return typeof customTime === "function" ? customTime() : customTime;
|
|
155
|
+
}
|
|
156
|
+
return /* @__PURE__ */ new Date();
|
|
157
|
+
case "realtime":
|
|
158
|
+
default:
|
|
159
|
+
return /* @__PURE__ */ new Date();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const formatTimeDisplay = useCallback((date) => {
|
|
163
|
+
if (showMET && missionStart) {
|
|
164
|
+
const start = typeof missionStart === "string" ? new Date(missionStart) : missionStart;
|
|
165
|
+
const elapsed = date.getTime() - start.getTime();
|
|
166
|
+
return formatMET(elapsed, showMilliseconds);
|
|
167
|
+
}
|
|
168
|
+
if (format === "met" && missionStart) {
|
|
169
|
+
const start = typeof missionStart === "string" ? new Date(missionStart) : missionStart;
|
|
170
|
+
const elapsed = date.getTime() - start.getTime();
|
|
171
|
+
return formatMET(elapsed, showMilliseconds);
|
|
172
|
+
}
|
|
173
|
+
const hours = date.getUTCHours();
|
|
174
|
+
const mins = date.getUTCMinutes();
|
|
175
|
+
const secs = date.getUTCSeconds();
|
|
176
|
+
const millis = date.getUTCMilliseconds();
|
|
177
|
+
let hoursStr;
|
|
178
|
+
let suffix = "";
|
|
179
|
+
if (format === "12h") {
|
|
180
|
+
const h12 = hours % 12 || 12;
|
|
181
|
+
hoursStr = h12.toString().padStart(2, "0");
|
|
182
|
+
suffix = hours >= 12 ? " PM" : " AM";
|
|
183
|
+
} else {
|
|
184
|
+
hoursStr = hours.toString().padStart(2, "0");
|
|
185
|
+
}
|
|
186
|
+
const minsStr = mins.toString().padStart(2, "0");
|
|
187
|
+
const secsStr = secs.toString().padStart(2, "0");
|
|
188
|
+
const millisStr = millis.toString().padStart(3, "0");
|
|
189
|
+
if (hideSeconds) {
|
|
190
|
+
return `${hoursStr}:${minsStr}${suffix}`;
|
|
191
|
+
}
|
|
192
|
+
if (showMilliseconds) {
|
|
193
|
+
return `${hoursStr}:${minsStr}:${secsStr}.${millisStr}${suffix}`;
|
|
194
|
+
}
|
|
195
|
+
return `${hoursStr}:${minsStr}:${secsStr}${suffix}`;
|
|
196
|
+
}, [format, hideSeconds, showMET, missionStart, showMilliseconds]);
|
|
197
|
+
const formatDateDisplay = useCallback((date) => {
|
|
198
|
+
switch (dateFormat) {
|
|
199
|
+
case "julian": {
|
|
200
|
+
const year2 = date.getUTCFullYear();
|
|
201
|
+
const doy = getJulianDay(date);
|
|
202
|
+
return `${year2}/${doy}`;
|
|
203
|
+
}
|
|
204
|
+
case "gregorian": {
|
|
205
|
+
const year2 = date.getUTCFullYear();
|
|
206
|
+
const month2 = (date.getUTCMonth() + 1).toString().padStart(2, "0");
|
|
207
|
+
const day2 = date.getUTCDate().toString().padStart(2, "0");
|
|
208
|
+
return `${month2}/${day2}/${year2}`;
|
|
209
|
+
}
|
|
210
|
+
case "iso":
|
|
211
|
+
default:
|
|
212
|
+
if (format === "iso") {
|
|
213
|
+
return date.toISOString().split("T")[0];
|
|
214
|
+
}
|
|
215
|
+
const year = date.getUTCFullYear();
|
|
216
|
+
const month = (date.getUTCMonth() + 1).toString().padStart(2, "0");
|
|
217
|
+
const day = date.getUTCDate().toString().padStart(2, "0");
|
|
218
|
+
return `${year}-${month}-${day}`;
|
|
219
|
+
}
|
|
220
|
+
}, [format, dateFormat]);
|
|
221
|
+
useEffect(() => {
|
|
222
|
+
const effectiveInterval = showMilliseconds ? Math.min(updateInterval, 100) : hideSeconds ? 6e4 : updateInterval;
|
|
223
|
+
const intervalId = setInterval(() => {
|
|
224
|
+
setTime(getCurrentTimeFromSource());
|
|
225
|
+
}, effectiveInterval);
|
|
226
|
+
return () => clearInterval(intervalId);
|
|
227
|
+
}, [hideSeconds, updateInterval, showMilliseconds, timeSource, simulationConfig, customTime]);
|
|
228
|
+
const handleKeyDown = (e) => {
|
|
229
|
+
if (onClick && (e.key === "Enter" || e.key === " ")) {
|
|
230
|
+
e.preventDefault();
|
|
231
|
+
onClick();
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
const displayLabel = useMemo(() => {
|
|
235
|
+
if (showMET || format === "met") {
|
|
236
|
+
return "MET";
|
|
237
|
+
}
|
|
238
|
+
if (timeSource === "simulation") {
|
|
239
|
+
return "SIM";
|
|
240
|
+
}
|
|
241
|
+
return timezone;
|
|
242
|
+
}, [showMET, format, timeSource, timezone]);
|
|
243
|
+
return /* @__PURE__ */ jsxs(
|
|
244
|
+
"div",
|
|
245
|
+
{
|
|
246
|
+
className: classNames("zendir-mission-clock", className),
|
|
247
|
+
onClick,
|
|
248
|
+
onKeyDown: onClick ? handleKeyDown : void 0,
|
|
249
|
+
tabIndex: onClick ? 0 : void 0,
|
|
250
|
+
role: "timer",
|
|
251
|
+
"aria-label": `Current time: ${formatTimeDisplay(time)} ${displayLabel}`,
|
|
252
|
+
style: {
|
|
253
|
+
display: "inline-flex",
|
|
254
|
+
flexDirection: compact ? "row" : "column",
|
|
255
|
+
alignItems: "center",
|
|
256
|
+
gap: compact ? 16 : 4,
|
|
257
|
+
padding: small ? `${tokens.spacing.xs} ${tokens.spacing.sm}` : `${tokens.spacing.sm} ${tokens.spacing.md}`,
|
|
258
|
+
backgroundColor: isTransparentTheme ? "transparent" : tokens.colors.background.surface,
|
|
259
|
+
...isTransparentTheme && { backdropFilter: "blur(12px)", WebkitBackdropFilter: "blur(12px)" },
|
|
260
|
+
...tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` },
|
|
261
|
+
borderRadius: tokens.borderRadius.md,
|
|
262
|
+
cursor: onClick ? "pointer" : "default",
|
|
263
|
+
outline: "none",
|
|
264
|
+
transition: tokens.animation.fast,
|
|
265
|
+
...tabularNumsStyle
|
|
266
|
+
},
|
|
267
|
+
children: [
|
|
268
|
+
/* @__PURE__ */ jsxs(
|
|
269
|
+
"div",
|
|
270
|
+
{
|
|
271
|
+
style: {
|
|
272
|
+
display: "flex",
|
|
273
|
+
flexDirection: "column",
|
|
274
|
+
alignItems: "center",
|
|
275
|
+
gap: 2
|
|
276
|
+
},
|
|
277
|
+
children: [
|
|
278
|
+
showDate && dateFormat !== "none" && /* @__PURE__ */ jsx(
|
|
279
|
+
"span",
|
|
280
|
+
{
|
|
281
|
+
style: {
|
|
282
|
+
fontSize: tokens.typography.fontSize.xs,
|
|
283
|
+
fontWeight: tokens.typography.fontWeight.normal,
|
|
284
|
+
fontFamily: tokens.typography.fontFamily.mono,
|
|
285
|
+
color: tokens.colors.text.tertiary,
|
|
286
|
+
letterSpacing: tokens.typography.letterSpacing.normal
|
|
287
|
+
},
|
|
288
|
+
children: formatDateDisplay(time)
|
|
289
|
+
}
|
|
290
|
+
),
|
|
291
|
+
/* @__PURE__ */ jsx(
|
|
292
|
+
"span",
|
|
293
|
+
{
|
|
294
|
+
style: {
|
|
295
|
+
fontSize: small ? tokens.typography.fontSize.base : tokens.typography.fontSize.xl,
|
|
296
|
+
fontWeight: tokens.typography.fontWeight.bold,
|
|
297
|
+
// Bold (700) for readability - time is critical info
|
|
298
|
+
fontFamily: tokens.typography.fontFamily.mono,
|
|
299
|
+
letterSpacing: tokens.typography.letterSpacing.normal,
|
|
300
|
+
color: tokens.colors.text.primary
|
|
301
|
+
},
|
|
302
|
+
children: formatTimeDisplay(time)
|
|
303
|
+
}
|
|
304
|
+
),
|
|
305
|
+
displayLabel && /* @__PURE__ */ jsx(
|
|
306
|
+
"span",
|
|
307
|
+
{
|
|
308
|
+
style: {
|
|
309
|
+
fontSize: tokens.typography.fontSize.xs,
|
|
310
|
+
fontWeight: tokens.typography.fontWeight.medium,
|
|
311
|
+
color: timeSource === "simulation" ? tokens.colors.status.caution : tokens.colors.text.tertiary,
|
|
312
|
+
textTransform: "uppercase",
|
|
313
|
+
letterSpacing: tokens.typography.letterSpacing.wide
|
|
314
|
+
},
|
|
315
|
+
children: displayLabel
|
|
316
|
+
}
|
|
317
|
+
)
|
|
318
|
+
]
|
|
319
|
+
}
|
|
320
|
+
),
|
|
321
|
+
allTimers.length > 0 && /* @__PURE__ */ jsx(
|
|
322
|
+
"div",
|
|
323
|
+
{
|
|
324
|
+
style: {
|
|
325
|
+
display: "flex",
|
|
326
|
+
flexDirection: compact ? "row" : "column",
|
|
327
|
+
gap: 8
|
|
328
|
+
},
|
|
329
|
+
children: allTimers.map((timer, index) => /* @__PURE__ */ jsx(
|
|
330
|
+
TimerDisplay,
|
|
331
|
+
{
|
|
332
|
+
timer,
|
|
333
|
+
currentTime: time,
|
|
334
|
+
tokens,
|
|
335
|
+
compact
|
|
336
|
+
},
|
|
337
|
+
`${timer.label}-${index}`
|
|
338
|
+
))
|
|
339
|
+
}
|
|
340
|
+
)
|
|
341
|
+
]
|
|
342
|
+
}
|
|
343
|
+
);
|
|
344
|
+
});
|
|
345
|
+
memo(function SimpleTimer2({
|
|
346
|
+
label,
|
|
347
|
+
timestamp,
|
|
348
|
+
direction = "countdown",
|
|
349
|
+
status,
|
|
350
|
+
showDays = false,
|
|
351
|
+
className = ""
|
|
352
|
+
}) {
|
|
353
|
+
const { tokens } = useTheme();
|
|
354
|
+
const [now, setNow] = useState(/* @__PURE__ */ new Date());
|
|
355
|
+
useEffect(() => {
|
|
356
|
+
const interval = setInterval(() => setNow(/* @__PURE__ */ new Date()), 1e3);
|
|
357
|
+
return () => clearInterval(interval);
|
|
358
|
+
}, []);
|
|
359
|
+
const timer = { label, timestamp, direction, status, showDays };
|
|
360
|
+
return /* @__PURE__ */ jsx("div", { className: classNames("zendir-simple-timer", className), children: /* @__PURE__ */ jsx(TimerDisplay, { timer, currentTime: now, tokens }) });
|
|
361
|
+
});
|
|
362
|
+
memo(function MissionElapsedTime2({
|
|
363
|
+
launchTime,
|
|
364
|
+
showMilliseconds = false,
|
|
365
|
+
className = "",
|
|
366
|
+
small = false
|
|
367
|
+
}) {
|
|
368
|
+
return /* @__PURE__ */ jsx(
|
|
369
|
+
MissionClock,
|
|
370
|
+
{
|
|
371
|
+
format: "met",
|
|
372
|
+
missionStart: launchTime,
|
|
373
|
+
showMET: true,
|
|
374
|
+
showMilliseconds,
|
|
375
|
+
className,
|
|
376
|
+
small,
|
|
377
|
+
timezone: ""
|
|
378
|
+
}
|
|
379
|
+
);
|
|
380
|
+
});
|
|
381
|
+
memo(function SimulationClock2({
|
|
382
|
+
epoch,
|
|
383
|
+
elapsedSeconds = 0,
|
|
384
|
+
timeScale = 1,
|
|
385
|
+
isRunning = true,
|
|
386
|
+
showDate = true,
|
|
387
|
+
dateFormat = "julian",
|
|
388
|
+
className = "",
|
|
389
|
+
small = false
|
|
390
|
+
}) {
|
|
391
|
+
return /* @__PURE__ */ jsx(
|
|
392
|
+
MissionClock,
|
|
393
|
+
{
|
|
394
|
+
timeSource: "simulation",
|
|
395
|
+
simulationConfig: {
|
|
396
|
+
epoch,
|
|
397
|
+
elapsedSeconds,
|
|
398
|
+
timeScale,
|
|
399
|
+
isRunning
|
|
400
|
+
},
|
|
401
|
+
showDate,
|
|
402
|
+
dateFormat,
|
|
403
|
+
className,
|
|
404
|
+
small
|
|
405
|
+
}
|
|
406
|
+
);
|
|
407
|
+
});
|
|
408
|
+
export {
|
|
409
|
+
MissionClock
|
|
410
|
+
};
|
|
411
|
+
//# sourceMappingURL=MissionClock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MissionClock.js","sources":["../../../src/react/astro/MissionClock.tsx"],"sourcesContent":["/**\n * @zendir/ui - MissionClock Component (Pure React)\n * \n * Advanced mission time display following Astro UX patterns with full\n * space operations support.\n * \n * Features:\n * - Theme-integrated via useTheme()\n * - UTC/Zulu time display\n * - Configurable formats (12h, 24h, ISO)\n * - Optional seconds display\n * - AOS/LOS timer support (Acquisition/Loss of Signal)\n * - MET (Mission Elapsed Time) display\n * - Julian day format (DOY-###)\n * - Simulation time support (custom epoch/time source)\n * - Tabular numbers for stability\n * - Zendir SDK integration for real-time data\n * \n * Space Operations Terminology:\n * - AOS: Acquisition of Signal - when satellite rises above horizon\n * - LOS: Loss of Signal - when satellite passes below horizon\n * - TCA: Time of Closest Approach - maximum elevation point\n * - MET: Mission Elapsed Time - time since launch (dd:hh:mm:ss)\n * - DOY: Day of Year - Julian day format\n */\n\nimport React, { memo, useState, useEffect, useCallback, useMemo } from 'react';\nimport { useTheme } from '../theme';\nimport { classNames, tabularNumsStyle } from '../utils';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ClockFormat = '12h' | '24h' | 'iso' | 'met';\nexport type DateFormat = 'iso' | 'julian' | 'gregorian' | 'none';\nexport type TimeSource = 'realtime' | 'simulation' | 'custom';\n\n/**\n * Timer configuration for AOS/LOS countdown/up timers\n */\nexport interface TimerConfig {\n /** Timer label (e.g., \"AOS\", \"LOS\", \"MET\") */\n label: string;\n /** Target timestamp (for countdown) or start timestamp (for countup) */\n timestamp: Date;\n /** Timer direction: 'countdown' counts to target, 'countup' counts from start */\n direction: 'countdown' | 'countup';\n /** Optional status color */\n status?: 'normal' | 'caution' | 'critical' | 'standby';\n /** Show days in timer format */\n showDays?: boolean;\n}\n\n/**\n * Simulation time configuration\n */\nexport interface SimulationTimeConfig {\n /** Simulation epoch (t=0) as Date or ISO string */\n epoch: Date | string;\n /** Current simulation time offset in seconds from epoch */\n elapsedSeconds?: number;\n /** Time scale factor (1 = realtime, 2 = 2x speed, etc.) */\n timeScale?: number;\n /** Whether simulation is running */\n isRunning?: boolean;\n /** Callback to get current simulation time */\n getCurrentTime?: () => Date;\n}\n\nexport interface MissionClockProps {\n /** Clock format */\n format?: ClockFormat;\n /** Timezone label to display */\n timezone?: string;\n /** Hide seconds */\n hideSeconds?: boolean;\n /** Small size variant */\n small?: boolean;\n /** Show date */\n showDate?: boolean;\n /** Date format (iso, julian, gregorian) */\n dateFormat?: DateFormat;\n /** Custom className */\n className?: string;\n /** Click handler */\n onClick?: () => void;\n \n // === AOS/LOS Timer Support ===\n /** AOS timer - countdown/up to Acquisition of Signal */\n aosTimer?: TimerConfig | Date;\n /** LOS timer - countdown/up to Loss of Signal */\n losTimer?: TimerConfig | Date;\n /** Additional custom timers */\n customTimers?: TimerConfig[];\n \n // === Simulation Time Support ===\n /** Time source: realtime, simulation, or custom */\n timeSource?: TimeSource;\n /** Simulation time configuration (for timeSource='simulation') */\n simulationConfig?: SimulationTimeConfig;\n /** Custom time provider (for timeSource='custom') */\n customTime?: Date | (() => Date);\n \n // === Mission Elapsed Time ===\n /** Mission start time for MET display */\n missionStart?: Date | string;\n /** Show MET (Mission Elapsed Time) instead of wall clock */\n showMET?: boolean;\n \n // === Advanced Options ===\n /** Update interval in milliseconds (default: 1000) */\n updateInterval?: number;\n /** Compact mode - single line display */\n compact?: boolean;\n /** Show milliseconds */\n showMilliseconds?: boolean;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Format duration as dd:hh:mm:ss (MET format)\n */\nfunction formatMET(ms: number, showMilliseconds = false): string {\n const totalSeconds = Math.floor(Math.abs(ms) / 1000);\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n \n const sign = ms < 0 ? '-' : '';\n \n if (showMilliseconds) {\n const millis = Math.floor(Math.abs(ms) % 1000);\n return `${sign}${days.toString().padStart(2, '0')}:${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${millis.toString().padStart(3, '0')}`;\n }\n \n return `${sign}${days.toString().padStart(2, '0')}:${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\n/**\n * Format duration for timers (compact: hh:mm:ss or mm:ss)\n */\nfunction formatTimerDuration(ms: number, showDays = false): string {\n const totalSeconds = Math.floor(Math.abs(ms) / 1000);\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n \n const sign = ms < 0 ? '-' : '';\n \n if (showDays && days > 0) {\n return `${sign}${days}d ${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n \n if (hours > 0 || showDays) {\n return `${sign}${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n \n return `${sign}${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\n/**\n * Get Julian day (day of year 001-366)\n */\nfunction getJulianDay(date: Date): string {\n const start = new Date(Date.UTC(date.getUTCFullYear(), 0, 0));\n const diff = date.getTime() - start.getTime();\n const oneDay = 1000 * 60 * 60 * 24;\n const day = Math.floor(diff / oneDay);\n return day.toString().padStart(3, '0');\n}\n\n/**\n * Normalize timer config from Date or TimerConfig\n */\nfunction normalizeTimerConfig(timer: TimerConfig | Date | undefined, label: string): TimerConfig | undefined {\n if (!timer) return undefined;\n if (timer instanceof Date) {\n return {\n label,\n timestamp: timer,\n direction: 'countdown',\n };\n }\n return timer;\n}\n\n// ============================================================================\n// Timer Sub-component\n// ============================================================================\n\ninterface TimerDisplayProps {\n timer: TimerConfig;\n currentTime: Date;\n tokens: ReturnType<typeof useTheme>['tokens'];\n compact?: boolean;\n}\n\nconst TimerDisplay = memo(function TimerDisplay({\n timer,\n currentTime,\n tokens,\n compact = false,\n}: TimerDisplayProps) {\n const diff = timer.direction === 'countdown'\n ? timer.timestamp.getTime() - currentTime.getTime()\n : currentTime.getTime() - timer.timestamp.getTime();\n \n const isNegative = diff < 0;\n const statusColor = timer.status \n ? tokens.colors.status[timer.status]\n : isNegative \n ? tokens.colors.status.caution \n : tokens.colors.status.normal;\n \n return (\n <div\n style={{\n display: 'flex',\n alignItems: compact ? 'center' : 'flex-start',\n flexDirection: compact ? 'row' : 'column',\n gap: compact ? 8 : 2,\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n backgroundColor: `${statusColor}15`,\n borderRadius: tokens.borderRadius.sm,\n border: `1px solid ${statusColor}30`,\n }}\n >\n <span\n style={{\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.semibold,\n color: statusColor,\n textTransform: 'uppercase',\n letterSpacing: tokens.typography.letterSpacing.wide,\n }}\n >\n {timer.label}\n </span>\n <span\n style={{\n fontSize: compact ? tokens.typography.fontSize.sm : tokens.typography.fontSize.base,\n fontWeight: tokens.typography.fontWeight.bold, // Bold (700) for timer readability\n fontFamily: tokens.typography.fontFamily.mono,\n color: statusColor,\n ...tabularNumsStyle,\n }}\n >\n {isNegative ? '+' : ''}{formatTimerDuration(diff, timer.showDays)}\n </span>\n </div>\n );\n});\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\n/**\n * MissionClock - Advanced mission time display for space operations\n * \n * Supports real-time clock, simulation time, MET (Mission Elapsed Time),\n * and AOS/LOS timers following Astro UX Design System patterns.\n * \n * @example\n * ```tsx\n * // Basic clock\n * <MissionClock format=\"24h\" timezone=\"UTC\" />\n * \n * // With AOS/LOS timers\n * <MissionClock\n * format=\"24h\"\n * aosTimer={{ label: 'AOS', timestamp: new Date('2024-03-15T10:30:00Z'), direction: 'countdown' }}\n * losTimer={{ label: 'LOS', timestamp: new Date('2024-03-15T10:45:00Z'), direction: 'countdown' }}\n * />\n * \n * // Simulation time\n * <MissionClock\n * timeSource=\"simulation\"\n * simulationConfig={{\n * epoch: new Date('2026-01-01T00:00:00Z'),\n * elapsedSeconds: 3600,\n * timeScale: 1,\n * }}\n * />\n * \n * // Mission Elapsed Time\n * <MissionClock\n * showMET\n * missionStart={new Date('2026-01-01T00:00:00Z')}\n * />\n * \n * // Julian day format\n * <MissionClock showDate dateFormat=\"julian\" />\n * ```\n */\nexport const MissionClock = memo(function MissionClock({\n format = '24h',\n timezone = 'UTC',\n hideSeconds = false,\n small = false,\n showDate = false,\n dateFormat = 'iso',\n className = '',\n onClick,\n aosTimer,\n losTimer,\n customTimers = [],\n timeSource = 'realtime',\n simulationConfig,\n customTime,\n missionStart,\n showMET = false,\n updateInterval = 1000,\n compact = false,\n showMilliseconds = false,\n}: MissionClockProps): React.ReactElement {\n const { tokens, theme } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n \n // State for current time\n const [time, setTime] = useState(() => getCurrentTimeFromSource());\n \n // Normalize timer configs\n const normalizedAOS = useMemo(() => normalizeTimerConfig(aosTimer, 'AOS'), [aosTimer]);\n const normalizedLOS = useMemo(() => normalizeTimerConfig(losTimer, 'LOS'), [losTimer]);\n \n // All timers combined\n const allTimers = useMemo(() => {\n const timers: TimerConfig[] = [];\n if (normalizedAOS) timers.push(normalizedAOS);\n if (normalizedLOS) timers.push(normalizedLOS);\n return [...timers, ...customTimers];\n }, [normalizedAOS, normalizedLOS, customTimers]);\n \n // Get current time based on source\n function getCurrentTimeFromSource(): Date {\n switch (timeSource) {\n case 'simulation':\n if (simulationConfig) {\n if (simulationConfig.getCurrentTime) {\n return simulationConfig.getCurrentTime();\n }\n const epoch = typeof simulationConfig.epoch === 'string' \n ? new Date(simulationConfig.epoch) \n : simulationConfig.epoch;\n const elapsed = (simulationConfig.elapsedSeconds || 0) * 1000;\n return new Date(epoch.getTime() + elapsed);\n }\n return new Date();\n \n case 'custom':\n if (customTime) {\n return typeof customTime === 'function' ? customTime() : customTime;\n }\n return new Date();\n \n case 'realtime':\n default:\n return new Date();\n }\n }\n \n // Format time display\n const formatTimeDisplay = useCallback((date: Date): string => {\n if (showMET && missionStart) {\n const start = typeof missionStart === 'string' ? new Date(missionStart) : missionStart;\n const elapsed = date.getTime() - start.getTime();\n return formatMET(elapsed, showMilliseconds);\n }\n \n if (format === 'met' && missionStart) {\n const start = typeof missionStart === 'string' ? new Date(missionStart) : missionStart;\n const elapsed = date.getTime() - start.getTime();\n return formatMET(elapsed, showMilliseconds);\n }\n \n const hours = date.getUTCHours();\n const mins = date.getUTCMinutes();\n const secs = date.getUTCSeconds();\n const millis = date.getUTCMilliseconds();\n\n let hoursStr: string;\n let suffix = '';\n\n if (format === '12h') {\n const h12 = hours % 12 || 12;\n hoursStr = h12.toString().padStart(2, '0');\n suffix = hours >= 12 ? ' PM' : ' AM';\n } else {\n hoursStr = hours.toString().padStart(2, '0');\n }\n\n const minsStr = mins.toString().padStart(2, '0');\n const secsStr = secs.toString().padStart(2, '0');\n const millisStr = millis.toString().padStart(3, '0');\n\n if (hideSeconds) {\n return `${hoursStr}:${minsStr}${suffix}`;\n }\n \n if (showMilliseconds) {\n return `${hoursStr}:${minsStr}:${secsStr}.${millisStr}${suffix}`;\n }\n \n return `${hoursStr}:${minsStr}:${secsStr}${suffix}`;\n }, [format, hideSeconds, showMET, missionStart, showMilliseconds]);\n\n // Format date display\n const formatDateDisplay = useCallback((date: Date): string => {\n switch (dateFormat) {\n case 'julian': {\n const year = date.getUTCFullYear();\n const doy = getJulianDay(date);\n return `${year}/${doy}`;\n }\n case 'gregorian': {\n const year = date.getUTCFullYear();\n const month = (date.getUTCMonth() + 1).toString().padStart(2, '0');\n const day = date.getUTCDate().toString().padStart(2, '0');\n return `${month}/${day}/${year}`;\n }\n case 'iso':\n default:\n if (format === 'iso') {\n return date.toISOString().split('T')[0];\n }\n const year = date.getUTCFullYear();\n const month = (date.getUTCMonth() + 1).toString().padStart(2, '0');\n const day = date.getUTCDate().toString().padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n }, [format, dateFormat]);\n\n // Update time at interval\n useEffect(() => {\n // Calculate effective update interval\n const effectiveInterval = showMilliseconds ? Math.min(updateInterval, 100) : (hideSeconds ? 60000 : updateInterval);\n \n const intervalId = setInterval(() => {\n setTime(getCurrentTimeFromSource());\n }, effectiveInterval);\n\n return () => clearInterval(intervalId);\n }, [hideSeconds, updateInterval, showMilliseconds, timeSource, simulationConfig, customTime]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (onClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick();\n }\n };\n \n // Determine display label\n const displayLabel = useMemo(() => {\n if (showMET || format === 'met') {\n return 'MET';\n }\n if (timeSource === 'simulation') {\n return 'SIM';\n }\n return timezone;\n }, [showMET, format, timeSource, timezone]);\n\n return (\n <div\n className={classNames('zendir-mission-clock', className)}\n onClick={onClick}\n onKeyDown={onClick ? handleKeyDown : undefined}\n tabIndex={onClick ? 0 : undefined}\n role=\"timer\"\n aria-label={`Current time: ${formatTimeDisplay(time)} ${displayLabel}`}\n style={{\n display: 'inline-flex',\n flexDirection: compact ? 'row' : 'column',\n alignItems: 'center',\n gap: compact ? 16 : 4,\n padding: small ? `${tokens.spacing.xs} ${tokens.spacing.sm}` : `${tokens.spacing.sm} ${tokens.spacing.md}`,\n backgroundColor: isTransparentTheme ? 'transparent' : tokens.colors.background.surface,\n ...(isTransparentTheme && { backdropFilter: 'blur(12px)', WebkitBackdropFilter: 'blur(12px)' as const }),\n ...(tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` }),\n borderRadius: tokens.borderRadius.md,\n cursor: onClick ? 'pointer' : 'default',\n outline: 'none',\n transition: tokens.animation.fast,\n ...tabularNumsStyle,\n }}\n >\n {/* Main clock section */}\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 2,\n }}\n >\n {/* Date (optional) */}\n {showDate && dateFormat !== 'none' && (\n <span\n style={{\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.normal,\n fontFamily: tokens.typography.fontFamily.mono,\n color: tokens.colors.text.tertiary,\n letterSpacing: tokens.typography.letterSpacing.normal,\n }}\n >\n {formatDateDisplay(time)}\n </span>\n )}\n\n {/* Time - Using bold weight for critical time displays (Apple/Google best practice) */}\n <span\n style={{\n fontSize: small ? tokens.typography.fontSize.base : tokens.typography.fontSize.xl,\n fontWeight: tokens.typography.fontWeight.bold, // Bold (700) for readability - time is critical info\n fontFamily: tokens.typography.fontFamily.mono,\n letterSpacing: tokens.typography.letterSpacing.normal,\n color: tokens.colors.text.primary,\n }}\n >\n {formatTimeDisplay(time)}\n </span>\n\n {/* Label (timezone/MET/SIM) */}\n {displayLabel && (\n <span\n style={{\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.medium,\n color: timeSource === 'simulation' \n ? tokens.colors.status.caution \n : tokens.colors.text.tertiary,\n textTransform: 'uppercase',\n letterSpacing: tokens.typography.letterSpacing.wide,\n }}\n >\n {displayLabel}\n </span>\n )}\n </div>\n \n {/* AOS/LOS Timers */}\n {allTimers.length > 0 && (\n <div\n style={{\n display: 'flex',\n flexDirection: compact ? 'row' : 'column',\n gap: 8,\n }}\n >\n {allTimers.map((timer, index) => (\n <TimerDisplay\n key={`${timer.label}-${index}`}\n timer={timer}\n currentTime={time}\n tokens={tokens}\n compact={compact}\n />\n ))}\n </div>\n )}\n </div>\n );\n});\n\n// ============================================================================\n// Convenience Components\n// ============================================================================\n\n/**\n * SimpleTimer - Standalone countdown/up timer\n */\nexport interface SimpleTimerProps {\n /** Timer label */\n label: string;\n /** Target/start timestamp */\n timestamp: Date;\n /** Timer direction */\n direction?: 'countdown' | 'countup';\n /** Status color */\n status?: 'normal' | 'caution' | 'critical' | 'standby';\n /** Show days */\n showDays?: boolean;\n /** Custom className */\n className?: string;\n}\n\nexport const SimpleTimer = memo(function SimpleTimer({\n label,\n timestamp,\n direction = 'countdown',\n status,\n showDays = false,\n className = '',\n}: SimpleTimerProps): React.ReactElement {\n const { tokens } = useTheme();\n const [now, setNow] = useState(new Date());\n \n useEffect(() => {\n const interval = setInterval(() => setNow(new Date()), 1000);\n return () => clearInterval(interval);\n }, []);\n \n const timer: TimerConfig = { label, timestamp, direction, status, showDays };\n \n return (\n <div className={classNames('zendir-simple-timer', className)}>\n <TimerDisplay timer={timer} currentTime={now} tokens={tokens} />\n </div>\n );\n});\n\n/**\n * MissionElapsedTime - Dedicated MET display\n */\nexport interface MissionElapsedTimeProps {\n /** Mission launch/start time */\n launchTime: Date | string;\n /** Show milliseconds */\n showMilliseconds?: boolean;\n /** Custom className */\n className?: string;\n /** Small variant */\n small?: boolean;\n}\n\nexport const MissionElapsedTime = memo(function MissionElapsedTime({\n launchTime,\n showMilliseconds = false,\n className = '',\n small = false,\n}: MissionElapsedTimeProps): React.ReactElement {\n return (\n <MissionClock\n format=\"met\"\n missionStart={launchTime}\n showMET\n showMilliseconds={showMilliseconds}\n className={className}\n small={small}\n timezone=\"\"\n />\n );\n});\n\n/**\n * SimulationClock - Clock driven by simulation time\n */\nexport interface SimulationClockProps {\n /** Simulation epoch */\n epoch: Date | string;\n /** Elapsed seconds from epoch */\n elapsedSeconds?: number;\n /** Time scale factor */\n timeScale?: number;\n /** Whether simulation is running */\n isRunning?: boolean;\n /** Show date */\n showDate?: boolean;\n /** Date format */\n dateFormat?: DateFormat;\n /** Custom className */\n className?: string;\n /** Small variant */\n small?: boolean;\n}\n\nexport const SimulationClock = memo(function SimulationClock({\n epoch,\n elapsedSeconds = 0,\n timeScale = 1,\n isRunning = true,\n showDate = true,\n dateFormat = 'julian',\n className = '',\n small = false,\n}: SimulationClockProps): React.ReactElement {\n return (\n <MissionClock\n timeSource=\"simulation\"\n simulationConfig={{\n epoch,\n elapsedSeconds,\n timeScale,\n isRunning,\n }}\n showDate={showDate}\n dateFormat={dateFormat}\n className={className}\n small={small}\n />\n );\n});\n\nexport default MissionClock;\n"],"names":["TimerDisplay","MissionClock","year","month","day","SimpleTimer","MissionElapsedTime","SimulationClock"],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { StatusLevel } from '../utils';
|
|
3
|
+
|
|
4
|
+
export type MonitoringStatus = StatusLevel;
|
|
5
|
+
export interface MonitoringIconProps {
|
|
6
|
+
/** Current status of the monitored item */
|
|
7
|
+
status: MonitoringStatus;
|
|
8
|
+
/** Primary label (always visible) */
|
|
9
|
+
label: string;
|
|
10
|
+
/** Sub-label for dynamic info (optional) */
|
|
11
|
+
sublabel?: string;
|
|
12
|
+
/** Icon name or custom icon element */
|
|
13
|
+
icon?: string | React.ReactNode;
|
|
14
|
+
/** Notification count badge */
|
|
15
|
+
notifications?: number;
|
|
16
|
+
/** Show tooltip on hover */
|
|
17
|
+
tooltip?: string;
|
|
18
|
+
/** Custom className */
|
|
19
|
+
className?: string;
|
|
20
|
+
/** Click handler */
|
|
21
|
+
onClick?: () => void;
|
|
22
|
+
/**
|
|
23
|
+
* Show percentage arc display instead of icon
|
|
24
|
+
* When true, displays a circular arc showing the percentage value
|
|
25
|
+
*/
|
|
26
|
+
showPercentage?: boolean;
|
|
27
|
+
/** Percentage value (0-100) - displayed as arc when showPercentage is true */
|
|
28
|
+
percentage?: number;
|
|
29
|
+
/** Map percentage to status colors (e.g., low = critical, high = normal) */
|
|
30
|
+
percentageToStatus?: 'ascending' | 'descending';
|
|
31
|
+
/** Show percentage value as text inside the arc */
|
|
32
|
+
showPercentageValue?: boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* MonitoringIcon - Pure React monitoring icon component
|
|
36
|
+
*
|
|
37
|
+
* Displays system status with icon, label, and optional notification badge.
|
|
38
|
+
* Fully Astro UX compliant with theme integration.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```tsx
|
|
42
|
+
* // Standard monitoring icon
|
|
43
|
+
* <MonitoringIcon
|
|
44
|
+
* status="normal"
|
|
45
|
+
* label="Power"
|
|
46
|
+
* sublabel="85%"
|
|
47
|
+
* icon="power"
|
|
48
|
+
* />
|
|
49
|
+
*
|
|
50
|
+
* // Percentage arc display
|
|
51
|
+
* <MonitoringIcon
|
|
52
|
+
* status="normal"
|
|
53
|
+
* label="Battery"
|
|
54
|
+
* showPercentage
|
|
55
|
+
* percentage={75}
|
|
56
|
+
* percentageToStatus="ascending"
|
|
57
|
+
* />
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare const MonitoringIcon: React.NamedExoticComponent<MonitoringIconProps>;
|