@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,410 +1,476 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { memo, useMemo } from "react";
3
1
  import { useTheme } from "../theme/ThemeProvider.js";
4
2
  import { Icon } from "../core/display/Icon.js";
3
+ import { classNames, formatDataRate, formatDecibels, formatDegrees, formatDuration, formatTime, getStatusColor, safeAccentText, safeNumber } from "../utils/index.js";
5
4
  import { CardHeader } from "../core/display/CardHeader.js";
6
- import { getStatusColor, classNames, safeNumber, formatDegrees, formatDecibels, formatDataRate, safeAccentText, formatTime, formatDuration } from "../utils/index.js";
7
5
  import { useCompactMode } from "../hooks/useCompactMode.js";
8
- const AccessCard = memo(function AccessCard2({
9
- access,
10
- groundStationName,
11
- spacecraftName,
12
- upcomingWindows = [],
13
- loading = false,
14
- className = "",
15
- compact = false,
16
- defaultExpanded = false,
17
- onPinChange
18
- }) {
19
- const { tokens, theme, prefersReducedMotion } = useTheme();
20
- const isTransparentTheme = theme === "transparent" || theme === "transparent-bold" || theme === "transparent-minimal";
21
- const isBoldVariant = theme === "transparent-bold";
22
- const isMinimalVariant = theme === "transparent-minimal";
23
- const useGlassMode = isBoldVariant || isMinimalVariant;
24
- const glassAccentColor = tokens.colors.accent.primary;
25
- const glassAccentMuted = `${glassAccentColor}66`;
26
- const cardBg = isTransparentTheme ? "transparent" : tokens.colors.background.surface;
27
- const cardGlass = isTransparentTheme ? {
28
- backdropFilter: "blur(12px)",
29
- WebkitBackdropFilter: "blur(12px)"
30
- } : {};
31
- const glassContainerStyle = useGlassMode ? {
32
- backgroundColor: "rgba(10, 15, 25, 0.35)",
33
- backdropFilter: "blur(12px)",
34
- WebkitBackdropFilter: "blur(12px)",
35
- border: `1px solid ${glassAccentMuted}`,
36
- borderTop: isBoldVariant ? `2px solid ${glassAccentColor}` : `1px solid ${glassAccentColor}`
37
- } : {};
38
- const { expanded, isPinned, handlers, transitionDuration } = useCompactMode({
39
- compact,
40
- defaultExpanded,
41
- onPinChange
42
- });
43
- const isAccessible = (access == null ? void 0 : access.isAccessible) ?? false;
44
- const statusLevel = isAccessible ? "normal" : "off";
45
- const statusColor = getStatusColor(statusLevel);
46
- const signalStatus = useMemo(() => {
47
- const signal = access == null ? void 0 : access.signalStrength;
48
- if (signal === void 0 || signal === null) return "off";
49
- if (signal > 70) return "normal";
50
- if (signal > 40) return "caution";
51
- if (signal > 20) return "serious";
52
- return "critical";
53
- }, [access == null ? void 0 : access.signalStrength]);
54
- if (loading) {
55
- return /* @__PURE__ */ jsxs(
56
- "div",
57
- {
58
- className: classNames("zendir-access-card", "loading", className),
59
- role: "article",
60
- "aria-busy": "true",
61
- "aria-label": "Loading access data",
62
- style: {
63
- backgroundColor: cardBg,
64
- ...cardGlass,
65
- ...tokens.colors.border.cardStyle ?? {},
66
- borderRadius: tokens.borderRadius.lg,
67
- padding: tokens.spacing.md,
68
- minHeight: 180
69
- },
70
- children: [
71
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", justifyContent: "space-between", marginBottom: 16 }, children: [
72
- /* @__PURE__ */ jsx("div", { style: { height: 24, width: "40%", backgroundColor: "rgba(255,255,255,0.1)", borderRadius: 4 } }),
73
- /* @__PURE__ */ jsx("div", { style: { height: 24, width: 60, backgroundColor: "rgba(255,255,255,0.1)", borderRadius: 4 } })
74
- ] }),
75
- /* @__PURE__ */ jsx("div", { style: { display: "grid", gridTemplateColumns: "repeat(2, 1fr)", gap: 12 }, children: [1, 2, 3, 4].map((i) => /* @__PURE__ */ jsx("div", { style: { height: 40, backgroundColor: "rgba(255,255,255,0.06)", borderRadius: 4 } }, i)) })
76
- ]
77
- }
78
- );
79
- }
80
- if (!access) {
81
- return /* @__PURE__ */ jsxs(
82
- "div",
83
- {
84
- className: classNames("zendir-access-card", "empty", className),
85
- role: "article",
86
- "aria-label": "No access data",
87
- style: {
88
- backgroundColor: cardBg,
89
- ...cardGlass,
90
- ...tokens.colors.border.cardStyleDashed ?? {},
91
- borderRadius: tokens.borderRadius.lg,
92
- padding: tokens.spacing.lg,
93
- textAlign: "center",
94
- color: tokens.colors.text.tertiary
95
- },
96
- children: [
97
- /* @__PURE__ */ jsx("svg", { width: "32", height: "32", viewBox: "0 0 24 24", fill: "currentColor", style: { opacity: 0.5, marginBottom: 8 }, children: /* @__PURE__ */ jsx("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z" }) }),
98
- /* @__PURE__ */ jsxs("p", { style: { margin: 0, fontSize: tokens.typography.body[2].fontSize }, children: [
99
- groundStationName,
100
- ": No access data"
101
- ] })
102
- ]
103
- }
104
- );
105
- }
106
- if (compact && !expanded) {
107
- return /* @__PURE__ */ jsxs(
108
- "article",
109
- {
110
- className: classNames("zendir-access-card", "compact", className),
111
- ...handlers,
112
- "aria-label": `Access: ${groundStationName} (compact)`,
113
- style: {
114
- position: "relative",
115
- overflow: "hidden",
116
- ...useGlassMode ? glassContainerStyle : {
117
- backgroundColor: cardBg,
118
- ...cardGlass,
119
- ...tokens.colors.border.cardStyle ?? {}
120
- },
121
- borderRadius: tokens.borderRadius.lg,
122
- padding: `${tokens.spacing.sm} ${tokens.spacing.md}`,
123
- fontFamily: tokens.typography.fontFamily.primary,
124
- color: tokens.colors.text.primary,
125
- fontSize: tokens.typography.fontSize.sm,
126
- cursor: "pointer",
127
- transition: `all ${transitionDuration} ease-out`,
128
- transform: "scale(1)"
129
- },
130
- onMouseEnter: (e) => {
131
- handlers.onMouseEnter();
132
- if (!prefersReducedMotion) {
133
- e.currentTarget.style.transform = "scale(1.01)";
134
- e.currentTarget.style.boxShadow = `0 4px 12px ${statusColor}20`;
135
- }
136
- },
137
- onMouseLeave: (e) => {
138
- handlers.onMouseLeave();
139
- e.currentTarget.style.transform = "scale(1)";
140
- e.currentTarget.style.boxShadow = "";
141
- },
142
- children: [
143
- useGlassMode && /* @__PURE__ */ jsx(
144
- "div",
145
- {
146
- style: {
147
- position: "absolute",
148
- inset: 0,
149
- background: "linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%, rgba(0,0,0,0.1) 100%)",
150
- pointerEvents: "none",
151
- zIndex: 0
152
- }
153
- }
154
- ),
155
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: tokens.spacing.md, position: "relative", zIndex: 1 }, children: [
156
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: tokens.spacing.sm, flex: 1, minWidth: 0 }, children: [
157
- /* @__PURE__ */ jsx(
158
- "div",
159
- {
160
- style: {
161
- width: 10,
162
- height: 10,
163
- borderRadius: "50%",
164
- backgroundColor: statusColor,
165
- boxShadow: isAccessible ? `0 0 6px ${statusColor}` : "none",
166
- flexShrink: 0
167
- }
168
- }
169
- ),
170
- /* @__PURE__ */ jsx("span", { style: {
171
- fontWeight: tokens.typography.fontWeight.medium,
172
- color: useGlassMode ? glassAccentColor : void 0,
173
- textShadow: useGlassMode ? `0 0 16px ${glassAccentMuted}` : void 0
174
- }, children: groundStationName.split(" ")[0] }),
175
- useGlassMode && /* @__PURE__ */ jsx("div", { style: {
176
- flex: 1,
177
- height: isBoldVariant ? "2px" : "1px",
178
- minWidth: 20,
179
- background: `linear-gradient(90deg, ${glassAccentColor} 0%, ${glassAccentMuted} 60%, transparent 100%)`,
180
- boxShadow: isBoldVariant ? `0 0 8px ${glassAccentMuted}` : void 0
181
- } })
182
- ] }),
183
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: tokens.spacing.sm, flexShrink: 0 }, children: [
184
- /* @__PURE__ */ jsx("span", { style: {
185
- color: statusColor,
186
- fontSize: tokens.typography.fontSize.xs,
187
- fontWeight: tokens.typography.fontWeight.medium
188
- }, children: isAccessible ? "AOS" : "LOS" }),
189
- access.signalStrength !== void 0 && /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: 4 }, children: [
190
- /* @__PURE__ */ jsx(Icon, { name: "antenna", size: 12, color: tokens.colors.text.secondary }),
191
- /* @__PURE__ */ jsxs("span", { style: {
192
- fontVariantNumeric: "tabular-nums",
193
- fontFamily: tokens.typography.fontFamily.mono,
194
- fontSize: tokens.typography.fontSize.xs
195
- }, children: [
196
- safeNumber(access.signalStrength, 0),
197
- "%"
198
- ] })
199
- ] }),
200
- isPinned && /* @__PURE__ */ jsx(Icon, { name: "lock", size: 12, color: tokens.colors.accent.primary })
201
- ] })
202
- ] })
203
- ]
204
- }
205
- );
206
- }
207
- const labelStyle = {
208
- color: tokens.colors.text.secondary,
209
- // WCAG AA compliant - 4.5:1 contrast
210
- fontSize: tokens.typography.fontSize.xs,
211
- fontWeight: tokens.typography.fontWeight.medium
212
- };
213
- const valueStyle = {
214
- color: tokens.colors.text.primary,
215
- fontWeight: tokens.typography.fontWeight.medium,
216
- fontFamily: tokens.typography.fontFamily.mono,
217
- fontVariantNumeric: "tabular-nums",
218
- marginTop: 2
219
- };
220
- return /* @__PURE__ */ jsxs(
221
- "article",
222
- {
223
- className: classNames("zendir-access-card", className),
224
- "aria-label": `${spacecraftName ?? "Spacecraft"} access to ${groundStationName}`,
225
- style: {
226
- position: "relative",
227
- overflow: "hidden",
228
- ...useGlassMode ? glassContainerStyle : {
229
- backgroundColor: cardBg,
230
- ...cardGlass,
231
- ...tokens.colors.border.cardStyle ?? {}
232
- },
233
- borderRadius: tokens.borderRadius.lg,
234
- padding: tokens.spacing.md,
235
- fontFamily: tokens.typography.fontFamily.primary,
236
- color: tokens.colors.text.primary,
237
- fontSize: tokens.typography.fontSize.sm
238
- },
239
- children: [
240
- useGlassMode && /* @__PURE__ */ jsx(
241
- "div",
242
- {
243
- style: {
244
- position: "absolute",
245
- inset: 0,
246
- background: "linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%, rgba(0,0,0,0.1) 100%)",
247
- pointerEvents: "none",
248
- zIndex: 0
249
- }
250
- }
251
- ),
252
- /* @__PURE__ */ jsx(
253
- CardHeader,
254
- {
255
- icon: "antenna-transmit",
256
- title: groundStationName,
257
- subtitle: spacecraftName,
258
- status: statusLevel,
259
- badge: isAccessible ? "Link" : "No Link",
260
- badgeColor: statusColor
261
- }
262
- ),
263
- /* @__PURE__ */ jsx(
264
- "section",
265
- {
266
- style: {
267
- paddingTop: tokens.spacing.md,
268
- borderTop: `1px solid ${tokens.colors.border.muted}`,
269
- marginBottom: tokens.spacing.md
270
- },
271
- "aria-label": "Access metrics",
272
- children: /* @__PURE__ */ jsxs("div", { style: { display: "grid", gridTemplateColumns: "repeat(2, 1fr)", gap: tokens.spacing.sm }, children: [
273
- /* @__PURE__ */ jsxs("div", { children: [
274
- /* @__PURE__ */ jsx("span", { style: labelStyle, children: "Elevation" }),
275
- /* @__PURE__ */ jsx(
276
- "div",
277
- {
278
- style: {
279
- ...valueStyle,
280
- color: (access.elevation ?? 0) > 0 ? tokens.colors.status.normal : tokens.colors.status.off
281
- },
282
- children: formatDegrees(access.elevation)
283
- }
284
- )
285
- ] }),
286
- /* @__PURE__ */ jsxs("div", { children: [
287
- /* @__PURE__ */ jsx("span", { style: labelStyle, children: "Azimuth" }),
288
- /* @__PURE__ */ jsx("div", { style: valueStyle, children: formatDegrees(access.azimuth) })
289
- ] }),
290
- /* @__PURE__ */ jsxs("div", { children: [
291
- /* @__PURE__ */ jsx("span", { style: labelStyle, children: "Range" }),
292
- /* @__PURE__ */ jsxs("div", { style: valueStyle, children: [
293
- safeNumber(access.slantRange, 0),
294
- " km"
295
- ] })
296
- ] }),
297
- /* @__PURE__ */ jsxs("div", { children: [
298
- /* @__PURE__ */ jsx("span", { style: labelStyle, children: "Signal" }),
299
- /* @__PURE__ */ jsxs("div", { style: { ...valueStyle, color: getStatusColor(signalStatus) }, children: [
300
- safeNumber(access.signalStrength, 0, "--"),
301
- "%"
302
- ] })
303
- ] })
304
- ] })
305
- }
306
- ),
307
- access.linkBudget && isAccessible && /* @__PURE__ */ jsxs(
308
- "section",
309
- {
310
- style: {
311
- paddingTop: tokens.spacing.md,
312
- borderTop: `1px solid ${tokens.colors.border.muted}`,
313
- marginBottom: tokens.spacing.md
314
- },
315
- "aria-label": "Link budget",
316
- children: [
317
- /* @__PURE__ */ jsx(
318
- "h4",
319
- {
320
- style: {
321
- margin: `0 0 ${tokens.spacing.sm} 0`,
322
- ...labelStyle
323
- },
324
- children: "Link Budget"
325
- }
326
- ),
327
- /* @__PURE__ */ jsxs("div", { style: { display: "grid", gridTemplateColumns: "repeat(3, 1fr)", gap: tokens.spacing.sm }, children: [
328
- /* @__PURE__ */ jsxs("div", { children: [
329
- /* @__PURE__ */ jsx("span", { style: labelStyle, children: "Rx Power" }),
330
- /* @__PURE__ */ jsxs("div", { style: valueStyle, children: [
331
- formatDecibels(access.linkBudget.receivedPower),
332
- "m"
333
- ] })
334
- ] }),
335
- /* @__PURE__ */ jsxs("div", { children: [
336
- /* @__PURE__ */ jsx("span", { style: labelStyle, children: "SNR" }),
337
- /* @__PURE__ */ jsx("div", { style: valueStyle, children: formatDecibels(access.linkBudget.snr) })
338
- ] }),
339
- /* @__PURE__ */ jsxs("div", { children: [
340
- /* @__PURE__ */ jsx("span", { style: labelStyle, children: "Data Rate" }),
341
- /* @__PURE__ */ jsx("div", { style: { ...valueStyle, color: safeAccentText(tokens.colors.accent.primary) }, children: formatDataRate(access.linkBudget.dataRate) })
342
- ] })
343
- ] })
344
- ]
345
- }
346
- ),
347
- upcomingWindows.length > 0 && /* @__PURE__ */ jsxs("section", { "aria-label": "Upcoming passes", children: [
348
- /* @__PURE__ */ jsx(
349
- "h4",
350
- {
351
- style: {
352
- margin: `0 0 ${tokens.spacing.sm} 0`,
353
- ...labelStyle
354
- },
355
- children: "Upcoming Passes"
356
- }
357
- ),
358
- /* @__PURE__ */ jsx("div", { style: { display: "flex", flexDirection: "column", gap: 4 }, children: upcomingWindows.slice(0, 3).map((window, idx) => /* @__PURE__ */ jsxs(
359
- "div",
360
- {
361
- style: {
362
- display: "flex",
363
- justifyContent: "space-between",
364
- alignItems: "center",
365
- padding: tokens.spacing.sm,
366
- backgroundColor: tokens.colors.background.base,
367
- borderRadius: tokens.borderRadius.sm
368
- },
369
- children: [
370
- /* @__PURE__ */ jsxs("div", { children: [
371
- /* @__PURE__ */ jsx(
372
- "div",
373
- {
374
- style: {
375
- fontSize: tokens.typography.fontSize.xs,
376
- fontWeight: tokens.typography.fontWeight.medium,
377
- fontFamily: tokens.typography.fontFamily.mono
378
- },
379
- children: formatTime(String(window.startTime ?? window.aos), false)
380
- }
381
- ),
382
- /* @__PURE__ */ jsx("div", { style: { fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.text.tertiary }, children: formatDuration(window.duration ?? 0) })
383
- ] }),
384
- /* @__PURE__ */ jsxs(
385
- "div",
386
- {
387
- style: {
388
- fontSize: tokens.typography.fontSize.xs,
389
- color: tokens.colors.status.normal,
390
- fontFamily: tokens.typography.fontFamily.mono
391
- },
392
- children: [
393
- safeNumber(window.maxElevation, 0),
394
- "° max"
395
- ]
396
- }
397
- )
398
- ]
399
- },
400
- idx
401
- )) })
402
- ] })
403
- ]
404
- }
405
- );
6
+ import { memo, useMemo } from "react";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ //#region src/react/cards/AccessCard.tsx
9
+ /**
10
+ * @zendir/ui - AccessCard Component
11
+ *
12
+ * Enterprise-grade access/link status card between spacecraft and ground station.
13
+ *
14
+ * AstroUXDS Compliance:
15
+ * - Status colors used semantically for link/signal status
16
+ * - Normal (green) = accessible, Off (grey) = no contact
17
+ * - Signal strength uses status gradient (normal → caution → serious → critical)
18
+ * - Zendir accent colors for decorative elements
19
+ * - Tabular numbers for time/data display
20
+ *
21
+ * Features:
22
+ * - Full null-safety with graceful fallbacks
23
+ * - WCAG 2.1 AA accessibility
24
+ * - Link budget display
25
+ * - Upcoming pass windows
26
+ * - Loading and empty states
27
+ */
28
+ /**
29
+ * AccessCard - Displays spacecraft-ground station link status
30
+ *
31
+ * @example
32
+ * ```tsx
33
+ * <AccessCard
34
+ * access={accessData}
35
+ * groundStationName="Goldstone"
36
+ * spacecraftName="ISS"
37
+ * upcomingWindows={windows}
38
+ * />
39
+ * ```
40
+ */
41
+ var AccessCard = memo(function AccessCard({ access, groundStationName, spacecraftName, upcomingWindows = [], loading = false, className = "", compact = false, defaultExpanded = false, onPinChange }) {
42
+ const { tokens, theme, prefersReducedMotion } = useTheme();
43
+ const isTransparentTheme = theme === "transparent" || theme === "transparent-bold" || theme === "transparent-minimal";
44
+ const isBoldVariant = theme === "transparent-bold";
45
+ const useGlassMode = isBoldVariant || theme === "transparent-minimal";
46
+ const glassAccentColor = tokens.colors.accent.primary;
47
+ const glassAccentMuted = `${glassAccentColor}66`;
48
+ const cardBg = isTransparentTheme ? "transparent" : tokens.colors.background.surface;
49
+ const cardGlass = isTransparentTheme ? {
50
+ backdropFilter: "blur(12px)",
51
+ WebkitBackdropFilter: "blur(12px)"
52
+ } : {};
53
+ const glassContainerStyle = useGlassMode ? {
54
+ backgroundColor: "rgba(10, 15, 25, 0.35)",
55
+ backdropFilter: "blur(12px)",
56
+ WebkitBackdropFilter: "blur(12px)",
57
+ border: `1px solid ${glassAccentMuted}`,
58
+ borderTop: isBoldVariant ? `2px solid ${glassAccentColor}` : `1px solid ${glassAccentColor}`
59
+ } : {};
60
+ const { expanded, isPinned, handlers, transitionDuration } = useCompactMode({
61
+ compact,
62
+ defaultExpanded,
63
+ onPinChange
64
+ });
65
+ const isAccessible = access?.isAccessible ?? false;
66
+ const statusLevel = isAccessible ? "normal" : "off";
67
+ const statusColor = getStatusColor(statusLevel);
68
+ const signalStatus = useMemo(() => {
69
+ const signal = access?.signalStrength;
70
+ if (signal === void 0 || signal === null) return "off";
71
+ if (signal > 70) return "normal";
72
+ if (signal > 40) return "caution";
73
+ if (signal > 20) return "serious";
74
+ return "critical";
75
+ }, [access?.signalStrength]);
76
+ if (loading) return /* @__PURE__ */ jsxs("div", {
77
+ className: classNames("zendir-access-card", "loading", className),
78
+ role: "article",
79
+ "aria-busy": "true",
80
+ "aria-label": "Loading access data",
81
+ style: {
82
+ backgroundColor: cardBg,
83
+ ...cardGlass,
84
+ ...tokens.colors.border.cardStyle ?? {},
85
+ borderRadius: tokens.borderRadius.lg,
86
+ padding: tokens.spacing.md,
87
+ minHeight: 180
88
+ },
89
+ children: [/* @__PURE__ */ jsxs("div", {
90
+ style: {
91
+ display: "flex",
92
+ justifyContent: "space-between",
93
+ marginBottom: 16
94
+ },
95
+ children: [/* @__PURE__ */ jsx("div", { style: {
96
+ height: 24,
97
+ width: "40%",
98
+ backgroundColor: "rgba(255,255,255,0.1)",
99
+ borderRadius: 4
100
+ } }), /* @__PURE__ */ jsx("div", { style: {
101
+ height: 24,
102
+ width: 60,
103
+ backgroundColor: "rgba(255,255,255,0.1)",
104
+ borderRadius: 4
105
+ } })]
106
+ }), /* @__PURE__ */ jsx("div", {
107
+ style: {
108
+ display: "grid",
109
+ gridTemplateColumns: "repeat(2, 1fr)",
110
+ gap: 12
111
+ },
112
+ children: [
113
+ 1,
114
+ 2,
115
+ 3,
116
+ 4
117
+ ].map((i) => /* @__PURE__ */ jsx("div", { style: {
118
+ height: 40,
119
+ backgroundColor: "rgba(255,255,255,0.06)",
120
+ borderRadius: 4
121
+ } }, i))
122
+ })]
123
+ });
124
+ if (!access) return /* @__PURE__ */ jsxs("div", {
125
+ className: classNames("zendir-access-card", "empty", className),
126
+ role: "article",
127
+ "aria-label": "No access data",
128
+ style: {
129
+ backgroundColor: cardBg,
130
+ ...cardGlass,
131
+ ...tokens.colors.border.cardStyleDashed ?? {},
132
+ borderRadius: tokens.borderRadius.lg,
133
+ padding: tokens.spacing.lg,
134
+ textAlign: "center",
135
+ color: tokens.colors.text.tertiary
136
+ },
137
+ children: [/* @__PURE__ */ jsx("svg", {
138
+ width: "32",
139
+ height: "32",
140
+ viewBox: "0 0 24 24",
141
+ fill: "currentColor",
142
+ style: {
143
+ opacity: .5,
144
+ marginBottom: 8
145
+ },
146
+ children: /* @__PURE__ */ jsx("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z" })
147
+ }), /* @__PURE__ */ jsxs("p", {
148
+ style: {
149
+ margin: 0,
150
+ fontSize: tokens.typography.body[2].fontSize
151
+ },
152
+ children: [groundStationName, ": No access data"]
153
+ })]
154
+ });
155
+ if (compact && !expanded) return /* @__PURE__ */ jsxs("article", {
156
+ className: classNames("zendir-access-card", "compact", className),
157
+ ...handlers,
158
+ "aria-label": `Access: ${groundStationName} (compact)`,
159
+ style: {
160
+ position: "relative",
161
+ overflow: "hidden",
162
+ ...useGlassMode ? glassContainerStyle : {
163
+ backgroundColor: cardBg,
164
+ ...cardGlass,
165
+ ...tokens.colors.border.cardStyle ?? {}
166
+ },
167
+ borderRadius: tokens.borderRadius.lg,
168
+ padding: `${tokens.spacing.sm} ${tokens.spacing.md}`,
169
+ fontFamily: tokens.typography.fontFamily.primary,
170
+ color: tokens.colors.text.primary,
171
+ fontSize: tokens.typography.fontSize.sm,
172
+ cursor: "pointer",
173
+ transition: `all ${transitionDuration} ease-out`,
174
+ transform: "scale(1)"
175
+ },
176
+ onMouseEnter: (e) => {
177
+ handlers.onMouseEnter();
178
+ if (!prefersReducedMotion) {
179
+ e.currentTarget.style.transform = "scale(1.01)";
180
+ e.currentTarget.style.boxShadow = `0 4px 12px ${statusColor}20`;
181
+ }
182
+ },
183
+ onMouseLeave: (e) => {
184
+ handlers.onMouseLeave();
185
+ e.currentTarget.style.transform = "scale(1)";
186
+ e.currentTarget.style.boxShadow = "";
187
+ },
188
+ children: [useGlassMode && /* @__PURE__ */ jsx("div", { style: {
189
+ position: "absolute",
190
+ inset: 0,
191
+ background: "linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%, rgba(0,0,0,0.1) 100%)",
192
+ pointerEvents: "none",
193
+ zIndex: 0
194
+ } }), /* @__PURE__ */ jsxs("div", {
195
+ style: {
196
+ display: "flex",
197
+ alignItems: "center",
198
+ justifyContent: "space-between",
199
+ gap: tokens.spacing.md,
200
+ position: "relative",
201
+ zIndex: 1
202
+ },
203
+ children: [/* @__PURE__ */ jsxs("div", {
204
+ style: {
205
+ display: "flex",
206
+ alignItems: "center",
207
+ gap: tokens.spacing.sm,
208
+ flex: 1,
209
+ minWidth: 0
210
+ },
211
+ children: [
212
+ /* @__PURE__ */ jsx("div", { style: {
213
+ width: 10,
214
+ height: 10,
215
+ borderRadius: "50%",
216
+ backgroundColor: statusColor,
217
+ boxShadow: isAccessible ? `0 0 6px ${statusColor}` : "none",
218
+ flexShrink: 0
219
+ } }),
220
+ /* @__PURE__ */ jsx("span", {
221
+ style: {
222
+ fontWeight: tokens.typography.fontWeight.medium,
223
+ color: useGlassMode ? glassAccentColor : void 0,
224
+ textShadow: useGlassMode ? `0 0 16px ${glassAccentMuted}` : void 0
225
+ },
226
+ children: groundStationName.split(" ")[0]
227
+ }),
228
+ useGlassMode && /* @__PURE__ */ jsx("div", { style: {
229
+ flex: 1,
230
+ height: isBoldVariant ? "2px" : "1px",
231
+ minWidth: 20,
232
+ background: `linear-gradient(90deg, ${glassAccentColor} 0%, ${glassAccentMuted} 60%, transparent 100%)`,
233
+ boxShadow: isBoldVariant ? `0 0 8px ${glassAccentMuted}` : void 0
234
+ } })
235
+ ]
236
+ }), /* @__PURE__ */ jsxs("div", {
237
+ style: {
238
+ display: "flex",
239
+ alignItems: "center",
240
+ gap: tokens.spacing.sm,
241
+ flexShrink: 0
242
+ },
243
+ children: [
244
+ /* @__PURE__ */ jsx("span", {
245
+ style: {
246
+ color: statusColor,
247
+ fontSize: tokens.typography.fontSize.xs,
248
+ fontWeight: tokens.typography.fontWeight.medium
249
+ },
250
+ children: isAccessible ? "AOS" : "LOS"
251
+ }),
252
+ access.signalStrength !== void 0 && /* @__PURE__ */ jsxs("div", {
253
+ style: {
254
+ display: "flex",
255
+ alignItems: "center",
256
+ gap: 4
257
+ },
258
+ children: [/* @__PURE__ */ jsx(Icon, {
259
+ name: "antenna",
260
+ size: 12,
261
+ color: tokens.colors.text.secondary
262
+ }), /* @__PURE__ */ jsxs("span", {
263
+ style: {
264
+ fontVariantNumeric: "tabular-nums",
265
+ fontFamily: tokens.typography.fontFamily.mono,
266
+ fontSize: tokens.typography.fontSize.xs
267
+ },
268
+ children: [safeNumber(access.signalStrength, 0), "%"]
269
+ })]
270
+ }),
271
+ isPinned && /* @__PURE__ */ jsx(Icon, {
272
+ name: "lock",
273
+ size: 12,
274
+ color: tokens.colors.accent.primary
275
+ })
276
+ ]
277
+ })]
278
+ })]
279
+ });
280
+ const labelStyle = {
281
+ color: tokens.colors.text.secondary,
282
+ fontSize: tokens.typography.fontSize.xs,
283
+ fontWeight: tokens.typography.fontWeight.medium
284
+ };
285
+ const valueStyle = {
286
+ color: tokens.colors.text.primary,
287
+ fontWeight: tokens.typography.fontWeight.medium,
288
+ fontFamily: tokens.typography.fontFamily.mono,
289
+ fontVariantNumeric: "tabular-nums",
290
+ marginTop: 2
291
+ };
292
+ return /* @__PURE__ */ jsxs("article", {
293
+ className: classNames("zendir-access-card", className),
294
+ "aria-label": `${spacecraftName ?? "Spacecraft"} access to ${groundStationName}`,
295
+ style: {
296
+ position: "relative",
297
+ overflow: "hidden",
298
+ ...useGlassMode ? glassContainerStyle : {
299
+ backgroundColor: cardBg,
300
+ ...cardGlass,
301
+ ...tokens.colors.border.cardStyle ?? {}
302
+ },
303
+ borderRadius: tokens.borderRadius.lg,
304
+ padding: tokens.spacing.md,
305
+ fontFamily: tokens.typography.fontFamily.primary,
306
+ color: tokens.colors.text.primary,
307
+ fontSize: tokens.typography.fontSize.sm
308
+ },
309
+ children: [
310
+ useGlassMode && /* @__PURE__ */ jsx("div", { style: {
311
+ position: "absolute",
312
+ inset: 0,
313
+ background: "linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%, rgba(0,0,0,0.1) 100%)",
314
+ pointerEvents: "none",
315
+ zIndex: 0
316
+ } }),
317
+ /* @__PURE__ */ jsx(CardHeader, {
318
+ icon: "antenna-transmit",
319
+ title: groundStationName,
320
+ subtitle: spacecraftName,
321
+ status: statusLevel,
322
+ badge: isAccessible ? "Link" : "No Link",
323
+ badgeColor: statusColor
324
+ }),
325
+ /* @__PURE__ */ jsx("section", {
326
+ style: {
327
+ paddingTop: tokens.spacing.md,
328
+ borderTop: `1px solid ${tokens.colors.border.muted}`,
329
+ marginBottom: tokens.spacing.md
330
+ },
331
+ "aria-label": "Access metrics",
332
+ children: /* @__PURE__ */ jsxs("div", {
333
+ style: {
334
+ display: "grid",
335
+ gridTemplateColumns: "repeat(2, 1fr)",
336
+ gap: tokens.spacing.sm
337
+ },
338
+ children: [
339
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("span", {
340
+ style: labelStyle,
341
+ children: "Elevation"
342
+ }), /* @__PURE__ */ jsx("div", {
343
+ style: {
344
+ ...valueStyle,
345
+ color: (access.elevation ?? 0) > 0 ? tokens.colors.status.normal : tokens.colors.status.off
346
+ },
347
+ children: formatDegrees(access.elevation)
348
+ })] }),
349
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("span", {
350
+ style: labelStyle,
351
+ children: "Azimuth"
352
+ }), /* @__PURE__ */ jsx("div", {
353
+ style: valueStyle,
354
+ children: formatDegrees(access.azimuth)
355
+ })] }),
356
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("span", {
357
+ style: labelStyle,
358
+ children: "Range"
359
+ }), /* @__PURE__ */ jsxs("div", {
360
+ style: valueStyle,
361
+ children: [safeNumber(access.slantRange, 0), " km"]
362
+ })] }),
363
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("span", {
364
+ style: labelStyle,
365
+ children: "Signal"
366
+ }), /* @__PURE__ */ jsxs("div", {
367
+ style: {
368
+ ...valueStyle,
369
+ color: getStatusColor(signalStatus)
370
+ },
371
+ children: [safeNumber(access.signalStrength, 0, "--"), "%"]
372
+ })] })
373
+ ]
374
+ })
375
+ }),
376
+ access.linkBudget && isAccessible && /* @__PURE__ */ jsxs("section", {
377
+ style: {
378
+ paddingTop: tokens.spacing.md,
379
+ borderTop: `1px solid ${tokens.colors.border.muted}`,
380
+ marginBottom: tokens.spacing.md
381
+ },
382
+ "aria-label": "Link budget",
383
+ children: [/* @__PURE__ */ jsx("h4", {
384
+ style: {
385
+ margin: `0 0 ${tokens.spacing.sm} 0`,
386
+ ...labelStyle
387
+ },
388
+ children: "Link Budget"
389
+ }), /* @__PURE__ */ jsxs("div", {
390
+ style: {
391
+ display: "grid",
392
+ gridTemplateColumns: "repeat(3, 1fr)",
393
+ gap: tokens.spacing.sm
394
+ },
395
+ children: [
396
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("span", {
397
+ style: labelStyle,
398
+ children: "Rx Power"
399
+ }), /* @__PURE__ */ jsxs("div", {
400
+ style: valueStyle,
401
+ children: [formatDecibels(access.linkBudget.receivedPower), "m"]
402
+ })] }),
403
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("span", {
404
+ style: labelStyle,
405
+ children: "SNR"
406
+ }), /* @__PURE__ */ jsx("div", {
407
+ style: valueStyle,
408
+ children: formatDecibels(access.linkBudget.snr)
409
+ })] }),
410
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("span", {
411
+ style: labelStyle,
412
+ children: "Data Rate"
413
+ }), /* @__PURE__ */ jsx("div", {
414
+ style: {
415
+ ...valueStyle,
416
+ color: safeAccentText(tokens.colors.accent.primary)
417
+ },
418
+ children: formatDataRate(access.linkBudget.dataRate)
419
+ })] })
420
+ ]
421
+ })]
422
+ }),
423
+ upcomingWindows.length > 0 && /* @__PURE__ */ jsxs("section", {
424
+ "aria-label": "Upcoming passes",
425
+ children: [/* @__PURE__ */ jsx("h4", {
426
+ style: {
427
+ margin: `0 0 ${tokens.spacing.sm} 0`,
428
+ ...labelStyle
429
+ },
430
+ children: "Upcoming Passes"
431
+ }), /* @__PURE__ */ jsx("div", {
432
+ style: {
433
+ display: "flex",
434
+ flexDirection: "column",
435
+ gap: 4
436
+ },
437
+ children: upcomingWindows.slice(0, 3).map((window, idx) => /* @__PURE__ */ jsxs("div", {
438
+ style: {
439
+ display: "flex",
440
+ justifyContent: "space-between",
441
+ alignItems: "center",
442
+ padding: tokens.spacing.sm,
443
+ backgroundColor: tokens.colors.background.base,
444
+ borderRadius: tokens.borderRadius.sm
445
+ },
446
+ children: [/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
447
+ style: {
448
+ fontSize: tokens.typography.fontSize.xs,
449
+ fontWeight: tokens.typography.fontWeight.medium,
450
+ fontFamily: tokens.typography.fontFamily.mono
451
+ },
452
+ children: formatTime(String(window.startTime ?? window.aos), false)
453
+ }), /* @__PURE__ */ jsx("div", {
454
+ style: {
455
+ fontSize: tokens.typography.fontSize.xxs,
456
+ color: tokens.colors.text.tertiary
457
+ },
458
+ children: formatDuration(window.duration ?? 0)
459
+ })] }), /* @__PURE__ */ jsxs("div", {
460
+ style: {
461
+ fontSize: tokens.typography.fontSize.xs,
462
+ color: tokens.colors.status.normal,
463
+ fontFamily: tokens.typography.fontFamily.mono
464
+ },
465
+ children: [safeNumber(window.maxElevation, 0), "° max"]
466
+ })]
467
+ }, idx))
468
+ })]
469
+ })
470
+ ]
471
+ });
406
472
  });
407
- export {
408
- AccessCard
409
- };
410
- //# sourceMappingURL=AccessCard.js.map
473
+ //#endregion
474
+ export { AccessCard };
475
+
476
+ //# sourceMappingURL=AccessCard.js.map