@zendir/ui 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/CHANGELOG.md +419 -386
  2. package/README.md +640 -631
  3. package/dist/_virtual/_rolldown/runtime.js +13 -0
  4. package/dist/index.js +17 -221
  5. package/dist/react/3d/CesiumCaptureSource.d.ts +0 -1
  6. package/dist/react/3d/CesiumCaptureSource.js +364 -283
  7. package/dist/react/3d/CesiumCaptureSource.js.map +1 -1
  8. package/dist/react/3d/ZenSpace3D.d.ts +2 -3
  9. package/dist/react/3d/ZenSpace3D.js +1681 -1237
  10. package/dist/react/3d/ZenSpace3D.js.map +1 -1
  11. package/dist/react/3d/ZenSpace3DCesium.d.ts +0 -1
  12. package/dist/react/3d/ZenSpace3DCesium.js +513 -560
  13. package/dist/react/3d/ZenSpace3DCesium.js.map +1 -1
  14. package/dist/react/3d/ZenSpace3DShaders.js +61 -66
  15. package/dist/react/3d/ZenSpace3DShaders.js.map +1 -1
  16. package/dist/react/3d/ZenSpace3DTypes.d.ts +19 -20
  17. package/dist/react/3d/ZenSpace3DUtils.d.ts +0 -1
  18. package/dist/react/3d/ZenSpace3DUtils.js +37 -24
  19. package/dist/react/3d/ZenSpace3DUtils.js.map +1 -1
  20. package/dist/react/3d/capturePngAnalysis.js +42 -36
  21. package/dist/react/3d/capturePngAnalysis.js.map +1 -1
  22. package/dist/react/3d/index.d.ts +3 -3
  23. package/dist/react/3d/index.js +5 -53
  24. package/dist/react/3d/threeLoader.d.ts +1 -1
  25. package/dist/react/3d/threeLoader.js +23 -18
  26. package/dist/react/3d/threeLoader.js.map +1 -1
  27. package/dist/react/astro/ClassificationBanner.d.ts +2 -3
  28. package/dist/react/astro/ClassificationBanner.js +95 -79
  29. package/dist/react/astro/ClassificationBanner.js.map +1 -1
  30. package/dist/react/astro/GlobalStatusBar.d.ts +0 -1
  31. package/dist/react/astro/GlobalStatusBar.js +157 -163
  32. package/dist/react/astro/GlobalStatusBar.js.map +1 -1
  33. package/dist/react/astro/MissionClock.d.ts +7 -8
  34. package/dist/react/astro/MissionClock.js +377 -400
  35. package/dist/react/astro/MissionClock.js.map +1 -1
  36. package/dist/react/astro/MonitoringIcon.d.ts +1 -2
  37. package/dist/react/astro/MonitoringIcon.js +422 -358
  38. package/dist/react/astro/MonitoringIcon.js.map +1 -1
  39. package/dist/react/astro/Notification.d.ts +1 -2
  40. package/dist/react/astro/Notification.js +229 -126
  41. package/dist/react/astro/Notification.js.map +1 -1
  42. package/dist/react/astro/Progress.d.ts +0 -1
  43. package/dist/react/astro/Progress.js +199 -141
  44. package/dist/react/astro/Progress.js.map +1 -1
  45. package/dist/react/astro/SimulationControls.d.ts +3 -4
  46. package/dist/react/astro/SimulationControls.js +596 -650
  47. package/dist/react/astro/SimulationControls.js.map +1 -1
  48. package/dist/react/astro/StatusIndicator.d.ts +0 -1
  49. package/dist/react/astro/StatusIndicator.js +236 -170
  50. package/dist/react/astro/StatusIndicator.js.map +1 -1
  51. package/dist/react/astro/UnifiedTimeline.d.ts +9 -10
  52. package/dist/react/astro/UnifiedTimeline.js +2345 -2392
  53. package/dist/react/astro/UnifiedTimeline.js.map +1 -1
  54. package/dist/react/astro/index.d.ts +5 -5
  55. package/dist/react/astro/index.js +1 -25
  56. package/dist/react/cards/AccessCard.d.ts +0 -1
  57. package/dist/react/cards/AccessCard.js +471 -405
  58. package/dist/react/cards/AccessCard.js.map +1 -1
  59. package/dist/react/cards/OrbitCard.d.ts +0 -1
  60. package/dist/react/cards/OrbitCard.js +487 -364
  61. package/dist/react/cards/OrbitCard.js.map +1 -1
  62. package/dist/react/cards/SpacecraftCard.d.ts +0 -1
  63. package/dist/react/cards/SpacecraftCard.js +813 -925
  64. package/dist/react/cards/SpacecraftCard.js.map +1 -1
  65. package/dist/react/cards/TelemetryCard.d.ts +0 -1
  66. package/dist/react/cards/TelemetryCard.js +1055 -732
  67. package/dist/react/cards/TelemetryCard.js.map +1 -1
  68. package/dist/react/cards/TelemetryStreamCard.d.ts +0 -1
  69. package/dist/react/cards/TelemetryStreamCard.js +323 -297
  70. package/dist/react/cards/TelemetryStreamCard.js.map +1 -1
  71. package/dist/react/cards/index.d.ts +1 -1
  72. package/dist/react/cards/index.js +1 -8
  73. package/dist/react/charts/GroundTrackMap.d.ts +6 -7
  74. package/dist/react/charts/GroundTrackMap.js +1377 -1256
  75. package/dist/react/charts/GroundTrackMap.js.map +1 -1
  76. package/dist/react/charts/GroundTrackMapLeaflet.d.ts +1 -2
  77. package/dist/react/charts/GroundTrackMapLeaflet.js +1065 -987
  78. package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -1
  79. package/dist/react/charts/groundTrackMapLeafletTiles.js +34 -25
  80. package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -1
  81. package/dist/react/charts/groundTrackMapLeafletUtils.js +70 -61
  82. package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -1
  83. package/dist/react/charts/index.d.ts +1 -1
  84. package/dist/react/charts/index.js +7 -100
  85. package/dist/react/charts/unified/AstroChart.d.ts +1 -2
  86. package/dist/react/charts/unified/AstroChart.js +1331 -1411
  87. package/dist/react/charts/unified/AstroChart.js.map +1 -1
  88. package/dist/react/charts/unified/PowerOverviewChart.d.ts +3 -3
  89. package/dist/react/charts/unified/PowerOverviewChart.js +495 -478
  90. package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -1
  91. package/dist/react/charts/unified/domain.d.ts +12 -13
  92. package/dist/react/charts/unified/domain.js +3999 -3145
  93. package/dist/react/charts/unified/domain.js.map +1 -1
  94. package/dist/react/charts/unified/generators.d.ts +3 -4
  95. package/dist/react/charts/unified/generators.js +561 -498
  96. package/dist/react/charts/unified/generators.js.map +1 -1
  97. package/dist/react/charts/unified/index.d.ts +1 -1
  98. package/dist/react/charts/unified/presets.d.ts +14 -15
  99. package/dist/react/charts/unified/presets.js +857 -994
  100. package/dist/react/charts/unified/presets.js.map +1 -1
  101. package/dist/react/charts/unified/sync.d.ts +2 -3
  102. package/dist/react/charts/unified/sync.js +229 -195
  103. package/dist/react/charts/unified/sync.js.map +1 -1
  104. package/dist/react/charts/unified/theme.d.ts +11 -12
  105. package/dist/react/charts/unified/theme.js +606 -642
  106. package/dist/react/charts/unified/theme.js.map +1 -1
  107. package/dist/react/charts/unified/types.d.ts +32 -33
  108. package/dist/react/charts/unified/useChartStream.d.ts +1 -2
  109. package/dist/react/charts/unified/useChartStream.js +203 -216
  110. package/dist/react/charts/unified/useChartStream.js.map +1 -1
  111. package/dist/react/chatgpt/AppCard.d.ts +1 -2
  112. package/dist/react/chatgpt/index.d.ts +7 -7
  113. package/dist/react/chatgpt/index.js +160 -139
  114. package/dist/react/chatgpt/index.js.map +1 -1
  115. package/dist/react/context/CategoryContext.d.ts +0 -1
  116. package/dist/react/context/CategoryContext.js +78 -29
  117. package/dist/react/context/CategoryContext.js.map +1 -1
  118. package/dist/react/context/DisplaySettingsContext.d.ts +1 -2
  119. package/dist/react/context/DisplaySettingsContext.js +205 -156
  120. package/dist/react/context/DisplaySettingsContext.js.map +1 -1
  121. package/dist/react/context/SpatialSelectionContext.d.ts +0 -1
  122. package/dist/react/context/SpatialSelectionContext.js +36 -7
  123. package/dist/react/context/SpatialSelectionContext.js.map +1 -1
  124. package/dist/react/core/data/DataTable.d.ts +3 -4
  125. package/dist/react/core/data/DataTable.js +473 -440
  126. package/dist/react/core/data/DataTable.js.map +1 -1
  127. package/dist/react/core/data/DataValue.d.ts +4 -5
  128. package/dist/react/core/data/DataValue.js +605 -571
  129. package/dist/react/core/data/DataValue.js.map +1 -1
  130. package/dist/react/core/data/propertyConfig.d.ts +1 -2
  131. package/dist/react/core/data/propertyConfig.js +446 -382
  132. package/dist/react/core/data/propertyConfig.js.map +1 -1
  133. package/dist/react/core/display/AstroIcon.d.ts +4 -5
  134. package/dist/react/core/display/AstroIcon.js +339 -429
  135. package/dist/react/core/display/AstroIcon.js.map +1 -1
  136. package/dist/react/core/display/Badge.d.ts +2 -3
  137. package/dist/react/core/display/Badge.js +131 -131
  138. package/dist/react/core/display/Badge.js.map +1 -1
  139. package/dist/react/core/display/CardHeader.d.ts +0 -1
  140. package/dist/react/core/display/CardHeader.js +398 -311
  141. package/dist/react/core/display/CardHeader.js.map +1 -1
  142. package/dist/react/core/display/Container.d.ts +2 -3
  143. package/dist/react/core/display/Container.js +640 -668
  144. package/dist/react/core/display/Container.js.map +1 -1
  145. package/dist/react/core/display/CopyButton.d.ts +1 -2
  146. package/dist/react/core/display/CopyButton.js +158 -101
  147. package/dist/react/core/display/CopyButton.js.map +1 -1
  148. package/dist/react/core/display/GlassCard.d.ts +3 -4
  149. package/dist/react/core/display/GlassCard.js +416 -369
  150. package/dist/react/core/display/GlassCard.js.map +1 -1
  151. package/dist/react/core/display/HeaderIconWithStatus.d.ts +0 -1
  152. package/dist/react/core/display/HeaderIconWithStatus.js +152 -152
  153. package/dist/react/core/display/HeaderIconWithStatus.js.map +1 -1
  154. package/dist/react/core/display/Icon.d.ts +2 -3
  155. package/dist/react/core/display/Icon.js +172 -143
  156. package/dist/react/core/display/Icon.js.map +1 -1
  157. package/dist/react/core/display/Typography.d.ts +24 -25
  158. package/dist/react/core/display/Typography.js +360 -178
  159. package/dist/react/core/display/Typography.js.map +1 -1
  160. package/dist/react/core/feedback/ConfirmDialog.d.ts +1 -2
  161. package/dist/react/core/feedback/ConfirmDialog.js +343 -304
  162. package/dist/react/core/feedback/ConfirmDialog.js.map +1 -1
  163. package/dist/react/core/feedback/Dialog.d.ts +2 -3
  164. package/dist/react/core/feedback/Dialog.js +189 -197
  165. package/dist/react/core/feedback/Dialog.js.map +1 -1
  166. package/dist/react/core/feedback/Toast.d.ts +2 -3
  167. package/dist/react/core/feedback/Toast.js +346 -207
  168. package/dist/react/core/feedback/Toast.js.map +1 -1
  169. package/dist/react/core/index.d.ts +26 -26
  170. package/dist/react/core/index.js +7 -119
  171. package/dist/react/core/inputs/Button.d.ts +2 -3
  172. package/dist/react/core/inputs/Button.js +281 -304
  173. package/dist/react/core/inputs/Button.js.map +1 -1
  174. package/dist/react/core/inputs/Checkbox.d.ts +2 -3
  175. package/dist/react/core/inputs/Checkbox.js +139 -127
  176. package/dist/react/core/inputs/Checkbox.js.map +1 -1
  177. package/dist/react/core/inputs/Input.d.ts +3 -4
  178. package/dist/react/core/inputs/Input.js +277 -285
  179. package/dist/react/core/inputs/Input.js.map +1 -1
  180. package/dist/react/core/inputs/LimitsBar.d.ts +1 -2
  181. package/dist/react/core/inputs/LimitsBar.js +271 -196
  182. package/dist/react/core/inputs/LimitsBar.js.map +1 -1
  183. package/dist/react/core/inputs/NumberInput.d.ts +2 -3
  184. package/dist/react/core/inputs/NumberInput.js +531 -503
  185. package/dist/react/core/inputs/NumberInput.js.map +1 -1
  186. package/dist/react/core/inputs/PinInput.d.ts +2 -3
  187. package/dist/react/core/inputs/PinInput.js +224 -207
  188. package/dist/react/core/inputs/PinInput.js.map +1 -1
  189. package/dist/react/core/inputs/Select.d.ts +1 -2
  190. package/dist/react/core/inputs/Select.js +298 -299
  191. package/dist/react/core/inputs/Select.js.map +1 -1
  192. package/dist/react/core/inputs/Toggle.d.ts +2 -3
  193. package/dist/react/core/inputs/Toggle.js +142 -148
  194. package/dist/react/core/inputs/Toggle.js.map +1 -1
  195. package/dist/react/core/layout/Box.d.ts +3 -4
  196. package/dist/react/core/layout/Box.js +118 -122
  197. package/dist/react/core/layout/Box.js.map +1 -1
  198. package/dist/react/core/layout/Center.d.ts +0 -1
  199. package/dist/react/core/layout/Center.js +45 -32
  200. package/dist/react/core/layout/Center.js.map +1 -1
  201. package/dist/react/core/layout/Divider.d.ts +1 -2
  202. package/dist/react/core/layout/Divider.js +112 -106
  203. package/dist/react/core/layout/Divider.js.map +1 -1
  204. package/dist/react/core/layout/Flex.d.ts +4 -5
  205. package/dist/react/core/layout/Flex.js +120 -124
  206. package/dist/react/core/layout/Flex.js.map +1 -1
  207. package/dist/react/core/layout/Grid.d.ts +5 -6
  208. package/dist/react/core/layout/Grid.js +131 -138
  209. package/dist/react/core/layout/Grid.js.map +1 -1
  210. package/dist/react/core/layout/Spacer.d.ts +0 -1
  211. package/dist/react/core/layout/Spacer.js +36 -29
  212. package/dist/react/core/layout/Spacer.js.map +1 -1
  213. package/dist/react/core/layout/Stack.d.ts +4 -5
  214. package/dist/react/core/layout/Stack.js +127 -70
  215. package/dist/react/core/layout/Stack.js.map +1 -1
  216. package/dist/react/core/layout/responsive.d.ts +1 -2
  217. package/dist/react/core/layout/responsive.js +25 -19
  218. package/dist/react/core/layout/responsive.js.map +1 -1
  219. package/dist/react/core/layout/useBreakpoint.d.ts +1 -1
  220. package/dist/react/core/layout/useBreakpoint.js +119 -66
  221. package/dist/react/core/layout/useBreakpoint.js.map +1 -1
  222. package/dist/react/core/navigation/AppBar.d.ts +1 -2
  223. package/dist/react/core/navigation/AppBar.js +827 -805
  224. package/dist/react/core/navigation/AppBar.js.map +1 -1
  225. package/dist/react/core/navigation/Pagination.d.ts +2 -3
  226. package/dist/react/core/navigation/Pagination.js +207 -187
  227. package/dist/react/core/navigation/Pagination.js.map +1 -1
  228. package/dist/react/core/navigation/SideNav.d.ts +5 -6
  229. package/dist/react/core/navigation/SideNav.js +855 -629
  230. package/dist/react/core/navigation/SideNav.js.map +1 -1
  231. package/dist/react/core/navigation/Tabs.d.ts +0 -1
  232. package/dist/react/core/navigation/Tabs.js +113 -119
  233. package/dist/react/core/navigation/Tabs.js.map +1 -1
  234. package/dist/react/core/overlays/Popover.d.ts +2 -3
  235. package/dist/react/core/overlays/Popover.js +303 -282
  236. package/dist/react/core/overlays/Popover.js.map +1 -1
  237. package/dist/react/core/overlays/SidePanel.d.ts +1 -2
  238. package/dist/react/core/overlays/SidePanel.js +217 -212
  239. package/dist/react/core/overlays/SidePanel.js.map +1 -1
  240. package/dist/react/core/overlays/Tooltip.d.ts +1 -2
  241. package/dist/react/core/overlays/Tooltip.js +170 -176
  242. package/dist/react/core/overlays/Tooltip.js.map +1 -1
  243. package/dist/react/core/widgets/ActivityPlanner.d.ts +0 -1
  244. package/dist/react/core/widgets/ActivityPlanner.js +855 -517
  245. package/dist/react/core/widgets/ActivityPlanner.js.map +1 -1
  246. package/dist/react/core/widgets/Capture.d.ts +2 -3
  247. package/dist/react/core/widgets/Capture.js +965 -779
  248. package/dist/react/core/widgets/Capture.js.map +1 -1
  249. package/dist/react/core/widgets/ChatPanel.d.ts +16 -17
  250. package/dist/react/core/widgets/ChatPanel.js +1734 -1034
  251. package/dist/react/core/widgets/ChatPanel.js.map +1 -1
  252. package/dist/react/core/widgets/ColorPickerPanel.d.ts +0 -1
  253. package/dist/react/core/widgets/ColorPickerPanel.js +298 -287
  254. package/dist/react/core/widgets/ColorPickerPanel.js.map +1 -1
  255. package/dist/react/core/widgets/CommandBuilder.d.ts +2 -3
  256. package/dist/react/core/widgets/CommandBuilder.js +624 -516
  257. package/dist/react/core/widgets/CommandBuilder.js.map +1 -1
  258. package/dist/react/core/widgets/ConnectionForm.d.ts +2 -3
  259. package/dist/react/core/widgets/ConnectionForm.js +528 -492
  260. package/dist/react/core/widgets/ConnectionForm.js.map +1 -1
  261. package/dist/react/core/widgets/FileExplorer.d.ts +3 -4
  262. package/dist/react/core/widgets/FileExplorer.js +617 -505
  263. package/dist/react/core/widgets/FileExplorer.js.map +1 -1
  264. package/dist/react/core/widgets/HexViewer.d.ts +2 -3
  265. package/dist/react/core/widgets/HexViewer.js +1353 -1091
  266. package/dist/react/core/widgets/HexViewer.js.map +1 -1
  267. package/dist/react/core/widgets/ImageFrame.d.ts +1 -2
  268. package/dist/react/core/widgets/ImageFrame.js +230 -193
  269. package/dist/react/core/widgets/ImageFrame.js.map +1 -1
  270. package/dist/react/core/widgets/ImageGallery.d.ts +2 -1
  271. package/dist/react/core/widgets/ImageGallery.js +380 -314
  272. package/dist/react/core/widgets/ImageGallery.js.map +1 -1
  273. package/dist/react/core/widgets/ImagePanel.d.ts +0 -1
  274. package/dist/react/core/widgets/ImagePanel.js +110 -101
  275. package/dist/react/core/widgets/ImagePanel.js.map +1 -1
  276. package/dist/react/core/widgets/LogViewer.d.ts +2 -3
  277. package/dist/react/core/widgets/LogViewer.js +711 -607
  278. package/dist/react/core/widgets/LogViewer.js.map +1 -1
  279. package/dist/react/core/widgets/MessageStream.d.ts +3 -4
  280. package/dist/react/core/widgets/MessageStream.js +514 -444
  281. package/dist/react/core/widgets/MessageStream.js.map +1 -1
  282. package/dist/react/core/widgets/MissionCalendar.d.ts +3 -4
  283. package/dist/react/core/widgets/MissionCalendar.js +1488 -1020
  284. package/dist/react/core/widgets/MissionCalendar.js.map +1 -1
  285. package/dist/react/core/widgets/PacketViewer.d.ts +2 -3
  286. package/dist/react/core/widgets/PacketViewer.js +550 -421
  287. package/dist/react/core/widgets/PacketViewer.js.map +1 -1
  288. package/dist/react/core/widgets/capture-placeholder.png.js +6 -5
  289. package/dist/react/core/widgets/capture-placeholder.png.js.map +1 -1
  290. package/dist/react/hooks/index.d.ts +5 -5
  291. package/dist/react/hooks/useAccessWindows.d.ts +0 -1
  292. package/dist/react/hooks/useCompactMode.d.ts +1 -1
  293. package/dist/react/hooks/useCompactMode.js +104 -58
  294. package/dist/react/hooks/useCompactMode.js.map +1 -1
  295. package/dist/react/hooks/useGroundTrackHistory.d.ts +0 -1
  296. package/dist/react/hooks/useSimulationScene.d.ts +1 -2
  297. package/dist/react/hooks/useSimulationScene.js +481 -374
  298. package/dist/react/hooks/useSimulationScene.js.map +1 -1
  299. package/dist/react/index.d.ts +3 -3
  300. package/dist/react/panels/LayerControlPanel.d.ts +1 -2
  301. package/dist/react/panels/LayerControlPanel.js +223 -180
  302. package/dist/react/panels/LayerControlPanel.js.map +1 -1
  303. package/dist/react/panels/ObjectInventoryPanel.d.ts +2 -3
  304. package/dist/react/panels/ObjectInventoryPanel.js +315 -250
  305. package/dist/react/panels/ObjectInventoryPanel.js.map +1 -1
  306. package/dist/react/panels/index.d.ts +1 -1
  307. package/dist/react/panels/index.js +1 -6
  308. package/dist/react/shared/ErrorBoundary.d.ts +1 -2
  309. package/dist/react/shared/ErrorBoundary.js +170 -139
  310. package/dist/react/shared/ErrorBoundary.js.map +1 -1
  311. package/dist/react/shared/Skeleton.d.ts +1 -2
  312. package/dist/react/shared/Skeleton.js +300 -301
  313. package/dist/react/shared/Skeleton.js.map +1 -1
  314. package/dist/react/theme/ThemeProvider.d.ts +2 -321
  315. package/dist/react/theme/ThemeProvider.js +313 -939
  316. package/dist/react/theme/ThemeProvider.js.map +1 -1
  317. package/dist/react/theme/cardAccent.d.ts +1 -2
  318. package/dist/react/theme/cardAccent.js +196 -126
  319. package/dist/react/theme/cardAccent.js.map +1 -1
  320. package/dist/react/theme/config.d.ts +0 -1
  321. package/dist/react/theme/config.js +47 -25
  322. package/dist/react/theme/config.js.map +1 -1
  323. package/dist/react/theme/index.d.ts +2 -2
  324. package/dist/react/theme/index.js +1 -16
  325. package/dist/react/theme/types.d.ts +332 -0
  326. package/dist/react/theme/types.js +39 -0
  327. package/dist/react/theme/types.js.map +1 -0
  328. package/dist/react/types.d.ts +8 -8
  329. package/dist/react/types.js +147 -47
  330. package/dist/react/types.js.map +1 -1
  331. package/dist/react/utils/categoryPalette.d.ts +0 -1
  332. package/dist/react/utils/categoryPalette.js +91 -102
  333. package/dist/react/utils/categoryPalette.js.map +1 -1
  334. package/dist/react/utils/index.d.ts +5 -5
  335. package/dist/react/utils/index.js +457 -371
  336. package/dist/react/utils/index.js.map +1 -1
  337. package/dist/react/visualizations/EclipseTimerCard.d.ts +0 -1
  338. package/dist/react/visualizations/LinkBudgetCard.d.ts +0 -1
  339. package/dist/react/visualizations/NavBallCard.d.ts +0 -1
  340. package/dist/react/visualizations/PropulsionCard.d.ts +1 -2
  341. package/dist/react/visualizations/SensorFootprintCard.d.ts +1 -2
  342. package/dist/react/visualizations/ThermalHeatmapCard.d.ts +0 -1
  343. package/dist/react/visualizations/index.d.ts +3 -3
  344. package/dist/react.d.ts +2 -1
  345. package/dist/react.js +17 -221
  346. package/dist/shaders/atmosphere.frag.js +6 -5
  347. package/dist/shaders/atmosphere.frag.js.map +1 -1
  348. package/dist/shaders/atmosphere.vert.js +6 -5
  349. package/dist/shaders/atmosphere.vert.js.map +1 -1
  350. package/dist/shaders/stars.frag.js +6 -5
  351. package/dist/shaders/stars.frag.js.map +1 -1
  352. package/dist/shaders/stars.vert.js +6 -5
  353. package/dist/shaders/stars.vert.js.map +1 -1
  354. package/dist/style.css +26 -3
  355. package/dist/tokens/core.d.ts +159 -0
  356. package/dist/tokens/core.js +144 -0
  357. package/dist/tokens/core.js.map +1 -0
  358. package/dist/tokens/css-vars.d.ts +213 -2
  359. package/dist/tokens/css-vars.js +590 -227
  360. package/dist/tokens/css-vars.js.map +1 -1
  361. package/dist/tokens/index.d.ts +31 -228
  362. package/dist/tokens/index.js +281 -366
  363. package/dist/tokens/index.js.map +1 -1
  364. package/dist/tokens/palettes/astro.d.ts +129 -0
  365. package/dist/tokens/palettes/astro.js +112 -0
  366. package/dist/tokens/palettes/astro.js.map +1 -0
  367. package/dist/tokens/palettes/index.d.ts +288 -0
  368. package/dist/tokens/palettes/index.js +35 -0
  369. package/dist/tokens/palettes/index.js.map +1 -0
  370. package/dist/tokens/palettes/tailwind.d.ts +324 -0
  371. package/dist/tokens/palettes/tailwind.js +201 -0
  372. package/dist/tokens/palettes/tailwind.js.map +1 -0
  373. package/dist/tokens/palettes/zendir.d.ts +126 -0
  374. package/dist/tokens/palettes/zendir.js +92 -0
  375. package/dist/tokens/palettes/zendir.js.map +1 -0
  376. package/dist/tokens/themes.d.ts +30 -0
  377. package/dist/tokens/themes.js +704 -0
  378. package/dist/tokens/themes.js.map +1 -0
  379. package/dist/tokens/tokens.css +533 -155
  380. package/dist/types/index.d.ts +2 -2
  381. package/package.json +310 -313
  382. package/dist/index.js.map +0 -1
  383. package/dist/react/3d/index.js.map +0 -1
  384. package/dist/react/astro/index.js.map +0 -1
  385. package/dist/react/cards/index.js.map +0 -1
  386. package/dist/react/charts/index.js.map +0 -1
  387. package/dist/react/core/index.js.map +0 -1
  388. package/dist/react/panels/index.js.map +0 -1
  389. package/dist/react/theme/astro-tokens.d.ts +0 -153
  390. package/dist/react/theme/index.js.map +0 -1
  391. package/dist/react.js.map +0 -1
@@ -1 +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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"}
1
+ {"version":3,"file":"MissionClock.js","names":[],"sources":["../../../src/react/astro/MissionClock.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - MissionClock Component (Pure React)\r\n *\r\n * Advanced mission time display following Astro UX patterns with full\r\n * space operations support.\r\n *\r\n * Features:\r\n * - Theme-integrated via useTheme()\r\n * - UTC/Zulu time display\r\n * - Configurable formats (12h, 24h, ISO)\r\n * - Optional seconds display\r\n * - AOS/LOS timer support (Acquisition/Loss of Signal)\r\n * - MET (Mission Elapsed Time) display\r\n * - Julian day format (DOY-###)\r\n * - Simulation time support (custom epoch/time source)\r\n * - Tabular numbers for stability\r\n * - Zendir SDK integration for real-time data\r\n *\r\n * Space Operations Terminology:\r\n * - AOS: Acquisition of Signal - when satellite rises above horizon\r\n * - LOS: Loss of Signal - when satellite passes below horizon\r\n * - TCA: Time of Closest Approach - maximum elevation point\r\n * - MET: Mission Elapsed Time - time since launch (dd:hh:mm:ss)\r\n * - DOY: Day of Year - Julian day format\r\n */\r\n\r\nimport React, { memo, useState, useEffect, useCallback, useMemo } from \"react\";\r\nimport { useTheme } from \"../theme\";\r\nimport { classNames, tabularNumsStyle } from \"../utils\";\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport type ClockFormat = \"12h\" | \"24h\" | \"iso\" | \"met\";\r\nexport type DateFormat = \"iso\" | \"julian\" | \"gregorian\" | \"none\";\r\nexport type TimeSource = \"realtime\" | \"simulation\" | \"custom\";\r\n\r\n/**\r\n * Timer configuration for AOS/LOS countdown/up timers\r\n */\r\nexport interface TimerConfig {\r\n /** Timer label (e.g., \"AOS\", \"LOS\", \"MET\") */\r\n label: string;\r\n /** Target timestamp (for countdown) or start timestamp (for countup) */\r\n timestamp: Date;\r\n /** Timer direction: 'countdown' counts to target, 'countup' counts from start */\r\n direction: \"countdown\" | \"countup\";\r\n /** Optional status color */\r\n status?: \"normal\" | \"caution\" | \"critical\" | \"standby\";\r\n /** Show days in timer format */\r\n showDays?: boolean;\r\n}\r\n\r\n/**\r\n * Simulation time configuration\r\n */\r\nexport interface SimulationTimeConfig {\r\n /** Simulation epoch (t=0) as Date or ISO string */\r\n epoch: Date | string;\r\n /** Current simulation time offset in seconds from epoch */\r\n elapsedSeconds?: number;\r\n /** Time scale factor (1 = realtime, 2 = 2x speed, etc.) */\r\n timeScale?: number;\r\n /** Whether simulation is running */\r\n isRunning?: boolean;\r\n /** Callback to get current simulation time */\r\n getCurrentTime?: () => Date;\r\n}\r\n\r\nexport interface MissionClockProps {\r\n /** Clock format */\r\n format?: ClockFormat;\r\n /** Timezone label to display */\r\n timezone?: string;\r\n /** Hide seconds */\r\n hideSeconds?: boolean;\r\n /** Small size variant */\r\n small?: boolean;\r\n /** Show date */\r\n showDate?: boolean;\r\n /** Date format (iso, julian, gregorian) */\r\n dateFormat?: DateFormat;\r\n /** Custom className */\r\n className?: string;\r\n /** Click handler */\r\n onClick?: () => void;\r\n\r\n // === AOS/LOS Timer Support ===\r\n /** AOS timer - countdown/up to Acquisition of Signal */\r\n aosTimer?: TimerConfig | Date;\r\n /** LOS timer - countdown/up to Loss of Signal */\r\n losTimer?: TimerConfig | Date;\r\n /** Additional custom timers */\r\n customTimers?: TimerConfig[];\r\n\r\n // === Simulation Time Support ===\r\n /** Time source: realtime, simulation, or custom */\r\n timeSource?: TimeSource;\r\n /** Simulation time configuration (for timeSource='simulation') */\r\n simulationConfig?: SimulationTimeConfig;\r\n /** Custom time provider (for timeSource='custom') */\r\n customTime?: Date | (() => Date);\r\n\r\n // === Mission Elapsed Time ===\r\n /** Mission start time for MET display */\r\n missionStart?: Date | string;\r\n /** Show MET (Mission Elapsed Time) instead of wall clock */\r\n showMET?: boolean;\r\n\r\n // === Advanced Options ===\r\n /** Update interval in milliseconds (default: 1000) */\r\n updateInterval?: number;\r\n /** Compact mode - single line display */\r\n compact?: boolean;\r\n /** Show milliseconds */\r\n showMilliseconds?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Format duration as dd:hh:mm:ss (MET format)\r\n */\r\nfunction formatMET(ms: number, showMilliseconds = false): string {\r\n const totalSeconds = Math.floor(Math.abs(ms) / 1000);\r\n const days = Math.floor(totalSeconds / 86400);\r\n const hours = Math.floor((totalSeconds % 86400) / 3600);\r\n const minutes = Math.floor((totalSeconds % 3600) / 60);\r\n const seconds = totalSeconds % 60;\r\n\r\n const sign = ms < 0 ? \"-\" : \"\";\r\n\r\n if (showMilliseconds) {\r\n const millis = Math.floor(Math.abs(ms) % 1000);\r\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\")}`;\r\n }\r\n\r\n return `${sign}${days.toString().padStart(2, \"0\")}:${hours.toString().padStart(2, \"0\")}:${minutes.toString().padStart(2, \"0\")}:${seconds.toString().padStart(2, \"0\")}`;\r\n}\r\n\r\n/**\r\n * Format duration for timers (compact: hh:mm:ss or mm:ss)\r\n */\r\nfunction formatTimerDuration(ms: number, showDays = false): string {\r\n const totalSeconds = Math.floor(Math.abs(ms) / 1000);\r\n const days = Math.floor(totalSeconds / 86400);\r\n const hours = Math.floor((totalSeconds % 86400) / 3600);\r\n const minutes = Math.floor((totalSeconds % 3600) / 60);\r\n const seconds = totalSeconds % 60;\r\n\r\n const sign = ms < 0 ? \"-\" : \"\";\r\n\r\n if (showDays && days > 0) {\r\n return `${sign}${days}d ${hours.toString().padStart(2, \"0\")}:${minutes.toString().padStart(2, \"0\")}:${seconds.toString().padStart(2, \"0\")}`;\r\n }\r\n\r\n if (hours > 0 || showDays) {\r\n return `${sign}${hours.toString().padStart(2, \"0\")}:${minutes.toString().padStart(2, \"0\")}:${seconds.toString().padStart(2, \"0\")}`;\r\n }\r\n\r\n return `${sign}${minutes.toString().padStart(2, \"0\")}:${seconds.toString().padStart(2, \"0\")}`;\r\n}\r\n\r\n/**\r\n * Get Julian day (day of year 001-366)\r\n */\r\nfunction getJulianDay(date: Date): string {\r\n const start = new Date(Date.UTC(date.getUTCFullYear(), 0, 0));\r\n const diff = date.getTime() - start.getTime();\r\n const oneDay = 1000 * 60 * 60 * 24;\r\n const day = Math.floor(diff / oneDay);\r\n return day.toString().padStart(3, \"0\");\r\n}\r\n\r\n/**\r\n * Normalize timer config from Date or TimerConfig\r\n */\r\nfunction normalizeTimerConfig(\r\n timer: TimerConfig | Date | undefined,\r\n label: string,\r\n): TimerConfig | undefined {\r\n if (!timer) return undefined;\r\n if (timer instanceof Date) {\r\n return {\r\n label,\r\n timestamp: timer,\r\n direction: \"countdown\",\r\n };\r\n }\r\n return timer;\r\n}\r\n\r\n// ============================================================================\r\n// Timer Sub-component\r\n// ============================================================================\r\n\r\ninterface TimerDisplayProps {\r\n timer: TimerConfig;\r\n currentTime: Date;\r\n tokens: ReturnType<typeof useTheme>[\"tokens\"];\r\n compact?: boolean;\r\n}\r\n\r\nconst TimerDisplay = memo(function TimerDisplay({\r\n timer,\r\n currentTime,\r\n tokens,\r\n compact = false,\r\n}: TimerDisplayProps) {\r\n const diff =\r\n timer.direction === \"countdown\"\r\n ? timer.timestamp.getTime() - currentTime.getTime()\r\n : currentTime.getTime() - timer.timestamp.getTime();\r\n\r\n const isNegative = diff < 0;\r\n const statusColor = timer.status\r\n ? tokens.colors.status[timer.status]\r\n : isNegative\r\n ? tokens.colors.status.caution\r\n : tokens.colors.status.normal;\r\n\r\n return (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: compact ? \"center\" : \"flex-start\",\r\n flexDirection: compact ? \"row\" : \"column\",\r\n gap: compact ? 8 : 2,\r\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\r\n backgroundColor: `${statusColor}15`,\r\n borderRadius: tokens.borderRadius.sm,\r\n border: `1px solid ${statusColor}30`,\r\n }}\r\n >\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontWeight: tokens.typography.fontWeight.semibold,\r\n color: statusColor,\r\n textTransform: \"uppercase\",\r\n letterSpacing: tokens.typography.letterSpacing.wide,\r\n }}\r\n >\r\n {timer.label}\r\n </span>\r\n <span\r\n style={{\r\n fontSize: compact\r\n ? tokens.typography.fontSize.sm\r\n : tokens.typography.fontSize.base,\r\n fontWeight: tokens.typography.fontWeight.bold, // Bold (700) for timer readability\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n color: statusColor,\r\n ...tabularNumsStyle,\r\n }}\r\n >\r\n {isNegative ? \"+\" : \"\"}\r\n {formatTimerDuration(diff, timer.showDays)}\r\n </span>\r\n </div>\r\n );\r\n});\r\n\r\n// ============================================================================\r\n// Main Component\r\n// ============================================================================\r\n\r\n/**\r\n * MissionClock - Advanced mission time display for space operations\r\n *\r\n * Supports real-time clock, simulation time, MET (Mission Elapsed Time),\r\n * and AOS/LOS timers following Astro UX Design System patterns.\r\n *\r\n * @example\r\n * ```tsx\r\n * // Basic clock\r\n * <MissionClock format=\"24h\" timezone=\"UTC\" />\r\n *\r\n * // With AOS/LOS timers\r\n * <MissionClock\r\n * format=\"24h\"\r\n * aosTimer={{ label: 'AOS', timestamp: new Date('2024-03-15T10:30:00Z'), direction: 'countdown' }}\r\n * losTimer={{ label: 'LOS', timestamp: new Date('2024-03-15T10:45:00Z'), direction: 'countdown' }}\r\n * />\r\n *\r\n * // Simulation time\r\n * <MissionClock\r\n * timeSource=\"simulation\"\r\n * simulationConfig={{\r\n * epoch: new Date('2026-01-01T00:00:00Z'),\r\n * elapsedSeconds: 3600,\r\n * timeScale: 1,\r\n * }}\r\n * />\r\n *\r\n * // Mission Elapsed Time\r\n * <MissionClock\r\n * showMET\r\n * missionStart={new Date('2026-01-01T00:00:00Z')}\r\n * />\r\n *\r\n * // Julian day format\r\n * <MissionClock showDate dateFormat=\"julian\" />\r\n * ```\r\n */\r\nexport const MissionClock = memo(function MissionClock({\r\n format = \"24h\",\r\n timezone = \"UTC\",\r\n hideSeconds = false,\r\n small = false,\r\n showDate = false,\r\n dateFormat = \"iso\",\r\n className = \"\",\r\n onClick,\r\n aosTimer,\r\n losTimer,\r\n customTimers = [],\r\n timeSource = \"realtime\",\r\n simulationConfig,\r\n customTime,\r\n missionStart,\r\n showMET = false,\r\n updateInterval = 1000,\r\n compact = false,\r\n showMilliseconds = false,\r\n}: MissionClockProps): React.ReactElement {\r\n const { tokens, theme } = useTheme();\r\n const isTransparentTheme =\r\n theme === \"transparent\" ||\r\n theme === \"transparent-bold\" ||\r\n theme === \"transparent-minimal\";\r\n\r\n // State for current time\r\n const [time, setTime] = useState(() => getCurrentTimeFromSource());\r\n\r\n // Normalize timer configs\r\n const normalizedAOS = useMemo(\r\n () => normalizeTimerConfig(aosTimer, \"AOS\"),\r\n [aosTimer],\r\n );\r\n const normalizedLOS = useMemo(\r\n () => normalizeTimerConfig(losTimer, \"LOS\"),\r\n [losTimer],\r\n );\r\n\r\n // All timers combined\r\n const allTimers = useMemo(() => {\r\n const timers: TimerConfig[] = [];\r\n if (normalizedAOS) timers.push(normalizedAOS);\r\n if (normalizedLOS) timers.push(normalizedLOS);\r\n return [...timers, ...customTimers];\r\n }, [normalizedAOS, normalizedLOS, customTimers]);\r\n\r\n // Get current time based on source\r\n function getCurrentTimeFromSource(): Date {\r\n switch (timeSource) {\r\n case \"simulation\":\r\n if (simulationConfig) {\r\n if (simulationConfig.getCurrentTime) {\r\n return simulationConfig.getCurrentTime();\r\n }\r\n const epoch =\r\n typeof simulationConfig.epoch === \"string\"\r\n ? new Date(simulationConfig.epoch)\r\n : simulationConfig.epoch;\r\n const elapsed = (simulationConfig.elapsedSeconds || 0) * 1000;\r\n return new Date(epoch.getTime() + elapsed);\r\n }\r\n return new Date();\r\n\r\n case \"custom\":\r\n if (customTime) {\r\n return typeof customTime === \"function\" ? customTime() : customTime;\r\n }\r\n return new Date();\r\n\r\n case \"realtime\":\r\n default:\r\n return new Date();\r\n }\r\n }\r\n\r\n // Format time display\r\n const formatTimeDisplay = useCallback(\r\n (date: Date): string => {\r\n if (showMET && missionStart) {\r\n const start =\r\n typeof missionStart === \"string\"\r\n ? new Date(missionStart)\r\n : missionStart;\r\n const elapsed = date.getTime() - start.getTime();\r\n return formatMET(elapsed, showMilliseconds);\r\n }\r\n\r\n if (format === \"met\" && missionStart) {\r\n const start =\r\n typeof missionStart === \"string\"\r\n ? new Date(missionStart)\r\n : missionStart;\r\n const elapsed = date.getTime() - start.getTime();\r\n return formatMET(elapsed, showMilliseconds);\r\n }\r\n\r\n const hours = date.getUTCHours();\r\n const mins = date.getUTCMinutes();\r\n const secs = date.getUTCSeconds();\r\n const millis = date.getUTCMilliseconds();\r\n\r\n let hoursStr: string;\r\n let suffix = \"\";\r\n\r\n if (format === \"12h\") {\r\n const h12 = hours % 12 || 12;\r\n hoursStr = h12.toString().padStart(2, \"0\");\r\n suffix = hours >= 12 ? \" PM\" : \" AM\";\r\n } else {\r\n hoursStr = hours.toString().padStart(2, \"0\");\r\n }\r\n\r\n const minsStr = mins.toString().padStart(2, \"0\");\r\n const secsStr = secs.toString().padStart(2, \"0\");\r\n const millisStr = millis.toString().padStart(3, \"0\");\r\n\r\n if (hideSeconds) {\r\n return `${hoursStr}:${minsStr}${suffix}`;\r\n }\r\n\r\n if (showMilliseconds) {\r\n return `${hoursStr}:${minsStr}:${secsStr}.${millisStr}${suffix}`;\r\n }\r\n\r\n return `${hoursStr}:${minsStr}:${secsStr}${suffix}`;\r\n },\r\n [format, hideSeconds, showMET, missionStart, showMilliseconds],\r\n );\r\n\r\n // Format date display\r\n const formatDateDisplay = useCallback(\r\n (date: Date): string => {\r\n switch (dateFormat) {\r\n case \"julian\": {\r\n const year = date.getUTCFullYear();\r\n const doy = getJulianDay(date);\r\n return `${year}/${doy}`;\r\n }\r\n case \"gregorian\": {\r\n const year = date.getUTCFullYear();\r\n const month = (date.getUTCMonth() + 1).toString().padStart(2, \"0\");\r\n const day = date.getUTCDate().toString().padStart(2, \"0\");\r\n return `${month}/${day}/${year}`;\r\n }\r\n case \"iso\":\r\n default:\r\n if (format === \"iso\") {\r\n return date.toISOString().split(\"T\")[0];\r\n }\r\n const year = date.getUTCFullYear();\r\n const month = (date.getUTCMonth() + 1).toString().padStart(2, \"0\");\r\n const day = date.getUTCDate().toString().padStart(2, \"0\");\r\n return `${year}-${month}-${day}`;\r\n }\r\n },\r\n [format, dateFormat],\r\n );\r\n\r\n // Update time at interval\r\n useEffect(() => {\r\n // Calculate effective update interval\r\n const effectiveInterval = showMilliseconds\r\n ? Math.min(updateInterval, 100)\r\n : hideSeconds\r\n ? 60000\r\n : updateInterval;\r\n\r\n const intervalId = setInterval(() => {\r\n setTime(getCurrentTimeFromSource());\r\n }, effectiveInterval);\r\n\r\n return () => clearInterval(intervalId);\r\n }, [\r\n hideSeconds,\r\n updateInterval,\r\n showMilliseconds,\r\n timeSource,\r\n simulationConfig,\r\n customTime,\r\n ]);\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (onClick && (e.key === \"Enter\" || e.key === \" \")) {\r\n e.preventDefault();\r\n onClick();\r\n }\r\n };\r\n\r\n // Determine display label\r\n const displayLabel = useMemo(() => {\r\n if (showMET || format === \"met\") {\r\n return \"MET\";\r\n }\r\n if (timeSource === \"simulation\") {\r\n return \"SIM\";\r\n }\r\n return timezone;\r\n }, [showMET, format, timeSource, timezone]);\r\n\r\n return (\r\n <div\r\n className={classNames(\"zendir-mission-clock\", className)}\r\n onClick={onClick}\r\n onKeyDown={onClick ? handleKeyDown : undefined}\r\n tabIndex={onClick ? 0 : undefined}\r\n role=\"timer\"\r\n aria-label={`Current time: ${formatTimeDisplay(time)} ${displayLabel}`}\r\n style={{\r\n display: \"inline-flex\",\r\n flexDirection: compact ? \"row\" : \"column\",\r\n alignItems: \"center\",\r\n gap: compact ? 16 : 4,\r\n padding: small\r\n ? `${tokens.spacing.xs} ${tokens.spacing.sm}`\r\n : `${tokens.spacing.sm} ${tokens.spacing.md}`,\r\n backgroundColor: isTransparentTheme\r\n ? \"transparent\"\r\n : tokens.colors.background.surface,\r\n ...(isTransparentTheme && {\r\n backdropFilter: \"blur(12px)\",\r\n WebkitBackdropFilter: \"blur(12px)\" as const,\r\n }),\r\n ...(tokens.colors.border.cardStyle ?? {\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n }),\r\n borderRadius: tokens.borderRadius.md,\r\n cursor: onClick ? \"pointer\" : \"default\",\r\n outline: \"none\",\r\n transition: tokens.animation.fast,\r\n ...tabularNumsStyle,\r\n }}\r\n >\r\n {/* Main clock section */}\r\n <div\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n gap: 2,\r\n }}\r\n >\r\n {/* Date (optional) */}\r\n {showDate && dateFormat !== \"none\" && (\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontWeight: tokens.typography.fontWeight.normal,\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n color: tokens.colors.text.tertiary,\r\n letterSpacing: tokens.typography.letterSpacing.normal,\r\n }}\r\n >\r\n {formatDateDisplay(time)}\r\n </span>\r\n )}\r\n\r\n {/* Time - Using bold weight for critical time displays (Apple/Google best practice) */}\r\n <span\r\n style={{\r\n fontSize: small\r\n ? tokens.typography.fontSize.base\r\n : tokens.typography.fontSize.xl,\r\n fontWeight: tokens.typography.fontWeight.bold, // Bold (700) for readability - time is critical info\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n letterSpacing: tokens.typography.letterSpacing.normal,\r\n color: tokens.colors.text.primary,\r\n }}\r\n >\r\n {formatTimeDisplay(time)}\r\n </span>\r\n\r\n {/* Label (timezone/MET/SIM) */}\r\n {displayLabel && (\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n color:\r\n timeSource === \"simulation\"\r\n ? tokens.colors.status.caution\r\n : tokens.colors.text.tertiary,\r\n textTransform: \"uppercase\",\r\n letterSpacing: tokens.typography.letterSpacing.wide,\r\n }}\r\n >\r\n {displayLabel}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* AOS/LOS Timers */}\r\n {allTimers.length > 0 && (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n flexDirection: compact ? \"row\" : \"column\",\r\n gap: 8,\r\n }}\r\n >\r\n {allTimers.map((timer, index) => (\r\n <TimerDisplay\r\n key={`${timer.label}-${index}`}\r\n timer={timer}\r\n currentTime={time}\r\n tokens={tokens}\r\n compact={compact}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n});\r\n\r\n// ============================================================================\r\n// Convenience Components\r\n// ============================================================================\r\n\r\n/**\r\n * SimpleTimer - Standalone countdown/up timer\r\n */\r\nexport interface SimpleTimerProps {\r\n /** Timer label */\r\n label: string;\r\n /** Target/start timestamp */\r\n timestamp: Date;\r\n /** Timer direction */\r\n direction?: \"countdown\" | \"countup\";\r\n /** Status color */\r\n status?: \"normal\" | \"caution\" | \"critical\" | \"standby\";\r\n /** Show days */\r\n showDays?: boolean;\r\n /** Custom className */\r\n className?: string;\r\n}\r\n\r\nexport const SimpleTimer = memo(function SimpleTimer({\r\n label,\r\n timestamp,\r\n direction = \"countdown\",\r\n status,\r\n showDays = false,\r\n className = \"\",\r\n}: SimpleTimerProps): React.ReactElement {\r\n const { tokens } = useTheme();\r\n const [now, setNow] = useState(new Date());\r\n\r\n useEffect(() => {\r\n const interval = setInterval(() => setNow(new Date()), 1000);\r\n return () => clearInterval(interval);\r\n }, []);\r\n\r\n const timer: TimerConfig = { label, timestamp, direction, status, showDays };\r\n\r\n return (\r\n <div className={classNames(\"zendir-simple-timer\", className)}>\r\n <TimerDisplay timer={timer} currentTime={now} tokens={tokens} />\r\n </div>\r\n );\r\n});\r\n\r\n/**\r\n * MissionElapsedTime - Dedicated MET display\r\n */\r\nexport interface MissionElapsedTimeProps {\r\n /** Mission launch/start time */\r\n launchTime: Date | string;\r\n /** Show milliseconds */\r\n showMilliseconds?: boolean;\r\n /** Custom className */\r\n className?: string;\r\n /** Small variant */\r\n small?: boolean;\r\n}\r\n\r\nexport const MissionElapsedTime = memo(function MissionElapsedTime({\r\n launchTime,\r\n showMilliseconds = false,\r\n className = \"\",\r\n small = false,\r\n}: MissionElapsedTimeProps): React.ReactElement {\r\n return (\r\n <MissionClock\r\n format=\"met\"\r\n missionStart={launchTime}\r\n showMET\r\n showMilliseconds={showMilliseconds}\r\n className={className}\r\n small={small}\r\n timezone=\"\"\r\n />\r\n );\r\n});\r\n\r\n/**\r\n * SimulationClock - Clock driven by simulation time\r\n */\r\nexport interface SimulationClockProps {\r\n /** Simulation epoch */\r\n epoch: Date | string;\r\n /** Elapsed seconds from epoch */\r\n elapsedSeconds?: number;\r\n /** Time scale factor */\r\n timeScale?: number;\r\n /** Whether simulation is running */\r\n isRunning?: boolean;\r\n /** Show date */\r\n showDate?: boolean;\r\n /** Date format */\r\n dateFormat?: DateFormat;\r\n /** Custom className */\r\n className?: string;\r\n /** Small variant */\r\n small?: boolean;\r\n}\r\n\r\nexport const SimulationClock = memo(function SimulationClock({\r\n epoch,\r\n elapsedSeconds = 0,\r\n timeScale = 1,\r\n isRunning = true,\r\n showDate = true,\r\n dateFormat = \"julian\",\r\n className = \"\",\r\n small = false,\r\n}: SimulationClockProps): React.ReactElement {\r\n return (\r\n <MissionClock\r\n timeSource=\"simulation\"\r\n simulationConfig={{\r\n epoch,\r\n elapsedSeconds,\r\n timeScale,\r\n isRunning,\r\n }}\r\n showDate={showDate}\r\n dateFormat={dateFormat}\r\n className={className}\r\n small={small}\r\n />\r\n );\r\n});\r\n\r\nexport default MissionClock;\r\n"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { default as React } from 'react';
2
2
  import { StatusLevel } from '../utils';
3
-
4
3
  export type MonitoringStatus = StatusLevel;
5
4
  export interface MonitoringIconProps {
6
5
  /** Current status of the monitored item */
@@ -27,7 +26,7 @@ export interface MonitoringIconProps {
27
26
  /** Percentage value (0-100) - displayed as arc when showPercentage is true */
28
27
  percentage?: number;
29
28
  /** Map percentage to status colors (e.g., low = critical, high = normal) */
30
- percentageToStatus?: 'ascending' | 'descending';
29
+ percentageToStatus?: "ascending" | "descending";
31
30
  /** Show percentage value as text inside the arc */
32
31
  showPercentageValue?: boolean;
33
32
  }