@zendir/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/LICENSE +21 -0
  3. package/README.md +589 -0
  4. package/dist/index.d.ts +8 -0
  5. package/dist/index.js +421 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/react/3d/EarthViewer.d.ts +46 -0
  8. package/dist/react/3d/EarthViewer.js +836 -0
  9. package/dist/react/3d/EarthViewer.js.map +1 -0
  10. package/dist/react/3d/SolarSystemViewer.d.ts +43 -0
  11. package/dist/react/3d/SolarSystemViewer.js +372 -0
  12. package/dist/react/3d/SolarSystemViewer.js.map +1 -0
  13. package/dist/react/3d/ZenSpace3D.d.ts +16 -0
  14. package/dist/react/3d/ZenSpace3D.js +1253 -0
  15. package/dist/react/3d/ZenSpace3D.js.map +1 -0
  16. package/dist/react/3d/ZenSpace3DCesium.d.ts +9 -0
  17. package/dist/react/3d/ZenSpace3DCesium.js +186 -0
  18. package/dist/react/3d/ZenSpace3DCesium.js.map +1 -0
  19. package/dist/react/3d/ZenSpace3DShaders.d.ts +78 -0
  20. package/dist/react/3d/ZenSpace3DShaders.js +94 -0
  21. package/dist/react/3d/ZenSpace3DShaders.js.map +1 -0
  22. package/dist/react/3d/ZenSpace3DTypes.d.ts +614 -0
  23. package/dist/react/3d/ZenSpace3DUtils.d.ts +183 -0
  24. package/dist/react/3d/ZenSpace3DUtils.js +213 -0
  25. package/dist/react/3d/ZenSpace3DUtils.js.map +1 -0
  26. package/dist/react/3d/index.d.ts +23 -0
  27. package/dist/react/3d/threeLoader.d.ts +22 -0
  28. package/dist/react/3d/threeLoader.js +18 -0
  29. package/dist/react/3d/threeLoader.js.map +1 -0
  30. package/dist/react/astro/ClassificationBanner.d.ts +25 -0
  31. package/dist/react/astro/ClassificationBanner.js +83 -0
  32. package/dist/react/astro/ClassificationBanner.js.map +1 -0
  33. package/dist/react/astro/GlobalStatusBar.d.ts +42 -0
  34. package/dist/react/astro/GlobalStatusBar.js +165 -0
  35. package/dist/react/astro/GlobalStatusBar.js.map +1 -0
  36. package/dist/react/astro/MissionClock.d.ts +169 -0
  37. package/dist/react/astro/MissionClock.js +411 -0
  38. package/dist/react/astro/MissionClock.js.map +1 -0
  39. package/dist/react/astro/MonitoringIcon.d.ts +60 -0
  40. package/dist/react/astro/MonitoringIcon.js +369 -0
  41. package/dist/react/astro/MonitoringIcon.js.map +1 -0
  42. package/dist/react/astro/Notification.d.ts +42 -0
  43. package/dist/react/astro/Notification.js +156 -0
  44. package/dist/react/astro/Notification.js.map +1 -0
  45. package/dist/react/astro/Progress.d.ts +39 -0
  46. package/dist/react/astro/Progress.js +149 -0
  47. package/dist/react/astro/Progress.js.map +1 -0
  48. package/dist/react/astro/SimulationControls.d.ts +136 -0
  49. package/dist/react/astro/SimulationControls.js +668 -0
  50. package/dist/react/astro/SimulationControls.js.map +1 -0
  51. package/dist/react/astro/StatusIndicator.d.ts +34 -0
  52. package/dist/react/astro/StatusIndicator.js +189 -0
  53. package/dist/react/astro/StatusIndicator.js.map +1 -0
  54. package/dist/react/astro/UnifiedTimeline.d.ts +106 -0
  55. package/dist/react/astro/UnifiedTimeline.js +1768 -0
  56. package/dist/react/astro/UnifiedTimeline.js.map +1 -0
  57. package/dist/react/astro/index.d.ts +63 -0
  58. package/dist/react/cards/AccessCard.d.ts +37 -0
  59. package/dist/react/cards/AccessCard.js +410 -0
  60. package/dist/react/cards/AccessCard.js.map +1 -0
  61. package/dist/react/cards/OrbitCard.d.ts +31 -0
  62. package/dist/react/cards/OrbitCard.js +372 -0
  63. package/dist/react/cards/OrbitCard.js.map +1 -0
  64. package/dist/react/cards/SpacecraftCard.d.ts +54 -0
  65. package/dist/react/cards/SpacecraftCard.js +941 -0
  66. package/dist/react/cards/SpacecraftCard.js.map +1 -0
  67. package/dist/react/cards/TelemetryCard.d.ts +40 -0
  68. package/dist/react/cards/TelemetryCard.js +742 -0
  69. package/dist/react/cards/TelemetryCard.js.map +1 -0
  70. package/dist/react/cards/TelemetryStreamCard.d.ts +59 -0
  71. package/dist/react/cards/TelemetryStreamCard.js +309 -0
  72. package/dist/react/cards/TelemetryStreamCard.js.map +1 -0
  73. package/dist/react/cards/index.d.ts +13 -0
  74. package/dist/react/charts/GroundTrackMap.d.ts +112 -0
  75. package/dist/react/charts/GroundTrackMap.js +1123 -0
  76. package/dist/react/charts/GroundTrackMap.js.map +1 -0
  77. package/dist/react/charts/GroundTrackMapLeaflet.d.ts +26 -0
  78. package/dist/react/charts/GroundTrackMapLeaflet.js +571 -0
  79. package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -0
  80. package/dist/react/charts/groundTrackMapLeafletTiles.d.ts +22 -0
  81. package/dist/react/charts/groundTrackMapLeafletTiles.js +11 -0
  82. package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -0
  83. package/dist/react/charts/groundTrackMapLeafletUtils.d.ts +24 -0
  84. package/dist/react/charts/groundTrackMapLeafletUtils.js +109 -0
  85. package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -0
  86. package/dist/react/charts/index.d.ts +10 -0
  87. package/dist/react/charts/unified/AstroChart.d.ts +24 -0
  88. package/dist/react/charts/unified/AstroChart.js +1405 -0
  89. package/dist/react/charts/unified/AstroChart.js.map +1 -0
  90. package/dist/react/charts/unified/PowerOverviewChart.d.ts +73 -0
  91. package/dist/react/charts/unified/PowerOverviewChart.js +488 -0
  92. package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -0
  93. package/dist/react/charts/unified/domain.d.ts +845 -0
  94. package/dist/react/charts/unified/domain.js +3168 -0
  95. package/dist/react/charts/unified/domain.js.map +1 -0
  96. package/dist/react/charts/unified/generators.d.ts +276 -0
  97. package/dist/react/charts/unified/generators.js +518 -0
  98. package/dist/react/charts/unified/generators.js.map +1 -0
  99. package/dist/react/charts/unified/index.d.ts +55 -0
  100. package/dist/react/charts/unified/presets.d.ts +290 -0
  101. package/dist/react/charts/unified/presets.js +999 -0
  102. package/dist/react/charts/unified/presets.js.map +1 -0
  103. package/dist/react/charts/unified/sync.d.ts +69 -0
  104. package/dist/react/charts/unified/sync.js +219 -0
  105. package/dist/react/charts/unified/sync.js.map +1 -0
  106. package/dist/react/charts/unified/theme.d.ts +447 -0
  107. package/dist/react/charts/unified/theme.js +562 -0
  108. package/dist/react/charts/unified/theme.js.map +1 -0
  109. package/dist/react/charts/unified/types.d.ts +826 -0
  110. package/dist/react/charts/unified/useChartStream.d.ts +58 -0
  111. package/dist/react/charts/unified/useChartStream.js +226 -0
  112. package/dist/react/charts/unified/useChartStream.js.map +1 -0
  113. package/dist/react/chatgpt/AppCard.d.ts +59 -0
  114. package/dist/react/chatgpt/AppCard.js +306 -0
  115. package/dist/react/chatgpt/AppCard.js.map +1 -0
  116. package/dist/react/chatgpt/ChatGPTCard.d.ts +6 -0
  117. package/dist/react/chatgpt/index.d.ts +167 -0
  118. package/dist/react/chatgpt/index.js +166 -0
  119. package/dist/react/chatgpt/index.js.map +1 -0
  120. package/dist/react/context/DisplaySettingsContext.d.ts +107 -0
  121. package/dist/react/context/DisplaySettingsContext.js +169 -0
  122. package/dist/react/context/DisplaySettingsContext.js.map +1 -0
  123. package/dist/react/context/index.d.ts +5 -0
  124. package/dist/react/core/ActivityPlanner.d.ts +45 -0
  125. package/dist/react/core/ActivityPlanner.js +532 -0
  126. package/dist/react/core/ActivityPlanner.js.map +1 -0
  127. package/dist/react/core/AppBar.d.ts +71 -0
  128. package/dist/react/core/AppBar.js +817 -0
  129. package/dist/react/core/AppBar.js.map +1 -0
  130. package/dist/react/core/AstroIcon.d.ts +84 -0
  131. package/dist/react/core/AstroIcon.js +1243 -0
  132. package/dist/react/core/AstroIcon.js.map +1 -0
  133. package/dist/react/core/Badge.d.ts +27 -0
  134. package/dist/react/core/Badge.js +134 -0
  135. package/dist/react/core/Badge.js.map +1 -0
  136. package/dist/react/core/Button.d.ts +26 -0
  137. package/dist/react/core/Button.js +306 -0
  138. package/dist/react/core/Button.js.map +1 -0
  139. package/dist/react/core/CardHeader.d.ts +34 -0
  140. package/dist/react/core/CardHeader.js +316 -0
  141. package/dist/react/core/CardHeader.js.map +1 -0
  142. package/dist/react/core/ChatPanel.d.ts +627 -0
  143. package/dist/react/core/ChatPanel.js +1144 -0
  144. package/dist/react/core/ChatPanel.js.map +1 -0
  145. package/dist/react/core/Checkbox.d.ts +26 -0
  146. package/dist/react/core/Checkbox.js +130 -0
  147. package/dist/react/core/Checkbox.js.map +1 -0
  148. package/dist/react/core/ColorPickerPanel.d.ts +25 -0
  149. package/dist/react/core/ColorPickerPanel.js +293 -0
  150. package/dist/react/core/ColorPickerPanel.js.map +1 -0
  151. package/dist/react/core/CommandBuilder.d.ts +74 -0
  152. package/dist/react/core/CommandBuilder.js +518 -0
  153. package/dist/react/core/CommandBuilder.js.map +1 -0
  154. package/dist/react/core/ConfirmDialog.d.ts +45 -0
  155. package/dist/react/core/ConfirmDialog.js +315 -0
  156. package/dist/react/core/ConfirmDialog.js.map +1 -0
  157. package/dist/react/core/ConnectionForm.d.ts +57 -0
  158. package/dist/react/core/ConnectionForm.js +496 -0
  159. package/dist/react/core/ConnectionForm.js.map +1 -0
  160. package/dist/react/core/Container.d.ts +51 -0
  161. package/dist/react/core/Container.js +670 -0
  162. package/dist/react/core/Container.js.map +1 -0
  163. package/dist/react/core/CopyButton.d.ts +39 -0
  164. package/dist/react/core/CopyButton.js +105 -0
  165. package/dist/react/core/CopyButton.js.map +1 -0
  166. package/dist/react/core/DataTable.d.ts +113 -0
  167. package/dist/react/core/DataTable.js +446 -0
  168. package/dist/react/core/DataTable.js.map +1 -0
  169. package/dist/react/core/DataValue.d.ts +64 -0
  170. package/dist/react/core/DataValue.js +545 -0
  171. package/dist/react/core/DataValue.js.map +1 -0
  172. package/dist/react/core/Dialog.d.ts +32 -0
  173. package/dist/react/core/Dialog.js +201 -0
  174. package/dist/react/core/Dialog.js.map +1 -0
  175. package/dist/react/core/FileExplorer.d.ts +65 -0
  176. package/dist/react/core/FileExplorer.js +520 -0
  177. package/dist/react/core/FileExplorer.js.map +1 -0
  178. package/dist/react/core/GlassCard.d.ts +129 -0
  179. package/dist/react/core/GlassCard.js +375 -0
  180. package/dist/react/core/GlassCard.js.map +1 -0
  181. package/dist/react/core/HeaderIconWithStatus.d.ts +39 -0
  182. package/dist/react/core/HeaderIconWithStatus.js +157 -0
  183. package/dist/react/core/HeaderIconWithStatus.js.map +1 -0
  184. package/dist/react/core/HexViewer.d.ts +143 -0
  185. package/dist/react/core/HexViewer.js +1106 -0
  186. package/dist/react/core/HexViewer.js.map +1 -0
  187. package/dist/react/core/Icon.d.ts +32 -0
  188. package/dist/react/core/Icon.js +142 -0
  189. package/dist/react/core/Icon.js.map +1 -0
  190. package/dist/react/core/ImageGallery.d.ts +41 -0
  191. package/dist/react/core/ImageGallery.js +320 -0
  192. package/dist/react/core/ImageGallery.js.map +1 -0
  193. package/dist/react/core/Input.d.ts +38 -0
  194. package/dist/react/core/Input.js +288 -0
  195. package/dist/react/core/Input.js.map +1 -0
  196. package/dist/react/core/LimitsBar.d.ts +51 -0
  197. package/dist/react/core/LimitsBar.js +200 -0
  198. package/dist/react/core/LimitsBar.js.map +1 -0
  199. package/dist/react/core/LogViewer.d.ts +61 -0
  200. package/dist/react/core/LogViewer.js +599 -0
  201. package/dist/react/core/LogViewer.js.map +1 -0
  202. package/dist/react/core/MessageStream.d.ts +58 -0
  203. package/dist/react/core/MessageStream.js +455 -0
  204. package/dist/react/core/MessageStream.js.map +1 -0
  205. package/dist/react/core/MissionCalendar.d.ts +81 -0
  206. package/dist/react/core/MissionCalendar.js +1049 -0
  207. package/dist/react/core/MissionCalendar.js.map +1 -0
  208. package/dist/react/core/NumberInput.d.ts +85 -0
  209. package/dist/react/core/NumberInput.js +507 -0
  210. package/dist/react/core/NumberInput.js.map +1 -0
  211. package/dist/react/core/PacketViewer.d.ts +73 -0
  212. package/dist/react/core/PacketViewer.js +431 -0
  213. package/dist/react/core/PacketViewer.js.map +1 -0
  214. package/dist/react/core/Pagination.d.ts +30 -0
  215. package/dist/react/core/Pagination.js +190 -0
  216. package/dist/react/core/Pagination.js.map +1 -0
  217. package/dist/react/core/PinInput.d.ts +41 -0
  218. package/dist/react/core/PinInput.js +210 -0
  219. package/dist/react/core/PinInput.js.map +1 -0
  220. package/dist/react/core/Popover.d.ts +55 -0
  221. package/dist/react/core/Popover.js +288 -0
  222. package/dist/react/core/Popover.js.map +1 -0
  223. package/dist/react/core/Select.d.ts +42 -0
  224. package/dist/react/core/Select.js +303 -0
  225. package/dist/react/core/Select.js.map +1 -0
  226. package/dist/react/core/SideNav.d.ts +103 -0
  227. package/dist/react/core/SideNav.js +551 -0
  228. package/dist/react/core/SideNav.js.map +1 -0
  229. package/dist/react/core/SidePanel.d.ts +33 -0
  230. package/dist/react/core/SidePanel.js +199 -0
  231. package/dist/react/core/SidePanel.js.map +1 -0
  232. package/dist/react/core/Tabs.d.ts +47 -0
  233. package/dist/react/core/Tabs.js +129 -0
  234. package/dist/react/core/Tabs.js.map +1 -0
  235. package/dist/react/core/Toast.d.ts +56 -0
  236. package/dist/react/core/Toast.js +229 -0
  237. package/dist/react/core/Toast.js.map +1 -0
  238. package/dist/react/core/Toggle.d.ts +22 -0
  239. package/dist/react/core/Toggle.js +151 -0
  240. package/dist/react/core/Toggle.js.map +1 -0
  241. package/dist/react/core/Tooltip.d.ts +19 -0
  242. package/dist/react/core/Tooltip.js +179 -0
  243. package/dist/react/core/Tooltip.js.map +1 -0
  244. package/dist/react/core/Typography.d.ts +127 -0
  245. package/dist/react/core/Typography.js +187 -0
  246. package/dist/react/core/Typography.js.map +1 -0
  247. package/dist/react/core/index.d.ts +108 -0
  248. package/dist/react/core/layout/Box.d.ts +77 -0
  249. package/dist/react/core/layout/Box.js +126 -0
  250. package/dist/react/core/layout/Box.js.map +1 -0
  251. package/dist/react/core/layout/Center.d.ts +20 -0
  252. package/dist/react/core/layout/Center.js +34 -0
  253. package/dist/react/core/layout/Center.js.map +1 -0
  254. package/dist/react/core/layout/Divider.d.ts +16 -0
  255. package/dist/react/core/layout/Divider.js +108 -0
  256. package/dist/react/core/layout/Divider.js.map +1 -0
  257. package/dist/react/core/layout/Flex.d.ts +30 -0
  258. package/dist/react/core/layout/Flex.js +128 -0
  259. package/dist/react/core/layout/Flex.js.map +1 -0
  260. package/dist/react/core/layout/Grid.d.ts +36 -0
  261. package/dist/react/core/layout/Grid.js +142 -0
  262. package/dist/react/core/layout/Grid.js.map +1 -0
  263. package/dist/react/core/layout/Spacer.d.ts +8 -0
  264. package/dist/react/core/layout/Spacer.js +31 -0
  265. package/dist/react/core/layout/Spacer.js.map +1 -0
  266. package/dist/react/core/layout/Stack.d.ts +54 -0
  267. package/dist/react/core/layout/Stack.js +74 -0
  268. package/dist/react/core/layout/Stack.js.map +1 -0
  269. package/dist/react/core/layout/index.d.ts +38 -0
  270. package/dist/react/core/layout/responsive.d.ts +23 -0
  271. package/dist/react/core/layout/responsive.js +26 -0
  272. package/dist/react/core/layout/responsive.js.map +1 -0
  273. package/dist/react/core/layout/useBreakpoint.d.ts +77 -0
  274. package/dist/react/core/layout/useBreakpoint.js +73 -0
  275. package/dist/react/core/layout/useBreakpoint.js.map +1 -0
  276. package/dist/react/core/propertyConfig.d.ts +443 -0
  277. package/dist/react/core/propertyConfig.js +399 -0
  278. package/dist/react/core/propertyConfig.js.map +1 -0
  279. package/dist/react/hooks/index.d.ts +21 -0
  280. package/dist/react/hooks/useAccessWindows.d.ts +66 -0
  281. package/dist/react/hooks/useCompactMode.d.ts +82 -0
  282. package/dist/react/hooks/useCompactMode.js +62 -0
  283. package/dist/react/hooks/useCompactMode.js.map +1 -0
  284. package/dist/react/hooks/useLiveSelection.d.ts +57 -0
  285. package/dist/react/hooks/useSimulationPlayback.d.ts +97 -0
  286. package/dist/react/hooks/useSimulationTime.d.ts +61 -0
  287. package/dist/react/hooks/useSpacecraftPosition.d.ts +50 -0
  288. package/dist/react/hooks/useSpacecraftPosition.js +89 -0
  289. package/dist/react/hooks/useSpacecraftPosition.js.map +1 -0
  290. package/dist/react/hooks/useTelemetry.d.ts +55 -0
  291. package/dist/react/hooks/useTelemetry.js +73 -0
  292. package/dist/react/hooks/useTelemetry.js.map +1 -0
  293. package/dist/react/hooks/useZendirSession.d.ts +109 -0
  294. package/dist/react/hooks/useZendirSession.js +148 -0
  295. package/dist/react/hooks/useZendirSession.js.map +1 -0
  296. package/dist/react/index.d.ts +74 -0
  297. package/dist/react/shared/ErrorBoundary.d.ts +63 -0
  298. package/dist/react/shared/ErrorBoundary.js +142 -0
  299. package/dist/react/shared/ErrorBoundary.js.map +1 -0
  300. package/dist/react/shared/Skeleton.d.ts +110 -0
  301. package/dist/react/shared/Skeleton.js +324 -0
  302. package/dist/react/shared/Skeleton.js.map +1 -0
  303. package/dist/react/shared/index.d.ts +12 -0
  304. package/dist/react/theme/ThemeProvider.d.ts +385 -0
  305. package/dist/react/theme/ThemeProvider.js +1096 -0
  306. package/dist/react/theme/ThemeProvider.js.map +1 -0
  307. package/dist/react/theme/astro-tokens.d.ts +153 -0
  308. package/dist/react/theme/cardAccent.d.ts +75 -0
  309. package/dist/react/theme/cardAccent.js +137 -0
  310. package/dist/react/theme/cardAccent.js.map +1 -0
  311. package/dist/react/theme/config.d.ts +39 -0
  312. package/dist/react/theme/index.d.ts +9 -0
  313. package/dist/react/types.d.ts +360 -0
  314. package/dist/react/types.js +58 -0
  315. package/dist/react/types.js.map +1 -0
  316. package/dist/react/utils/index.d.ts +247 -0
  317. package/dist/react/utils/index.js +423 -0
  318. package/dist/react/utils/index.js.map +1 -0
  319. package/dist/react/visualizations/EclipseTimerCard.d.ts +17 -0
  320. package/dist/react/visualizations/EclipseTimerCard.js +250 -0
  321. package/dist/react/visualizations/EclipseTimerCard.js.map +1 -0
  322. package/dist/react/visualizations/LinkBudgetCard.d.ts +50 -0
  323. package/dist/react/visualizations/LinkBudgetCard.js +444 -0
  324. package/dist/react/visualizations/LinkBudgetCard.js.map +1 -0
  325. package/dist/react/visualizations/NavBallCard.d.ts +17 -0
  326. package/dist/react/visualizations/NavBallCard.js +243 -0
  327. package/dist/react/visualizations/NavBallCard.js.map +1 -0
  328. package/dist/react/visualizations/PropulsionCard.d.ts +37 -0
  329. package/dist/react/visualizations/PropulsionCard.js +298 -0
  330. package/dist/react/visualizations/PropulsionCard.js.map +1 -0
  331. package/dist/react/visualizations/SensorFootprintCard.d.ts +33 -0
  332. package/dist/react/visualizations/SensorFootprintCard.js +326 -0
  333. package/dist/react/visualizations/SensorFootprintCard.js.map +1 -0
  334. package/dist/react/visualizations/ThermalHeatmapCard.d.ts +38 -0
  335. package/dist/react/visualizations/ThermalHeatmapCard.js +372 -0
  336. package/dist/react/visualizations/ThermalHeatmapCard.js.map +1 -0
  337. package/dist/react/visualizations/index.d.ts +17 -0
  338. package/dist/react.d.ts +1 -0
  339. package/dist/react.js +421 -0
  340. package/dist/react.js.map +1 -0
  341. package/dist/shaders/atmosphere.frag.js +5 -0
  342. package/dist/shaders/atmosphere.frag.js.map +1 -0
  343. package/dist/shaders/atmosphere.vert.js +5 -0
  344. package/dist/shaders/atmosphere.vert.js.map +1 -0
  345. package/dist/shaders/stars.frag.js +5 -0
  346. package/dist/shaders/stars.frag.js.map +1 -0
  347. package/dist/shaders/stars.vert.js +5 -0
  348. package/dist/shaders/stars.vert.js.map +1 -0
  349. package/dist/style.css +143 -0
  350. package/dist/tokens/index.d.ts +296 -0
  351. package/dist/tokens/index.js +263 -0
  352. package/dist/tokens/index.js.map +1 -0
  353. package/dist/tokens/tokens.css +155 -0
  354. package/dist/types/index.d.ts +23 -0
  355. package/dist/types.d.ts +1 -0
  356. package/dist/types.js +2 -0
  357. package/dist/types.js.map +1 -0
  358. package/package.json +220 -0
  359. package/sdk-stub.js +22 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AstroIcon.js","sources":["../../../src/react/core/AstroIcon.tsx"],"sourcesContent":["/**\n * @zendir/ui - AstroIcon Component\n * \n * Wrapper around official @astrouxds/react RuxIcon component.\n * Provides all 400+ official Astro UXD icons with consistent API.\n * \n * SECURITY: Uses dynamic import with proper error handling.\n * FLEXIBILITY: Works with or without @astrouxds/react installed.\n * \n * @see https://www.astrouxds.com/components/icon-library/\n * \n * @example\n * ```tsx\n * import { AstroIcon } from '@zendir/ui/react';\n * \n * <AstroIcon name=\"satellite\" />\n * <AstroIcon name=\"antenna\" size=\"large\" />\n * <AstroIcon name=\"thermal\" color=\"#ff0000\" />\n * ```\n */\n\nimport React, { memo, useState, useEffect, useRef } from 'react';\nimport { useTheme } from '../theme';\n\n/**\n * All official Astro UXD icon names\n * @see https://www.astrouxds.com/components/icon-library/\n */\nexport type AstroIconName =\n // === Astro Space/Mission Icons (Custom by Rocket Communications) ===\n | 'altitude'\n | 'antenna'\n | 'antenna-off'\n | 'antenna-receive'\n | 'antenna-transmit'\n | 'equipment'\n | 'hardware'\n | 'mission'\n | 'netcom'\n | 'payload'\n | 'processor'\n | 'processor-alt'\n | 'propulsion-power'\n | 'satellite-off'\n | 'satellite-receive'\n | 'satellite-transmit'\n | 'solar'\n | 'thermal'\n // === Actions ===\n | 'settings'\n | 'search'\n | 'home'\n | 'info'\n | 'help'\n | 'delete'\n | 'edit'\n | 'lock'\n | 'lock-open'\n | 'visibility'\n | 'visibility-off'\n | 'refresh'\n | 'sync'\n | 'download'\n | 'upload'\n | 'fullscreen'\n | 'fullscreen-exit'\n | 'zoom-in'\n | 'zoom-out'\n | 'schedule'\n | 'timeline'\n | 'today'\n | 'event'\n | 'bookmark'\n | 'favorite'\n | 'star'\n | 'check-circle'\n | 'done'\n | 'done-all'\n | 'print'\n | 'open-in-new'\n | 'launch'\n | 'power-settings-new'\n | 'history'\n | 'cached'\n | 'build'\n | 'code'\n | 'dns'\n | 'language'\n | 'input'\n | 'label'\n | 'list'\n | 'track-changes'\n | 'verified-user'\n | 'work'\n // === Alerts ===\n | 'add-alert'\n | 'error'\n | 'error-outline'\n | 'notification-important'\n | 'warning'\n // === AV ===\n | 'play-arrow'\n | 'pause'\n | 'stop'\n | 'skip-next'\n | 'skip-previous'\n | 'fast-forward'\n | 'fast-rewind'\n | 'replay'\n | 'loop'\n | 'shuffle'\n | 'volume-up'\n | 'volume-down'\n | 'volume-off'\n | 'volume-mute'\n | 'mic'\n | 'mic-off'\n | 'videocam'\n | 'videocam-off'\n | 'movie'\n | 'music-note'\n | 'equalizer'\n | 'library-music'\n | 'queue-music'\n | 'subscriptions'\n | 'fiber-new'\n | 'fiber-manual-record'\n | 'fiber-smart-record'\n // === Communication ===\n | 'call'\n | 'call-end'\n | 'call-made'\n | 'call-received'\n | 'call-missed'\n | 'call-split'\n | 'chat'\n | 'chat-bubble'\n | 'comment'\n | 'contacts'\n | 'dialer-sip'\n | 'email'\n | 'forum'\n | 'import-export'\n | 'live-help'\n | 'location-off'\n | 'location-on'\n | 'message'\n | 'phone'\n | 'phonelink-erase'\n | 'phonelink-lock'\n | 'phonelink-ring'\n | 'portable-wifi-off'\n | 'present-to-all'\n | 'ring-volume'\n | 'screen-share'\n | 'speaker-phone'\n | 'stay-primary-landscape'\n | 'stay-primary-portrait'\n | 'stop-screen-share'\n | 'swap-calls'\n | 'textsms'\n | 'voicemail'\n | 'vpn-key'\n // === Content ===\n | 'add'\n | 'add-box'\n | 'add-circle'\n | 'add-circle-outline'\n | 'archive'\n | 'backspace'\n | 'block'\n | 'clear'\n | 'content-copy'\n | 'content-cut'\n | 'content-paste'\n | 'create'\n | 'drafts'\n | 'filter-list'\n | 'flag'\n | 'forward'\n | 'gesture'\n | 'inbox'\n | 'link'\n | 'link-off'\n | 'low-priority'\n | 'mail'\n | 'markunread'\n | 'move-to-inbox'\n | 'next-week'\n | 'redo'\n | 'remove'\n | 'remove-circle'\n | 'remove-circle-outline'\n | 'reply'\n | 'reply-all'\n | 'report'\n | 'save'\n | 'select-all'\n | 'send'\n | 'sort'\n | 'text-format'\n | 'unarchive'\n | 'undo'\n | 'weekend'\n // === Device ===\n | 'access-alarm'\n | 'access-alarms'\n | 'access-time'\n | 'add-alarm'\n | 'airplanemode-active'\n | 'airplanemode-inactive'\n | 'battery-20'\n | 'battery-30'\n | 'battery-50'\n | 'battery-60'\n | 'battery-80'\n | 'battery-90'\n | 'battery-alert'\n | 'battery-charging-20'\n | 'battery-charging-30'\n | 'battery-charging-50'\n | 'battery-charging-60'\n | 'battery-charging-80'\n | 'battery-charging-90'\n | 'battery-charging-full'\n | 'battery-full'\n | 'battery-std'\n | 'battery-unknown'\n | 'bluetooth'\n | 'bluetooth-connected'\n | 'bluetooth-disabled'\n | 'bluetooth-searching'\n | 'brightness-auto'\n | 'brightness-high'\n | 'brightness-low'\n | 'brightness-medium'\n | 'data-usage'\n | 'developer-mode'\n | 'devices'\n | 'dvr'\n | 'gps-fixed'\n | 'gps-not-fixed'\n | 'gps-off'\n | 'graphic-eq'\n | 'location-disabled'\n | 'location-searching'\n | 'network-cell'\n | 'network-wifi'\n | 'nfc'\n | 'screen-lock-landscape'\n | 'screen-lock-portrait'\n | 'screen-lock-rotation'\n | 'screen-rotation'\n | 'sd-storage'\n | 'settings-system-daydream'\n | 'signal-cellular-0-bar'\n | 'signal-cellular-1-bar'\n | 'signal-cellular-2-bar'\n | 'signal-cellular-3-bar'\n | 'signal-cellular-4-bar'\n | 'signal-cellular-connected-no-internet-0-bar'\n | 'signal-cellular-connected-no-internet-1-bar'\n | 'signal-cellular-connected-no-internet-2-bar'\n | 'signal-cellular-connected-no-internet-3-bar'\n | 'signal-cellular-connected-no-internet-4-bar'\n | 'signal-cellular-no-sim'\n | 'signal-cellular-null'\n | 'signal-cellular-off'\n | 'signal-wifi-0-bar'\n | 'signal-wifi-1-bar'\n | 'signal-wifi-1-bar-lock'\n | 'signal-wifi-2-bar'\n | 'signal-wifi-2-bar-lock'\n | 'signal-wifi-3-bar'\n | 'signal-wifi-3-bar-lock'\n | 'signal-wifi-4-bar'\n | 'signal-wifi-4-bar-lock'\n | 'signal-wifi-off'\n | 'storage'\n | 'usb'\n | 'wallpaper'\n | 'widgets'\n | 'wifi-lock'\n | 'wifi-tethering'\n // === Editor ===\n | 'attach-file'\n | 'attach-money'\n | 'border-all'\n | 'border-bottom'\n | 'border-clear'\n | 'border-color'\n | 'border-horizontal'\n | 'border-inner'\n | 'border-left'\n | 'border-outer'\n | 'border-right'\n | 'border-style'\n | 'border-top'\n | 'border-vertical'\n | 'bubble-chart'\n | 'drag-handle'\n | 'format-align-center'\n | 'format-align-justify'\n | 'format-align-left'\n | 'format-align-right'\n | 'format-bold'\n | 'format-clear'\n | 'format-color-fill'\n | 'format-color-reset'\n | 'format-color-text'\n | 'format-indent-decrease'\n | 'format-indent-increase'\n | 'format-italic'\n | 'format-line-spacing'\n | 'format-list-bulleted'\n | 'format-list-numbered'\n | 'format-paint'\n | 'format-quote'\n | 'format-shapes'\n | 'format-size'\n | 'format-strikethrough'\n | 'format-textdirection-l-to-r'\n | 'format-textdirection-r-to-l'\n | 'format-underlined'\n | 'functions'\n | 'highlight'\n | 'insert-chart'\n | 'insert-comment'\n | 'insert-drive-file'\n | 'insert-emoticon'\n | 'insert-invitation'\n | 'insert-link'\n | 'insert-photo'\n | 'linear-scale'\n | 'merge-type'\n | 'mode-comment'\n | 'mode-edit'\n | 'monetization-on'\n | 'money-off'\n | 'multiline-chart'\n | 'pie-chart'\n | 'pie-chart-outlined'\n | 'publish'\n | 'short-text'\n | 'show-chart'\n | 'space-bar'\n | 'strikethrough-s'\n | 'table-chart'\n | 'text-fields'\n | 'title'\n | 'vertical-align-bottom'\n | 'vertical-align-center'\n | 'vertical-align-top'\n | 'wrap-text'\n // === File ===\n | 'attachment'\n | 'cloud'\n | 'cloud-circle'\n | 'cloud-done'\n | 'cloud-download'\n | 'cloud-off'\n | 'cloud-queue'\n | 'cloud-upload'\n | 'create-new-folder'\n | 'file-download'\n | 'file-upload'\n | 'folder'\n | 'folder-open'\n | 'folder-shared'\n // === Hardware ===\n | 'cast'\n | 'cast-connected'\n | 'computer'\n | 'desktop-mac'\n | 'desktop-windows'\n | 'developer-board'\n | 'device-hub'\n | 'devices-other'\n | 'dock'\n | 'gamepad'\n | 'headset'\n | 'headset-mic'\n | 'keyboard'\n | 'keyboard-arrow-down'\n | 'keyboard-arrow-left'\n | 'keyboard-arrow-right'\n | 'keyboard-arrow-up'\n | 'keyboard-backspace'\n | 'keyboard-capslock'\n | 'keyboard-hide'\n | 'keyboard-return'\n | 'keyboard-tab'\n | 'keyboard-voice'\n | 'laptop'\n | 'laptop-chromebook'\n | 'laptop-mac'\n | 'laptop-windows'\n | 'memory'\n | 'mouse'\n | 'phone-android'\n | 'phone-iphone'\n | 'phonelink'\n | 'phonelink-off'\n | 'power-input'\n | 'router'\n | 'scanner'\n | 'security'\n | 'sim-card'\n | 'smartphone'\n | 'speaker'\n | 'speaker-group'\n | 'tablet'\n | 'tablet-android'\n | 'tablet-mac'\n | 'toys'\n | 'tv'\n | 'videogame-asset'\n | 'watch'\n // === Image ===\n | 'add-a-photo'\n | 'add-to-photos'\n | 'adjust'\n | 'assistant'\n | 'assistant-photo'\n | 'audiotrack'\n | 'blur-circular'\n | 'blur-linear'\n | 'blur-off'\n | 'blur-on'\n | 'brightness-1'\n | 'brightness-2'\n | 'brightness-3'\n | 'brightness-4'\n | 'brightness-5'\n | 'brightness-6'\n | 'brightness-7'\n | 'broken-image'\n | 'brush'\n | 'burst-mode'\n | 'camera'\n | 'camera-alt'\n | 'camera-front'\n | 'camera-rear'\n | 'camera-roll'\n | 'center-focus-strong'\n | 'center-focus-weak'\n | 'collections'\n | 'collections-bookmark'\n | 'color-lens'\n | 'colorize'\n | 'compare'\n | 'control-point'\n | 'control-point-duplicate'\n | 'crop'\n | 'crop-16-9'\n | 'crop-3-2'\n | 'crop-5-4'\n | 'crop-7-5'\n | 'crop-din'\n | 'crop-free'\n | 'crop-landscape'\n | 'crop-original'\n | 'crop-portrait'\n | 'crop-rotate'\n | 'crop-square'\n | 'dehaze'\n | 'details'\n | 'edit'\n | 'exposure'\n | 'exposure-neg-1'\n | 'exposure-neg-2'\n | 'exposure-plus-1'\n | 'exposure-plus-2'\n | 'exposure-zero'\n | 'filter'\n | 'filter-1'\n | 'filter-2'\n | 'filter-3'\n | 'filter-4'\n | 'filter-5'\n | 'filter-6'\n | 'filter-7'\n | 'filter-8'\n | 'filter-9'\n | 'filter-9-plus'\n | 'filter-b-and-w'\n | 'filter-center-focus'\n | 'filter-drama'\n | 'filter-frames'\n | 'filter-hdr'\n | 'filter-none'\n | 'filter-tilt-shift'\n | 'filter-vintage'\n | 'flare'\n | 'flash-auto'\n | 'flash-off'\n | 'flash-on'\n | 'flip'\n | 'gradient'\n | 'grain'\n | 'grid-off'\n | 'grid-on'\n | 'hdr-off'\n | 'hdr-on'\n | 'hdr-strong'\n | 'hdr-weak'\n | 'healing'\n | 'image'\n | 'image-aspect-ratio'\n | 'iso'\n | 'landscape'\n | 'leak-add'\n | 'leak-remove'\n | 'lens'\n | 'linked-camera'\n | 'looks'\n | 'looks-3'\n | 'looks-4'\n | 'looks-5'\n | 'looks-6'\n | 'looks-one'\n | 'looks-two'\n | 'loupe'\n | 'monochrome-photos'\n | 'movie-creation'\n | 'movie-filter'\n | 'music-note'\n | 'nature'\n | 'nature-people'\n | 'navigate-before'\n | 'navigate-next'\n | 'palette'\n | 'panorama'\n | 'panorama-fish-eye'\n | 'panorama-horizontal'\n | 'panorama-vertical'\n | 'panorama-wide-angle'\n | 'photo'\n | 'photo-album'\n | 'photo-camera'\n | 'photo-filter'\n | 'photo-library'\n | 'photo-size-select-actual'\n | 'photo-size-select-large'\n | 'photo-size-select-small'\n | 'picture-as-pdf'\n | 'portrait'\n | 'remove-red-eye'\n | 'rotate-90-degrees-ccw'\n | 'rotate-left'\n | 'rotate-right'\n | 'slideshow'\n | 'straighten'\n | 'style'\n | 'switch-camera'\n | 'switch-video'\n | 'tag-faces'\n | 'texture'\n | 'timelapse'\n | 'timer'\n | 'timer-10'\n | 'timer-3'\n | 'timer-off'\n | 'tonality'\n | 'transform'\n | 'tune'\n | 'view-comfy'\n | 'view-compact'\n | 'vignette'\n | 'wb-auto'\n | 'wb-cloudy'\n | 'wb-incandescent'\n | 'wb-iridescent'\n | 'wb-sunny'\n // === Maps ===\n | 'add-location'\n | 'beenhere'\n | 'directions'\n | 'directions-bike'\n | 'directions-boat'\n | 'directions-bus'\n | 'directions-car'\n | 'directions-railway'\n | 'directions-run'\n | 'directions-subway'\n | 'directions-transit'\n | 'directions-walk'\n | 'edit-location'\n | 'ev-station'\n | 'explore'\n | 'flight'\n | 'hotel'\n | 'layers'\n | 'layers-clear'\n | 'local-activity'\n | 'local-airport'\n | 'local-atm'\n | 'local-bar'\n | 'local-cafe'\n | 'local-car-wash'\n | 'local-convenience-store'\n | 'local-dining'\n | 'local-drink'\n | 'local-florist'\n | 'local-gas-station'\n | 'local-grocery-store'\n | 'local-hospital'\n | 'local-hotel'\n | 'local-laundry-service'\n | 'local-library'\n | 'local-mall'\n | 'local-movies'\n | 'local-offer'\n | 'local-parking'\n | 'local-pharmacy'\n | 'local-phone'\n | 'local-pizza'\n | 'local-play'\n | 'local-post-office'\n | 'local-printshop'\n | 'local-see'\n | 'local-shipping'\n | 'local-taxi'\n | 'map'\n | 'my-location'\n | 'navigation'\n | 'near-me'\n | 'person-pin'\n | 'person-pin-circle'\n | 'pin-drop'\n | 'place'\n | 'rate-review'\n | 'restaurant'\n | 'restaurant-menu'\n | 'satellite'\n | 'store-mall-directory'\n | 'streetview'\n | 'subway'\n | 'terrain'\n | 'traffic'\n | 'train'\n | 'tram'\n | 'transfer-within-a-station'\n | 'zoom-out-map'\n // === Navigation ===\n | 'apps'\n | 'arrow-back'\n | 'arrow-downward'\n | 'arrow-drop-down'\n | 'arrow-drop-down-circle'\n | 'arrow-drop-up'\n | 'arrow-forward'\n | 'arrow-upward'\n | 'cancel'\n | 'check'\n | 'chevron-left'\n | 'chevron-right'\n | 'close'\n | 'expand-less'\n | 'expand-more'\n | 'first-page'\n | 'fullscreen'\n | 'fullscreen-exit'\n | 'last-page'\n | 'menu'\n | 'more-horiz'\n | 'more-vert'\n | 'refresh'\n | 'subdirectory-arrow-left'\n | 'subdirectory-arrow-right'\n | 'unfold-less'\n | 'unfold-more'\n // === Notification ===\n | 'adb'\n | 'airline-seat-flat'\n | 'airline-seat-flat-angled'\n | 'airline-seat-individual-suite'\n | 'airline-seat-legroom-extra'\n | 'airline-seat-legroom-normal'\n | 'airline-seat-legroom-reduced'\n | 'airline-seat-recline-extra'\n | 'airline-seat-recline-normal'\n | 'bluetooth-audio'\n | 'confirmation-number'\n | 'disc-full'\n | 'do-not-disturb'\n | 'do-not-disturb-alt'\n | 'do-not-disturb-off'\n | 'do-not-disturb-on'\n | 'drive-eta'\n | 'enhanced-encryption'\n | 'event-available'\n | 'event-busy'\n | 'event-note'\n | 'folder-special'\n | 'live-tv'\n | 'mms'\n | 'more'\n | 'network-check'\n | 'network-locked'\n | 'no-encryption'\n | 'ondemand-video'\n | 'personal-video'\n | 'phone-bluetooth-speaker'\n | 'phone-forwarded'\n | 'phone-in-talk'\n | 'phone-locked'\n | 'phone-missed'\n | 'phone-paused'\n | 'power'\n | 'power-off'\n | 'priority-high'\n | 'sd-card'\n | 'sim-card-alert'\n | 'sms'\n | 'sms-failed'\n | 'sync'\n | 'sync-disabled'\n | 'sync-problem'\n | 'system-update'\n | 'tap-and-play'\n | 'time-to-leave'\n | 'vibration'\n | 'voice-chat'\n | 'vpn-lock'\n | 'wc'\n | 'wifi'\n | 'wifi-off'\n // === Places ===\n | 'ac-unit'\n | 'airport-shuttle'\n | 'all-inclusive'\n | 'beach-access'\n | 'business-center'\n | 'casino'\n | 'child-care'\n | 'child-friendly'\n | 'fitness-center'\n | 'free-breakfast'\n | 'golf-course'\n | 'hot-tub'\n | 'kitchen'\n | 'pool'\n | 'room-service'\n | 'rv-hookup'\n | 'smoke-free'\n | 'smoking-rooms'\n | 'spa'\n // === Social ===\n | 'cake'\n | 'domain'\n | 'group'\n | 'group-add'\n | 'location-city'\n | 'mood'\n | 'mood-bad'\n | 'notifications'\n | 'notifications-active'\n | 'notifications-none'\n | 'notifications-off'\n | 'notifications-paused'\n | 'pages'\n | 'party-mode'\n | 'people'\n | 'people-outline'\n | 'person'\n | 'person-add'\n | 'person-outline'\n | 'plus-one'\n | 'poll'\n | 'public'\n | 'school'\n | 'sentiment-dissatisfied'\n | 'sentiment-neutral'\n | 'sentiment-satisfied'\n | 'sentiment-very-dissatisfied'\n | 'sentiment-very-satisfied'\n | 'share'\n | 'whatshot'\n // === Toggle ===\n | 'check-box'\n | 'check-box-outline-blank'\n | 'indeterminate-check-box'\n | 'radio-button-checked'\n | 'radio-button-unchecked'\n | 'star'\n | 'star-border'\n | 'star-half'\n // === Space Operations Aliases (mapped to existing icons) ===\n // Orbit & Trajectory\n | 'orbit' | 'trajectory' | 'orbital'\n // Ground Operations\n | 'ground-station' | 'ground-control' | 'dish' | 'tracking-station'\n // Communication\n | 'uplink' | 'downlink' | 'command' | 'telemetry' | 'comms' | 'rf' | 'link' | 'signal' | 'data-link'\n // Satellite States\n | 'satellite' | 'spacecraft' | 'vehicle' | 'sat' | 'sc'\n // Power Systems\n | 'power' | 'battery' | 'energy' | 'solar-array' | 'solar-panel' | 'photovoltaic'\n // Propulsion\n | 'thruster' | 'engine' | 'burn' | 'maneuver' | 'delta-v' | 'rcs'\n // Thermal\n | 'temperature' | 'heat' | 'cooling' | 'heater'\n // Attitude & Control\n | 'attitude' | 'pointing' | 'orientation' | 'adcs' | 'gyro' | 'gyroscope'\n // Navigation\n | 'gps' | 'gnss' | 'position' | 'location' | 'ephemeris'\n // Status & Health\n | 'health' | 'status' | 'nominal' | 'anomaly' | 'fault' | 'safe-mode' | 'emergency' | 'critical' | 'caution'\n // Time & Scheduling\n | 'pass' | 'contact' | 'access' | 'window' | 'aos' | 'los' | 'eclipse' | 'sunlight' | 'shadow'\n // Subsystems\n | 'subsystem' | 'computer' | 'obc' | 'cdh' | 'flight-computer' | 'sensor' | 'instrument'\n // Launch & Deployment\n | 'launch' | 'rocket' | 'liftoff' | 'deployment' | 'deploy' | 'separation'\n // Operations\n | 'ops' | 'operations' | 'control' | 'automation' | 'sequence' | 'procedure'\n // Data & Storage\n | 'storage' | 'memory' | 'recorder' | 'playback' | 'record'\n // Monitoring\n | 'monitor' | 'dashboard' | 'console' | 'display'\n // Crew\n | 'astronaut' | 'crew' | 'eva'\n // Catch-all for any other icon (flexibility)\n | (string & {});\n\nexport type AstroIconSize = 'extra-small' | 'small' | 'normal' | 'large';\n\nexport interface AstroIconProps {\n /** Icon name from Astro UXD library */\n name: AstroIconName;\n /** Icon size preset or custom pixel value */\n size?: AstroIconSize | number;\n /** Custom color (hex, rgb, or CSS color) */\n color?: string;\n /** Accessibility label (required for screen readers) */\n label?: string;\n /** Additional CSS class */\n className?: string;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Click handler */\n onClick?: () => void;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\n// Size mapping for fallback mode\nconst SIZE_MAP: Record<AstroIconSize, number> = {\n 'extra-small': 16,\n 'small': 24,\n 'normal': 32,\n 'large': 48,\n};\n\n/**\n * Space Operations Icon Aliases\n * Maps common space terminology to existing Astro icons.\n * Provides better developer experience with intuitive naming.\n */\nconst ICON_ALIASES: Record<string, string> = {\n // === Orbit & Trajectory ===\n 'orbit': '360', // Orbital path\n 'trajectory': '360', // Flight path\n 'orbital': '360', // Orbital mechanics\n \n // === Ground Operations ===\n 'ground-station': 'antenna', // Ground station\n 'ground-control': 'antenna', // Mission control\n 'dish': 'antenna', // Antenna dish\n 'tracking-station': 'antenna', // Tracking facility\n \n // === Communication ===\n 'uplink': 'antenna-transmit', // Command upload\n 'downlink': 'antenna-receive', // Data download\n 'command': 'antenna-transmit', // Send command\n 'telemetry': 'antenna-receive', // Receive telemetry\n 'comms': 'netcom', // Communications\n 'rf': 'antenna', // Radio frequency\n 'link': 'netcom', // Communication link\n 'signal': 'antenna-transmit', // Signal transmission\n 'data-link': 'netcom', // Data link\n \n // === Satellite States ===\n 'satellite': 'satellite-transmit', // Default satellite (active)\n 'spacecraft': 'satellite-transmit', // Spacecraft\n 'vehicle': 'satellite-transmit', // Space vehicle\n 'sat': 'satellite-transmit', // Abbreviation\n 'sc': 'satellite-transmit', // Spacecraft abbreviation\n \n // === Power Systems ===\n 'power': 'propulsion-power', // Power system\n 'battery': 'battery-full', // Battery status\n 'energy': 'propulsion-power', // Energy management\n 'solar-array': 'solar', // Solar arrays\n 'solar-panel': 'solar', // Solar panels\n 'photovoltaic': 'solar', // PV system\n \n // === Propulsion ===\n 'thruster': 'propulsion-power', // Thruster\n 'engine': 'propulsion-power', // Engine\n 'burn': 'propulsion-power', // Burn/maneuver\n 'maneuver': 'propulsion-power', // Orbital maneuver\n 'delta-v': 'propulsion-power', // Delta-V\n 'rcs': 'propulsion-power', // Reaction control system\n \n // === Thermal ===\n 'temperature': 'thermal', // Temperature\n 'heat': 'thermal', // Heat management\n 'cooling': 'thermal', // Cooling system\n 'heater': 'thermal', // Heater\n \n // === Attitude & Control ===\n 'attitude': 'explore', // Attitude control\n 'pointing': 'explore', // Pointing direction\n 'orientation': 'explore', // Spacecraft orientation\n 'adcs': 'explore', // Attitude determination & control\n 'gyro': 'explore', // Gyroscope\n 'gyroscope': 'explore', // Gyroscope\n \n // === Navigation ===\n 'gps': 'gps-fixed', // GPS/GNSS\n 'gnss': 'gps-fixed', // Global navigation\n 'position': 'gps-fixed', // Position\n 'location': 'place', // Location\n 'ephemeris': 'timeline', // Ephemeris data\n \n // === Status & Health ===\n 'health': 'favorite', // System health\n 'status': 'info', // Status indicator\n 'nominal': 'check-circle', // Nominal/OK\n 'anomaly': 'error', // Anomaly detected\n 'fault': 'error', // Fault condition\n 'safe-mode': 'warning', // Safe mode\n 'emergency': 'warning', // Emergency\n 'critical': 'error', // Critical status\n 'caution': 'warning', // Caution\n \n // === Time & Scheduling ===\n 'pass': 'schedule', // Satellite pass\n 'contact': 'schedule', // Ground contact\n 'access': 'schedule', // Access window\n 'window': 'schedule', // Time window\n 'aos': 'schedule', // Acquisition of signal\n 'los': 'schedule', // Loss of signal\n 'eclipse': 'brightness-3', // Eclipse period\n 'sunlight': 'wb-sunny', // In sunlight\n 'shadow': 'brightness-3', // In shadow\n \n // === Subsystems ===\n 'subsystem': 'developer-board', // Generic subsystem\n 'computer': 'memory', // Onboard computer\n 'obc': 'memory', // Onboard computer\n 'cdh': 'memory', // Command & data handling\n 'flight-computer': 'memory', // Flight computer\n 'sensor': 'settings-input-component', // Sensor\n 'instrument': 'settings-input-component', // Instrument\n \n // === Launch & Deployment ===\n 'launch': 'flight-takeoff', // Launch\n 'rocket': 'flight-takeoff', // Rocket\n 'liftoff': 'flight-takeoff', // Liftoff\n 'deployment': 'open-in-new', // Deployment\n 'deploy': 'open-in-new', // Deploy\n 'separation': 'call-split', // Stage separation\n \n // === Operations ===\n 'ops': 'build', // Operations\n 'operations': 'build', // Operations\n 'control': 'tune', // Control\n 'automation': 'autorenew', // Automation\n 'sequence': 'playlist-play', // Command sequence\n 'procedure': 'list', // Procedure\n \n // === Data & Storage ===\n 'storage': 'sd-storage', // Data storage\n 'memory': 'memory', // Memory\n 'recorder': 'fiber-dvr', // Data recorder\n 'playback': 'play-arrow', // Playback\n 'record': 'fiber-manual-record', // Recording\n \n // === Monitoring ===\n 'monitor': 'desktop-mac', // Monitoring\n 'dashboard': 'dashboard', // Dashboard\n 'console': 'desktop-windows', // Console\n 'display': 'tv', // Display\n \n // === Crew (if applicable) ===\n 'astronaut': 'person', // Astronaut\n 'crew': 'group', // Crew\n 'eva': 'directions-walk', // Extra-vehicular activity\n};\n\n/**\n * Resolve icon alias to actual Astro icon name\n */\nfunction resolveIconAlias(name: string): string {\n return ICON_ALIASES[name] || name;\n}\n\n/**\n * Get all available icon aliases\n */\nexport function getIconAliases(): Record<string, string> {\n return { ...ICON_ALIASES };\n}\n\n/**\n * Check if an icon name is an alias\n */\nexport function isIconAlias(name: string): boolean {\n return name in ICON_ALIASES;\n}\n\n/**\n * All available Astro UXD icon names (official icons, not aliases)\n * This is the comprehensive list from the Astro UXD icon library\n */\nexport const ASTRO_ICON_NAMES: readonly string[] = [\n // === Astro Space/Mission Icons (Custom by Rocket Communications) ===\n 'altitude', 'antenna', 'antenna-off', 'antenna-receive', 'antenna-transmit',\n 'equipment', 'hardware', 'mission', 'netcom', 'payload',\n 'processor', 'processor-alt', 'propulsion-power', 'satellite-off',\n 'satellite-receive', 'satellite-transmit', 'solar', 'thermal',\n // === Actions ===\n 'settings', 'search', 'home', 'info', 'help', 'delete', 'edit',\n 'lock', 'lock-open', 'visibility', 'visibility-off', 'refresh', 'sync',\n 'download', 'upload', 'fullscreen', 'fullscreen-exit', 'zoom-in', 'zoom-out',\n 'schedule', 'timeline', 'today', 'event', 'bookmark', 'favorite', 'star',\n 'check-circle', 'done', 'done-all', 'print', 'open-in-new', 'launch',\n 'power-settings-new', 'history', 'cached', 'build', 'code', 'dns',\n 'language', 'input', 'label', 'list', 'track-changes', 'verified-user', 'work',\n // === Alerts ===\n 'add-alert', 'error', 'error-outline', 'notification-important', 'warning',\n // === AV ===\n 'play-arrow', 'pause', 'stop', 'skip-next', 'skip-previous',\n 'fast-forward', 'fast-rewind', 'replay', 'loop', 'shuffle',\n 'volume-up', 'volume-down', 'volume-off', 'volume-mute',\n 'mic', 'mic-off', 'videocam', 'videocam-off', 'movie',\n 'music-note', 'equalizer', 'library-music', 'queue-music',\n // === Communication ===\n 'call', 'call-end', 'chat', 'chat-bubble', 'chat-bubble-outline',\n 'comment', 'contacts', 'email', 'mail-outline', 'message',\n 'phone', 'voicemail', 'vpn-key', 'forum', 'live-help',\n 'location-on', 'location-off', 'business', 'import-contacts',\n // === Content ===\n 'add', 'remove', 'add-circle', 'add-circle-outline', 'remove-circle',\n 'remove-circle-outline', 'clear', 'content-copy', 'content-cut', 'content-paste',\n 'create', 'flag', 'forward', 'reply', 'reply-all',\n 'save', 'save-alt', 'select-all', 'send', 'undo', 'redo',\n 'filter-list', 'sort', 'drafts', 'link', 'link-off',\n // === Device ===\n 'battery-full', 'battery-charging-full', 'battery-alert', 'battery-unknown',\n 'bluetooth', 'bluetooth-disabled', 'bluetooth-connected', 'bluetooth-searching',\n 'brightness-1', 'brightness-2', 'brightness-3', 'brightness-4',\n 'brightness-5', 'brightness-6', 'brightness-7', 'brightness-auto',\n 'brightness-high', 'brightness-low', 'brightness-medium',\n 'gps-fixed', 'gps-not-fixed', 'gps-off', 'graphic-eq',\n 'network-cell', 'network-wifi', 'nfc', 'screen-rotation',\n 'sd-storage', 'settings-system-daydream', 'signal-cellular-4-bar',\n 'signal-cellular-connected-no-internet-4-bar', 'signal-cellular-no-sim',\n 'signal-cellular-null', 'signal-cellular-off', 'signal-wifi-4-bar',\n 'signal-wifi-4-bar-lock', 'signal-wifi-off', 'storage',\n 'usb', 'wifi', 'wifi-lock', 'wifi-off', 'wifi-tethering',\n // === Editor ===\n 'attach-file', 'attach-money', 'border-all', 'border-bottom',\n 'border-clear', 'border-color', 'border-horizontal', 'border-inner',\n 'border-left', 'border-outer', 'border-right', 'border-style',\n 'border-top', 'border-vertical', 'format-align-center', 'format-align-justify',\n 'format-align-left', 'format-align-right', 'format-bold', 'format-clear',\n 'format-color-fill', 'format-color-reset', 'format-color-text',\n 'format-indent-decrease', 'format-indent-increase', 'format-italic',\n 'format-line-spacing', 'format-list-bulleted', 'format-list-numbered',\n 'format-paint', 'format-quote', 'format-size', 'format-strikethrough',\n 'format-textdirection-l-to-r', 'format-textdirection-r-to-l',\n 'format-underlined', 'functions', 'insert-chart', 'insert-comment',\n 'insert-drive-file', 'insert-emoticon', 'insert-invitation', 'insert-link',\n 'insert-photo', 'merge-type', 'mode-comment', 'mode-edit',\n 'publish', 'short-text', 'space-bar', 'strikethrough-s',\n 'text-fields', 'title', 'vertical-align-bottom', 'vertical-align-center',\n 'vertical-align-top', 'wrap-text',\n // === File ===\n 'attachment', 'cloud', 'cloud-circle', 'cloud-done', 'cloud-download',\n 'cloud-off', 'cloud-queue', 'cloud-upload', 'create-new-folder',\n 'file-download', 'file-upload', 'folder', 'folder-open', 'folder-shared',\n // === Hardware ===\n 'cast', 'cast-connected', 'computer', 'desktop-mac', 'desktop-windows',\n 'developer-board', 'device-hub', 'devices-other', 'dock', 'gamepad',\n 'headset', 'headset-mic', 'keyboard', 'keyboard-arrow-down',\n 'keyboard-arrow-left', 'keyboard-arrow-right', 'keyboard-arrow-up',\n 'keyboard-backspace', 'keyboard-capslock', 'keyboard-hide',\n 'keyboard-return', 'keyboard-tab', 'keyboard-voice', 'laptop',\n 'laptop-chromebook', 'laptop-mac', 'laptop-windows', 'memory',\n 'mouse', 'phone-android', 'phone-iphone', 'phonelink', 'phonelink-off',\n 'power-input', 'router', 'scanner', 'security', 'sim-card',\n 'smartphone', 'speaker', 'speaker-group', 'tablet', 'tablet-android',\n 'tablet-mac', 'toys', 'tv', 'watch',\n // === Image ===\n 'add-a-photo', 'add-photo-alternate', 'add-to-photos', 'adjust',\n 'brightness-1', 'broken-image', 'brush', 'burst-mode', 'camera',\n 'camera-alt', 'camera-front', 'camera-rear', 'camera-roll',\n 'center-focus-strong', 'center-focus-weak', 'collections',\n 'collections-bookmark', 'color-lens', 'colorize', 'compare',\n 'control-point', 'control-point-duplicate', 'crop', 'crop-16-9',\n 'crop-3-2', 'crop-5-4', 'crop-7-5', 'crop-din', 'crop-free',\n 'crop-landscape', 'crop-original', 'crop-portrait', 'crop-rotate',\n 'crop-square', 'dehaze', 'details', 'edit', 'exposure',\n 'exposure-neg-1', 'exposure-neg-2', 'exposure-plus-1', 'exposure-plus-2',\n 'exposure-zero', 'filter', 'filter-1', 'filter-2', 'filter-3',\n 'filter-4', 'filter-5', 'filter-6', 'filter-7', 'filter-8', 'filter-9',\n 'filter-9-plus', 'filter-b-and-w', 'filter-center-focus', 'filter-drama',\n 'filter-frames', 'filter-hdr', 'filter-none', 'filter-tilt-shift',\n 'filter-vintage', 'flare', 'flash-auto', 'flash-off', 'flash-on',\n 'flip', 'gradient', 'grain', 'grid-off', 'grid-on', 'hdr-off',\n 'hdr-on', 'hdr-strong', 'hdr-weak', 'healing', 'image',\n 'image-aspect-ratio', 'image-search', 'iso', 'landscape', 'leak-add',\n 'leak-remove', 'lens', 'linked-camera', 'looks', 'looks-3',\n 'looks-4', 'looks-5', 'looks-6', 'looks-one', 'looks-two', 'loupe',\n 'monochrome-photos', 'movie-creation', 'movie-filter', 'music-off',\n 'music-on', 'navigate-before', 'navigate-next', 'nature', 'nature-people',\n 'palette', 'panorama', 'panorama-fish-eye', 'panorama-horizontal',\n 'panorama-vertical', 'panorama-wide-angle', 'photo', 'photo-album',\n 'photo-camera', 'photo-filter', 'photo-library', 'photo-size-select-actual',\n 'photo-size-select-large', 'photo-size-select-small', 'picture-as-pdf',\n 'portrait', 'remove-red-eye', 'rotate-90-degrees-ccw', 'rotate-left',\n 'rotate-right', 'slideshow', 'straighten', 'style', 'switch-camera',\n 'switch-video', 'tag-faces', 'texture', 'timelapse', 'timer',\n 'timer-10', 'timer-3', 'timer-off', 'tonality', 'transform', 'tune',\n 'view-comfy', 'view-compact', 'vignette', 'wb-auto', 'wb-cloudy',\n 'wb-incandescent', 'wb-iridescent', 'wb-sunny',\n // === Maps ===\n 'add-location', 'beenhere', 'directions', 'directions-bike',\n 'directions-boat', 'directions-bus', 'directions-car',\n 'directions-railway', 'directions-run', 'directions-subway',\n 'directions-transit', 'directions-walk', 'edit-location', 'ev-station',\n 'flight', 'hotel', 'layers', 'layers-clear', 'local-activity',\n 'local-airport', 'local-atm', 'local-bar', 'local-cafe', 'local-car-wash',\n 'local-convenience-store', 'local-dining', 'local-drink', 'local-florist',\n 'local-gas-station', 'local-grocery-store', 'local-hospital',\n 'local-hotel', 'local-laundry-service', 'local-library', 'local-mall',\n 'local-movies', 'local-offer', 'local-parking', 'local-pharmacy',\n 'local-phone', 'local-pizza', 'local-play', 'local-post-office',\n 'local-printshop', 'local-see', 'local-shipping', 'local-taxi', 'map',\n 'my-location', 'navigation', 'near-me', 'person-pin', 'person-pin-circle',\n 'pin-drop', 'place', 'rate-review', 'restaurant', 'restaurant-menu',\n 'satellite', 'store-mall-directory', 'streetview', 'subway', 'terrain',\n 'traffic', 'train', 'tram', 'transfer-within-a-station', 'zoom-out-map',\n // === Navigation ===\n 'apps', 'arrow-back', 'arrow-downward', 'arrow-drop-down',\n 'arrow-drop-down-circle', 'arrow-drop-up', 'arrow-forward', 'arrow-upward',\n 'cancel', 'check', 'chevron-left', 'chevron-right', 'close',\n 'expand-less', 'expand-more', 'first-page', 'last-page', 'menu',\n 'more-horiz', 'more-vert', 'subdirectory-arrow-left',\n 'subdirectory-arrow-right', 'unfold-less', 'unfold-more',\n // === Notification ===\n 'adb', 'airline-seat-flat', 'airline-seat-flat-angled',\n 'airline-seat-individual-suite', 'airline-seat-legroom-extra',\n 'airline-seat-legroom-normal', 'airline-seat-legroom-reduced',\n 'airline-seat-recline-extra', 'airline-seat-recline-normal',\n 'bluetooth-audio', 'confirmation-number', 'disc-full', 'do-not-disturb',\n 'do-not-disturb-alt', 'do-not-disturb-off', 'do-not-disturb-on',\n 'drive-eta', 'enhanced-encryption', 'event-available', 'event-busy',\n 'event-note', 'folder-special', 'live-tv', 'mms', 'more',\n 'network-check', 'network-locked', 'no-encryption', 'ondemand-video',\n 'personal-video', 'phone-bluetooth-speaker', 'phone-callback',\n 'phone-forwarded', 'phone-in-talk', 'phone-locked', 'phone-missed',\n 'phone-paused', 'power', 'power-off', 'priority-high', 'sd-card',\n 'sim-card-alert', 'sms', 'sms-failed', 'sync-disabled', 'sync-problem',\n 'system-update', 'tap-and-play', 'time-to-leave', 'vibration',\n 'voice-chat', 'vpn-lock', 'wc', 'wifi', 'notifications', 'notifications-active',\n 'notifications-none', 'notifications-off', 'notifications-paused',\n // === Places ===\n 'ac-unit', 'airport-shuttle', 'all-inclusive', 'beach-access',\n 'business-center', 'casino', 'child-care', 'child-friendly',\n 'fitness-center', 'free-breakfast', 'golf-course', 'hot-tub',\n 'kitchen', 'meeting-room', 'no-meeting-room', 'pool', 'room-service',\n 'rv-hookup', 'smoke-free', 'smoking-rooms', 'spa',\n // === Social ===\n 'cake', 'domain', 'group', 'group-add', 'location-city', 'mood',\n 'mood-bad', 'notifications', 'pages', 'party-mode', 'people',\n 'people-outline', 'person', 'person-add', 'person-outline',\n 'plus-one', 'poll', 'public', 'school', 'sentiment-dissatisfied',\n 'sentiment-neutral', 'sentiment-satisfied', 'sentiment-very-dissatisfied',\n 'sentiment-very-satisfied', 'share', 'thumb-down', 'thumb-up',\n 'whatshot',\n // === Toggle ===\n 'check-box', 'check-box-outline-blank', 'indeterminate-check-box',\n 'radio-button-checked', 'radio-button-unchecked', 'star', 'star-border', 'star-half',\n // === Additional common icons ===\n '360', 'autorenew', 'call-split', 'explore', 'extension', 'face',\n 'feedback', 'fiber-dvr', 'fiber-manual-record', 'fiber-new', 'fiber-pin',\n 'fiber-smart-record', 'get-app', 'grade', 'highlight-off', 'http',\n 'https', 'important-devices', 'lightbulb', 'lightbulb-outline',\n 'perm-camera-mic', 'perm-contact-calendar', 'perm-data-setting',\n 'perm-device-information', 'perm-identity', 'perm-media', 'perm-phone-msg',\n 'perm-scan-wifi', 'pets', 'playlist-add', 'playlist-add-check', 'playlist-play',\n 'pregnant-woman', 'query-builder', 'question-answer', 'receipt', 'record-voice-over',\n 'redeem', 'report-problem', 'restore', 'restore-page', 'room', 'rounded-corner',\n 'rowing', 'settings-applications', 'settings-backup-restore', 'settings-bluetooth',\n 'settings-brightness', 'settings-cell', 'settings-ethernet', 'settings-input-antenna',\n 'settings-input-component', 'settings-input-composite', 'settings-input-hdmi',\n 'settings-input-svideo', 'settings-overscan', 'settings-phone', 'settings-power',\n 'settings-remote', 'settings-voice', 'shop', 'shop-two', 'shopping-basket',\n 'shopping-cart', 'speaker-notes', 'speaker-notes-off', 'spellcheck', 'stars',\n 'subject', 'supervisor-account', 'swap-horiz', 'swap-vert', 'swap-vertical-circle',\n 'system-update-alt', 'tab', 'tab-unselected', 'theaters', 'thumb-down',\n 'thumb-up', 'thumbs-up-down', 'toc', 'toll', 'touch-app', 'translate',\n 'trending-down', 'trending-flat', 'trending-up', 'turned-in', 'turned-in-not',\n 'update', 'view-agenda', 'view-array', 'view-carousel', 'view-column',\n 'view-day', 'view-headline', 'view-list', 'view-module', 'view-quilt',\n 'view-stream', 'view-week', 'visibility', 'visibility-off', 'watch-later',\n 'youtube-searched-for', 'aspect-ratio', 'assignment', 'assignment-ind',\n 'assignment-late', 'assignment-return', 'assignment-returned', 'assignment-turned-in',\n 'backup', 'book', 'flight-takeoff', 'flight-land',\n] as const;\n\n/**\n * Get all available Astro icon names\n */\nexport function getAstroIconNames(): readonly string[] {\n return ASTRO_ICON_NAMES;\n}\n\n/**\n * Get all available icon names including aliases\n */\nexport function getAllIconNames(): { icons: readonly string[]; aliases: Record<string, string> } {\n return {\n icons: ASTRO_ICON_NAMES,\n aliases: ICON_ALIASES,\n };\n}\n\n// Global state for RuxIcon loading with subscription pattern\ntype LoadState = 'pending' | 'loading' | 'loaded' | 'failed';\nlet loadState: LoadState = 'pending';\nlet RuxIconComponent: React.ComponentType<any> | null = null;\nconst subscribers = new Set<() => void>();\n\nfunction subscribe(callback: () => void) {\n subscribers.add(callback);\n return () => subscribers.delete(callback);\n}\n\nfunction notifySubscribers() {\n subscribers.forEach(cb => cb());\n}\n\n/**\n * Safely load RuxIcon from @astrouxds/react\n * Returns null if not available\n */\nasync function loadRuxIcon(): Promise<React.ComponentType<any> | null> {\n if (loadState === 'loaded') {\n return RuxIconComponent;\n }\n \n if (loadState === 'failed') {\n return null;\n }\n \n if (loadState === 'loading') {\n // Wait for the existing load to complete\n return new Promise(resolve => {\n const unsub = subscribe(() => {\n unsub();\n resolve(RuxIconComponent);\n });\n });\n }\n \n loadState = 'loading';\n \n try {\n // Dynamic import for tree-shaking and optional dependency\n const astroModule = await import('@astrouxds/react');\n RuxIconComponent = astroModule.RuxIcon;\n loadState = 'loaded';\n notifySubscribers();\n return RuxIconComponent;\n } catch (err) {\n loadState = 'failed';\n notifySubscribers();\n return null;\n }\n}\n\n/**\n * Fallback icon component when @astrouxds/react is not installed\n */\nfunction FallbackIcon({\n name,\n size,\n color,\n label,\n className,\n style,\n onClick,\n 'data-testid': testId,\n}: AstroIconProps) {\n const { tokens } = useTheme();\n const actualSize = typeof size === 'number' ? size : SIZE_MAP[size || 'normal'];\n \n // Simple SVG fallback with first letter\n return (\n <span\n role=\"img\"\n aria-label={label || name}\n className={className}\n data-testid={testId}\n onClick={onClick}\n tabIndex={onClick ? 0 : undefined}\n onKeyDown={onClick ? (e) => e.key === 'Enter' && onClick() : undefined}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: actualSize,\n height: actualSize,\n fontSize: actualSize * 0.4,\n fontFamily: tokens.typography.fontFamily.mono,\n fontWeight: 700, // AstroUXDS bold for data values\n color: color || tokens.colors.status.off,\n backgroundColor: tokens.colors.background.surface,\n border: `1px solid ${tokens.colors.border.default}`,\n borderRadius: 4,\n cursor: onClick ? 'pointer' : 'default',\n userSelect: 'none',\n ...style,\n }}\n title={`Icon: ${name}${!RuxIconComponent ? ' (install @astrouxds/react for official icons)' : ''}`}\n >\n <svg\n width={actualSize * 0.6}\n height={actualSize * 0.6}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n {/* Generic icon placeholder - box with dot */}\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <circle cx=\"12\" cy=\"12\" r=\"2\" fill=\"currentColor\" />\n </svg>\n </span>\n );\n}\n\n/**\n * AstroIcon - Official Astro UXD Icons\n * \n * Displays icons from the official Astro UX Design System.\n * Automatically uses @astrouxds/react if installed, otherwise shows fallback.\n * \n * @example\n * ```tsx\n * // Basic usage\n * <AstroIcon name=\"satellite\" />\n * \n * // With size\n * <AstroIcon name=\"antenna\" size=\"large\" />\n * <AstroIcon name=\"thermal\" size={48} />\n * \n * // With color\n * <AstroIcon name=\"warning\" color=\"var(--color-status-caution)\" />\n * \n * // With click handler\n * <AstroIcon name=\"settings\" onClick={() => openSettings()} />\n * ```\n */\nexport const AstroIcon = memo(function AstroIcon(props: AstroIconProps) {\n const {\n name,\n size = 'normal',\n color,\n label,\n className,\n style,\n onClick,\n 'data-testid': testId,\n } = props;\n \n const [, forceUpdate] = useState(0);\n const [currentState, setCurrentState] = useState(loadState);\n const mountedRef = useRef(true);\n \n // Subscribe to load state changes and trigger loading\n useEffect(() => {\n mountedRef.current = true;\n \n // Subscribe to state changes\n const unsubscribe = subscribe(() => {\n if (mountedRef.current) {\n setCurrentState(loadState);\n forceUpdate(n => n + 1);\n }\n });\n \n // Trigger load if not yet started\n if (loadState === 'pending') {\n loadRuxIcon();\n }\n \n return () => {\n mountedRef.current = false;\n unsubscribe();\n };\n }, []);\n \n // If still loading, show a subtle placeholder\n if (currentState === 'pending' || currentState === 'loading') {\n const actualSize = typeof size === 'number' ? size : SIZE_MAP[size];\n return (\n <span\n style={{\n display: 'inline-block',\n width: actualSize,\n height: actualSize,\n ...style,\n }}\n className={className}\n aria-hidden=\"true\"\n />\n );\n }\n \n // Resolve icon alias to actual Astro icon name\n const resolvedName = resolveIconAlias(name);\n \n // If @astrouxds/react is available, use official RuxIcon\n if (RuxIconComponent) {\n const RuxIcon = RuxIconComponent;\n const pixelSize = typeof size === 'number' ? size : SIZE_MAP[size];\n \n // Map numeric size to closest Astro size preset for RuxIcon\n // This helps RuxIcon render at approximately the right size before CSS kicks in\n const getClosestAstroSize = (px: number): AstroIconSize => {\n if (px <= 18) return 'extra-small'; // 16px\n if (px <= 28) return 'small'; // 24px\n if (px <= 40) return 'normal'; // 32px\n return 'large'; // 48px\n };\n const astroSize = typeof size === 'number' ? getClosestAstroSize(size) : size;\n \n // Default to off/grey color if no color specified\n const iconColor = color || 'var(--color-status-off, #a4abb6)';\n \n return (\n <span\n role=\"img\"\n aria-label={label || name}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: pixelSize,\n height: pixelSize,\n minWidth: pixelSize,\n minHeight: pixelSize,\n flexShrink: 0,\n // Don't use overflow:hidden - it clips the icon SVG\n ...style,\n }}\n className={className}\n >\n <RuxIcon\n icon={resolvedName}\n size={astroSize}\n label={label || name}\n data-testid={testId}\n onClick={onClick}\n style={{\n // Force the RuxIcon to respect our exact pixel size\n '--iconDefaultSize': `${pixelSize}px`,\n '--iconSize': `${pixelSize}px`,\n '--size': `${pixelSize}px`,\n color: iconColor,\n width: `${pixelSize}px`,\n height: `${pixelSize}px`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n ...(onClick && { cursor: 'pointer' }),\n } as React.CSSProperties}\n />\n </span>\n );\n }\n \n // Fallback when @astrouxds/react is not installed\n return <FallbackIcon {...props} name={resolvedName} />;\n});\n\n/**\n * Check if @astrouxds/react is available\n * Useful for conditional rendering or feature detection\n */\nexport function isAstroIconsAvailable(): boolean {\n return loadState === 'loaded' && RuxIconComponent !== null;\n}\n\n/**\n * Preload the Astro icons module\n * Call this early in your app to ensure icons are ready\n */\nexport async function preloadAstroIcons(): Promise<boolean> {\n const component = await loadRuxIcon();\n return component !== null;\n}\n\nexport default AstroIcon;\n"],"names":["AstroIcon"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { default as React } from 'react';
2
+ import { StatusLevel } from '../utils';
3
+
4
+ export type BadgeVariant = 'filled' | 'outline' | 'subtle';
5
+ export type BadgeSize = 'small' | 'medium';
6
+ export interface BadgeProps {
7
+ /** Visual variant */
8
+ variant?: BadgeVariant;
9
+ /** Size */
10
+ size?: BadgeSize;
11
+ /** Status-based coloring */
12
+ status?: StatusLevel;
13
+ /** Custom color */
14
+ color?: string;
15
+ /** Icon before text */
16
+ icon?: React.ReactNode;
17
+ /** Removable (shows X button) */
18
+ onRemove?: () => void;
19
+ /** Children */
20
+ children: React.ReactNode;
21
+ /** Custom className */
22
+ className?: string;
23
+ /** Click handler */
24
+ onClick?: () => void;
25
+ }
26
+ export declare const Badge: React.NamedExoticComponent<BadgeProps>;
27
+ export default Badge;
@@ -0,0 +1,134 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { memo } from "react";
3
+ import { classNames } from "../utils/index.js";
4
+ import { useTheme } from "../theme/ThemeProvider.js";
5
+ const Badge = memo(function Badge2({
6
+ variant = "filled",
7
+ size = "small",
8
+ status,
9
+ color,
10
+ icon,
11
+ onRemove,
12
+ children,
13
+ className = "",
14
+ onClick
15
+ }) {
16
+ const { tokens } = useTheme();
17
+ const baseColor = color ?? (status ? tokens.colors.status[status] : tokens.colors.accent.primary);
18
+ const getContrastText = (bg) => {
19
+ const hex = bg.replace("#", "");
20
+ if (hex.length < 6) return "#ffffff";
21
+ const r = parseInt(hex.slice(0, 2), 16) / 255;
22
+ const g = parseInt(hex.slice(2, 4), 16) / 255;
23
+ const b = parseInt(hex.slice(4, 6), 16) / 255;
24
+ const toLinear = (c) => c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
25
+ const L = 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);
26
+ return L > 0.179 ? "#000000" : "#ffffff";
27
+ };
28
+ const sizeConfig = {
29
+ small: {
30
+ padding: `2px ${tokens.spacing.xs}`,
31
+ fontSize: tokens.typography.fontSize.xs,
32
+ height: "20px"
33
+ },
34
+ medium: {
35
+ padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,
36
+ fontSize: tokens.typography.fontSize.sm,
37
+ height: "26px"
38
+ }
39
+ };
40
+ const config = sizeConfig[size];
41
+ const variantStyles = {
42
+ filled: {
43
+ backgroundColor: baseColor,
44
+ color: getContrastText(baseColor),
45
+ // WCAG AA: auto dark/light text based on bg luminance
46
+ border: "none"
47
+ },
48
+ outline: {
49
+ backgroundColor: "transparent",
50
+ color: baseColor,
51
+ border: `1px solid ${baseColor}`
52
+ },
53
+ subtle: {
54
+ backgroundColor: `${baseColor}20`,
55
+ color: baseColor,
56
+ border: "none"
57
+ }
58
+ };
59
+ const isInteractive = !!onClick;
60
+ return /* @__PURE__ */ jsxs(
61
+ "span",
62
+ {
63
+ className: classNames("zendir-badge", `zendir-badge--${variant}`, className),
64
+ onClick,
65
+ role: isInteractive ? "button" : void 0,
66
+ tabIndex: isInteractive ? 0 : void 0,
67
+ onKeyDown: onClick ? (e) => {
68
+ if (e.key === "Enter" || e.key === " ") {
69
+ e.preventDefault();
70
+ onClick();
71
+ }
72
+ } : void 0,
73
+ style: {
74
+ display: "inline-flex",
75
+ alignItems: "center",
76
+ gap: tokens.spacing.xs,
77
+ padding: config.padding,
78
+ height: config.height,
79
+ fontSize: config.fontSize,
80
+ fontWeight: tokens.typography.fontWeight.medium,
81
+ fontFamily: tokens.typography.fontFamily.primary,
82
+ borderRadius: tokens.borderRadius.full,
83
+ cursor: isInteractive ? "pointer" : "default",
84
+ transition: `all ${tokens.animation.fast}`,
85
+ whiteSpace: "nowrap",
86
+ ...variantStyles[variant]
87
+ },
88
+ children: [
89
+ icon,
90
+ children,
91
+ onRemove && /* @__PURE__ */ jsx(
92
+ "button",
93
+ {
94
+ type: "button",
95
+ onClick: (e) => {
96
+ e.stopPropagation();
97
+ onRemove();
98
+ },
99
+ "aria-label": "Remove",
100
+ style: {
101
+ display: "flex",
102
+ alignItems: "center",
103
+ justifyContent: "center",
104
+ /* Visual size stays 14px; touch target expanded to 24px via padding (WCAG 2.5.8) */
105
+ padding: "5px",
106
+ marginLeft: tokens.spacing.xxs,
107
+ width: "24px",
108
+ height: "24px",
109
+ backgroundColor: "transparent",
110
+ border: "none",
111
+ borderRadius: "50%",
112
+ cursor: "pointer",
113
+ color: "inherit",
114
+ opacity: 0.7,
115
+ transition: `opacity ${tokens.animation.fast}`,
116
+ boxSizing: "border-box"
117
+ },
118
+ onMouseEnter: (e) => {
119
+ e.currentTarget.style.opacity = "1";
120
+ },
121
+ onMouseLeave: (e) => {
122
+ e.currentTarget.style.opacity = "0.7";
123
+ },
124
+ children: /* @__PURE__ */ jsx("svg", { width: "10", height: "10", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" }) })
125
+ }
126
+ )
127
+ ]
128
+ }
129
+ );
130
+ });
131
+ export {
132
+ Badge
133
+ };
134
+ //# sourceMappingURL=Badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.js","sources":["../../../src/react/core/Badge.tsx"],"sourcesContent":["/**\n * @zendir/ui - Badge/Tag Component\n * \n * Badge and tag following Astro UX Design System.\n * \n * @example\n * ```tsx\n * <Badge>Default</Badge>\n * <Badge status=\"normal\">Active</Badge>\n * <Badge variant=\"outline\" status=\"caution\">Warning</Badge>\n * <Badge icon={<Icon name=\"satellite\" size={12} />}>Satellite</Badge>\n * ```\n */\n\nimport React, { memo } from 'react';\nimport { useTheme } from '../theme';\nimport { classNames, type StatusLevel } from '../utils';\n\nexport type BadgeVariant = 'filled' | 'outline' | 'subtle';\nexport type BadgeSize = 'small' | 'medium';\n\nexport interface BadgeProps {\n /** Visual variant */\n variant?: BadgeVariant;\n /** Size */\n size?: BadgeSize;\n /** Status-based coloring */\n status?: StatusLevel;\n /** Custom color */\n color?: string;\n /** Icon before text */\n icon?: React.ReactNode;\n /** Removable (shows X button) */\n onRemove?: () => void;\n /** Children */\n children: React.ReactNode;\n /** Custom className */\n className?: string;\n /** Click handler */\n onClick?: () => void;\n}\n\nexport const Badge = memo(function Badge({\n variant = 'filled',\n size = 'small',\n status,\n color,\n icon,\n onRemove,\n children,\n className = '',\n onClick,\n}: BadgeProps): React.ReactElement {\n const { tokens } = useTheme();\n \n // Determine base color\n const baseColor = color ?? (status ? tokens.colors.status[status] : tokens.colors.accent.primary);\n\n // WCAG AA: choose black or white text based on background luminance\n // Uses relative luminance formula (WCAG 2.1 SC 1.4.3)\n const getContrastText = (bg: string): string => {\n const hex = bg.replace('#', '');\n if (hex.length < 6) return '#ffffff';\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n const toLinear = (c: number) => c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n const L = 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n // If luminance > 0.179, background is bright → use dark text\n return L > 0.179 ? '#000000' : '#ffffff';\n };\n \n const sizeConfig = {\n small: {\n padding: `2px ${tokens.spacing.xs}`,\n fontSize: tokens.typography.fontSize.xs,\n height: '20px',\n },\n medium: {\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n fontSize: tokens.typography.fontSize.sm,\n height: '26px',\n },\n };\n const config = sizeConfig[size];\n \n const variantStyles: Record<BadgeVariant, React.CSSProperties> = {\n filled: {\n backgroundColor: baseColor,\n color: getContrastText(baseColor), // WCAG AA: auto dark/light text based on bg luminance\n border: 'none',\n },\n outline: {\n backgroundColor: 'transparent',\n color: baseColor,\n border: `1px solid ${baseColor}`,\n },\n subtle: {\n backgroundColor: `${baseColor}20`,\n color: baseColor,\n border: 'none',\n },\n };\n \n const isInteractive = !!onClick;\n \n return (\n <span\n className={classNames('zendir-badge', `zendir-badge--${variant}`, className)}\n onClick={onClick}\n role={isInteractive ? 'button' : undefined}\n tabIndex={isInteractive ? 0 : undefined}\n onKeyDown={onClick ? (e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onClick(); } } : undefined}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: tokens.spacing.xs,\n padding: config.padding,\n height: config.height,\n fontSize: config.fontSize,\n fontWeight: tokens.typography.fontWeight.medium,\n fontFamily: tokens.typography.fontFamily.primary,\n borderRadius: tokens.borderRadius.full,\n cursor: isInteractive ? 'pointer' : 'default',\n transition: `all ${tokens.animation.fast}`,\n whiteSpace: 'nowrap',\n ...variantStyles[variant],\n }}\n >\n {icon}\n {children}\n {onRemove && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n aria-label=\"Remove\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n /* Visual size stays 14px; touch target expanded to 24px via padding (WCAG 2.5.8) */\n padding: '5px',\n marginLeft: tokens.spacing.xxs,\n width: '24px',\n height: '24px',\n backgroundColor: 'transparent',\n border: 'none',\n borderRadius: '50%',\n cursor: 'pointer',\n color: 'inherit',\n opacity: 0.7,\n transition: `opacity ${tokens.animation.fast}`,\n boxSizing: 'border-box',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '1';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '0.7';\n }}\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n </button>\n )}\n </span>\n );\n});\n\nexport default Badge;\n"],"names":["Badge"],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { default as React } from 'react';
2
+
3
+ export type ButtonVariant = 'primary' | 'secondary' | 'borderless';
4
+ export type ButtonSize = 'small' | 'medium' | 'large';
5
+ export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
6
+ /** Visual variant */
7
+ variant?: ButtonVariant;
8
+ /** Size variant */
9
+ size?: ButtonSize;
10
+ /** Icon to display before text */
11
+ icon?: React.ReactNode;
12
+ /** Icon to display after text */
13
+ iconEnd?: React.ReactNode;
14
+ /** Show loading spinner */
15
+ loading?: boolean;
16
+ /** Full width button */
17
+ fullWidth?: boolean;
18
+ /** Tooltip text (shows on hover) */
19
+ tooltip?: string;
20
+ /** Custom className */
21
+ className?: string;
22
+ /** Children */
23
+ children?: React.ReactNode;
24
+ }
25
+ export declare const Button: React.MemoExoticComponent<React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>>;
26
+ export default Button;