@zendir/ui 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/CHANGELOG.md +419 -386
  2. package/README.md +640 -631
  3. package/dist/_virtual/_rolldown/runtime.js +13 -0
  4. package/dist/index.js +17 -221
  5. package/dist/react/3d/CesiumCaptureSource.d.ts +0 -1
  6. package/dist/react/3d/CesiumCaptureSource.js +364 -283
  7. package/dist/react/3d/CesiumCaptureSource.js.map +1 -1
  8. package/dist/react/3d/ZenSpace3D.d.ts +2 -3
  9. package/dist/react/3d/ZenSpace3D.js +1681 -1237
  10. package/dist/react/3d/ZenSpace3D.js.map +1 -1
  11. package/dist/react/3d/ZenSpace3DCesium.d.ts +0 -1
  12. package/dist/react/3d/ZenSpace3DCesium.js +513 -560
  13. package/dist/react/3d/ZenSpace3DCesium.js.map +1 -1
  14. package/dist/react/3d/ZenSpace3DShaders.js +61 -66
  15. package/dist/react/3d/ZenSpace3DShaders.js.map +1 -1
  16. package/dist/react/3d/ZenSpace3DTypes.d.ts +19 -20
  17. package/dist/react/3d/ZenSpace3DUtils.d.ts +0 -1
  18. package/dist/react/3d/ZenSpace3DUtils.js +37 -24
  19. package/dist/react/3d/ZenSpace3DUtils.js.map +1 -1
  20. package/dist/react/3d/capturePngAnalysis.js +42 -36
  21. package/dist/react/3d/capturePngAnalysis.js.map +1 -1
  22. package/dist/react/3d/index.d.ts +3 -3
  23. package/dist/react/3d/index.js +5 -53
  24. package/dist/react/3d/threeLoader.d.ts +1 -1
  25. package/dist/react/3d/threeLoader.js +23 -18
  26. package/dist/react/3d/threeLoader.js.map +1 -1
  27. package/dist/react/astro/ClassificationBanner.d.ts +2 -3
  28. package/dist/react/astro/ClassificationBanner.js +95 -79
  29. package/dist/react/astro/ClassificationBanner.js.map +1 -1
  30. package/dist/react/astro/GlobalStatusBar.d.ts +0 -1
  31. package/dist/react/astro/GlobalStatusBar.js +157 -163
  32. package/dist/react/astro/GlobalStatusBar.js.map +1 -1
  33. package/dist/react/astro/MissionClock.d.ts +7 -8
  34. package/dist/react/astro/MissionClock.js +377 -400
  35. package/dist/react/astro/MissionClock.js.map +1 -1
  36. package/dist/react/astro/MonitoringIcon.d.ts +1 -2
  37. package/dist/react/astro/MonitoringIcon.js +422 -358
  38. package/dist/react/astro/MonitoringIcon.js.map +1 -1
  39. package/dist/react/astro/Notification.d.ts +1 -2
  40. package/dist/react/astro/Notification.js +229 -126
  41. package/dist/react/astro/Notification.js.map +1 -1
  42. package/dist/react/astro/Progress.d.ts +0 -1
  43. package/dist/react/astro/Progress.js +199 -141
  44. package/dist/react/astro/Progress.js.map +1 -1
  45. package/dist/react/astro/SimulationControls.d.ts +3 -4
  46. package/dist/react/astro/SimulationControls.js +596 -650
  47. package/dist/react/astro/SimulationControls.js.map +1 -1
  48. package/dist/react/astro/StatusIndicator.d.ts +0 -1
  49. package/dist/react/astro/StatusIndicator.js +236 -170
  50. package/dist/react/astro/StatusIndicator.js.map +1 -1
  51. package/dist/react/astro/UnifiedTimeline.d.ts +9 -10
  52. package/dist/react/astro/UnifiedTimeline.js +2345 -2392
  53. package/dist/react/astro/UnifiedTimeline.js.map +1 -1
  54. package/dist/react/astro/index.d.ts +5 -5
  55. package/dist/react/astro/index.js +1 -25
  56. package/dist/react/cards/AccessCard.d.ts +0 -1
  57. package/dist/react/cards/AccessCard.js +471 -405
  58. package/dist/react/cards/AccessCard.js.map +1 -1
  59. package/dist/react/cards/OrbitCard.d.ts +0 -1
  60. package/dist/react/cards/OrbitCard.js +487 -364
  61. package/dist/react/cards/OrbitCard.js.map +1 -1
  62. package/dist/react/cards/SpacecraftCard.d.ts +0 -1
  63. package/dist/react/cards/SpacecraftCard.js +813 -925
  64. package/dist/react/cards/SpacecraftCard.js.map +1 -1
  65. package/dist/react/cards/TelemetryCard.d.ts +0 -1
  66. package/dist/react/cards/TelemetryCard.js +1055 -732
  67. package/dist/react/cards/TelemetryCard.js.map +1 -1
  68. package/dist/react/cards/TelemetryStreamCard.d.ts +0 -1
  69. package/dist/react/cards/TelemetryStreamCard.js +323 -297
  70. package/dist/react/cards/TelemetryStreamCard.js.map +1 -1
  71. package/dist/react/cards/index.d.ts +1 -1
  72. package/dist/react/cards/index.js +1 -8
  73. package/dist/react/charts/GroundTrackMap.d.ts +6 -7
  74. package/dist/react/charts/GroundTrackMap.js +1377 -1256
  75. package/dist/react/charts/GroundTrackMap.js.map +1 -1
  76. package/dist/react/charts/GroundTrackMapLeaflet.d.ts +1 -2
  77. package/dist/react/charts/GroundTrackMapLeaflet.js +1065 -987
  78. package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -1
  79. package/dist/react/charts/groundTrackMapLeafletTiles.js +34 -25
  80. package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -1
  81. package/dist/react/charts/groundTrackMapLeafletUtils.js +70 -61
  82. package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -1
  83. package/dist/react/charts/index.d.ts +1 -1
  84. package/dist/react/charts/index.js +7 -100
  85. package/dist/react/charts/unified/AstroChart.d.ts +1 -2
  86. package/dist/react/charts/unified/AstroChart.js +1331 -1411
  87. package/dist/react/charts/unified/AstroChart.js.map +1 -1
  88. package/dist/react/charts/unified/PowerOverviewChart.d.ts +3 -3
  89. package/dist/react/charts/unified/PowerOverviewChart.js +495 -478
  90. package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -1
  91. package/dist/react/charts/unified/domain.d.ts +12 -13
  92. package/dist/react/charts/unified/domain.js +3999 -3145
  93. package/dist/react/charts/unified/domain.js.map +1 -1
  94. package/dist/react/charts/unified/generators.d.ts +3 -4
  95. package/dist/react/charts/unified/generators.js +561 -498
  96. package/dist/react/charts/unified/generators.js.map +1 -1
  97. package/dist/react/charts/unified/index.d.ts +1 -1
  98. package/dist/react/charts/unified/presets.d.ts +14 -15
  99. package/dist/react/charts/unified/presets.js +857 -994
  100. package/dist/react/charts/unified/presets.js.map +1 -1
  101. package/dist/react/charts/unified/sync.d.ts +2 -3
  102. package/dist/react/charts/unified/sync.js +229 -195
  103. package/dist/react/charts/unified/sync.js.map +1 -1
  104. package/dist/react/charts/unified/theme.d.ts +11 -12
  105. package/dist/react/charts/unified/theme.js +606 -642
  106. package/dist/react/charts/unified/theme.js.map +1 -1
  107. package/dist/react/charts/unified/types.d.ts +32 -33
  108. package/dist/react/charts/unified/useChartStream.d.ts +1 -2
  109. package/dist/react/charts/unified/useChartStream.js +203 -216
  110. package/dist/react/charts/unified/useChartStream.js.map +1 -1
  111. package/dist/react/chatgpt/AppCard.d.ts +1 -2
  112. package/dist/react/chatgpt/index.d.ts +7 -7
  113. package/dist/react/chatgpt/index.js +160 -139
  114. package/dist/react/chatgpt/index.js.map +1 -1
  115. package/dist/react/context/CategoryContext.d.ts +0 -1
  116. package/dist/react/context/CategoryContext.js +78 -29
  117. package/dist/react/context/CategoryContext.js.map +1 -1
  118. package/dist/react/context/DisplaySettingsContext.d.ts +1 -2
  119. package/dist/react/context/DisplaySettingsContext.js +205 -156
  120. package/dist/react/context/DisplaySettingsContext.js.map +1 -1
  121. package/dist/react/context/SpatialSelectionContext.d.ts +0 -1
  122. package/dist/react/context/SpatialSelectionContext.js +36 -7
  123. package/dist/react/context/SpatialSelectionContext.js.map +1 -1
  124. package/dist/react/core/data/DataTable.d.ts +3 -4
  125. package/dist/react/core/data/DataTable.js +473 -440
  126. package/dist/react/core/data/DataTable.js.map +1 -1
  127. package/dist/react/core/data/DataValue.d.ts +4 -5
  128. package/dist/react/core/data/DataValue.js +605 -571
  129. package/dist/react/core/data/DataValue.js.map +1 -1
  130. package/dist/react/core/data/propertyConfig.d.ts +1 -2
  131. package/dist/react/core/data/propertyConfig.js +446 -382
  132. package/dist/react/core/data/propertyConfig.js.map +1 -1
  133. package/dist/react/core/display/AstroIcon.d.ts +4 -5
  134. package/dist/react/core/display/AstroIcon.js +339 -429
  135. package/dist/react/core/display/AstroIcon.js.map +1 -1
  136. package/dist/react/core/display/Badge.d.ts +2 -3
  137. package/dist/react/core/display/Badge.js +131 -131
  138. package/dist/react/core/display/Badge.js.map +1 -1
  139. package/dist/react/core/display/CardHeader.d.ts +0 -1
  140. package/dist/react/core/display/CardHeader.js +398 -311
  141. package/dist/react/core/display/CardHeader.js.map +1 -1
  142. package/dist/react/core/display/Container.d.ts +2 -3
  143. package/dist/react/core/display/Container.js +640 -668
  144. package/dist/react/core/display/Container.js.map +1 -1
  145. package/dist/react/core/display/CopyButton.d.ts +1 -2
  146. package/dist/react/core/display/CopyButton.js +158 -101
  147. package/dist/react/core/display/CopyButton.js.map +1 -1
  148. package/dist/react/core/display/GlassCard.d.ts +3 -4
  149. package/dist/react/core/display/GlassCard.js +416 -369
  150. package/dist/react/core/display/GlassCard.js.map +1 -1
  151. package/dist/react/core/display/HeaderIconWithStatus.d.ts +0 -1
  152. package/dist/react/core/display/HeaderIconWithStatus.js +152 -152
  153. package/dist/react/core/display/HeaderIconWithStatus.js.map +1 -1
  154. package/dist/react/core/display/Icon.d.ts +2 -3
  155. package/dist/react/core/display/Icon.js +172 -143
  156. package/dist/react/core/display/Icon.js.map +1 -1
  157. package/dist/react/core/display/Typography.d.ts +24 -25
  158. package/dist/react/core/display/Typography.js +360 -178
  159. package/dist/react/core/display/Typography.js.map +1 -1
  160. package/dist/react/core/feedback/ConfirmDialog.d.ts +1 -2
  161. package/dist/react/core/feedback/ConfirmDialog.js +343 -304
  162. package/dist/react/core/feedback/ConfirmDialog.js.map +1 -1
  163. package/dist/react/core/feedback/Dialog.d.ts +2 -3
  164. package/dist/react/core/feedback/Dialog.js +189 -197
  165. package/dist/react/core/feedback/Dialog.js.map +1 -1
  166. package/dist/react/core/feedback/Toast.d.ts +2 -3
  167. package/dist/react/core/feedback/Toast.js +346 -207
  168. package/dist/react/core/feedback/Toast.js.map +1 -1
  169. package/dist/react/core/index.d.ts +26 -26
  170. package/dist/react/core/index.js +7 -119
  171. package/dist/react/core/inputs/Button.d.ts +2 -3
  172. package/dist/react/core/inputs/Button.js +281 -304
  173. package/dist/react/core/inputs/Button.js.map +1 -1
  174. package/dist/react/core/inputs/Checkbox.d.ts +2 -3
  175. package/dist/react/core/inputs/Checkbox.js +139 -127
  176. package/dist/react/core/inputs/Checkbox.js.map +1 -1
  177. package/dist/react/core/inputs/Input.d.ts +3 -4
  178. package/dist/react/core/inputs/Input.js +277 -285
  179. package/dist/react/core/inputs/Input.js.map +1 -1
  180. package/dist/react/core/inputs/LimitsBar.d.ts +1 -2
  181. package/dist/react/core/inputs/LimitsBar.js +271 -196
  182. package/dist/react/core/inputs/LimitsBar.js.map +1 -1
  183. package/dist/react/core/inputs/NumberInput.d.ts +2 -3
  184. package/dist/react/core/inputs/NumberInput.js +531 -503
  185. package/dist/react/core/inputs/NumberInput.js.map +1 -1
  186. package/dist/react/core/inputs/PinInput.d.ts +2 -3
  187. package/dist/react/core/inputs/PinInput.js +224 -207
  188. package/dist/react/core/inputs/PinInput.js.map +1 -1
  189. package/dist/react/core/inputs/Select.d.ts +1 -2
  190. package/dist/react/core/inputs/Select.js +298 -299
  191. package/dist/react/core/inputs/Select.js.map +1 -1
  192. package/dist/react/core/inputs/Toggle.d.ts +2 -3
  193. package/dist/react/core/inputs/Toggle.js +142 -148
  194. package/dist/react/core/inputs/Toggle.js.map +1 -1
  195. package/dist/react/core/layout/Box.d.ts +3 -4
  196. package/dist/react/core/layout/Box.js +118 -122
  197. package/dist/react/core/layout/Box.js.map +1 -1
  198. package/dist/react/core/layout/Center.d.ts +0 -1
  199. package/dist/react/core/layout/Center.js +45 -32
  200. package/dist/react/core/layout/Center.js.map +1 -1
  201. package/dist/react/core/layout/Divider.d.ts +1 -2
  202. package/dist/react/core/layout/Divider.js +112 -106
  203. package/dist/react/core/layout/Divider.js.map +1 -1
  204. package/dist/react/core/layout/Flex.d.ts +4 -5
  205. package/dist/react/core/layout/Flex.js +120 -124
  206. package/dist/react/core/layout/Flex.js.map +1 -1
  207. package/dist/react/core/layout/Grid.d.ts +5 -6
  208. package/dist/react/core/layout/Grid.js +131 -138
  209. package/dist/react/core/layout/Grid.js.map +1 -1
  210. package/dist/react/core/layout/Spacer.d.ts +0 -1
  211. package/dist/react/core/layout/Spacer.js +36 -29
  212. package/dist/react/core/layout/Spacer.js.map +1 -1
  213. package/dist/react/core/layout/Stack.d.ts +4 -5
  214. package/dist/react/core/layout/Stack.js +127 -70
  215. package/dist/react/core/layout/Stack.js.map +1 -1
  216. package/dist/react/core/layout/responsive.d.ts +1 -2
  217. package/dist/react/core/layout/responsive.js +25 -19
  218. package/dist/react/core/layout/responsive.js.map +1 -1
  219. package/dist/react/core/layout/useBreakpoint.d.ts +1 -1
  220. package/dist/react/core/layout/useBreakpoint.js +119 -66
  221. package/dist/react/core/layout/useBreakpoint.js.map +1 -1
  222. package/dist/react/core/navigation/AppBar.d.ts +1 -2
  223. package/dist/react/core/navigation/AppBar.js +827 -805
  224. package/dist/react/core/navigation/AppBar.js.map +1 -1
  225. package/dist/react/core/navigation/Pagination.d.ts +2 -3
  226. package/dist/react/core/navigation/Pagination.js +207 -187
  227. package/dist/react/core/navigation/Pagination.js.map +1 -1
  228. package/dist/react/core/navigation/SideNav.d.ts +5 -6
  229. package/dist/react/core/navigation/SideNav.js +855 -629
  230. package/dist/react/core/navigation/SideNav.js.map +1 -1
  231. package/dist/react/core/navigation/Tabs.d.ts +0 -1
  232. package/dist/react/core/navigation/Tabs.js +113 -119
  233. package/dist/react/core/navigation/Tabs.js.map +1 -1
  234. package/dist/react/core/overlays/Popover.d.ts +2 -3
  235. package/dist/react/core/overlays/Popover.js +303 -282
  236. package/dist/react/core/overlays/Popover.js.map +1 -1
  237. package/dist/react/core/overlays/SidePanel.d.ts +1 -2
  238. package/dist/react/core/overlays/SidePanel.js +217 -212
  239. package/dist/react/core/overlays/SidePanel.js.map +1 -1
  240. package/dist/react/core/overlays/Tooltip.d.ts +1 -2
  241. package/dist/react/core/overlays/Tooltip.js +170 -176
  242. package/dist/react/core/overlays/Tooltip.js.map +1 -1
  243. package/dist/react/core/widgets/ActivityPlanner.d.ts +0 -1
  244. package/dist/react/core/widgets/ActivityPlanner.js +855 -517
  245. package/dist/react/core/widgets/ActivityPlanner.js.map +1 -1
  246. package/dist/react/core/widgets/Capture.d.ts +2 -3
  247. package/dist/react/core/widgets/Capture.js +965 -779
  248. package/dist/react/core/widgets/Capture.js.map +1 -1
  249. package/dist/react/core/widgets/ChatPanel.d.ts +16 -17
  250. package/dist/react/core/widgets/ChatPanel.js +1734 -1034
  251. package/dist/react/core/widgets/ChatPanel.js.map +1 -1
  252. package/dist/react/core/widgets/ColorPickerPanel.d.ts +0 -1
  253. package/dist/react/core/widgets/ColorPickerPanel.js +298 -287
  254. package/dist/react/core/widgets/ColorPickerPanel.js.map +1 -1
  255. package/dist/react/core/widgets/CommandBuilder.d.ts +2 -3
  256. package/dist/react/core/widgets/CommandBuilder.js +624 -516
  257. package/dist/react/core/widgets/CommandBuilder.js.map +1 -1
  258. package/dist/react/core/widgets/ConnectionForm.d.ts +2 -3
  259. package/dist/react/core/widgets/ConnectionForm.js +528 -492
  260. package/dist/react/core/widgets/ConnectionForm.js.map +1 -1
  261. package/dist/react/core/widgets/FileExplorer.d.ts +3 -4
  262. package/dist/react/core/widgets/FileExplorer.js +617 -505
  263. package/dist/react/core/widgets/FileExplorer.js.map +1 -1
  264. package/dist/react/core/widgets/HexViewer.d.ts +2 -3
  265. package/dist/react/core/widgets/HexViewer.js +1353 -1091
  266. package/dist/react/core/widgets/HexViewer.js.map +1 -1
  267. package/dist/react/core/widgets/ImageFrame.d.ts +1 -2
  268. package/dist/react/core/widgets/ImageFrame.js +230 -193
  269. package/dist/react/core/widgets/ImageFrame.js.map +1 -1
  270. package/dist/react/core/widgets/ImageGallery.d.ts +2 -1
  271. package/dist/react/core/widgets/ImageGallery.js +380 -314
  272. package/dist/react/core/widgets/ImageGallery.js.map +1 -1
  273. package/dist/react/core/widgets/ImagePanel.d.ts +0 -1
  274. package/dist/react/core/widgets/ImagePanel.js +110 -101
  275. package/dist/react/core/widgets/ImagePanel.js.map +1 -1
  276. package/dist/react/core/widgets/LogViewer.d.ts +2 -3
  277. package/dist/react/core/widgets/LogViewer.js +711 -607
  278. package/dist/react/core/widgets/LogViewer.js.map +1 -1
  279. package/dist/react/core/widgets/MessageStream.d.ts +3 -4
  280. package/dist/react/core/widgets/MessageStream.js +514 -444
  281. package/dist/react/core/widgets/MessageStream.js.map +1 -1
  282. package/dist/react/core/widgets/MissionCalendar.d.ts +3 -4
  283. package/dist/react/core/widgets/MissionCalendar.js +1488 -1020
  284. package/dist/react/core/widgets/MissionCalendar.js.map +1 -1
  285. package/dist/react/core/widgets/PacketViewer.d.ts +2 -3
  286. package/dist/react/core/widgets/PacketViewer.js +550 -421
  287. package/dist/react/core/widgets/PacketViewer.js.map +1 -1
  288. package/dist/react/core/widgets/capture-placeholder.png.js +6 -5
  289. package/dist/react/core/widgets/capture-placeholder.png.js.map +1 -1
  290. package/dist/react/hooks/index.d.ts +5 -5
  291. package/dist/react/hooks/useAccessWindows.d.ts +0 -1
  292. package/dist/react/hooks/useCompactMode.d.ts +1 -1
  293. package/dist/react/hooks/useCompactMode.js +104 -58
  294. package/dist/react/hooks/useCompactMode.js.map +1 -1
  295. package/dist/react/hooks/useGroundTrackHistory.d.ts +0 -1
  296. package/dist/react/hooks/useSimulationScene.d.ts +1 -2
  297. package/dist/react/hooks/useSimulationScene.js +481 -374
  298. package/dist/react/hooks/useSimulationScene.js.map +1 -1
  299. package/dist/react/index.d.ts +3 -3
  300. package/dist/react/panels/LayerControlPanel.d.ts +1 -2
  301. package/dist/react/panels/LayerControlPanel.js +223 -180
  302. package/dist/react/panels/LayerControlPanel.js.map +1 -1
  303. package/dist/react/panels/ObjectInventoryPanel.d.ts +2 -3
  304. package/dist/react/panels/ObjectInventoryPanel.js +315 -250
  305. package/dist/react/panels/ObjectInventoryPanel.js.map +1 -1
  306. package/dist/react/panels/index.d.ts +1 -1
  307. package/dist/react/panels/index.js +1 -6
  308. package/dist/react/shared/ErrorBoundary.d.ts +1 -2
  309. package/dist/react/shared/ErrorBoundary.js +170 -139
  310. package/dist/react/shared/ErrorBoundary.js.map +1 -1
  311. package/dist/react/shared/Skeleton.d.ts +1 -2
  312. package/dist/react/shared/Skeleton.js +300 -301
  313. package/dist/react/shared/Skeleton.js.map +1 -1
  314. package/dist/react/theme/ThemeProvider.d.ts +2 -321
  315. package/dist/react/theme/ThemeProvider.js +313 -939
  316. package/dist/react/theme/ThemeProvider.js.map +1 -1
  317. package/dist/react/theme/cardAccent.d.ts +1 -2
  318. package/dist/react/theme/cardAccent.js +196 -126
  319. package/dist/react/theme/cardAccent.js.map +1 -1
  320. package/dist/react/theme/config.d.ts +0 -1
  321. package/dist/react/theme/config.js +47 -25
  322. package/dist/react/theme/config.js.map +1 -1
  323. package/dist/react/theme/index.d.ts +2 -2
  324. package/dist/react/theme/index.js +1 -16
  325. package/dist/react/theme/types.d.ts +332 -0
  326. package/dist/react/theme/types.js +39 -0
  327. package/dist/react/theme/types.js.map +1 -0
  328. package/dist/react/types.d.ts +8 -8
  329. package/dist/react/types.js +147 -47
  330. package/dist/react/types.js.map +1 -1
  331. package/dist/react/utils/categoryPalette.d.ts +0 -1
  332. package/dist/react/utils/categoryPalette.js +91 -102
  333. package/dist/react/utils/categoryPalette.js.map +1 -1
  334. package/dist/react/utils/index.d.ts +5 -5
  335. package/dist/react/utils/index.js +457 -371
  336. package/dist/react/utils/index.js.map +1 -1
  337. package/dist/react/visualizations/EclipseTimerCard.d.ts +0 -1
  338. package/dist/react/visualizations/LinkBudgetCard.d.ts +0 -1
  339. package/dist/react/visualizations/NavBallCard.d.ts +0 -1
  340. package/dist/react/visualizations/PropulsionCard.d.ts +1 -2
  341. package/dist/react/visualizations/SensorFootprintCard.d.ts +1 -2
  342. package/dist/react/visualizations/ThermalHeatmapCard.d.ts +0 -1
  343. package/dist/react/visualizations/index.d.ts +3 -3
  344. package/dist/react.d.ts +2 -1
  345. package/dist/react.js +17 -221
  346. package/dist/shaders/atmosphere.frag.js +6 -5
  347. package/dist/shaders/atmosphere.frag.js.map +1 -1
  348. package/dist/shaders/atmosphere.vert.js +6 -5
  349. package/dist/shaders/atmosphere.vert.js.map +1 -1
  350. package/dist/shaders/stars.frag.js +6 -5
  351. package/dist/shaders/stars.frag.js.map +1 -1
  352. package/dist/shaders/stars.vert.js +6 -5
  353. package/dist/shaders/stars.vert.js.map +1 -1
  354. package/dist/style.css +26 -3
  355. package/dist/tokens/core.d.ts +159 -0
  356. package/dist/tokens/core.js +144 -0
  357. package/dist/tokens/core.js.map +1 -0
  358. package/dist/tokens/css-vars.d.ts +213 -2
  359. package/dist/tokens/css-vars.js +590 -227
  360. package/dist/tokens/css-vars.js.map +1 -1
  361. package/dist/tokens/index.d.ts +31 -228
  362. package/dist/tokens/index.js +281 -366
  363. package/dist/tokens/index.js.map +1 -1
  364. package/dist/tokens/palettes/astro.d.ts +129 -0
  365. package/dist/tokens/palettes/astro.js +112 -0
  366. package/dist/tokens/palettes/astro.js.map +1 -0
  367. package/dist/tokens/palettes/index.d.ts +288 -0
  368. package/dist/tokens/palettes/index.js +35 -0
  369. package/dist/tokens/palettes/index.js.map +1 -0
  370. package/dist/tokens/palettes/tailwind.d.ts +324 -0
  371. package/dist/tokens/palettes/tailwind.js +201 -0
  372. package/dist/tokens/palettes/tailwind.js.map +1 -0
  373. package/dist/tokens/palettes/zendir.d.ts +126 -0
  374. package/dist/tokens/palettes/zendir.js +92 -0
  375. package/dist/tokens/palettes/zendir.js.map +1 -0
  376. package/dist/tokens/themes.d.ts +30 -0
  377. package/dist/tokens/themes.js +704 -0
  378. package/dist/tokens/themes.js.map +1 -0
  379. package/dist/tokens/tokens.css +533 -155
  380. package/dist/types/index.d.ts +2 -2
  381. package/package.json +310 -313
  382. package/dist/index.js.map +0 -1
  383. package/dist/react/3d/index.js.map +0 -1
  384. package/dist/react/astro/index.js.map +0 -1
  385. package/dist/react/cards/index.js.map +0 -1
  386. package/dist/react/charts/index.js.map +0 -1
  387. package/dist/react/core/index.js.map +0 -1
  388. package/dist/react/panels/index.js.map +0 -1
  389. package/dist/react/theme/astro-tokens.d.ts +0 -153
  390. package/dist/react/theme/index.js.map +0 -1
  391. package/dist/react.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TelemetryCard.js","sources":["../../../src/react/cards/TelemetryCard.tsx"],"sourcesContent":["/**\n * @zendir/ui - TelemetryCard Component\n * \n * Enterprise-grade spacecraft telemetry data card.\n * \n * AstroUXDS Compliance:\n * - Status colors used semantically (battery level, health status)\n * - Dual-coded status indicators (color + shape via StatusIndicator)\n * - Zendir accent colors for non-status elements (icons, decorative)\n * - Tabular numbers with fontVariantNumeric for data display\n * - Sentence-case labels per Tier 3 compliance\n * \n * Features:\n * - Full null-safety with graceful fallbacks\n * - WCAG 2.1 AA accessibility\n * - Subsystem toggles (power, attitude, comms)\n * - Anomaly alerts\n * - Loading and empty states\n */\n\nimport React, { memo, useMemo, useState } from 'react';\nimport type { TelemetryData } from '../types';\nimport { useTheme } from '../theme';\nimport { StatusIndicator } from '../astro';\nimport { DataValue, DataValueGroup } from '../core/data/DataValue';\nimport { getPropertyConfig } from '../core/data/propertyConfig';\nimport { AstroIcon } from '../core/display/AstroIcon';\nimport { CardHeader } from '../core/display/CardHeader';\nimport { HeaderIconWithStatus } from '../core/display/HeaderIconWithStatus';\nimport { Icon, type IconName } from '../core/display/Icon';\nimport { useCompactMode } from '../hooks';\nimport { useCardBorderStyle } from '../context/DisplaySettingsContext';\nimport {\n safeNumber,\n formatTime,\n classNames,\n getStatusColor,\n deriveBatteryStatus,\n normalizeStatus,\n type StatusLevel,\n} from '../utils';\n\nexport interface TelemetryCardProps {\n /** Telemetry data */\n telemetry?: TelemetryData;\n /** Spacecraft name */\n spacecraftName?: string;\n /** Show power subsystem */\n showPower?: boolean;\n /** Show attitude subsystem */\n showAttitude?: boolean;\n /** Show communications */\n showComms?: boolean;\n /** Loading state */\n loading?: boolean;\n /** Custom className */\n className?: string;\n /** Enable compact mode - shows condensed view that expands on hover/click */\n compact?: boolean;\n /** Start expanded when in compact mode (pinned state) */\n defaultExpanded?: boolean;\n /** Callback when pin state changes in compact mode */\n onPinChange?: (isPinned: boolean) => void;\n}\n\n/**\n * Get health status level\n * Uses normalizeStatus utility to convert SDK terms to StatusLevel\n */\nfunction getHealthStatus(healthStatus: string | undefined): StatusLevel {\n return normalizeStatus(healthStatus);\n}\n\n/**\n * Get battery status based on level\n * @deprecated Use deriveBatteryStatus from utils instead\n */\nfunction getBatteryStatus(level: number | undefined): StatusLevel {\n return deriveBatteryStatus(level);\n}\n\n/**\n * TelemetryCard - Displays spacecraft telemetry data\n * \n * @example\n * ```tsx\n * <TelemetryCard\n * telemetry={telemetryData}\n * spacecraftName=\"ISS\"\n * showPower\n * showAttitude\n * showComms\n * />\n * ```\n */\nexport const TelemetryCard = memo(function TelemetryCard({\n telemetry,\n spacecraftName,\n showPower = true,\n showAttitude = true,\n showComms = true,\n loading = false,\n className = '',\n compact = false,\n defaultExpanded = false,\n onPinChange,\n}: TelemetryCardProps): React.ReactElement {\n const { tokens, theme, prefersReducedMotion } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n const isBoldVariant = theme === 'transparent-bold';\n const isMinimalVariant = theme === 'transparent-minimal';\n const useGlassMode = isBoldVariant || isMinimalVariant;\n \n // Glass accent colors for bold/minimal themes (matching Container/AstroChart)\n const glassAccentColor = tokens.colors.accent.primary;\n const glassAccentMuted = `${glassAccentColor}66`;\n \n // Use transparent background with blur for transparent themes (matching Timeline)\n const cardBg = isTransparentTheme ? 'transparent' : tokens.colors.background.surface;\n const cardGlass = isTransparentTheme ? { \n backdropFilter: 'blur(12px)' as const, \n WebkitBackdropFilter: 'blur(12px)' as const,\n } : {};\n // Get card border style based on accentBorders setting\n const cardBorderStyle = useCardBorderStyle(tokens, isTransparentTheme);\n \n // Glass mode container style (matching Container/AstroChart for bold/minimal)\n const glassContainerStyle: React.CSSProperties = useGlassMode ? {\n backgroundColor: 'rgba(10, 15, 25, 0.35)',\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n border: `1px solid ${glassAccentMuted}`,\n borderTop: isBoldVariant ? `2px solid ${glassAccentColor}` : `1px solid ${glassAccentColor}`,\n } : {};\n\n // Compact mode state management\n const { expanded, isPinned, isHovered: _isHovered, handlers, transitionDuration: compactTransition } = useCompactMode({\n compact,\n defaultExpanded,\n onPinChange,\n });\n \n // Track if we're animating to prevent flicker\n const [_isAnimating, _setIsAnimating] = useState(false);\n \n // Smooth animation timing\n const animationDuration = prefersReducedMotion ? 0 : 250;\n const animationEasing = 'cubic-bezier(0.4, 0, 0.2, 1)';\n\n // Computed statuses\n const healthStatus = useMemo(\n () => getHealthStatus(telemetry?.health?.status),\n [telemetry?.health?.status]\n );\n\n const batteryStatus = useMemo(\n () => getBatteryStatus(telemetry?.power?.batteryLevel),\n [telemetry?.power?.batteryLevel]\n );\n\n const transitionDuration = prefersReducedMotion ? '0ms' : '200ms';\n\n // Loading state\n if (loading) {\n return (\n <div\n className={classNames('zendir-telemetry-card', 'loading', className)}\n role=\"article\"\n aria-busy=\"true\"\n aria-label=\"Loading telemetry data\"\n style={{\n backgroundColor: cardBg,\n ...cardGlass,\n ...cardBorderStyle,\n borderRadius: tokens.borderRadius.lg,\n padding: tokens.spacing.md,\n minHeight: 200,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 16 }}>\n <div\n style={{\n width: 24,\n height: 24,\n borderRadius: 4,\n backgroundColor: 'rgba(255,255,255,0.1)',\n }}\n />\n <div\n style={{\n height: 16,\n width: '40%',\n backgroundColor: 'rgba(255,255,255,0.1)',\n borderRadius: 4,\n }}\n />\n </div>\n {[1, 2, 3].map((i) => (\n <div key={i} style={{ marginBottom: 16 }}>\n <div\n style={{\n height: 12,\n width: '30%',\n backgroundColor: 'rgba(255,255,255,0.08)',\n borderRadius: 2,\n marginBottom: 8,\n }}\n />\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: 8,\n }}\n >\n {[1, 2, 3, 4].map((j) => (\n <div\n key={j}\n style={{\n height: 32,\n backgroundColor: 'rgba(255,255,255,0.06)',\n borderRadius: 4,\n }}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n // Empty state\n if (!telemetry) {\n return (\n <div\n className={classNames('zendir-telemetry-card', 'empty', className)}\n role=\"article\"\n aria-label=\"No telemetry data\"\n style={{\n backgroundColor: cardBg,\n ...cardGlass,\n ...(tokens.colors.border.cardStyleDashed ?? {}),\n borderRadius: tokens.borderRadius.lg,\n padding: tokens.spacing.lg,\n textAlign: 'center',\n color: tokens.colors.text.tertiary,\n }}\n >\n <AstroIcon name=\"antenna\" size=\"normal\" label=\"\" style={{ opacity: 0.5 }} />\n <p style={{ margin: '8px 0 0 0', fontSize: tokens.typography.body[2].fontSize }}>No telemetry data available</p>\n </div>\n );\n }\n\n const sectionStyle: React.CSSProperties = {\n marginBottom: tokens.spacing.md,\n paddingBottom: tokens.spacing.md,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n };\n\n /** Fixed width so all section and metric icons align on one vertical line */\n const iconColumnWidth = 20;\n const iconGap = tokens.spacing.sm;\n const rowGap = tokens.spacing.smd;\n const sectionGridColumns = `${iconColumnWidth}px 1fr ${iconColumnWidth}px 1fr`;\n\n // Compact metric item component for consistent styling\n const CompactMetric = ({ \n icon, \n label, \n value, \n color, \n astroIcon \n }: { \n icon?: string; \n label: string; \n value: string | number; \n color?: string;\n astroIcon?: string;\n }) => (\n <div style={{ \n display: 'flex', \n alignItems: 'center', \n gap: 3,\n padding: `2px 0`,\n }}>\n {astroIcon ? (\n <AstroIcon name={astroIcon} size={12} color={color ?? tokens.colors.text.secondary} />\n ) : icon ? (\n <Icon name={icon as IconName} size={12} color={color ?? tokens.colors.text.secondary} />\n ) : null}\n <span style={{ \n fontSize: tokens.typography.fontSize.micro, // 0.5625rem / 9px (AstroUXDS micro)\n fontWeight: tokens.typography.fontWeight.medium,\n fontFamily: tokens.typography.fontFamily.primary, // Public Sans → Roboto fallback → system stack\n color: tokens.colors.text.tertiary,\n textTransform: 'uppercase',\n minWidth: 8,\n }}>\n {label.charAt(0)}\n </span>\n <span style={{ \n fontVariantNumeric: 'tabular-nums', \n fontFamily: tokens.typography.fontFamily.mono,\n fontSize: tokens.typography.fontSize.xs,\n color: color ?? tokens.colors.text.primary,\n fontWeight: tokens.typography.fontWeight.medium,\n }}>\n {value}\n </span>\n </div>\n );\n\n // Compact view content - reusable for both states\n const renderCompactContent = () => {\n const power = telemetry?.power ?? telemetry?.subsystems?.power;\n const attitude = telemetry?.attitude ?? telemetry?.subsystems?.attitude;\n const comms = telemetry?.communications ?? telemetry?.subsystems?.comms;\n const thermal = telemetry?.subsystems?.thermal;\n const compactStatusColor = getStatusColor(healthStatus);\n\n return (\n <>\n {/* Header: Icon with status badge overlay → Name → (flex) → Badges on right */}\n {/* Follows MonitoringIcon layout pattern for consistency */}\n <div style={{ \n display: 'flex', \n alignItems: 'center', \n justifyContent: 'space-between', \n marginBottom: tokens.spacing.xs,\n paddingBottom: tokens.spacing.xs,\n borderBottom: useGlassMode ? 'none' : `1px solid ${tokens.colors.border.muted}`,\n position: 'relative',\n zIndex: 1,\n }}>\n {/* Left side: Icon with status badge + Name */}\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.sm, minWidth: 0, flex: 1 }}>\n {/* Icon with status badge - MonitoringIcon pattern */}\n <HeaderIconWithStatus \n icon=\"antenna-receive\" \n size={20} \n status={healthStatus}\n statusColor={compactStatusColor}\n />\n {/* Name - accent color for glass mode */}\n <span style={{ \n fontWeight: tokens.typography.fontWeight.semibold, \n fontSize: tokens.typography.fontSize.sm,\n fontFamily: tokens.typography.fontFamily.primary,\n color: useGlassMode ? glassAccentColor : undefined,\n textShadow: useGlassMode ? `0 0 16px ${glassAccentMuted}` : undefined,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n minWidth: 0,\n }}>\n {spacecraftName ? spacecraftName.split(' ')[0] : 'Telemetry'}\n </span>\n {/* Accent line for glass mode */}\n {useGlassMode && (\n <div style={{\n flex: 1,\n height: isBoldVariant ? '2px' : '1px',\n minWidth: 20,\n background: `linear-gradient(90deg, ${glassAccentColor} 0%, ${glassAccentMuted} 60%, transparent 100%)`,\n boxShadow: isBoldVariant ? `0 0 8px ${glassAccentMuted}` : undefined,\n }} />\n )}\n </div>\n \n {/* Right side: Badges (pin indicator, etc.) */}\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.xs, flexShrink: 0 }}>\n {isPinned && (\n <Icon name=\"lock\" size={10} color={tokens.colors.accent.primary} />\n )}\n </div>\n </div>\n\n {/* Metrics grid */}\n <div style={{ \n display: 'grid', \n gridTemplateColumns: 'repeat(3, 1fr)',\n gap: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n }}>\n {/* Power metrics */}\n {showPower && power && (\n <>\n {power.batteryLevel !== undefined && (\n <CompactMetric \n icon=\"battery\" \n label=\"Battery\" \n value={`${safeNumber(power.batteryLevel, 0)}%`}\n color={getStatusColor(batteryStatus)}\n />\n )}\n {(power.solarGeneration ?? power.solarArrayOutput) !== undefined && (\n <CompactMetric \n astroIcon=\"solar\" \n label=\"Solar\" \n value={`${safeNumber(power.solarGeneration ?? power.solarArrayOutput, 1)}W`}\n color={tokens.colors.status.standby}\n />\n )}\n {power.voltage !== undefined && (\n <CompactMetric \n astroIcon=\"propulsion-power\" \n label=\"Voltage\" \n value={`${safeNumber(power.voltage, 1)}V`}\n />\n )}\n </>\n )}\n\n {/* Attitude metrics */}\n {showAttitude && attitude && (\n <>\n {attitude.pointingError !== undefined && (\n <CompactMetric \n astroIcon=\"explore\" \n label=\"Pointing\" \n value={`${safeNumber(attitude.pointingError, 2)}°`}\n />\n )}\n {attitude.targetMode && (\n <CompactMetric \n astroIcon=\"explore\" \n label=\"Mode\" \n value={attitude.targetMode}\n />\n )}\n </>\n )}\n\n {/* Thermal metrics */}\n {thermal && (\n <>\n {thermal.cpuTemp !== undefined && (\n <CompactMetric \n icon=\"thermometer\" \n label=\"CPU\" \n value={`${safeNumber(thermal.cpuTemp, 0)}°C`}\n color={thermal.cpuTemp > 50 ? tokens.colors.status.caution : undefined}\n />\n )}\n </>\n )}\n\n {/* Comms metrics */}\n {showComms && comms && (\n <>\n {comms.signalStrength !== undefined && (\n <CompactMetric \n astroIcon=\"antenna\" \n label=\"Signal\" \n value={`${safeNumber(comms.signalStrength, 0)}%`}\n />\n )}\n {(comms.downlinkRate ?? comms.dataRate) !== undefined && (\n <CompactMetric \n astroIcon=\"antenna-transmit\" \n label=\"Rate\" \n value={`${safeNumber(comms.downlinkRate ?? comms.dataRate, 0)}Mb`}\n />\n )}\n {comms.transmitterStatus && (\n <CompactMetric \n astroIcon=\"antenna-receive\" \n label=\"TX\" \n value={comms.transmitterStatus === 'transmitting' ? 'ON' : 'OFF'}\n color={comms.transmitterStatus === 'transmitting' ? tokens.colors.status.normal : tokens.colors.status.off}\n />\n )}\n </>\n )}\n </div>\n </>\n );\n };\n\n // Compact mode with overlay expansion - prevents layout shift\n if (compact) {\n return (\n <article\n className={classNames('zendir-telemetry-card', 'compact', expanded ? 'expanded' : '', className)}\n {...handlers}\n aria-label={spacecraftName ? `${spacecraftName} Telemetry${expanded ? '' : ' (compact)'}` : 'Telemetry Data'}\n style={{\n position: 'relative',\n overflow: 'hidden',\n // Use glass container style for bold/minimal themes\n ...(useGlassMode ? glassContainerStyle : {\n backgroundColor: cardBg,\n ...cardGlass,\n ...cardBorderStyle,\n }),\n borderRadius: tokens.borderRadius.lg,\n padding: expanded ? tokens.spacing.md : tokens.spacing.sm,\n fontFamily: tokens.typography.fontFamily.primary,\n color: tokens.colors.text.primary,\n fontSize: expanded ? tokens.typography.fontSize.base : tokens.typography.fontSize.sm,\n cursor: 'pointer',\n transition: `all ${animationDuration}ms ${animationEasing}`,\n boxShadow: expanded \n ? `0 12px 40px rgba(0,0,0,0.4), 0 0 0 1px ${tokens.colors.accent.primary}30` \n : 'none',\n zIndex: expanded ? 50 : 1,\n }}\n >\n {/* Glass gradient overlay for bold/minimal themes */}\n {useGlassMode && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n background: 'linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%, rgba(0,0,0,0.1) 100%)',\n pointerEvents: 'none',\n zIndex: 0,\n }}\n />\n )}\n {expanded ? (\n // Full expanded content - resolve data with fallbacks like compact view\n (() => {\n const power = telemetry?.power ?? telemetry?.subsystems?.power;\n const attitude = telemetry?.attitude ?? telemetry?.subsystems?.attitude;\n const comms = telemetry?.communications ?? telemetry?.subsystems?.comms;\n return (\n <>\n {/* Header - consistent icon/status with compact view */}\n <header\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: tokens.spacing.md,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.sm }}>\n {/* Icon with status badge - MonitoringIcon pattern */}\n <HeaderIconWithStatus \n icon=\"antenna-receive\" \n size={24} \n status={healthStatus}\n />\n <h3\n style={{\n margin: 0,\n fontSize: tokens.typography.fontSize.md,\n fontWeight: tokens.typography.fontWeight.semibold,\n }}\n >\n {spacecraftName ? `${spacecraftName} Telemetry` : 'Telemetry'}\n </h3>\n {isPinned && (\n <Icon name=\"lock\" size={12} color={tokens.colors.accent.primary} style={{ marginLeft: 4 }} />\n )}\n </div>\n <StatusIndicator status={healthStatus} label={healthStatus} small />\n </header>\n\n {/* Power Section - fixed icon column so all icons align vertically */}\n {showPower && (\n <section style={sectionStyle} aria-label=\"Power subsystem\">\n <div style={{ display: 'grid', gridTemplateColumns: sectionGridColumns, gap: `${rowGap} ${iconGap}`, alignItems: 'center' }}>\n <AstroIcon name=\"propulsion-power\" size={12} color={tokens.colors.text.tertiary} />\n <h4 style={{ margin: 0, gridColumn: '2 / -1', fontSize: tokens.typography.fontSize.xs, fontWeight: tokens.typography.fontWeight.medium, color: tokens.colors.text.secondary }}>\n Power\n </h4>\n <AstroIcon name={getPropertyConfig('battery').icon} size={16} color={getStatusColor(batteryStatus)} />\n <DataValue property=\"battery\" value={power?.batteryLevel} size=\"sm\" variant=\"card\" showIcon={false} />\n <AstroIcon name={getPropertyConfig('voltage').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"voltage\" value={power?.voltage} size=\"sm\" variant=\"card\" showIcon={false} />\n <AstroIcon name={getPropertyConfig('solarPower').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"solarPower\" value={power?.solarGeneration ?? power?.solarArrayOutput} size=\"sm\" variant=\"card\" status=\"standby\" showIcon={false} />\n <AstroIcon name={getPropertyConfig('load').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"load\" value={power?.consumption} size=\"sm\" variant=\"card\" showIcon={false} />\n </div>\n\n {/* Battery progress bar */}\n <div\n style={{\n marginTop: tokens.spacing.sm,\n height: 4,\n backgroundColor: tokens.colors.border.muted,\n borderRadius: 2,\n overflow: 'hidden',\n }}\n >\n <div\n role=\"progressbar\"\n aria-valuenow={power?.batteryLevel ?? 0}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label=\"Battery level\"\n style={{\n height: '100%',\n width: `${Math.min(100, Math.max(0, power?.batteryLevel ?? 0))}%`,\n backgroundColor: getStatusColor(batteryStatus),\n borderRadius: 2,\n transition: `width ${transitionDuration} ease-out`,\n }}\n />\n </div>\n </section>\n )}\n\n {/* Attitude Section - fixed icon column so all icons align vertically */}\n {showAttitude && (\n <section style={sectionStyle} aria-label=\"Attitude subsystem\">\n <div style={{ display: 'grid', gridTemplateColumns: sectionGridColumns, gap: `${rowGap} ${iconGap}`, alignItems: 'center' }}>\n <AstroIcon name=\"explore\" size={12} color={tokens.colors.text.tertiary} />\n <h4 style={{ margin: 0, gridColumn: '2 / -1', fontSize: tokens.typography.fontSize.xs, fontWeight: tokens.typography.fontWeight.medium, color: tokens.colors.text.secondary }}>\n Attitude\n </h4>\n <AstroIcon name={getPropertyConfig('roll').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"roll\" value={attitude?.eulerAngles?.roll ?? attitude?.pointingError} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n <AstroIcon name={getPropertyConfig('pitch').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"pitch\" value={attitude?.eulerAngles?.pitch} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n <AstroIcon name={getPropertyConfig('yaw').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"yaw\" value={attitude?.eulerAngles?.yaw} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n <AstroIcon name=\"explore\" size={16} color={tokens.colors.text.tertiary} />\n <DataValue label=\"Mode\" icon=\"explore\" value={attitude?.targetMode ?? '--'} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n </div>\n </section>\n )}\n\n {/* Communications Section - fixed icon column so all icons align vertically */}\n {showComms && (\n <section style={{ marginBottom: tokens.spacing.sm }} aria-label=\"Communications subsystem\">\n <div style={{ display: 'grid', gridTemplateColumns: sectionGridColumns, gap: `${rowGap} ${iconGap}`, alignItems: 'center' }}>\n <AstroIcon name=\"antenna\" size={12} color={tokens.colors.text.tertiary} />\n <h4 style={{ margin: 0, gridColumn: '2 / -1', fontSize: tokens.typography.fontSize.xs, fontWeight: tokens.typography.fontWeight.medium, color: tokens.colors.text.secondary }}>\n Communications\n </h4>\n <AstroIcon name=\"antenna-transmit\" size={16} color={tokens.colors.text.tertiary} />\n <DataValue label=\"Status\" icon=\"antenna-transmit\" value={comms?.transmitterStatus ?? comms?.status ?? '--'} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n <AstroIcon name={getPropertyConfig('signalStrength').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"signalStrength\" value={comms?.signalStrength} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n <AstroIcon name=\"antenna-receive\" size={16} color={tokens.colors.text.tertiary} />\n <DataValue label=\"Transmitted\" icon=\"antenna-receive\" value={comms?.packetsTransmitted ?? comms?.dataRate ?? '--'} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n <span style={{ gridColumn: '4 / -1' }} />\n </div>\n </section>\n )}\n\n {/* Timestamp */}\n {telemetry?.timestamp && (\n <time\n dateTime={telemetry.timestamp}\n style={{\n display: 'block',\n fontSize: tokens.typography.fontSize.xs,\n color: tokens.colors.text.tertiary,\n marginTop: tokens.spacing.sm,\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {formatTime(telemetry.timestamp)}\n </time>\n )}\n </>\n );\n })()\n ) : (\n // Compact content\n renderCompactContent()\n )}\n </article>\n );\n }\n\n return (\n <article\n className={classNames('zendir-telemetry-card', compact ? 'expanded' : '', className)}\n {...(compact ? handlers : {})}\n role={compact ? handlers.role : 'article'}\n tabIndex={compact ? handlers.tabIndex : undefined}\n aria-expanded={compact ? handlers['aria-expanded'] : undefined}\n aria-label={spacecraftName ? `${spacecraftName} Telemetry` : 'Telemetry Data'}\n style={{\n position: 'relative',\n overflow: 'hidden',\n ...(useGlassMode ? glassContainerStyle : {\n backgroundColor: cardBg,\n ...cardGlass,\n ...cardBorderStyle,\n }),\n borderRadius: tokens.borderRadius.lg,\n padding: tokens.spacing.md,\n fontFamily: tokens.typography.fontFamily.primary,\n color: tokens.colors.text.primary,\n fontSize: tokens.typography.fontSize.sm,\n cursor: compact ? 'pointer' : undefined,\n transition: compact ? `all ${compactTransition} ease-out` : undefined,\n }}\n >\n {/* Glass gradient overlay for bold/minimal themes */}\n {useGlassMode && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n background: 'linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%, rgba(0,0,0,0.1) 100%)',\n pointerEvents: 'none',\n zIndex: 0,\n }}\n />\n )}\n \n {/* Unified Card Header - handles all theme variants */}\n <CardHeader\n icon=\"antenna-receive\"\n title={spacecraftName ? `${spacecraftName} Telemetry` : 'Telemetry'}\n status={healthStatus}\n isPinned={compact && isPinned}\n />\n\n {/* Power Section - fixed icon column so all icons align vertically */}\n {showPower && (\n <section style={sectionStyle} aria-label=\"Power subsystem\">\n <div style={{ display: 'grid', gridTemplateColumns: sectionGridColumns, gap: `${rowGap} ${iconGap}`, alignItems: 'center' }}>\n <AstroIcon name=\"propulsion-power\" size={12} color={tokens.colors.text.tertiary} />\n <h4 style={{ margin: 0, gridColumn: '2 / -1', fontSize: tokens.typography.fontSize.xs, fontWeight: tokens.typography.fontWeight.medium, color: tokens.colors.text.secondary }}>\n Power\n </h4>\n <AstroIcon name={getPropertyConfig('battery').icon} size={16} color={getStatusColor(batteryStatus)} />\n <DataValue property=\"battery\" value={telemetry.power?.batteryLevel} size=\"sm\" variant=\"card\" showIcon={false} />\n <AstroIcon name={getPropertyConfig('voltage').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"voltage\" value={telemetry.power?.voltage} size=\"sm\" variant=\"card\" showIcon={false} />\n <AstroIcon name={getPropertyConfig('solarPower').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"solarPower\" value={telemetry.power?.solarGeneration} size=\"sm\" variant=\"card\" status=\"standby\" showIcon={false} />\n <AstroIcon name={getPropertyConfig('load').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"load\" value={telemetry.power?.consumption} size=\"sm\" variant=\"card\" showIcon={false} />\n </div>\n\n {/* Battery progress bar */}\n <div\n style={{\n marginTop: tokens.spacing.sm,\n height: 4,\n backgroundColor: tokens.colors.border.muted,\n borderRadius: 2,\n overflow: 'hidden',\n }}\n >\n <div\n role=\"progressbar\"\n aria-valuenow={telemetry.power?.batteryLevel ?? 0}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label=\"Battery level\"\n style={{\n height: '100%',\n width: `${Math.min(100, Math.max(0, telemetry.power?.batteryLevel ?? 0))}%`,\n backgroundColor: getStatusColor(batteryStatus),\n borderRadius: 2,\n transition: `width ${transitionDuration} ease-out`,\n }}\n />\n </div>\n </section>\n )}\n\n {/* Attitude Section - fixed icon column so all icons align vertically */}\n {showAttitude && (\n <section style={sectionStyle} aria-label=\"Attitude subsystem\">\n <div style={{ display: 'grid', gridTemplateColumns: sectionGridColumns, gap: `${rowGap} ${iconGap}`, alignItems: 'center' }}>\n <AstroIcon name=\"explore\" size={12} color={tokens.colors.text.tertiary} />\n <h4 style={{ margin: 0, gridColumn: '2 / -1', fontSize: tokens.typography.fontSize.xs, fontWeight: tokens.typography.fontWeight.medium, color: tokens.colors.text.secondary }}>\n Attitude\n </h4>\n <AstroIcon name={getPropertyConfig('roll').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"roll\" value={telemetry.attitude?.eulerAngles?.roll} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n <AstroIcon name={getPropertyConfig('pitch').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"pitch\" value={telemetry.attitude?.eulerAngles?.pitch} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n <AstroIcon name={getPropertyConfig('yaw').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"yaw\" value={telemetry.attitude?.eulerAngles?.yaw} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n <AstroIcon name=\"explore\" size={16} color={tokens.colors.text.tertiary} />\n <DataValue label=\"Mode\" icon=\"explore\" value={telemetry.attitude?.targetMode ?? '--'} size=\"sm\" variant=\"card\" showStatus={false} showIcon={false} />\n </div>\n {telemetry.attitude?.pointingError !== undefined && (\n <div style={{ display: 'flex', alignItems: 'center', gap: iconGap, marginTop: tokens.spacing.sm }}>\n <AstroIcon name={getPropertyConfig('pointingError').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"pointingError\" value={telemetry.attitude.pointingError} size=\"sm\" variant=\"inline\" showIcon={false} />\n </div>\n )}\n </section>\n )}\n\n {/* Communications Section - fixed icon column so all icons align vertically */}\n {showComms && (\n <section style={{ marginBottom: tokens.spacing.md }} aria-label=\"Communications subsystem\">\n <div style={{ display: 'grid', gridTemplateColumns: sectionGridColumns, gap: `${rowGap} ${iconGap}`, alignItems: 'center' }}>\n <AstroIcon name=\"antenna\" size={12} color={tokens.colors.text.tertiary} />\n <h4 style={{ margin: 0, gridColumn: '2 / -1', fontSize: tokens.typography.fontSize.xs, fontWeight: tokens.typography.fontWeight.medium, color: tokens.colors.text.secondary }}>\n Communications\n </h4>\n <AstroIcon name=\"antenna-transmit\" size={16} color={tokens.colors.text.tertiary} />\n <DataValue\n label=\"Status\"\n icon=\"antenna-transmit\"\n value={telemetry.communications?.transmitterStatus ?? '--'}\n size=\"sm\"\n variant=\"card\"\n showIcon={false}\n status={\n telemetry.communications?.transmitterStatus === 'transmitting'\n ? 'normal'\n : telemetry.communications?.transmitterStatus === 'error'\n ? 'critical'\n : 'off'\n }\n />\n <AstroIcon name={getPropertyConfig('queue').icon} size={16} color={tokens.colors.text.tertiary} />\n <DataValue property=\"queue\" value={telemetry.communications?.packetsQueued} size=\"sm\" variant=\"card\" showIcon={false} />\n <AstroIcon name=\"antenna-receive\" size={16} color={tokens.colors.text.tertiary} />\n <DataValue\n label=\"Transmitted\"\n icon=\"antenna-receive\"\n value={safeNumber((telemetry.communications?.bytesTransmitted ?? 0) / 1024, 1)}\n unit=\"KB\"\n size=\"sm\"\n variant=\"card\"\n showStatus={false}\n showIcon={false}\n />\n <span style={{ gridColumn: '4 / -1' }} />\n </div>\n </section>\n )}\n\n {/* Anomalies Alert */}\n {telemetry.health?.anomalies && telemetry.health.anomalies.length > 0 && (\n <div\n role=\"alert\"\n style={{\n backgroundColor: `${tokens.colors.status.critical}15`,\n border: `1px solid ${tokens.colors.status.critical}40`,\n borderRadius: tokens.borderRadius.md,\n padding: tokens.spacing.sm,\n marginTop: tokens.spacing.md,\n }}\n >\n <h4\n style={{\n margin: `0 0 ${tokens.spacing.xs} 0`,\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.medium,\n color: tokens.colors.status.critical,\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n }}\n >\n ⚠️ Anomalies ({telemetry.health.anomalies.length})\n </h4>\n <ul style={{ margin: 0, paddingLeft: 16 }}>\n {telemetry.health.anomalies.map((anomaly: { id: string; message: string; severity?: string }, idx: number) => (\n <li\n key={idx}\n style={{\n fontSize: tokens.typography.fontSize.xs,\n color: tokens.colors.status.critical,\n marginTop: 2,\n }}\n >\n {typeof anomaly === 'object' && anomaly !== null && 'message' in anomaly ? anomaly.message : String(anomaly)}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {/* Timestamp Footer */}\n <footer\n style={{\n marginTop: tokens.spacing.md,\n fontSize: tokens.typography.fontSize.xs,\n color: tokens.colors.text.secondary, // WCAG AA compliant - 4.5:1 contrast\n textAlign: 'right',\n }}\n >\n <time dateTime={telemetry.timestamp}>{formatTime(telemetry.timestamp)} UTC</time>\n </footer>\n </article>\n );\n});\n\n// Note: DataCell is deprecated in favor of DataValue from core.\n// Use <DataValue property=\"...\" value={...} /> for automatic icon/status integration.\n"],"names":["TelemetryCard","_a","_b","_c","_d","_e","_f"],"mappings":"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"}
1
+ {"version":3,"file":"TelemetryCard.js","names":[],"sources":["../../../src/react/cards/TelemetryCard.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - TelemetryCard Component\r\n *\r\n * Enterprise-grade spacecraft telemetry data card.\r\n *\r\n * AstroUXDS Compliance:\r\n * - Status colors used semantically (battery level, health status)\r\n * - Dual-coded status indicators (color + shape via StatusIndicator)\r\n * - Zendir accent colors for non-status elements (icons, decorative)\r\n * - Tabular numbers with fontVariantNumeric for data display\r\n * - Sentence-case labels per Tier 3 compliance\r\n *\r\n * Features:\r\n * - Full null-safety with graceful fallbacks\r\n * - WCAG 2.1 AA accessibility\r\n * - Subsystem toggles (power, attitude, comms)\r\n * - Anomaly alerts\r\n * - Loading and empty states\r\n */\r\n\r\nimport React, { memo, useMemo, useState } from \"react\";\r\nimport type { TelemetryData } from \"../types\";\r\nimport { useTheme } from \"../theme\";\r\nimport { StatusIndicator } from \"../astro\";\r\nimport { DataValue, DataValueGroup } from \"../core/data/DataValue\";\r\nimport { getPropertyConfig } from \"../core/data/propertyConfig\";\r\nimport { AstroIcon } from \"../core/display/AstroIcon\";\r\nimport { CardHeader } from \"../core/display/CardHeader\";\r\nimport { HeaderIconWithStatus } from \"../core/display/HeaderIconWithStatus\";\r\nimport { Icon, type IconName } from \"../core/display/Icon\";\r\nimport { useCompactMode } from \"../hooks\";\r\nimport { useCardBorderStyle } from \"../context/DisplaySettingsContext\";\r\nimport {\r\n safeNumber,\r\n formatTime,\r\n classNames,\r\n getStatusColor,\r\n deriveBatteryStatus,\r\n normalizeStatus,\r\n type StatusLevel,\r\n} from \"../utils\";\r\n\r\nexport interface TelemetryCardProps {\r\n /** Telemetry data */\r\n telemetry?: TelemetryData;\r\n /** Spacecraft name */\r\n spacecraftName?: string;\r\n /** Show power subsystem */\r\n showPower?: boolean;\r\n /** Show attitude subsystem */\r\n showAttitude?: boolean;\r\n /** Show communications */\r\n showComms?: boolean;\r\n /** Loading state */\r\n loading?: boolean;\r\n /** Custom className */\r\n className?: string;\r\n /** Enable compact mode - shows condensed view that expands on hover/click */\r\n compact?: boolean;\r\n /** Start expanded when in compact mode (pinned state) */\r\n defaultExpanded?: boolean;\r\n /** Callback when pin state changes in compact mode */\r\n onPinChange?: (isPinned: boolean) => void;\r\n}\r\n\r\n/**\r\n * Get health status level\r\n * Uses normalizeStatus utility to convert SDK terms to StatusLevel\r\n */\r\nfunction getHealthStatus(healthStatus: string | undefined): StatusLevel {\r\n return normalizeStatus(healthStatus);\r\n}\r\n\r\n/**\r\n * Get battery status based on level\r\n * @deprecated Use deriveBatteryStatus from utils instead\r\n */\r\nfunction getBatteryStatus(level: number | undefined): StatusLevel {\r\n return deriveBatteryStatus(level);\r\n}\r\n\r\n/**\r\n * TelemetryCard - Displays spacecraft telemetry data\r\n *\r\n * @example\r\n * ```tsx\r\n * <TelemetryCard\r\n * telemetry={telemetryData}\r\n * spacecraftName=\"ISS\"\r\n * showPower\r\n * showAttitude\r\n * showComms\r\n * />\r\n * ```\r\n */\r\nexport const TelemetryCard = memo(function TelemetryCard({\r\n telemetry,\r\n spacecraftName,\r\n showPower = true,\r\n showAttitude = true,\r\n showComms = true,\r\n loading = false,\r\n className = \"\",\r\n compact = false,\r\n defaultExpanded = false,\r\n onPinChange,\r\n}: TelemetryCardProps): React.ReactElement {\r\n const { tokens, theme, prefersReducedMotion } = useTheme();\r\n const isTransparentTheme =\r\n theme === \"transparent\" ||\r\n theme === \"transparent-bold\" ||\r\n theme === \"transparent-minimal\";\r\n const isBoldVariant = theme === \"transparent-bold\";\r\n const isMinimalVariant = theme === \"transparent-minimal\";\r\n const useGlassMode = isBoldVariant || isMinimalVariant;\r\n\r\n // Glass accent colors for bold/minimal themes (matching Container/AstroChart)\r\n const glassAccentColor = tokens.colors.accent.primary;\r\n const glassAccentMuted = `${glassAccentColor}66`;\r\n\r\n // Use transparent background with blur for transparent themes (matching Timeline)\r\n const cardBg = isTransparentTheme\r\n ? \"transparent\"\r\n : tokens.colors.background.surface;\r\n const cardGlass = isTransparentTheme\r\n ? {\r\n backdropFilter: \"blur(12px)\" as const,\r\n WebkitBackdropFilter: \"blur(12px)\" as const,\r\n }\r\n : {};\r\n // Get card border style based on accentBorders setting\r\n const cardBorderStyle = useCardBorderStyle(tokens, isTransparentTheme);\r\n\r\n // Glass mode container style (matching Container/AstroChart for bold/minimal)\r\n const glassContainerStyle: React.CSSProperties = useGlassMode\r\n ? {\r\n backgroundColor: \"rgba(10, 15, 25, 0.35)\",\r\n backdropFilter: \"blur(12px)\",\r\n WebkitBackdropFilter: \"blur(12px)\",\r\n border: `1px solid ${glassAccentMuted}`,\r\n borderTop: isBoldVariant\r\n ? `2px solid ${glassAccentColor}`\r\n : `1px solid ${glassAccentColor}`,\r\n }\r\n : {};\r\n\r\n // Compact mode state management\r\n const {\r\n expanded,\r\n isPinned,\r\n isHovered: _isHovered,\r\n handlers,\r\n transitionDuration: compactTransition,\r\n } = useCompactMode({\r\n compact,\r\n defaultExpanded,\r\n onPinChange,\r\n });\r\n\r\n // Track if we're animating to prevent flicker\r\n const [_isAnimating, _setIsAnimating] = useState(false);\r\n\r\n // Smooth animation timing\r\n const animationDuration = prefersReducedMotion ? 0 : 250;\r\n const animationEasing = \"cubic-bezier(0.4, 0, 0.2, 1)\";\r\n\r\n // Computed statuses\r\n const healthStatus = useMemo(\r\n () => getHealthStatus(telemetry?.health?.status),\r\n [telemetry?.health?.status],\r\n );\r\n\r\n const batteryStatus = useMemo(\r\n () => getBatteryStatus(telemetry?.power?.batteryLevel),\r\n [telemetry?.power?.batteryLevel],\r\n );\r\n\r\n const transitionDuration = prefersReducedMotion ? \"0ms\" : \"200ms\";\r\n\r\n // Loading state\r\n if (loading) {\r\n return (\r\n <div\r\n className={classNames(\"zendir-telemetry-card\", \"loading\", className)}\r\n role=\"article\"\r\n aria-busy=\"true\"\r\n aria-label=\"Loading telemetry data\"\r\n style={{\r\n backgroundColor: cardBg,\r\n ...cardGlass,\r\n ...cardBorderStyle,\r\n borderRadius: tokens.borderRadius.lg,\r\n padding: tokens.spacing.md,\r\n minHeight: 200,\r\n }}\r\n >\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 8,\r\n marginBottom: 16,\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: 24,\r\n height: 24,\r\n borderRadius: 4,\r\n backgroundColor: \"rgba(255,255,255,0.1)\",\r\n }}\r\n />\r\n <div\r\n style={{\r\n height: 16,\r\n width: \"40%\",\r\n backgroundColor: \"rgba(255,255,255,0.1)\",\r\n borderRadius: 4,\r\n }}\r\n />\r\n </div>\r\n {[1, 2, 3].map((i) => (\r\n <div key={i} style={{ marginBottom: 16 }}>\r\n <div\r\n style={{\r\n height: 12,\r\n width: \"30%\",\r\n backgroundColor: \"rgba(255,255,255,0.08)\",\r\n borderRadius: 2,\r\n marginBottom: 8,\r\n }}\r\n />\r\n <div\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"repeat(2, 1fr)\",\r\n gap: 8,\r\n }}\r\n >\r\n {[1, 2, 3, 4].map((j) => (\r\n <div\r\n key={j}\r\n style={{\r\n height: 32,\r\n backgroundColor: \"rgba(255,255,255,0.06)\",\r\n borderRadius: 4,\r\n }}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n // Empty state\r\n if (!telemetry) {\r\n return (\r\n <div\r\n className={classNames(\"zendir-telemetry-card\", \"empty\", className)}\r\n role=\"article\"\r\n aria-label=\"No telemetry data\"\r\n style={{\r\n backgroundColor: cardBg,\r\n ...cardGlass,\r\n ...(tokens.colors.border.cardStyleDashed ?? {}),\r\n borderRadius: tokens.borderRadius.lg,\r\n padding: tokens.spacing.lg,\r\n textAlign: \"center\",\r\n color: tokens.colors.text.tertiary,\r\n }}\r\n >\r\n <AstroIcon\r\n name=\"antenna\"\r\n size=\"normal\"\r\n label=\"\"\r\n style={{ opacity: 0.5 }}\r\n />\r\n <p\r\n style={{\r\n margin: \"8px 0 0 0\",\r\n fontSize: tokens.typography.body[2].fontSize,\r\n }}\r\n >\r\n No telemetry data available\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n const sectionStyle: React.CSSProperties = {\r\n marginBottom: tokens.spacing.md,\r\n paddingBottom: tokens.spacing.md,\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n };\r\n\r\n /** Fixed width so all section and metric icons align on one vertical line */\r\n const iconColumnWidth = 20;\r\n const iconGap = tokens.spacing.sm;\r\n const rowGap = tokens.spacing.smd;\r\n const sectionGridColumns = `${iconColumnWidth}px 1fr ${iconColumnWidth}px 1fr`;\r\n\r\n // Compact metric item component for consistent styling\r\n const CompactMetric = ({\r\n icon,\r\n label,\r\n value,\r\n color,\r\n astroIcon,\r\n }: {\r\n icon?: string;\r\n label: string;\r\n value: string | number;\r\n color?: string;\r\n astroIcon?: string;\r\n }) => (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 3,\r\n padding: `2px 0`,\r\n }}\r\n >\r\n {astroIcon ? (\r\n <AstroIcon\r\n name={astroIcon}\r\n size={12}\r\n color={color ?? tokens.colors.text.secondary}\r\n />\r\n ) : icon ? (\r\n <Icon\r\n name={icon as IconName}\r\n size={12}\r\n color={color ?? tokens.colors.text.secondary}\r\n />\r\n ) : null}\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.micro, // 0.5625rem / 9px (AstroUXDS micro)\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n fontFamily: tokens.typography.fontFamily.primary, // Public Sans → Roboto fallback → system stack\r\n color: tokens.colors.text.tertiary,\r\n textTransform: \"uppercase\",\r\n minWidth: 8,\r\n }}\r\n >\r\n {label.charAt(0)}\r\n </span>\r\n <span\r\n style={{\r\n fontVariantNumeric: \"tabular-nums\",\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n fontSize: tokens.typography.fontSize.xs,\r\n color: color ?? tokens.colors.text.primary,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n }}\r\n >\r\n {value}\r\n </span>\r\n </div>\r\n );\r\n\r\n // Compact view content - reusable for both states\r\n const renderCompactContent = () => {\r\n const power = telemetry?.power ?? telemetry?.subsystems?.power;\r\n const attitude = telemetry?.attitude ?? telemetry?.subsystems?.attitude;\r\n const comms = telemetry?.communications ?? telemetry?.subsystems?.comms;\r\n const thermal = telemetry?.subsystems?.thermal;\r\n const compactStatusColor = getStatusColor(healthStatus);\r\n\r\n return (\r\n <>\r\n {/* Header: Icon with status badge overlay → Name → (flex) → Badges on right */}\r\n {/* Follows MonitoringIcon layout pattern for consistency */}\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n marginBottom: tokens.spacing.xs,\r\n paddingBottom: tokens.spacing.xs,\r\n borderBottom: useGlassMode\r\n ? \"none\"\r\n : `1px solid ${tokens.colors.border.muted}`,\r\n position: \"relative\",\r\n zIndex: 1,\r\n }}\r\n >\r\n {/* Left side: Icon with status badge + Name */}\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.sm,\r\n minWidth: 0,\r\n flex: 1,\r\n }}\r\n >\r\n {/* Icon with status badge - MonitoringIcon pattern */}\r\n <HeaderIconWithStatus\r\n icon=\"antenna-receive\"\r\n size={20}\r\n status={healthStatus}\r\n statusColor={compactStatusColor}\r\n />\r\n {/* Name - accent color for glass mode */}\r\n <span\r\n style={{\r\n fontWeight: tokens.typography.fontWeight.semibold,\r\n fontSize: tokens.typography.fontSize.sm,\r\n fontFamily: tokens.typography.fontFamily.primary,\r\n color: useGlassMode ? glassAccentColor : undefined,\r\n textShadow: useGlassMode\r\n ? `0 0 16px ${glassAccentMuted}`\r\n : undefined,\r\n whiteSpace: \"nowrap\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n minWidth: 0,\r\n }}\r\n >\r\n {spacecraftName ? spacecraftName.split(\" \")[0] : \"Telemetry\"}\r\n </span>\r\n {/* Accent line for glass mode */}\r\n {useGlassMode && (\r\n <div\r\n style={{\r\n flex: 1,\r\n height: isBoldVariant ? \"2px\" : \"1px\",\r\n minWidth: 20,\r\n background: `linear-gradient(90deg, ${glassAccentColor} 0%, ${glassAccentMuted} 60%, transparent 100%)`,\r\n boxShadow: isBoldVariant\r\n ? `0 0 8px ${glassAccentMuted}`\r\n : undefined,\r\n }}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Right side: Badges (pin indicator, etc.) */}\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.xs,\r\n flexShrink: 0,\r\n }}\r\n >\r\n {isPinned && (\r\n <Icon\r\n name=\"lock\"\r\n size={10}\r\n color={tokens.colors.accent.primary}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Metrics grid */}\r\n <div\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"repeat(3, 1fr)\",\r\n gap: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\r\n }}\r\n >\r\n {/* Power metrics */}\r\n {showPower && power && (\r\n <>\r\n {power.batteryLevel !== undefined && (\r\n <CompactMetric\r\n icon=\"battery\"\r\n label=\"Battery\"\r\n value={`${safeNumber(power.batteryLevel, 0)}%`}\r\n color={getStatusColor(batteryStatus)}\r\n />\r\n )}\r\n {(power.solarGeneration ?? power.solarArrayOutput) !==\r\n undefined && (\r\n <CompactMetric\r\n astroIcon=\"solar\"\r\n label=\"Solar\"\r\n value={`${safeNumber(power.solarGeneration ?? power.solarArrayOutput, 1)}W`}\r\n color={tokens.colors.status.standby}\r\n />\r\n )}\r\n {power.voltage !== undefined && (\r\n <CompactMetric\r\n astroIcon=\"propulsion-power\"\r\n label=\"Voltage\"\r\n value={`${safeNumber(power.voltage, 1)}V`}\r\n />\r\n )}\r\n </>\r\n )}\r\n\r\n {/* Attitude metrics */}\r\n {showAttitude && attitude && (\r\n <>\r\n {attitude.pointingError !== undefined && (\r\n <CompactMetric\r\n astroIcon=\"explore\"\r\n label=\"Pointing\"\r\n value={`${safeNumber(attitude.pointingError, 2)}°`}\r\n />\r\n )}\r\n {attitude.targetMode && (\r\n <CompactMetric\r\n astroIcon=\"explore\"\r\n label=\"Mode\"\r\n value={attitude.targetMode}\r\n />\r\n )}\r\n </>\r\n )}\r\n\r\n {/* Thermal metrics */}\r\n {thermal && (\r\n <>\r\n {thermal.cpuTemp !== undefined && (\r\n <CompactMetric\r\n icon=\"thermometer\"\r\n label=\"CPU\"\r\n value={`${safeNumber(thermal.cpuTemp, 0)}°C`}\r\n color={\r\n thermal.cpuTemp > 50\r\n ? tokens.colors.status.caution\r\n : undefined\r\n }\r\n />\r\n )}\r\n </>\r\n )}\r\n\r\n {/* Comms metrics */}\r\n {showComms && comms && (\r\n <>\r\n {comms.signalStrength !== undefined && (\r\n <CompactMetric\r\n astroIcon=\"antenna\"\r\n label=\"Signal\"\r\n value={`${safeNumber(comms.signalStrength, 0)}%`}\r\n />\r\n )}\r\n {(comms.downlinkRate ?? comms.dataRate) !== undefined && (\r\n <CompactMetric\r\n astroIcon=\"antenna-transmit\"\r\n label=\"Rate\"\r\n value={`${safeNumber(comms.downlinkRate ?? comms.dataRate, 0)}Mb`}\r\n />\r\n )}\r\n {comms.transmitterStatus && (\r\n <CompactMetric\r\n astroIcon=\"antenna-receive\"\r\n label=\"TX\"\r\n value={\r\n comms.transmitterStatus === \"transmitting\" ? \"ON\" : \"OFF\"\r\n }\r\n color={\r\n comms.transmitterStatus === \"transmitting\"\r\n ? tokens.colors.status.normal\r\n : tokens.colors.status.off\r\n }\r\n />\r\n )}\r\n </>\r\n )}\r\n </div>\r\n </>\r\n );\r\n };\r\n\r\n // Compact mode with overlay expansion - prevents layout shift\r\n if (compact) {\r\n return (\r\n <article\r\n className={classNames(\r\n \"zendir-telemetry-card\",\r\n \"compact\",\r\n expanded ? \"expanded\" : \"\",\r\n className,\r\n )}\r\n {...handlers}\r\n aria-label={\r\n spacecraftName\r\n ? `${spacecraftName} Telemetry${expanded ? \"\" : \" (compact)\"}`\r\n : \"Telemetry Data\"\r\n }\r\n style={{\r\n position: \"relative\",\r\n overflow: \"hidden\",\r\n // Use glass container style for bold/minimal themes\r\n ...(useGlassMode\r\n ? glassContainerStyle\r\n : {\r\n backgroundColor: cardBg,\r\n ...cardGlass,\r\n ...cardBorderStyle,\r\n }),\r\n borderRadius: tokens.borderRadius.lg,\r\n padding: expanded ? tokens.spacing.md : tokens.spacing.sm,\r\n fontFamily: tokens.typography.fontFamily.primary,\r\n color: tokens.colors.text.primary,\r\n fontSize: expanded\r\n ? tokens.typography.fontSize.base\r\n : tokens.typography.fontSize.sm,\r\n cursor: \"pointer\",\r\n transition: `all ${animationDuration}ms ${animationEasing}`,\r\n boxShadow: expanded\r\n ? `0 12px 40px rgba(0,0,0,0.4), 0 0 0 1px ${tokens.colors.accent.primary}30`\r\n : \"none\",\r\n zIndex: expanded ? 50 : 1,\r\n }}\r\n >\r\n {/* Glass gradient overlay for bold/minimal themes */}\r\n {useGlassMode && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n background:\r\n \"linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%, rgba(0,0,0,0.1) 100%)\",\r\n pointerEvents: \"none\",\r\n zIndex: 0,\r\n }}\r\n />\r\n )}\r\n {expanded\r\n ? // Full expanded content - resolve data with fallbacks like compact view\r\n (() => {\r\n const power = telemetry?.power ?? telemetry?.subsystems?.power;\r\n const attitude =\r\n telemetry?.attitude ?? telemetry?.subsystems?.attitude;\r\n const comms =\r\n telemetry?.communications ?? telemetry?.subsystems?.comms;\r\n return (\r\n <>\r\n {/* Header - consistent icon/status with compact view */}\r\n <header\r\n style={{\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n marginBottom: tokens.spacing.md,\r\n }}\r\n >\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.sm,\r\n }}\r\n >\r\n {/* Icon with status badge - MonitoringIcon pattern */}\r\n <HeaderIconWithStatus\r\n icon=\"antenna-receive\"\r\n size={24}\r\n status={healthStatus}\r\n />\r\n <h3\r\n style={{\r\n margin: 0,\r\n fontSize: tokens.typography.fontSize.md,\r\n fontWeight: tokens.typography.fontWeight.semibold,\r\n }}\r\n >\r\n {spacecraftName\r\n ? `${spacecraftName} Telemetry`\r\n : \"Telemetry\"}\r\n </h3>\r\n {isPinned && (\r\n <Icon\r\n name=\"lock\"\r\n size={12}\r\n color={tokens.colors.accent.primary}\r\n style={{ marginLeft: 4 }}\r\n />\r\n )}\r\n </div>\r\n <StatusIndicator\r\n status={healthStatus}\r\n label={healthStatus}\r\n small\r\n />\r\n </header>\r\n\r\n {/* Power Section - fixed icon column so all icons align vertically */}\r\n {showPower && (\r\n <section style={sectionStyle} aria-label=\"Power subsystem\">\r\n <div\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: sectionGridColumns,\r\n gap: `${rowGap} ${iconGap}`,\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <AstroIcon\r\n name=\"propulsion-power\"\r\n size={12}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <h4\r\n style={{\r\n margin: 0,\r\n gridColumn: \"2 / -1\",\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n color: tokens.colors.text.secondary,\r\n }}\r\n >\r\n Power\r\n </h4>\r\n <AstroIcon\r\n name={getPropertyConfig(\"battery\").icon}\r\n size={16}\r\n color={getStatusColor(batteryStatus)}\r\n />\r\n <DataValue\r\n property=\"battery\"\r\n value={power?.batteryLevel}\r\n size=\"sm\"\r\n variant=\"card\"\r\n showIcon={false}\r\n />\r\n <AstroIcon\r\n name={getPropertyConfig(\"voltage\").icon}\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n property=\"voltage\"\r\n value={power?.voltage}\r\n size=\"sm\"\r\n variant=\"card\"\r\n showIcon={false}\r\n />\r\n <AstroIcon\r\n name={getPropertyConfig(\"solarPower\").icon}\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n property=\"solarPower\"\r\n value={\r\n power?.solarGeneration ?? power?.solarArrayOutput\r\n }\r\n size=\"sm\"\r\n variant=\"card\"\r\n status=\"standby\"\r\n showIcon={false}\r\n />\r\n <AstroIcon\r\n name={getPropertyConfig(\"load\").icon}\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n property=\"load\"\r\n value={power?.consumption}\r\n size=\"sm\"\r\n variant=\"card\"\r\n showIcon={false}\r\n />\r\n </div>\r\n\r\n {/* Battery progress bar */}\r\n <div\r\n style={{\r\n marginTop: tokens.spacing.sm,\r\n height: 4,\r\n backgroundColor: tokens.colors.border.muted,\r\n borderRadius: 2,\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <div\r\n role=\"progressbar\"\r\n aria-valuenow={power?.batteryLevel ?? 0}\r\n aria-valuemin={0}\r\n aria-valuemax={100}\r\n aria-label=\"Battery level\"\r\n style={{\r\n height: \"100%\",\r\n width: `${Math.min(100, Math.max(0, power?.batteryLevel ?? 0))}%`,\r\n backgroundColor: getStatusColor(batteryStatus),\r\n borderRadius: 2,\r\n transition: `width ${transitionDuration} ease-out`,\r\n }}\r\n />\r\n </div>\r\n </section>\r\n )}\r\n\r\n {/* Attitude Section - fixed icon column so all icons align vertically */}\r\n {showAttitude && (\r\n <section\r\n style={sectionStyle}\r\n aria-label=\"Attitude subsystem\"\r\n >\r\n <div\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: sectionGridColumns,\r\n gap: `${rowGap} ${iconGap}`,\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <AstroIcon\r\n name=\"explore\"\r\n size={12}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <h4\r\n style={{\r\n margin: 0,\r\n gridColumn: \"2 / -1\",\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n color: tokens.colors.text.secondary,\r\n }}\r\n >\r\n Attitude\r\n </h4>\r\n <AstroIcon\r\n name={getPropertyConfig(\"roll\").icon}\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n property=\"roll\"\r\n value={\r\n attitude?.eulerAngles?.roll ??\r\n attitude?.pointingError\r\n }\r\n size=\"sm\"\r\n variant=\"card\"\r\n showStatus={false}\r\n showIcon={false}\r\n />\r\n <AstroIcon\r\n name={getPropertyConfig(\"pitch\").icon}\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n property=\"pitch\"\r\n value={attitude?.eulerAngles?.pitch}\r\n size=\"sm\"\r\n variant=\"card\"\r\n showStatus={false}\r\n showIcon={false}\r\n />\r\n <AstroIcon\r\n name={getPropertyConfig(\"yaw\").icon}\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n property=\"yaw\"\r\n value={attitude?.eulerAngles?.yaw}\r\n size=\"sm\"\r\n variant=\"card\"\r\n showStatus={false}\r\n showIcon={false}\r\n />\r\n <AstroIcon\r\n name=\"explore\"\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n label=\"Mode\"\r\n icon=\"explore\"\r\n value={attitude?.targetMode ?? \"--\"}\r\n size=\"sm\"\r\n variant=\"card\"\r\n showStatus={false}\r\n showIcon={false}\r\n />\r\n </div>\r\n </section>\r\n )}\r\n\r\n {/* Communications Section - fixed icon column so all icons align vertically */}\r\n {showComms && (\r\n <section\r\n style={{ marginBottom: tokens.spacing.sm }}\r\n aria-label=\"Communications subsystem\"\r\n >\r\n <div\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: sectionGridColumns,\r\n gap: `${rowGap} ${iconGap}`,\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <AstroIcon\r\n name=\"antenna\"\r\n size={12}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <h4\r\n style={{\r\n margin: 0,\r\n gridColumn: \"2 / -1\",\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n color: tokens.colors.text.secondary,\r\n }}\r\n >\r\n Communications\r\n </h4>\r\n <AstroIcon\r\n name=\"antenna-transmit\"\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n label=\"Status\"\r\n icon=\"antenna-transmit\"\r\n value={\r\n comms?.transmitterStatus ?? comms?.status ?? \"--\"\r\n }\r\n size=\"sm\"\r\n variant=\"card\"\r\n showStatus={false}\r\n showIcon={false}\r\n />\r\n <AstroIcon\r\n name={getPropertyConfig(\"signalStrength\").icon}\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n property=\"signalStrength\"\r\n value={comms?.signalStrength}\r\n size=\"sm\"\r\n variant=\"card\"\r\n showStatus={false}\r\n showIcon={false}\r\n />\r\n <AstroIcon\r\n name=\"antenna-receive\"\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n label=\"Transmitted\"\r\n icon=\"antenna-receive\"\r\n value={\r\n comms?.packetsTransmitted ?? comms?.dataRate ?? \"--\"\r\n }\r\n size=\"sm\"\r\n variant=\"card\"\r\n showStatus={false}\r\n showIcon={false}\r\n />\r\n <span style={{ gridColumn: \"4 / -1\" }} />\r\n </div>\r\n </section>\r\n )}\r\n\r\n {/* Timestamp */}\r\n {telemetry?.timestamp && (\r\n <time\r\n dateTime={telemetry.timestamp}\r\n style={{\r\n display: \"block\",\r\n fontSize: tokens.typography.fontSize.xs,\r\n color: tokens.colors.text.tertiary,\r\n marginTop: tokens.spacing.sm,\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {formatTime(telemetry.timestamp)}\r\n </time>\r\n )}\r\n </>\r\n );\r\n })()\r\n : // Compact content\r\n renderCompactContent()}\r\n </article>\r\n );\r\n }\r\n\r\n return (\r\n <article\r\n className={classNames(\r\n \"zendir-telemetry-card\",\r\n compact ? \"expanded\" : \"\",\r\n className,\r\n )}\r\n {...(compact ? handlers : {})}\r\n role={compact ? handlers.role : \"article\"}\r\n tabIndex={compact ? handlers.tabIndex : undefined}\r\n aria-expanded={compact ? handlers[\"aria-expanded\"] : undefined}\r\n aria-label={\r\n spacecraftName ? `${spacecraftName} Telemetry` : \"Telemetry Data\"\r\n }\r\n style={{\r\n position: \"relative\",\r\n overflow: \"hidden\",\r\n ...(useGlassMode\r\n ? glassContainerStyle\r\n : {\r\n backgroundColor: cardBg,\r\n ...cardGlass,\r\n ...cardBorderStyle,\r\n }),\r\n borderRadius: tokens.borderRadius.lg,\r\n padding: tokens.spacing.md,\r\n fontFamily: tokens.typography.fontFamily.primary,\r\n color: tokens.colors.text.primary,\r\n fontSize: tokens.typography.fontSize.sm,\r\n cursor: compact ? \"pointer\" : undefined,\r\n transition: compact ? `all ${compactTransition} ease-out` : undefined,\r\n }}\r\n >\r\n {/* Glass gradient overlay for bold/minimal themes */}\r\n {useGlassMode && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n background:\r\n \"linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%, rgba(0,0,0,0.1) 100%)\",\r\n pointerEvents: \"none\",\r\n zIndex: 0,\r\n }}\r\n />\r\n )}\r\n\r\n {/* Unified Card Header - handles all theme variants */}\r\n <CardHeader\r\n icon=\"antenna-receive\"\r\n title={spacecraftName ? `${spacecraftName} Telemetry` : \"Telemetry\"}\r\n status={healthStatus}\r\n isPinned={compact && isPinned}\r\n />\r\n\r\n {/* Power Section - fixed icon column so all icons align vertically */}\r\n {showPower && (\r\n <section style={sectionStyle} aria-label=\"Power subsystem\">\r\n <div\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: sectionGridColumns,\r\n gap: `${rowGap} ${iconGap}`,\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <AstroIcon\r\n name=\"propulsion-power\"\r\n size={12}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <h4\r\n style={{\r\n margin: 0,\r\n gridColumn: \"2 / -1\",\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n color: tokens.colors.text.secondary,\r\n }}\r\n >\r\n Power\r\n </h4>\r\n <AstroIcon\r\n name={getPropertyConfig(\"battery\").icon}\r\n size={16}\r\n color={getStatusColor(batteryStatus)}\r\n />\r\n <DataValue\r\n property=\"battery\"\r\n value={telemetry.power?.batteryLevel}\r\n size=\"sm\"\r\n variant=\"card\"\r\n showIcon={false}\r\n />\r\n <AstroIcon\r\n name={getPropertyConfig(\"voltage\").icon}\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n property=\"voltage\"\r\n value={telemetry.power?.voltage}\r\n size=\"sm\"\r\n variant=\"card\"\r\n showIcon={false}\r\n />\r\n <AstroIcon\r\n name={getPropertyConfig(\"solarPower\").icon}\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n property=\"solarPower\"\r\n value={telemetry.power?.solarGeneration}\r\n size=\"sm\"\r\n variant=\"card\"\r\n status=\"standby\"\r\n showIcon={false}\r\n />\r\n <AstroIcon\r\n name={getPropertyConfig(\"load\").icon}\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n property=\"load\"\r\n value={telemetry.power?.consumption}\r\n size=\"sm\"\r\n variant=\"card\"\r\n showIcon={false}\r\n />\r\n </div>\r\n\r\n {/* Battery progress bar */}\r\n <div\r\n style={{\r\n marginTop: tokens.spacing.sm,\r\n height: 4,\r\n backgroundColor: tokens.colors.border.muted,\r\n borderRadius: 2,\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <div\r\n role=\"progressbar\"\r\n aria-valuenow={telemetry.power?.batteryLevel ?? 0}\r\n aria-valuemin={0}\r\n aria-valuemax={100}\r\n aria-label=\"Battery level\"\r\n style={{\r\n height: \"100%\",\r\n width: `${Math.min(100, Math.max(0, telemetry.power?.batteryLevel ?? 0))}%`,\r\n backgroundColor: getStatusColor(batteryStatus),\r\n borderRadius: 2,\r\n transition: `width ${transitionDuration} ease-out`,\r\n }}\r\n />\r\n </div>\r\n </section>\r\n )}\r\n\r\n {/* Attitude Section - fixed icon column so all icons align vertically */}\r\n {showAttitude && (\r\n <section style={sectionStyle} aria-label=\"Attitude subsystem\">\r\n <div\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: sectionGridColumns,\r\n gap: `${rowGap} ${iconGap}`,\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <AstroIcon\r\n name=\"explore\"\r\n size={12}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <h4\r\n style={{\r\n margin: 0,\r\n gridColumn: \"2 / -1\",\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n color: tokens.colors.text.secondary,\r\n }}\r\n >\r\n Attitude\r\n </h4>\r\n <AstroIcon\r\n name={getPropertyConfig(\"roll\").icon}\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n property=\"roll\"\r\n value={telemetry.attitude?.eulerAngles?.roll}\r\n size=\"sm\"\r\n variant=\"card\"\r\n showStatus={false}\r\n showIcon={false}\r\n />\r\n <AstroIcon\r\n name={getPropertyConfig(\"pitch\").icon}\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n property=\"pitch\"\r\n value={telemetry.attitude?.eulerAngles?.pitch}\r\n size=\"sm\"\r\n variant=\"card\"\r\n showStatus={false}\r\n showIcon={false}\r\n />\r\n <AstroIcon\r\n name={getPropertyConfig(\"yaw\").icon}\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n property=\"yaw\"\r\n value={telemetry.attitude?.eulerAngles?.yaw}\r\n size=\"sm\"\r\n variant=\"card\"\r\n showStatus={false}\r\n showIcon={false}\r\n />\r\n <AstroIcon\r\n name=\"explore\"\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n label=\"Mode\"\r\n icon=\"explore\"\r\n value={telemetry.attitude?.targetMode ?? \"--\"}\r\n size=\"sm\"\r\n variant=\"card\"\r\n showStatus={false}\r\n showIcon={false}\r\n />\r\n </div>\r\n {telemetry.attitude?.pointingError !== undefined && (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: iconGap,\r\n marginTop: tokens.spacing.sm,\r\n }}\r\n >\r\n <AstroIcon\r\n name={getPropertyConfig(\"pointingError\").icon}\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n property=\"pointingError\"\r\n value={telemetry.attitude.pointingError}\r\n size=\"sm\"\r\n variant=\"inline\"\r\n showIcon={false}\r\n />\r\n </div>\r\n )}\r\n </section>\r\n )}\r\n\r\n {/* Communications Section - fixed icon column so all icons align vertically */}\r\n {showComms && (\r\n <section\r\n style={{ marginBottom: tokens.spacing.md }}\r\n aria-label=\"Communications subsystem\"\r\n >\r\n <div\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: sectionGridColumns,\r\n gap: `${rowGap} ${iconGap}`,\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <AstroIcon\r\n name=\"antenna\"\r\n size={12}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <h4\r\n style={{\r\n margin: 0,\r\n gridColumn: \"2 / -1\",\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n color: tokens.colors.text.secondary,\r\n }}\r\n >\r\n Communications\r\n </h4>\r\n <AstroIcon\r\n name=\"antenna-transmit\"\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n label=\"Status\"\r\n icon=\"antenna-transmit\"\r\n value={telemetry.communications?.transmitterStatus ?? \"--\"}\r\n size=\"sm\"\r\n variant=\"card\"\r\n showIcon={false}\r\n status={\r\n telemetry.communications?.transmitterStatus === \"transmitting\"\r\n ? \"normal\"\r\n : telemetry.communications?.transmitterStatus === \"error\"\r\n ? \"critical\"\r\n : \"off\"\r\n }\r\n />\r\n <AstroIcon\r\n name={getPropertyConfig(\"queue\").icon}\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n property=\"queue\"\r\n value={telemetry.communications?.packetsQueued}\r\n size=\"sm\"\r\n variant=\"card\"\r\n showIcon={false}\r\n />\r\n <AstroIcon\r\n name=\"antenna-receive\"\r\n size={16}\r\n color={tokens.colors.text.tertiary}\r\n />\r\n <DataValue\r\n label=\"Transmitted\"\r\n icon=\"antenna-receive\"\r\n value={safeNumber(\r\n (telemetry.communications?.bytesTransmitted ?? 0) / 1024,\r\n 1,\r\n )}\r\n unit=\"KB\"\r\n size=\"sm\"\r\n variant=\"card\"\r\n showStatus={false}\r\n showIcon={false}\r\n />\r\n <span style={{ gridColumn: \"4 / -1\" }} />\r\n </div>\r\n </section>\r\n )}\r\n\r\n {/* Anomalies Alert */}\r\n {telemetry.health?.anomalies && telemetry.health.anomalies.length > 0 && (\r\n <div\r\n role=\"alert\"\r\n style={{\r\n backgroundColor: `${tokens.colors.status.critical}15`,\r\n border: `1px solid ${tokens.colors.status.critical}40`,\r\n borderRadius: tokens.borderRadius.md,\r\n padding: tokens.spacing.sm,\r\n marginTop: tokens.spacing.md,\r\n }}\r\n >\r\n <h4\r\n style={{\r\n margin: `0 0 ${tokens.spacing.xs} 0`,\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n color: tokens.colors.status.critical,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 4,\r\n }}\r\n >\r\n ⚠️ Anomalies ({telemetry.health.anomalies.length})\r\n </h4>\r\n <ul style={{ margin: 0, paddingLeft: 16 }}>\r\n {telemetry.health.anomalies.map(\r\n (\r\n anomaly: { id: string; message: string; severity?: string },\r\n idx: number,\r\n ) => (\r\n <li\r\n key={idx}\r\n style={{\r\n fontSize: tokens.typography.fontSize.xs,\r\n color: tokens.colors.status.critical,\r\n marginTop: 2,\r\n }}\r\n >\r\n {typeof anomaly === \"object\" &&\r\n anomaly !== null &&\r\n \"message\" in anomaly\r\n ? anomaly.message\r\n : String(anomaly)}\r\n </li>\r\n ),\r\n )}\r\n </ul>\r\n </div>\r\n )}\r\n\r\n {/* Timestamp Footer */}\r\n <footer\r\n style={{\r\n marginTop: tokens.spacing.md,\r\n fontSize: tokens.typography.fontSize.xs,\r\n color: tokens.colors.text.secondary, // WCAG AA compliant - 4.5:1 contrast\r\n textAlign: \"right\",\r\n }}\r\n >\r\n <time dateTime={telemetry.timestamp}>\r\n {formatTime(telemetry.timestamp)} UTC\r\n </time>\r\n </footer>\r\n </article>\r\n );\r\n});\r\n\r\n// Note: DataCell is deprecated in favor of DataValue from core.\r\n// Use <DataValue property=\"...\" value={...} /> for automatic icon/status integration.\r\n"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { default as React } from 'react';
2
2
  import { StatusLevel } from '../utils';
3
-
4
3
  export interface TelemetryMetric {
5
4
  /** Unique identifier */
6
5
  id: string;