@zendir/ui 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/CHANGELOG.md +20 -0
  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 +312 -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 +217 -194
  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 +419 -41
  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,941 +1,829 @@
1
- import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
- import { memo, useMemo, useCallback } from "react";
3
1
  import { useTheme } from "../theme/ThemeProvider.js";
4
2
  import { Icon } from "../core/display/Icon.js";
5
- import { CardHeader } from "../core/display/CardHeader.js";
3
+ import { classNames, formatAltitude, formatCoordinate, formatPercentage, formatTime, formatVelocity, getStatusColor, safeAccentText, safeNumber } from "../utils/index.js";
6
4
  import { HeaderIconWithStatus } from "../core/display/HeaderIconWithStatus.js";
5
+ import { CardHeader } from "../core/display/CardHeader.js";
7
6
  import { useCardBorderStyle } from "../context/DisplaySettingsContext.js";
8
- import { safeAccentText, getStatusColor, classNames, formatCoordinate, formatAltitude, formatVelocity, formatTime, safeNumber, formatPercentage } from "../utils/index.js";
9
7
  import { useCompactMode } from "../hooks/useCompactMode.js";
8
+ import { memo, useCallback, useMemo } from "react";
9
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
10
+ //#region src/react/cards/SpacecraftCard.tsx
11
+ /**
12
+ * @zendir/ui - SpacecraftCard Component
13
+ *
14
+ * Enterprise-grade spacecraft information card.
15
+ *
16
+ * AstroUXDS Compliance:
17
+ * - Status colors used for health/operational status only
18
+ * - Orbit type uses Zendir-Astro data viz colors (categorical)
19
+ * - Zendir accent colors for interactive elements
20
+ * - Tabular numbers with fontVariantNumeric for data
21
+ * - Sentence-case labels per Tier 3 compliance
22
+ *
23
+ * Features:
24
+ * - Full null-safety with graceful fallbacks
25
+ * - WCAG 2.1 AA accessibility
26
+ * - Keyboard navigation
27
+ * - Smooth animations with reduced-motion support
28
+ * - Loading skeleton state
29
+ * - Error boundary support
30
+ * - Real SDK integration via optional client prop
31
+ */
32
+ /**
33
+ * Get orbit type color based on orbit classification
34
+ * Uses Zendir-Astro palette for categorical (non-status) classification
35
+ */
10
36
  function getOrbitTypeColor(orbitType, accentColor) {
11
- const colors = {
12
- LEO: "#3E3CFF",
13
- // Zendir Electric - Low Earth Orbit
14
- MEO: "#3548C0",
15
- // Zendir Prussian Blue Light - Medium Earth Orbit
16
- GEO: "#9D70FF",
17
- // Zendir Purple - Geostationary
18
- HEO: "#1B2DA0",
19
- // Zendir Prussian Blue - Highly Elliptical
20
- SSO: "#B48DFF",
21
- // Zendir Purple Light - Sun-Synchronous
22
- POLAR: "#6B69FF"
23
- // Zendir Electric Light - Polar
24
- };
25
- return colors[(orbitType == null ? void 0 : orbitType.toUpperCase()) ?? ""] ?? accentColor;
37
+ return {
38
+ LEO: "#3E3CFF",
39
+ MEO: "#3548C0",
40
+ GEO: "#9D70FF",
41
+ HEO: "#1B2DA0",
42
+ SSO: "#B48DFF",
43
+ POLAR: "#6B69FF"
44
+ }[orbitType?.toUpperCase() ?? ""] ?? accentColor;
26
45
  }
46
+ /**
47
+ * Derive health status from spacecraft or telemetry
48
+ * Prefers telemetry.health.status, falls back to spacecraft.status
49
+ */
27
50
  function deriveHealthStatus(spacecraftStatus, telemetryStatus) {
28
- if (telemetryStatus) {
29
- const validStatuses = ["off", "standby", "normal", "caution", "serious", "critical"];
30
- const normalized = telemetryStatus.toLowerCase();
31
- if (validStatuses.includes(normalized)) {
32
- return normalized;
33
- }
34
- switch (normalized) {
35
- case "healthy":
36
- case "nominal":
37
- case "operational":
38
- return "normal";
39
- case "warning":
40
- case "degraded":
41
- return "caution";
42
- case "failed":
43
- case "error":
44
- return "critical";
45
- case "idle":
46
- return "standby";
47
- }
48
- }
49
- return spacecraftStatus ?? "off";
51
+ if (telemetryStatus) {
52
+ const validStatuses = [
53
+ "off",
54
+ "standby",
55
+ "normal",
56
+ "caution",
57
+ "serious",
58
+ "critical"
59
+ ];
60
+ const normalized = telemetryStatus.toLowerCase();
61
+ if (validStatuses.includes(normalized)) return normalized;
62
+ switch (normalized) {
63
+ case "healthy":
64
+ case "nominal":
65
+ case "operational": return "normal";
66
+ case "warning":
67
+ case "degraded": return "caution";
68
+ case "failed":
69
+ case "error": return "critical";
70
+ case "idle": return "standby";
71
+ }
72
+ }
73
+ return spacecraftStatus ?? "off";
50
74
  }
51
- const SpacecraftCard = memo(function SpacecraftCard2({
52
- spacecraft,
53
- telemetry,
54
- showOrbit = false,
55
- showTelemetry = false,
56
- loading = false,
57
- onClick,
58
- className = "",
59
- compact = false,
60
- defaultExpanded = false,
61
- onPinChange
62
- }) {
63
- var _a, _b, _c;
64
- const { tokens, theme, prefersReducedMotion } = useTheme();
65
- const isTransparentTheme = theme === "transparent" || theme === "transparent-bold" || theme === "transparent-minimal";
66
- const isBoldVariant = theme === "transparent-bold";
67
- const isMinimalVariant = theme === "transparent-minimal";
68
- const useGlassMode = isBoldVariant || isMinimalVariant;
69
- const glassAccentColor = tokens.colors.accent.primary;
70
- const glassAccentMuted = `${glassAccentColor}66`;
71
- const accentTextColor = useMemo(() => safeAccentText(tokens.colors.accent.primary), [tokens.colors.accent.primary]);
72
- const cardBg = isTransparentTheme ? "transparent" : tokens.colors.background.surface;
73
- const cardGlass = isTransparentTheme ? {
74
- backdropFilter: "blur(12px)",
75
- WebkitBackdropFilter: "blur(12px)"
76
- } : {};
77
- const cardBorderStyle = useCardBorderStyle(tokens, isTransparentTheme);
78
- const glassContainerStyle = useGlassMode ? {
79
- backgroundColor: "rgba(10, 15, 25, 0.35)",
80
- backdropFilter: "blur(12px)",
81
- WebkitBackdropFilter: "blur(12px)",
82
- border: `1px solid ${glassAccentMuted}`,
83
- borderTop: isBoldVariant ? `2px solid ${glassAccentColor}` : `1px solid ${glassAccentColor}`
84
- } : {};
85
- const { expanded, isPinned, isHovered: _isHovered, handlers: compactHandlers, transitionDuration: _compactTransition } = useCompactMode({
86
- compact,
87
- defaultExpanded,
88
- onPinChange
89
- });
90
- const animationDuration = prefersReducedMotion ? 0 : 250;
91
- const animationEasing = "cubic-bezier(0.4, 0, 0.2, 1)";
92
- useCallback(() => {
93
- if (onClick && spacecraft) {
94
- onClick(spacecraft);
95
- }
96
- }, [onClick, spacecraft]);
97
- const handleKeyDown = useCallback(
98
- (e) => {
99
- if (onClick && spacecraft && (e.key === "Enter" || e.key === " ")) {
100
- e.preventDefault();
101
- onClick(spacecraft);
102
- }
103
- },
104
- [onClick, spacecraft]
105
- );
106
- const orbitColor = useMemo(
107
- () => getOrbitTypeColor(spacecraft == null ? void 0 : spacecraft.orbitType, tokens.colors.accent.primary),
108
- [spacecraft == null ? void 0 : spacecraft.orbitType, tokens.colors.accent.primary]
109
- );
110
- const healthStatus = useMemo(
111
- () => {
112
- var _a2;
113
- return deriveHealthStatus(spacecraft == null ? void 0 : spacecraft.status, (_a2 = telemetry == null ? void 0 : telemetry.health) == null ? void 0 : _a2.status);
114
- },
115
- [spacecraft == null ? void 0 : spacecraft.status, (_a = telemetry == null ? void 0 : telemetry.health) == null ? void 0 : _a.status]
116
- );
117
- const statusColor = useMemo(() => getStatusColor(healthStatus), [healthStatus]);
118
- const transitionDuration = prefersReducedMotion ? "0ms" : "200ms";
119
- const combinedClickHandler = useCallback(() => {
120
- if (compact) {
121
- compactHandlers.onClick();
122
- }
123
- if (onClick && spacecraft) {
124
- onClick(spacecraft);
125
- }
126
- }, [compact, compactHandlers, onClick, spacecraft]);
127
- if (loading) {
128
- return /* @__PURE__ */ jsxs(
129
- "div",
130
- {
131
- className: classNames("zendir-spacecraft-card", "loading", className),
132
- role: "article",
133
- "aria-busy": "true",
134
- "aria-label": "Loading spacecraft data",
135
- style: {
136
- backgroundColor: cardBg,
137
- ...cardGlass,
138
- ...cardBorderStyle,
139
- borderRadius: tokens.borderRadius.lg,
140
- padding: tokens.spacing.md,
141
- minHeight: 180
142
- },
143
- children: [
144
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: 12, marginBottom: 16 }, children: [
145
- /* @__PURE__ */ jsx(
146
- "div",
147
- {
148
- style: {
149
- width: 32,
150
- height: 32,
151
- borderRadius: "50%",
152
- backgroundColor: "rgba(255,255,255,0.1)",
153
- animation: "pulse 1.5s ease-in-out infinite"
154
- }
155
- }
156
- ),
157
- /* @__PURE__ */ jsx("div", { style: { flex: 1 }, children: /* @__PURE__ */ jsx(
158
- "div",
159
- {
160
- style: {
161
- height: 16,
162
- width: "60%",
163
- backgroundColor: "rgba(255,255,255,0.1)",
164
- borderRadius: 4,
165
- animation: "pulse 1.5s ease-in-out infinite"
166
- }
167
- }
168
- ) })
169
- ] }),
170
- /* @__PURE__ */ jsx(
171
- "div",
172
- {
173
- style: {
174
- display: "grid",
175
- gridTemplateColumns: "repeat(2, 1fr)",
176
- gap: 12
177
- },
178
- children: [1, 2, 3, 4].map((i) => /* @__PURE__ */ jsxs("div", { children: [
179
- /* @__PURE__ */ jsx(
180
- "div",
181
- {
182
- style: {
183
- height: 10,
184
- width: "40%",
185
- backgroundColor: "rgba(255,255,255,0.08)",
186
- borderRadius: 2,
187
- marginBottom: 4
188
- }
189
- }
190
- ),
191
- /* @__PURE__ */ jsx(
192
- "div",
193
- {
194
- style: {
195
- height: 14,
196
- width: "70%",
197
- backgroundColor: "rgba(255,255,255,0.1)",
198
- borderRadius: 2
199
- }
200
- }
201
- )
202
- ] }, i))
203
- }
204
- ),
205
- /* @__PURE__ */ jsx("style", { children: `
75
+ /**
76
+ * SpacecraftCard - Displays spacecraft position and status information
77
+ *
78
+ * @example
79
+ * ```tsx
80
+ * // Direct data mode
81
+ * <SpacecraftCard
82
+ * spacecraft={spacecraftData}
83
+ * telemetry={telemetryData}
84
+ * showOrbit
85
+ * showTelemetry
86
+ * onClick={() => {}}
87
+ * />
88
+ *
89
+ * // Connected mode (auto-fetches via SDK)
90
+ * <SpacecraftCard
91
+ * client={zendirClient}
92
+ * spacecraftId="iss-25544"
93
+ * showTelemetry
94
+ * />
95
+ * ```
96
+ */
97
+ var SpacecraftCard = memo(function SpacecraftCard({ spacecraft, telemetry, showOrbit = false, showTelemetry = false, loading = false, onClick, className = "", compact = false, defaultExpanded = false, onPinChange }) {
98
+ const { tokens, theme, prefersReducedMotion } = useTheme();
99
+ const isTransparentTheme = theme === "transparent" || theme === "transparent-bold" || theme === "transparent-minimal";
100
+ const isBoldVariant = theme === "transparent-bold";
101
+ const useGlassMode = isBoldVariant || theme === "transparent-minimal";
102
+ const glassAccentColor = tokens.colors.accent.primary;
103
+ const glassAccentMuted = `${glassAccentColor}66`;
104
+ const accentTextColor = useMemo(() => safeAccentText(tokens.colors.accent.primary), [tokens.colors.accent.primary]);
105
+ const cardBg = isTransparentTheme ? "transparent" : tokens.colors.background.surface;
106
+ const cardGlass = isTransparentTheme ? {
107
+ backdropFilter: "blur(12px)",
108
+ WebkitBackdropFilter: "blur(12px)"
109
+ } : {};
110
+ const cardBorderStyle = useCardBorderStyle(tokens, isTransparentTheme);
111
+ const glassContainerStyle = useGlassMode ? {
112
+ backgroundColor: "rgba(10, 15, 25, 0.35)",
113
+ backdropFilter: "blur(12px)",
114
+ WebkitBackdropFilter: "blur(12px)",
115
+ border: `1px solid ${glassAccentMuted}`,
116
+ borderTop: isBoldVariant ? `2px solid ${glassAccentColor}` : `1px solid ${glassAccentColor}`
117
+ } : {};
118
+ const { expanded, isPinned, isHovered: _isHovered, handlers: compactHandlers, transitionDuration: _compactTransition } = useCompactMode({
119
+ compact,
120
+ defaultExpanded,
121
+ onPinChange
122
+ });
123
+ const animationDuration = prefersReducedMotion ? 0 : 250;
124
+ const animationEasing = "cubic-bezier(0.4, 0, 0.2, 1)";
125
+ useCallback(() => {
126
+ if (onClick && spacecraft) onClick(spacecraft);
127
+ }, [onClick, spacecraft]);
128
+ const handleKeyDown = useCallback((e) => {
129
+ if (onClick && spacecraft && (e.key === "Enter" || e.key === " ")) {
130
+ e.preventDefault();
131
+ onClick(spacecraft);
132
+ }
133
+ }, [onClick, spacecraft]);
134
+ const orbitColor = useMemo(() => getOrbitTypeColor(spacecraft?.orbitType, tokens.colors.accent.primary), [spacecraft?.orbitType, tokens.colors.accent.primary]);
135
+ const healthStatus = useMemo(() => deriveHealthStatus(spacecraft?.status, telemetry?.health?.status), [spacecraft?.status, telemetry?.health?.status]);
136
+ const statusColor = useMemo(() => getStatusColor(healthStatus), [healthStatus]);
137
+ const transitionDuration = prefersReducedMotion ? "0ms" : "200ms";
138
+ const combinedClickHandler = useCallback(() => {
139
+ if (compact) compactHandlers.onClick();
140
+ if (onClick && spacecraft) onClick(spacecraft);
141
+ }, [
142
+ compact,
143
+ compactHandlers,
144
+ onClick,
145
+ spacecraft
146
+ ]);
147
+ if (loading) return /* @__PURE__ */ jsxs("div", {
148
+ className: classNames("zendir-spacecraft-card", "loading", className),
149
+ role: "article",
150
+ "aria-busy": "true",
151
+ "aria-label": "Loading spacecraft data",
152
+ style: {
153
+ backgroundColor: cardBg,
154
+ ...cardGlass,
155
+ ...cardBorderStyle,
156
+ borderRadius: tokens.borderRadius.lg,
157
+ padding: tokens.spacing.md,
158
+ minHeight: 180
159
+ },
160
+ children: [
161
+ /* @__PURE__ */ jsxs("div", {
162
+ style: {
163
+ display: "flex",
164
+ alignItems: "center",
165
+ gap: 12,
166
+ marginBottom: 16
167
+ },
168
+ children: [/* @__PURE__ */ jsx("div", { style: {
169
+ width: 32,
170
+ height: 32,
171
+ borderRadius: "50%",
172
+ backgroundColor: "rgba(255,255,255,0.1)",
173
+ animation: "pulse 1.5s ease-in-out infinite"
174
+ } }), /* @__PURE__ */ jsx("div", {
175
+ style: { flex: 1 },
176
+ children: /* @__PURE__ */ jsx("div", { style: {
177
+ height: 16,
178
+ width: "60%",
179
+ backgroundColor: "rgba(255,255,255,0.1)",
180
+ borderRadius: 4,
181
+ animation: "pulse 1.5s ease-in-out infinite"
182
+ } })
183
+ })]
184
+ }),
185
+ /* @__PURE__ */ jsx("div", {
186
+ style: {
187
+ display: "grid",
188
+ gridTemplateColumns: "repeat(2, 1fr)",
189
+ gap: 12
190
+ },
191
+ children: [
192
+ 1,
193
+ 2,
194
+ 3,
195
+ 4
196
+ ].map((i) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", { style: {
197
+ height: 10,
198
+ width: "40%",
199
+ backgroundColor: "rgba(255,255,255,0.08)",
200
+ borderRadius: 2,
201
+ marginBottom: 4
202
+ } }), /* @__PURE__ */ jsx("div", { style: {
203
+ height: 14,
204
+ width: "70%",
205
+ backgroundColor: "rgba(255,255,255,0.1)",
206
+ borderRadius: 2
207
+ } })] }, i))
208
+ }),
209
+ /* @__PURE__ */ jsx("style", { children: `
206
210
  @keyframes pulse {
207
211
  0%, 100% { opacity: 1; }
208
212
  50% { opacity: 0.5; }
209
213
  }
210
214
  ` })
211
- ]
212
- }
213
- );
214
- }
215
- if (!spacecraft) {
216
- return /* @__PURE__ */ jsxs(
217
- "div",
218
- {
219
- className: classNames("zendir-spacecraft-card", "empty", className),
220
- role: "article",
221
- "aria-label": "No spacecraft data",
222
- style: {
223
- backgroundColor: cardBg,
224
- ...cardGlass,
225
- ...tokens.colors.border.cardStyleDashed ?? {},
226
- borderRadius: tokens.borderRadius.lg,
227
- padding: tokens.spacing.lg,
228
- textAlign: "center",
229
- color: tokens.colors.text.tertiary
230
- },
231
- children: [
232
- /* @__PURE__ */ jsx(
233
- "svg",
234
- {
235
- width: "32",
236
- height: "32",
237
- viewBox: "0 0 24 24",
238
- fill: "none",
239
- stroke: "currentColor",
240
- strokeWidth: "1.5",
241
- style: { marginBottom: 8, opacity: 0.5 },
242
- children: /* @__PURE__ */ jsx("path", { d: "M13 2L3 14h9l-1 8 10-12h-9l1-8z" })
243
- }
244
- ),
245
- /* @__PURE__ */ jsx("p", { style: { margin: 0, fontSize: tokens.typography.body[2].fontSize }, children: "No spacecraft data available" })
246
- ]
247
- }
248
- );
249
- }
250
- const CompactMetric = ({
251
- icon,
252
- label,
253
- value,
254
- color
255
- }) => /* @__PURE__ */ jsxs("div", { style: {
256
- display: "flex",
257
- alignItems: "center",
258
- gap: 3,
259
- padding: `2px 0`
260
- }, children: [
261
- /* @__PURE__ */ jsx(Icon, { name: icon, size: 12, color: color ?? tokens.colors.text.secondary }),
262
- /* @__PURE__ */ jsx("span", { style: {
263
- fontSize: tokens.typography.fontSize.micro,
264
- // 0.5625rem / 9px (AstroUXDS micro)
265
- fontWeight: tokens.typography.fontWeight.medium,
266
- fontFamily: tokens.typography.fontFamily.primary,
267
- // Public Sans → Roboto fallback → system stack
268
- color: tokens.colors.text.tertiary,
269
- textTransform: "uppercase",
270
- minWidth: 8
271
- }, children: label.charAt(0) }),
272
- /* @__PURE__ */ jsx("span", { style: {
273
- fontVariantNumeric: "tabular-nums",
274
- fontFamily: tokens.typography.fontFamily.mono,
275
- fontSize: tokens.typography.fontSize.xs,
276
- color: color ?? tokens.colors.text.primary,
277
- fontWeight: tokens.typography.fontWeight.medium
278
- }, children: value })
279
- ] });
280
- const renderCompactContent = () => {
281
- var _a2;
282
- const power = ((_a2 = telemetry == null ? void 0 : telemetry.subsystems) == null ? void 0 : _a2.power) ?? (telemetry == null ? void 0 : telemetry.power);
283
- const batteryLevel = power == null ? void 0 : power.batteryLevel;
284
- const batteryStatusLocal = batteryLevel !== void 0 ? batteryLevel > 50 ? "normal" : batteryLevel > 20 ? "caution" : "critical" : "off";
285
- const statusColor2 = getStatusColor(healthStatus);
286
- return /* @__PURE__ */ jsxs(Fragment, { children: [
287
- /* @__PURE__ */ jsxs("div", { style: {
288
- display: "flex",
289
- alignItems: "center",
290
- justifyContent: "space-between",
291
- marginBottom: tokens.spacing.xs,
292
- paddingBottom: tokens.spacing.xs,
293
- borderBottom: useGlassMode ? "none" : `1px solid ${tokens.colors.border.muted}`,
294
- position: "relative",
295
- zIndex: 1
296
- }, children: [
297
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: tokens.spacing.xs, flex: 1, minWidth: 0 }, children: [
298
- /* @__PURE__ */ jsx(
299
- HeaderIconWithStatus,
300
- {
301
- icon: "satellite-transmit",
302
- size: 18,
303
- status: healthStatus,
304
- statusColor: statusColor2
305
- }
306
- ),
307
- /* @__PURE__ */ jsx("span", { style: {
308
- fontWeight: tokens.typography.fontWeight.semibold,
309
- fontSize: tokens.typography.fontSize.sm,
310
- fontFamily: tokens.typography.fontFamily.primary,
311
- color: useGlassMode ? glassAccentColor : void 0,
312
- textShadow: useGlassMode ? `0 0 16px ${glassAccentMuted}` : void 0,
313
- whiteSpace: "nowrap",
314
- overflow: "hidden",
315
- textOverflow: "ellipsis"
316
- }, children: (spacecraft.name ?? spacecraft.id ?? "Unknown").split(" ")[0] }),
317
- useGlassMode && /* @__PURE__ */ jsx("div", { style: {
318
- flex: 1,
319
- height: isBoldVariant ? "2px" : "1px",
320
- minWidth: 20,
321
- background: `linear-gradient(90deg, ${glassAccentColor} 0%, ${glassAccentMuted} 60%, transparent 100%)`,
322
- boxShadow: isBoldVariant ? `0 0 8px ${glassAccentMuted}` : void 0
323
- } })
324
- ] }),
325
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: tokens.spacing.xs, flexShrink: 0 }, children: [
326
- /* @__PURE__ */ jsx(
327
- "span",
328
- {
329
- style: {
330
- backgroundColor: `${orbitColor}20`,
331
- color: orbitColor,
332
- padding: `1px 6px`,
333
- borderRadius: tokens.borderRadius.sm,
334
- fontSize: tokens.typography.fontSize.xxs,
335
- // 0.625rem / 10px (AstroUXDS compact)
336
- fontWeight: tokens.typography.fontWeight.medium,
337
- fontFamily: tokens.typography.fontFamily.primary
338
- },
339
- children: spacecraft.orbitType ?? "—"
340
- }
341
- ),
342
- isPinned && /* @__PURE__ */ jsx(Icon, { name: "lock", size: 10, color: tokens.colors.accent.primary })
343
- ] })
344
- ] }),
345
- /* @__PURE__ */ jsxs("div", { style: {
346
- display: "grid",
347
- gridTemplateColumns: "repeat(3, 1fr)",
348
- gap: `${tokens.spacing.xs} ${tokens.spacing.sm}`
349
- }, children: [
350
- /* @__PURE__ */ jsx(
351
- CompactMetric,
352
- {
353
- icon: "location",
354
- label: "Latitude",
355
- value: formatCoordinate(spacecraft.latitude, "lat")
356
- }
357
- ),
358
- /* @__PURE__ */ jsx(
359
- CompactMetric,
360
- {
361
- icon: "location",
362
- label: "Longitude",
363
- value: formatCoordinate(spacecraft.longitude, "lon")
364
- }
365
- ),
366
- /* @__PURE__ */ jsx(
367
- CompactMetric,
368
- {
369
- icon: "orbit",
370
- label: "Altitude",
371
- value: formatAltitude(spacecraft.altitude),
372
- color: orbitColor
373
- }
374
- ),
375
- spacecraft.velocity !== void 0 && /* @__PURE__ */ jsx(
376
- CompactMetric,
377
- {
378
- icon: "rocket",
379
- label: "Velocity",
380
- value: formatVelocity(spacecraft.velocity)
381
- }
382
- ),
383
- batteryLevel !== void 0 && /* @__PURE__ */ jsx(
384
- CompactMetric,
385
- {
386
- icon: "battery",
387
- label: "Battery",
388
- value: formatPercentage(batteryLevel),
389
- color: getStatusColor(batteryStatusLocal)
390
- }
391
- ),
392
- spacecraft.inclination !== void 0 && /* @__PURE__ */ jsx(
393
- CompactMetric,
394
- {
395
- icon: "orbit",
396
- label: "Inclination",
397
- value: `${safeNumber(spacecraft.inclination, 1)}°`
398
- }
399
- )
400
- ] })
401
- ] });
402
- };
403
- if (compact) {
404
- return /* @__PURE__ */ jsxs(
405
- "article",
406
- {
407
- className: classNames("zendir-spacecraft-card", "compact", expanded ? "expanded" : "", className),
408
- ...compactHandlers,
409
- "aria-label": `Spacecraft: ${spacecraft.name ?? spacecraft.id}${expanded ? "" : " (compact)"}`,
410
- style: {
411
- position: "relative",
412
- overflow: "hidden",
413
- // Use glass container style for bold/minimal themes
414
- ...useGlassMode ? glassContainerStyle : {
415
- backgroundColor: cardBg,
416
- ...cardGlass,
417
- ...cardBorderStyle
418
- },
419
- borderRadius: tokens.borderRadius.lg,
420
- padding: expanded ? tokens.spacing.md : tokens.spacing.sm,
421
- fontFamily: tokens.typography.fontFamily.primary,
422
- color: tokens.colors.text.primary,
423
- fontSize: expanded ? tokens.typography.fontSize.base : tokens.typography.fontSize.sm,
424
- cursor: "pointer",
425
- transition: `all ${animationDuration}ms ${animationEasing}`,
426
- boxShadow: expanded ? `0 12px 40px rgba(0,0,0,0.4), 0 0 0 1px ${orbitColor}30` : "none",
427
- zIndex: expanded ? 50 : 1
428
- },
429
- children: [
430
- useGlassMode && /* @__PURE__ */ jsx(
431
- "div",
432
- {
433
- style: {
434
- position: "absolute",
435
- inset: 0,
436
- background: "linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%, rgba(0,0,0,0.1) 100%)",
437
- pointerEvents: "none",
438
- zIndex: 0
439
- }
440
- }
441
- ),
442
- expanded ? (
443
- // Full expanded content
444
- /* @__PURE__ */ jsxs(Fragment, { children: [
445
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: tokens.spacing.sm, marginBottom: tokens.spacing.md }, children: [
446
- /* @__PURE__ */ jsx(
447
- HeaderIconWithStatus,
448
- {
449
- icon: "satellite-transmit",
450
- size: 24,
451
- status: healthStatus
452
- }
453
- ),
454
- /* @__PURE__ */ jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
455
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
456
- /* @__PURE__ */ jsx(
457
- "h3",
458
- {
459
- style: {
460
- margin: 0,
461
- fontSize: tokens.typography.fontSize.md,
462
- fontWeight: tokens.typography.fontWeight.semibold,
463
- lineHeight: 1.2
464
- },
465
- children: spacecraft.name ?? spacecraft.id
466
- }
467
- ),
468
- isPinned && /* @__PURE__ */ jsx(Icon, { name: "lock", size: 12, color: tokens.colors.accent.primary })
469
- ] }),
470
- spacecraft.id && spacecraft.name && /* @__PURE__ */ jsx(
471
- "span",
472
- {
473
- style: {
474
- fontSize: tokens.typography.fontSize.xs,
475
- color: tokens.colors.text.tertiary
476
- },
477
- children: spacecraft.id
478
- }
479
- )
480
- ] }),
481
- /* @__PURE__ */ jsx(
482
- "span",
483
- {
484
- style: {
485
- backgroundColor: `${orbitColor}20`,
486
- color: orbitColor,
487
- padding: `4px 8px`,
488
- borderRadius: tokens.borderRadius.sm,
489
- fontSize: tokens.typography.fontSize.xs,
490
- fontWeight: tokens.typography.fontWeight.medium,
491
- flexShrink: 0
492
- },
493
- children: spacecraft.orbitType ?? "Unknown"
494
- }
495
- )
496
- ] }),
497
- /* @__PURE__ */ jsxs(
498
- "div",
499
- {
500
- style: {
501
- display: "grid",
502
- gridTemplateColumns: "repeat(2, 1fr)",
503
- gap: tokens.spacing.sm,
504
- marginBottom: tokens.spacing.md
505
- },
506
- children: [
507
- /* @__PURE__ */ jsxs("div", { children: [
508
- /* @__PURE__ */ jsx(
509
- "span",
510
- {
511
- style: {
512
- display: "block",
513
- fontSize: tokens.typography.fontSize.xs,
514
- color: tokens.colors.text.tertiary,
515
- marginBottom: 2
516
- },
517
- children: "Latitude"
518
- }
519
- ),
520
- /* @__PURE__ */ jsx(
521
- "span",
522
- {
523
- style: {
524
- fontSize: tokens.typography.fontSize.md,
525
- fontWeight: tokens.typography.fontWeight.medium,
526
- fontVariantNumeric: "tabular-nums",
527
- fontFamily: tokens.typography.fontFamily.mono
528
- },
529
- children: formatCoordinate(spacecraft.latitude, "lat")
530
- }
531
- )
532
- ] }),
533
- /* @__PURE__ */ jsxs("div", { children: [
534
- /* @__PURE__ */ jsx(
535
- "span",
536
- {
537
- style: {
538
- display: "block",
539
- fontSize: tokens.typography.fontSize.xs,
540
- color: tokens.colors.text.tertiary,
541
- marginBottom: 2
542
- },
543
- children: "Longitude"
544
- }
545
- ),
546
- /* @__PURE__ */ jsx(
547
- "span",
548
- {
549
- style: {
550
- fontSize: tokens.typography.fontSize.md,
551
- fontWeight: tokens.typography.fontWeight.medium,
552
- fontVariantNumeric: "tabular-nums",
553
- fontFamily: tokens.typography.fontFamily.mono
554
- },
555
- children: formatCoordinate(spacecraft.longitude, "lon")
556
- }
557
- )
558
- ] }),
559
- /* @__PURE__ */ jsxs("div", { children: [
560
- /* @__PURE__ */ jsx(
561
- "span",
562
- {
563
- style: {
564
- display: "block",
565
- fontSize: tokens.typography.fontSize.xs,
566
- color: tokens.colors.text.tertiary,
567
- marginBottom: 2
568
- },
569
- children: "Altitude"
570
- }
571
- ),
572
- /* @__PURE__ */ jsx(
573
- "span",
574
- {
575
- style: {
576
- fontSize: tokens.typography.fontSize.md,
577
- fontWeight: tokens.typography.fontWeight.medium,
578
- fontVariantNumeric: "tabular-nums",
579
- fontFamily: tokens.typography.fontFamily.mono,
580
- color: orbitColor
581
- },
582
- children: formatAltitude(spacecraft.altitude)
583
- }
584
- )
585
- ] }),
586
- /* @__PURE__ */ jsxs("div", { children: [
587
- /* @__PURE__ */ jsx(
588
- "span",
589
- {
590
- style: {
591
- display: "block",
592
- fontSize: tokens.typography.fontSize.xs,
593
- color: tokens.colors.text.tertiary,
594
- marginBottom: 2
595
- },
596
- children: "Velocity"
597
- }
598
- ),
599
- /* @__PURE__ */ jsx(
600
- "span",
601
- {
602
- style: {
603
- fontSize: tokens.typography.fontSize.md,
604
- fontWeight: tokens.typography.fontWeight.medium,
605
- fontVariantNumeric: "tabular-nums",
606
- fontFamily: tokens.typography.fontFamily.mono
607
- },
608
- children: formatVelocity(spacecraft.velocity)
609
- }
610
- )
611
- ] })
612
- ]
613
- }
614
- ),
615
- spacecraft.timestamp && /* @__PURE__ */ jsx(
616
- "time",
617
- {
618
- dateTime: spacecraft.timestamp,
619
- style: {
620
- display: "block",
621
- fontSize: tokens.typography.fontSize.xs,
622
- color: tokens.colors.text.tertiary,
623
- fontVariantNumeric: "tabular-nums"
624
- },
625
- children: formatTime(spacecraft.timestamp)
626
- }
627
- )
628
- ] })
629
- ) : (
630
- // Compact content
631
- renderCompactContent()
632
- )
633
- ]
634
- }
635
- );
636
- }
637
- return /* @__PURE__ */ jsxs(
638
- "article",
639
- {
640
- className: classNames("zendir-spacecraft-card", compact ? "expanded" : "", className),
641
- onClick: compact || onClick ? combinedClickHandler : void 0,
642
- onKeyDown: onClick ? handleKeyDown : compactHandlers.onKeyDown,
643
- tabIndex: onClick || compact ? 0 : void 0,
644
- role: compact ? compactHandlers.role : "article",
645
- "aria-expanded": compact ? compactHandlers["aria-expanded"] : void 0,
646
- "aria-label": `Spacecraft: ${spacecraft.name ?? spacecraft.id}`,
647
- style: {
648
- position: "relative",
649
- overflow: "hidden",
650
- ...useGlassMode ? glassContainerStyle : {
651
- backgroundColor: cardBg,
652
- ...cardGlass,
653
- ...cardBorderStyle
654
- },
655
- borderRadius: tokens.borderRadius.lg,
656
- padding: tokens.spacing.md,
657
- fontFamily: tokens.typography.fontFamily.primary,
658
- color: tokens.colors.text.primary,
659
- cursor: onClick || compact ? "pointer" : "default",
660
- transition: `all ${transitionDuration} ease-out`,
661
- outline: "none"
662
- },
663
- onMouseEnter: (e) => {
664
- if (compact) compactHandlers.onMouseEnter();
665
- if (onClick) {
666
- e.currentTarget.style.borderColor = tokens.colors.border.focus;
667
- e.currentTarget.style.boxShadow = tokens.shadows.md;
668
- e.currentTarget.style.transform = prefersReducedMotion ? "none" : "translateY(-2px)";
669
- }
670
- },
671
- onMouseLeave: (e) => {
672
- if (compact) compactHandlers.onMouseLeave();
673
- if (onClick) {
674
- e.currentTarget.style.borderColor = tokens.colors.border.muted;
675
- e.currentTarget.style.boxShadow = "none";
676
- e.currentTarget.style.transform = "none";
677
- }
678
- },
679
- onFocus: (e) => {
680
- e.currentTarget.style.outline = `2px solid ${tokens.colors.border.focus}`;
681
- e.currentTarget.style.outlineOffset = "2px";
682
- },
683
- onBlur: (e) => {
684
- e.currentTarget.style.outline = "none";
685
- },
686
- children: [
687
- useGlassMode && /* @__PURE__ */ jsx(
688
- "div",
689
- {
690
- style: {
691
- position: "absolute",
692
- inset: 0,
693
- background: "linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%, rgba(0,0,0,0.1) 100%)",
694
- pointerEvents: "none",
695
- zIndex: 0
696
- }
697
- }
698
- ),
699
- /* @__PURE__ */ jsx(
700
- CardHeader,
701
- {
702
- icon: "satellite-transmit",
703
- title: spacecraft.name ?? spacecraft.id ?? "Unknown",
704
- subtitle: spacecraft.id && spacecraft.name ? spacecraft.id : void 0,
705
- status: healthStatus,
706
- badge: spacecraft.orbitType ?? "Unknown",
707
- badgeColor: orbitColor,
708
- isPinned: compact && isPinned
709
- }
710
- ),
711
- /* @__PURE__ */ jsxs(
712
- "div",
713
- {
714
- style: {
715
- display: "grid",
716
- gridTemplateColumns: "repeat(2, 1fr)",
717
- gap: tokens.spacing.sm
718
- },
719
- children: [
720
- /* @__PURE__ */ jsx(DataCell, { label: "Latitude", value: formatCoordinate(spacecraft.latitude, "lat"), tokens, highlightColor: accentTextColor }),
721
- /* @__PURE__ */ jsx(DataCell, { label: "Longitude", value: formatCoordinate(spacecraft.longitude, "lon"), tokens, highlightColor: accentTextColor }),
722
- /* @__PURE__ */ jsx(DataCell, { label: "Altitude", value: formatAltitude(spacecraft.altitude), highlight: true, tokens, highlightColor: accentTextColor }),
723
- /* @__PURE__ */ jsx(DataCell, { label: "Velocity", value: formatVelocity(spacecraft.velocity), tokens, highlightColor: accentTextColor })
724
- ]
725
- }
726
- ),
727
- showOrbit && spacecraft.inclination !== void 0 && /* @__PURE__ */ jsx(
728
- "div",
729
- {
730
- style: {
731
- marginTop: tokens.spacing.md,
732
- paddingTop: tokens.spacing.md,
733
- borderTop: `1px solid ${tokens.colors.border.muted}`
734
- },
735
- children: /* @__PURE__ */ jsx(
736
- DataCell,
737
- {
738
- label: "Inclination",
739
- value: `${safeNumber(spacecraft.inclination, 1)}°`,
740
- inline: true,
741
- tokens
742
- }
743
- )
744
- }
745
- ),
746
- showTelemetry && telemetry && /* @__PURE__ */ jsxs(
747
- "div",
748
- {
749
- style: {
750
- marginTop: tokens.spacing.md,
751
- paddingTop: tokens.spacing.md,
752
- borderTop: `1px solid ${tokens.colors.border.muted}`
753
- },
754
- children: [
755
- /* @__PURE__ */ jsxs(
756
- "div",
757
- {
758
- style: {
759
- display: "flex",
760
- alignItems: "center",
761
- gap: tokens.spacing.sm,
762
- marginBottom: tokens.spacing.sm
763
- },
764
- children: [
765
- /* @__PURE__ */ jsx(
766
- "span",
767
- {
768
- "aria-hidden": "true",
769
- style: {
770
- width: 10,
771
- height: 10,
772
- borderRadius: "50%",
773
- backgroundColor: statusColor,
774
- boxShadow: `0 0 8px ${statusColor}60`
775
- }
776
- }
777
- ),
778
- /* @__PURE__ */ jsx(
779
- "span",
780
- {
781
- style: {
782
- fontSize: tokens.typography.fontSize.xs,
783
- fontWeight: tokens.typography.fontWeight.medium,
784
- color: statusColor,
785
- textTransform: "capitalize"
786
- },
787
- children: ((_b = telemetry.health) == null ? void 0 : _b.status) ?? "Unknown"
788
- }
789
- )
790
- ]
791
- }
792
- ),
793
- ((_c = telemetry.power) == null ? void 0 : _c.batteryLevel) !== void 0 && /* @__PURE__ */ jsxs("div", { children: [
794
- /* @__PURE__ */ jsxs(
795
- "div",
796
- {
797
- style: {
798
- display: "flex",
799
- justifyContent: "space-between",
800
- marginBottom: 4,
801
- fontSize: tokens.typography.fontSize.xs
802
- },
803
- children: [
804
- /* @__PURE__ */ jsx("span", { style: { color: tokens.colors.text.tertiary }, children: "Battery" }),
805
- /* @__PURE__ */ jsx(
806
- "span",
807
- {
808
- style: {
809
- fontFamily: tokens.typography.fontFamily.mono,
810
- fontVariantNumeric: "tabular-nums"
811
- },
812
- children: formatPercentage(telemetry.power.batteryLevel, false, 0)
813
- }
814
- )
815
- ]
816
- }
817
- ),
818
- /* @__PURE__ */ jsx(
819
- "div",
820
- {
821
- style: {
822
- height: 4,
823
- backgroundColor: tokens.colors.border.muted,
824
- borderRadius: 2,
825
- overflow: "hidden"
826
- },
827
- children: /* @__PURE__ */ jsx(
828
- "div",
829
- {
830
- role: "progressbar",
831
- "aria-valuenow": telemetry.power.batteryLevel,
832
- "aria-valuemin": 0,
833
- "aria-valuemax": 100,
834
- "aria-label": "Battery level",
835
- style: {
836
- height: "100%",
837
- width: `${Math.min(100, Math.max(0, telemetry.power.batteryLevel))}%`,
838
- backgroundColor: telemetry.power.batteryLevel > 30 ? tokens.colors.status.normal : tokens.colors.status.critical,
839
- borderRadius: 2,
840
- transition: `width ${transitionDuration} ease-out`
841
- }
842
- }
843
- )
844
- }
845
- )
846
- ] })
847
- ]
848
- }
849
- ),
850
- spacecraft.timestamp && /* @__PURE__ */ jsx(
851
- "footer",
852
- {
853
- style: {
854
- marginTop: tokens.spacing.md,
855
- paddingTop: tokens.spacing.sm,
856
- borderTop: `1px solid ${tokens.colors.border.muted}`,
857
- fontSize: tokens.typography.fontSize.xs,
858
- color: tokens.colors.text.tertiary,
859
- textAlign: "right"
860
- },
861
- children: /* @__PURE__ */ jsxs("time", { dateTime: spacecraft.timestamp, children: [
862
- formatTime(spacecraft.timestamp),
863
- " UTC"
864
- ] })
865
- }
866
- )
867
- ]
868
- }
869
- );
215
+ ]
216
+ });
217
+ if (!spacecraft) return /* @__PURE__ */ jsxs("div", {
218
+ className: classNames("zendir-spacecraft-card", "empty", className),
219
+ role: "article",
220
+ "aria-label": "No spacecraft data",
221
+ style: {
222
+ backgroundColor: cardBg,
223
+ ...cardGlass,
224
+ ...tokens.colors.border.cardStyleDashed ?? {},
225
+ borderRadius: tokens.borderRadius.lg,
226
+ padding: tokens.spacing.lg,
227
+ textAlign: "center",
228
+ color: tokens.colors.text.tertiary
229
+ },
230
+ children: [/* @__PURE__ */ jsx("svg", {
231
+ width: "32",
232
+ height: "32",
233
+ viewBox: "0 0 24 24",
234
+ fill: "none",
235
+ stroke: "currentColor",
236
+ strokeWidth: "1.5",
237
+ style: {
238
+ marginBottom: 8,
239
+ opacity: .5
240
+ },
241
+ children: /* @__PURE__ */ jsx("path", { d: "M13 2L3 14h9l-1 8 10-12h-9l1-8z" })
242
+ }), /* @__PURE__ */ jsx("p", {
243
+ style: {
244
+ margin: 0,
245
+ fontSize: tokens.typography.body[2].fontSize
246
+ },
247
+ children: "No spacecraft data available"
248
+ })]
249
+ });
250
+ const CompactMetric = ({ icon, label, value, color }) => /* @__PURE__ */ jsxs("div", {
251
+ style: {
252
+ display: "flex",
253
+ alignItems: "center",
254
+ gap: 3,
255
+ padding: `2px 0`
256
+ },
257
+ children: [
258
+ /* @__PURE__ */ jsx(Icon, {
259
+ name: icon,
260
+ size: 12,
261
+ color: color ?? tokens.colors.text.secondary
262
+ }),
263
+ /* @__PURE__ */ jsx("span", {
264
+ style: {
265
+ fontSize: tokens.typography.fontSize.micro,
266
+ fontWeight: tokens.typography.fontWeight.medium,
267
+ fontFamily: tokens.typography.fontFamily.primary,
268
+ color: tokens.colors.text.tertiary,
269
+ textTransform: "uppercase",
270
+ minWidth: 8
271
+ },
272
+ children: label.charAt(0)
273
+ }),
274
+ /* @__PURE__ */ jsx("span", {
275
+ style: {
276
+ fontVariantNumeric: "tabular-nums",
277
+ fontFamily: tokens.typography.fontFamily.mono,
278
+ fontSize: tokens.typography.fontSize.xs,
279
+ color: color ?? tokens.colors.text.primary,
280
+ fontWeight: tokens.typography.fontWeight.medium
281
+ },
282
+ children: value
283
+ })
284
+ ]
285
+ });
286
+ const renderCompactContent = () => {
287
+ const batteryLevel = (telemetry?.subsystems?.power ?? telemetry?.power)?.batteryLevel;
288
+ const batteryStatusLocal = batteryLevel !== void 0 ? batteryLevel > 50 ? "normal" : batteryLevel > 20 ? "caution" : "critical" : "off";
289
+ const statusColor = getStatusColor(healthStatus);
290
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
291
+ style: {
292
+ display: "flex",
293
+ alignItems: "center",
294
+ justifyContent: "space-between",
295
+ marginBottom: tokens.spacing.xs,
296
+ paddingBottom: tokens.spacing.xs,
297
+ borderBottom: useGlassMode ? "none" : `1px solid ${tokens.colors.border.muted}`,
298
+ position: "relative",
299
+ zIndex: 1
300
+ },
301
+ children: [/* @__PURE__ */ jsxs("div", {
302
+ style: {
303
+ display: "flex",
304
+ alignItems: "center",
305
+ gap: tokens.spacing.xs,
306
+ flex: 1,
307
+ minWidth: 0
308
+ },
309
+ children: [
310
+ /* @__PURE__ */ jsx(HeaderIconWithStatus, {
311
+ icon: "satellite-transmit",
312
+ size: 18,
313
+ status: healthStatus,
314
+ statusColor
315
+ }),
316
+ /* @__PURE__ */ jsx("span", {
317
+ style: {
318
+ fontWeight: tokens.typography.fontWeight.semibold,
319
+ fontSize: tokens.typography.fontSize.sm,
320
+ fontFamily: tokens.typography.fontFamily.primary,
321
+ color: useGlassMode ? glassAccentColor : void 0,
322
+ textShadow: useGlassMode ? `0 0 16px ${glassAccentMuted}` : void 0,
323
+ whiteSpace: "nowrap",
324
+ overflow: "hidden",
325
+ textOverflow: "ellipsis"
326
+ },
327
+ children: (spacecraft.name ?? spacecraft.id ?? "Unknown").split(" ")[0]
328
+ }),
329
+ useGlassMode && /* @__PURE__ */ jsx("div", { style: {
330
+ flex: 1,
331
+ height: isBoldVariant ? "2px" : "1px",
332
+ minWidth: 20,
333
+ background: `linear-gradient(90deg, ${glassAccentColor} 0%, ${glassAccentMuted} 60%, transparent 100%)`,
334
+ boxShadow: isBoldVariant ? `0 0 8px ${glassAccentMuted}` : void 0
335
+ } })
336
+ ]
337
+ }), /* @__PURE__ */ jsxs("div", {
338
+ style: {
339
+ display: "flex",
340
+ alignItems: "center",
341
+ gap: tokens.spacing.xs,
342
+ flexShrink: 0
343
+ },
344
+ children: [/* @__PURE__ */ jsx("span", {
345
+ style: {
346
+ backgroundColor: `${orbitColor}20`,
347
+ color: orbitColor,
348
+ padding: `1px 6px`,
349
+ borderRadius: tokens.borderRadius.sm,
350
+ fontSize: tokens.typography.fontSize.xxs,
351
+ fontWeight: tokens.typography.fontWeight.medium,
352
+ fontFamily: tokens.typography.fontFamily.primary
353
+ },
354
+ children: spacecraft.orbitType ?? "—"
355
+ }), isPinned && /* @__PURE__ */ jsx(Icon, {
356
+ name: "lock",
357
+ size: 10,
358
+ color: tokens.colors.accent.primary
359
+ })]
360
+ })]
361
+ }), /* @__PURE__ */ jsxs("div", {
362
+ style: {
363
+ display: "grid",
364
+ gridTemplateColumns: "repeat(3, 1fr)",
365
+ gap: `${tokens.spacing.xs} ${tokens.spacing.sm}`
366
+ },
367
+ children: [
368
+ /* @__PURE__ */ jsx(CompactMetric, {
369
+ icon: "location",
370
+ label: "Latitude",
371
+ value: formatCoordinate(spacecraft.latitude, "lat")
372
+ }),
373
+ /* @__PURE__ */ jsx(CompactMetric, {
374
+ icon: "location",
375
+ label: "Longitude",
376
+ value: formatCoordinate(spacecraft.longitude, "lon")
377
+ }),
378
+ /* @__PURE__ */ jsx(CompactMetric, {
379
+ icon: "orbit",
380
+ label: "Altitude",
381
+ value: formatAltitude(spacecraft.altitude),
382
+ color: orbitColor
383
+ }),
384
+ spacecraft.velocity !== void 0 && /* @__PURE__ */ jsx(CompactMetric, {
385
+ icon: "rocket",
386
+ label: "Velocity",
387
+ value: formatVelocity(spacecraft.velocity)
388
+ }),
389
+ batteryLevel !== void 0 && /* @__PURE__ */ jsx(CompactMetric, {
390
+ icon: "battery",
391
+ label: "Battery",
392
+ value: formatPercentage(batteryLevel),
393
+ color: getStatusColor(batteryStatusLocal)
394
+ }),
395
+ spacecraft.inclination !== void 0 && /* @__PURE__ */ jsx(CompactMetric, {
396
+ icon: "orbit",
397
+ label: "Inclination",
398
+ value: `${safeNumber(spacecraft.inclination, 1)}°`
399
+ })
400
+ ]
401
+ })] });
402
+ };
403
+ if (compact) return /* @__PURE__ */ jsxs("article", {
404
+ className: classNames("zendir-spacecraft-card", "compact", expanded ? "expanded" : "", className),
405
+ ...compactHandlers,
406
+ "aria-label": `Spacecraft: ${spacecraft.name ?? spacecraft.id}${expanded ? "" : " (compact)"}`,
407
+ style: {
408
+ position: "relative",
409
+ overflow: "hidden",
410
+ ...useGlassMode ? glassContainerStyle : {
411
+ backgroundColor: cardBg,
412
+ ...cardGlass,
413
+ ...cardBorderStyle
414
+ },
415
+ borderRadius: tokens.borderRadius.lg,
416
+ padding: expanded ? tokens.spacing.md : tokens.spacing.sm,
417
+ fontFamily: tokens.typography.fontFamily.primary,
418
+ color: tokens.colors.text.primary,
419
+ fontSize: expanded ? tokens.typography.fontSize.base : tokens.typography.fontSize.sm,
420
+ cursor: "pointer",
421
+ transition: `all ${animationDuration}ms ${animationEasing}`,
422
+ boxShadow: expanded ? `0 12px 40px rgba(0,0,0,0.4), 0 0 0 1px ${orbitColor}30` : "none",
423
+ zIndex: expanded ? 50 : 1
424
+ },
425
+ children: [useGlassMode && /* @__PURE__ */ jsx("div", { style: {
426
+ position: "absolute",
427
+ inset: 0,
428
+ background: "linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%, rgba(0,0,0,0.1) 100%)",
429
+ pointerEvents: "none",
430
+ zIndex: 0
431
+ } }), expanded ? /* @__PURE__ */ jsxs(Fragment, { children: [
432
+ /* @__PURE__ */ jsxs("div", {
433
+ style: {
434
+ display: "flex",
435
+ alignItems: "center",
436
+ gap: tokens.spacing.sm,
437
+ marginBottom: tokens.spacing.md
438
+ },
439
+ children: [
440
+ /* @__PURE__ */ jsx(HeaderIconWithStatus, {
441
+ icon: "satellite-transmit",
442
+ size: 24,
443
+ status: healthStatus
444
+ }),
445
+ /* @__PURE__ */ jsxs("div", {
446
+ style: {
447
+ flex: 1,
448
+ minWidth: 0
449
+ },
450
+ children: [/* @__PURE__ */ jsxs("div", {
451
+ style: {
452
+ display: "flex",
453
+ alignItems: "center",
454
+ gap: 6
455
+ },
456
+ children: [/* @__PURE__ */ jsx("h3", {
457
+ style: {
458
+ margin: 0,
459
+ fontSize: tokens.typography.fontSize.md,
460
+ fontWeight: tokens.typography.fontWeight.semibold,
461
+ lineHeight: 1.2
462
+ },
463
+ children: spacecraft.name ?? spacecraft.id
464
+ }), isPinned && /* @__PURE__ */ jsx(Icon, {
465
+ name: "lock",
466
+ size: 12,
467
+ color: tokens.colors.accent.primary
468
+ })]
469
+ }), spacecraft.id && spacecraft.name && /* @__PURE__ */ jsx("span", {
470
+ style: {
471
+ fontSize: tokens.typography.fontSize.xs,
472
+ color: tokens.colors.text.tertiary
473
+ },
474
+ children: spacecraft.id
475
+ })]
476
+ }),
477
+ /* @__PURE__ */ jsx("span", {
478
+ style: {
479
+ backgroundColor: `${orbitColor}20`,
480
+ color: orbitColor,
481
+ padding: `4px 8px`,
482
+ borderRadius: tokens.borderRadius.sm,
483
+ fontSize: tokens.typography.fontSize.xs,
484
+ fontWeight: tokens.typography.fontWeight.medium,
485
+ flexShrink: 0
486
+ },
487
+ children: spacecraft.orbitType ?? "Unknown"
488
+ })
489
+ ]
490
+ }),
491
+ /* @__PURE__ */ jsxs("div", {
492
+ style: {
493
+ display: "grid",
494
+ gridTemplateColumns: "repeat(2, 1fr)",
495
+ gap: tokens.spacing.sm,
496
+ marginBottom: tokens.spacing.md
497
+ },
498
+ children: [
499
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("span", {
500
+ style: {
501
+ display: "block",
502
+ fontSize: tokens.typography.fontSize.xs,
503
+ color: tokens.colors.text.tertiary,
504
+ marginBottom: 2
505
+ },
506
+ children: "Latitude"
507
+ }), /* @__PURE__ */ jsx("span", {
508
+ style: {
509
+ fontSize: tokens.typography.fontSize.md,
510
+ fontWeight: tokens.typography.fontWeight.medium,
511
+ fontVariantNumeric: "tabular-nums",
512
+ fontFamily: tokens.typography.fontFamily.mono
513
+ },
514
+ children: formatCoordinate(spacecraft.latitude, "lat")
515
+ })] }),
516
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("span", {
517
+ style: {
518
+ display: "block",
519
+ fontSize: tokens.typography.fontSize.xs,
520
+ color: tokens.colors.text.tertiary,
521
+ marginBottom: 2
522
+ },
523
+ children: "Longitude"
524
+ }), /* @__PURE__ */ jsx("span", {
525
+ style: {
526
+ fontSize: tokens.typography.fontSize.md,
527
+ fontWeight: tokens.typography.fontWeight.medium,
528
+ fontVariantNumeric: "tabular-nums",
529
+ fontFamily: tokens.typography.fontFamily.mono
530
+ },
531
+ children: formatCoordinate(spacecraft.longitude, "lon")
532
+ })] }),
533
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("span", {
534
+ style: {
535
+ display: "block",
536
+ fontSize: tokens.typography.fontSize.xs,
537
+ color: tokens.colors.text.tertiary,
538
+ marginBottom: 2
539
+ },
540
+ children: "Altitude"
541
+ }), /* @__PURE__ */ jsx("span", {
542
+ style: {
543
+ fontSize: tokens.typography.fontSize.md,
544
+ fontWeight: tokens.typography.fontWeight.medium,
545
+ fontVariantNumeric: "tabular-nums",
546
+ fontFamily: tokens.typography.fontFamily.mono,
547
+ color: orbitColor
548
+ },
549
+ children: formatAltitude(spacecraft.altitude)
550
+ })] }),
551
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("span", {
552
+ style: {
553
+ display: "block",
554
+ fontSize: tokens.typography.fontSize.xs,
555
+ color: tokens.colors.text.tertiary,
556
+ marginBottom: 2
557
+ },
558
+ children: "Velocity"
559
+ }), /* @__PURE__ */ jsx("span", {
560
+ style: {
561
+ fontSize: tokens.typography.fontSize.md,
562
+ fontWeight: tokens.typography.fontWeight.medium,
563
+ fontVariantNumeric: "tabular-nums",
564
+ fontFamily: tokens.typography.fontFamily.mono
565
+ },
566
+ children: formatVelocity(spacecraft.velocity)
567
+ })] })
568
+ ]
569
+ }),
570
+ spacecraft.timestamp && /* @__PURE__ */ jsx("time", {
571
+ dateTime: spacecraft.timestamp,
572
+ style: {
573
+ display: "block",
574
+ fontSize: tokens.typography.fontSize.xs,
575
+ color: tokens.colors.text.tertiary,
576
+ fontVariantNumeric: "tabular-nums"
577
+ },
578
+ children: formatTime(spacecraft.timestamp)
579
+ })
580
+ ] }) : renderCompactContent()]
581
+ });
582
+ return /* @__PURE__ */ jsxs("article", {
583
+ className: classNames("zendir-spacecraft-card", compact ? "expanded" : "", className),
584
+ onClick: compact || onClick ? combinedClickHandler : void 0,
585
+ onKeyDown: onClick ? handleKeyDown : compactHandlers.onKeyDown,
586
+ tabIndex: onClick || compact ? 0 : void 0,
587
+ role: compact ? compactHandlers.role : "article",
588
+ "aria-expanded": compact ? compactHandlers["aria-expanded"] : void 0,
589
+ "aria-label": `Spacecraft: ${spacecraft.name ?? spacecraft.id}`,
590
+ style: {
591
+ position: "relative",
592
+ overflow: "hidden",
593
+ ...useGlassMode ? glassContainerStyle : {
594
+ backgroundColor: cardBg,
595
+ ...cardGlass,
596
+ ...cardBorderStyle
597
+ },
598
+ borderRadius: tokens.borderRadius.lg,
599
+ padding: tokens.spacing.md,
600
+ fontFamily: tokens.typography.fontFamily.primary,
601
+ color: tokens.colors.text.primary,
602
+ cursor: onClick || compact ? "pointer" : "default",
603
+ transition: `all ${transitionDuration} ease-out`,
604
+ outline: "none"
605
+ },
606
+ onMouseEnter: (e) => {
607
+ if (compact) compactHandlers.onMouseEnter();
608
+ if (onClick) {
609
+ e.currentTarget.style.borderColor = tokens.colors.border.focus;
610
+ e.currentTarget.style.boxShadow = tokens.shadows.md;
611
+ e.currentTarget.style.transform = prefersReducedMotion ? "none" : "translateY(-2px)";
612
+ }
613
+ },
614
+ onMouseLeave: (e) => {
615
+ if (compact) compactHandlers.onMouseLeave();
616
+ if (onClick) {
617
+ e.currentTarget.style.borderColor = tokens.colors.border.muted;
618
+ e.currentTarget.style.boxShadow = "none";
619
+ e.currentTarget.style.transform = "none";
620
+ }
621
+ },
622
+ onFocus: (e) => {
623
+ e.currentTarget.style.outline = `2px solid ${tokens.colors.border.focus}`;
624
+ e.currentTarget.style.outlineOffset = "2px";
625
+ },
626
+ onBlur: (e) => {
627
+ e.currentTarget.style.outline = "none";
628
+ },
629
+ children: [
630
+ useGlassMode && /* @__PURE__ */ jsx("div", { style: {
631
+ position: "absolute",
632
+ inset: 0,
633
+ background: "linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%, rgba(0,0,0,0.1) 100%)",
634
+ pointerEvents: "none",
635
+ zIndex: 0
636
+ } }),
637
+ /* @__PURE__ */ jsx(CardHeader, {
638
+ icon: "satellite-transmit",
639
+ title: spacecraft.name ?? spacecraft.id ?? "Unknown",
640
+ subtitle: spacecraft.id && spacecraft.name ? spacecraft.id : void 0,
641
+ status: healthStatus,
642
+ badge: spacecraft.orbitType ?? "Unknown",
643
+ badgeColor: orbitColor,
644
+ isPinned: compact && isPinned
645
+ }),
646
+ /* @__PURE__ */ jsxs("div", {
647
+ style: {
648
+ display: "grid",
649
+ gridTemplateColumns: "repeat(2, 1fr)",
650
+ gap: tokens.spacing.sm
651
+ },
652
+ children: [
653
+ /* @__PURE__ */ jsx(DataCell, {
654
+ label: "Latitude",
655
+ value: formatCoordinate(spacecraft.latitude, "lat"),
656
+ tokens,
657
+ highlightColor: accentTextColor
658
+ }),
659
+ /* @__PURE__ */ jsx(DataCell, {
660
+ label: "Longitude",
661
+ value: formatCoordinate(spacecraft.longitude, "lon"),
662
+ tokens,
663
+ highlightColor: accentTextColor
664
+ }),
665
+ /* @__PURE__ */ jsx(DataCell, {
666
+ label: "Altitude",
667
+ value: formatAltitude(spacecraft.altitude),
668
+ highlight: true,
669
+ tokens,
670
+ highlightColor: accentTextColor
671
+ }),
672
+ /* @__PURE__ */ jsx(DataCell, {
673
+ label: "Velocity",
674
+ value: formatVelocity(spacecraft.velocity),
675
+ tokens,
676
+ highlightColor: accentTextColor
677
+ })
678
+ ]
679
+ }),
680
+ showOrbit && spacecraft.inclination !== void 0 && /* @__PURE__ */ jsx("div", {
681
+ style: {
682
+ marginTop: tokens.spacing.md,
683
+ paddingTop: tokens.spacing.md,
684
+ borderTop: `1px solid ${tokens.colors.border.muted}`
685
+ },
686
+ children: /* @__PURE__ */ jsx(DataCell, {
687
+ label: "Inclination",
688
+ value: `${safeNumber(spacecraft.inclination, 1)}°`,
689
+ inline: true,
690
+ tokens
691
+ })
692
+ }),
693
+ showTelemetry && telemetry && /* @__PURE__ */ jsxs("div", {
694
+ style: {
695
+ marginTop: tokens.spacing.md,
696
+ paddingTop: tokens.spacing.md,
697
+ borderTop: `1px solid ${tokens.colors.border.muted}`
698
+ },
699
+ children: [/* @__PURE__ */ jsxs("div", {
700
+ style: {
701
+ display: "flex",
702
+ alignItems: "center",
703
+ gap: tokens.spacing.sm,
704
+ marginBottom: tokens.spacing.sm
705
+ },
706
+ children: [/* @__PURE__ */ jsx("span", {
707
+ "aria-hidden": "true",
708
+ style: {
709
+ width: 10,
710
+ height: 10,
711
+ borderRadius: "50%",
712
+ backgroundColor: statusColor,
713
+ boxShadow: `0 0 8px ${statusColor}60`
714
+ }
715
+ }), /* @__PURE__ */ jsx("span", {
716
+ style: {
717
+ fontSize: tokens.typography.fontSize.xs,
718
+ fontWeight: tokens.typography.fontWeight.medium,
719
+ color: statusColor,
720
+ textTransform: "capitalize"
721
+ },
722
+ children: telemetry.health?.status ?? "Unknown"
723
+ })]
724
+ }), telemetry.power?.batteryLevel !== void 0 && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("div", {
725
+ style: {
726
+ display: "flex",
727
+ justifyContent: "space-between",
728
+ marginBottom: 4,
729
+ fontSize: tokens.typography.fontSize.xs
730
+ },
731
+ children: [/* @__PURE__ */ jsx("span", {
732
+ style: { color: tokens.colors.text.tertiary },
733
+ children: "Battery"
734
+ }), /* @__PURE__ */ jsx("span", {
735
+ style: {
736
+ fontFamily: tokens.typography.fontFamily.mono,
737
+ fontVariantNumeric: "tabular-nums"
738
+ },
739
+ children: formatPercentage(telemetry.power.batteryLevel, false, 0)
740
+ })]
741
+ }), /* @__PURE__ */ jsx("div", {
742
+ style: {
743
+ height: 4,
744
+ backgroundColor: tokens.colors.border.muted,
745
+ borderRadius: 2,
746
+ overflow: "hidden"
747
+ },
748
+ children: /* @__PURE__ */ jsx("div", {
749
+ role: "progressbar",
750
+ "aria-valuenow": telemetry.power.batteryLevel,
751
+ "aria-valuemin": 0,
752
+ "aria-valuemax": 100,
753
+ "aria-label": "Battery level",
754
+ style: {
755
+ height: "100%",
756
+ width: `${Math.min(100, Math.max(0, telemetry.power.batteryLevel))}%`,
757
+ backgroundColor: telemetry.power.batteryLevel > 30 ? tokens.colors.status.normal : tokens.colors.status.critical,
758
+ borderRadius: 2,
759
+ transition: `width ${transitionDuration} ease-out`
760
+ }
761
+ })
762
+ })] })]
763
+ }),
764
+ spacecraft.timestamp && /* @__PURE__ */ jsx("footer", {
765
+ style: {
766
+ marginTop: tokens.spacing.md,
767
+ paddingTop: tokens.spacing.sm,
768
+ borderTop: `1px solid ${tokens.colors.border.muted}`,
769
+ fontSize: tokens.typography.fontSize.xs,
770
+ color: tokens.colors.text.tertiary,
771
+ textAlign: "right"
772
+ },
773
+ children: /* @__PURE__ */ jsxs("time", {
774
+ dateTime: spacecraft.timestamp,
775
+ children: [formatTime(spacecraft.timestamp), " UTC"]
776
+ })
777
+ })
778
+ ]
779
+ });
870
780
  });
871
- const DataCell = memo(function DataCell2({
872
- label,
873
- value,
874
- highlight = false,
875
- inline = false,
876
- tokens,
877
- highlightColor
878
- }) {
879
- if (inline) {
880
- return /* @__PURE__ */ jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [
881
- /* @__PURE__ */ jsx(
882
- "span",
883
- {
884
- style: {
885
- fontSize: tokens.typography.fontSize.xs,
886
- color: tokens.colors.text.secondary,
887
- // WCAG AA compliant
888
- fontWeight: tokens.typography.fontWeight.medium
889
- },
890
- children: label
891
- }
892
- ),
893
- /* @__PURE__ */ jsx(
894
- "span",
895
- {
896
- style: {
897
- fontSize: tokens.typography.fontSize.sm,
898
- fontFamily: tokens.typography.fontFamily.mono,
899
- fontVariantNumeric: "tabular-nums",
900
- color: tokens.colors.text.primary
901
- },
902
- children: value
903
- }
904
- )
905
- ] });
906
- }
907
- return /* @__PURE__ */ jsxs("div", { children: [
908
- /* @__PURE__ */ jsx(
909
- "span",
910
- {
911
- style: {
912
- display: "block",
913
- fontSize: tokens.typography.fontSize.xs,
914
- color: tokens.colors.text.secondary,
915
- // WCAG AA compliant
916
- fontWeight: tokens.typography.fontWeight.medium,
917
- marginBottom: 2
918
- },
919
- children: label
920
- }
921
- ),
922
- /* @__PURE__ */ jsx(
923
- "span",
924
- {
925
- style: {
926
- display: "block",
927
- fontSize: tokens.typography.fontSize.sm,
928
- fontFamily: tokens.typography.fontFamily.mono,
929
- fontVariantNumeric: "tabular-nums",
930
- color: highlight ? highlightColor ?? safeAccentText(tokens.colors.accent.primary) : tokens.colors.text.primary,
931
- fontWeight: tokens.typography.fontWeight.medium
932
- },
933
- children: value
934
- }
935
- )
936
- ] });
781
+ var DataCell = memo(function DataCell({ label, value, highlight = false, inline = false, tokens, highlightColor }) {
782
+ if (inline) return /* @__PURE__ */ jsxs("div", {
783
+ style: {
784
+ display: "flex",
785
+ justifyContent: "space-between",
786
+ alignItems: "center"
787
+ },
788
+ children: [/* @__PURE__ */ jsx("span", {
789
+ style: {
790
+ fontSize: tokens.typography.fontSize.xs,
791
+ color: tokens.colors.text.secondary,
792
+ fontWeight: tokens.typography.fontWeight.medium
793
+ },
794
+ children: label
795
+ }), /* @__PURE__ */ jsx("span", {
796
+ style: {
797
+ fontSize: tokens.typography.fontSize.sm,
798
+ fontFamily: tokens.typography.fontFamily.mono,
799
+ fontVariantNumeric: "tabular-nums",
800
+ color: tokens.colors.text.primary
801
+ },
802
+ children: value
803
+ })]
804
+ });
805
+ return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("span", {
806
+ style: {
807
+ display: "block",
808
+ fontSize: tokens.typography.fontSize.xs,
809
+ color: tokens.colors.text.secondary,
810
+ fontWeight: tokens.typography.fontWeight.medium,
811
+ marginBottom: 2
812
+ },
813
+ children: label
814
+ }), /* @__PURE__ */ jsx("span", {
815
+ style: {
816
+ display: "block",
817
+ fontSize: tokens.typography.fontSize.sm,
818
+ fontFamily: tokens.typography.fontFamily.mono,
819
+ fontVariantNumeric: "tabular-nums",
820
+ color: highlight ? highlightColor ?? safeAccentText(tokens.colors.accent.primary) : tokens.colors.text.primary,
821
+ fontWeight: tokens.typography.fontWeight.medium
822
+ },
823
+ children: value
824
+ })] });
937
825
  });
938
- export {
939
- SpacecraftCard
940
- };
941
- //# sourceMappingURL=SpacecraftCard.js.map
826
+ //#endregion
827
+ export { SpacecraftCard };
828
+
829
+ //# sourceMappingURL=SpacecraftCard.js.map