@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":"AstroIcon.js","sources":["../../../../src/react/core/display/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';\nimport { Icon, isValidIconName } from './Icon';\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 * Uses built-in Icon SVGs when the name matches, otherwise shows a generic placeholder.\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 if (isValidIconName(name)) {\n return (\n <Icon\n name={name}\n size={actualSize}\n color={color}\n className={className}\n aria-label={label || name}\n onClick={onClick}\n style={style}\n />\n );\n }\n\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,\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} (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 <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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"}
1
+ {"version":3,"file":"AstroIcon.js","names":[],"sources":["../../../../src/react/core/display/AstroIcon.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - AstroIcon Component\r\n *\r\n * Wrapper around official @astrouxds/react RuxIcon component.\r\n * Provides all 400+ official Astro UXD icons with consistent API.\r\n *\r\n * SECURITY: Uses dynamic import with proper error handling.\r\n * FLEXIBILITY: Works with or without @astrouxds/react installed.\r\n *\r\n * @see https://www.astrouxds.com/components/icon-library/\r\n *\r\n * @example\r\n * ```tsx\r\n * import { AstroIcon } from '@zendir/ui/react';\r\n *\r\n * <AstroIcon name=\"satellite\" />\r\n * <AstroIcon name=\"antenna\" size=\"large\" />\r\n * <AstroIcon name=\"thermal\" color=\"#ff0000\" />\r\n * ```\r\n */\r\n\r\nimport React, { memo, useState, useEffect, useRef } from \"react\";\r\nimport { useTheme } from \"../../theme\";\r\nimport { Icon, isValidIconName } from \"./Icon\";\r\n\r\n/**\r\n * All official Astro UXD icon names\r\n * @see https://www.astrouxds.com/components/icon-library/\r\n */\r\nexport type AstroIconName =\r\n // === Astro Space/Mission Icons (Custom by Rocket Communications) ===\r\n | \"altitude\"\r\n | \"antenna\"\r\n | \"antenna-off\"\r\n | \"antenna-receive\"\r\n | \"antenna-transmit\"\r\n | \"equipment\"\r\n | \"hardware\"\r\n | \"mission\"\r\n | \"netcom\"\r\n | \"payload\"\r\n | \"processor\"\r\n | \"processor-alt\"\r\n | \"propulsion-power\"\r\n | \"satellite-off\"\r\n | \"satellite-receive\"\r\n | \"satellite-transmit\"\r\n | \"solar\"\r\n | \"thermal\"\r\n // === Actions ===\r\n | \"settings\"\r\n | \"search\"\r\n | \"home\"\r\n | \"info\"\r\n | \"help\"\r\n | \"delete\"\r\n | \"edit\"\r\n | \"lock\"\r\n | \"lock-open\"\r\n | \"visibility\"\r\n | \"visibility-off\"\r\n | \"refresh\"\r\n | \"sync\"\r\n | \"download\"\r\n | \"upload\"\r\n | \"fullscreen\"\r\n | \"fullscreen-exit\"\r\n | \"zoom-in\"\r\n | \"zoom-out\"\r\n | \"schedule\"\r\n | \"timeline\"\r\n | \"today\"\r\n | \"event\"\r\n | \"bookmark\"\r\n | \"favorite\"\r\n | \"star\"\r\n | \"check-circle\"\r\n | \"done\"\r\n | \"done-all\"\r\n | \"print\"\r\n | \"open-in-new\"\r\n | \"launch\"\r\n | \"power-settings-new\"\r\n | \"history\"\r\n | \"cached\"\r\n | \"build\"\r\n | \"code\"\r\n | \"dns\"\r\n | \"language\"\r\n | \"input\"\r\n | \"label\"\r\n | \"list\"\r\n | \"track-changes\"\r\n | \"verified-user\"\r\n | \"work\"\r\n // === Alerts ===\r\n | \"add-alert\"\r\n | \"error\"\r\n | \"error-outline\"\r\n | \"notification-important\"\r\n | \"warning\"\r\n // === AV ===\r\n | \"play-arrow\"\r\n | \"pause\"\r\n | \"stop\"\r\n | \"skip-next\"\r\n | \"skip-previous\"\r\n | \"fast-forward\"\r\n | \"fast-rewind\"\r\n | \"replay\"\r\n | \"loop\"\r\n | \"shuffle\"\r\n | \"volume-up\"\r\n | \"volume-down\"\r\n | \"volume-off\"\r\n | \"volume-mute\"\r\n | \"mic\"\r\n | \"mic-off\"\r\n | \"videocam\"\r\n | \"videocam-off\"\r\n | \"movie\"\r\n | \"music-note\"\r\n | \"equalizer\"\r\n | \"library-music\"\r\n | \"queue-music\"\r\n | \"subscriptions\"\r\n | \"fiber-new\"\r\n | \"fiber-manual-record\"\r\n | \"fiber-smart-record\"\r\n // === Communication ===\r\n | \"call\"\r\n | \"call-end\"\r\n | \"call-made\"\r\n | \"call-received\"\r\n | \"call-missed\"\r\n | \"call-split\"\r\n | \"chat\"\r\n | \"chat-bubble\"\r\n | \"comment\"\r\n | \"contacts\"\r\n | \"dialer-sip\"\r\n | \"email\"\r\n | \"forum\"\r\n | \"import-export\"\r\n | \"live-help\"\r\n | \"location-off\"\r\n | \"location-on\"\r\n | \"message\"\r\n | \"phone\"\r\n | \"phonelink-erase\"\r\n | \"phonelink-lock\"\r\n | \"phonelink-ring\"\r\n | \"portable-wifi-off\"\r\n | \"present-to-all\"\r\n | \"ring-volume\"\r\n | \"screen-share\"\r\n | \"speaker-phone\"\r\n | \"stay-primary-landscape\"\r\n | \"stay-primary-portrait\"\r\n | \"stop-screen-share\"\r\n | \"swap-calls\"\r\n | \"textsms\"\r\n | \"voicemail\"\r\n | \"vpn-key\"\r\n // === Content ===\r\n | \"add\"\r\n | \"add-box\"\r\n | \"add-circle\"\r\n | \"add-circle-outline\"\r\n | \"archive\"\r\n | \"backspace\"\r\n | \"block\"\r\n | \"clear\"\r\n | \"content-copy\"\r\n | \"content-cut\"\r\n | \"content-paste\"\r\n | \"create\"\r\n | \"drafts\"\r\n | \"filter-list\"\r\n | \"flag\"\r\n | \"forward\"\r\n | \"gesture\"\r\n | \"inbox\"\r\n | \"link\"\r\n | \"link-off\"\r\n | \"low-priority\"\r\n | \"mail\"\r\n | \"markunread\"\r\n | \"move-to-inbox\"\r\n | \"next-week\"\r\n | \"redo\"\r\n | \"remove\"\r\n | \"remove-circle\"\r\n | \"remove-circle-outline\"\r\n | \"reply\"\r\n | \"reply-all\"\r\n | \"report\"\r\n | \"save\"\r\n | \"select-all\"\r\n | \"send\"\r\n | \"sort\"\r\n | \"text-format\"\r\n | \"unarchive\"\r\n | \"undo\"\r\n | \"weekend\"\r\n // === Device ===\r\n | \"access-alarm\"\r\n | \"access-alarms\"\r\n | \"access-time\"\r\n | \"add-alarm\"\r\n | \"airplanemode-active\"\r\n | \"airplanemode-inactive\"\r\n | \"battery-20\"\r\n | \"battery-30\"\r\n | \"battery-50\"\r\n | \"battery-60\"\r\n | \"battery-80\"\r\n | \"battery-90\"\r\n | \"battery-alert\"\r\n | \"battery-charging-20\"\r\n | \"battery-charging-30\"\r\n | \"battery-charging-50\"\r\n | \"battery-charging-60\"\r\n | \"battery-charging-80\"\r\n | \"battery-charging-90\"\r\n | \"battery-charging-full\"\r\n | \"battery-full\"\r\n | \"battery-std\"\r\n | \"battery-unknown\"\r\n | \"bluetooth\"\r\n | \"bluetooth-connected\"\r\n | \"bluetooth-disabled\"\r\n | \"bluetooth-searching\"\r\n | \"brightness-auto\"\r\n | \"brightness-high\"\r\n | \"brightness-low\"\r\n | \"brightness-medium\"\r\n | \"data-usage\"\r\n | \"developer-mode\"\r\n | \"devices\"\r\n | \"dvr\"\r\n | \"gps-fixed\"\r\n | \"gps-not-fixed\"\r\n | \"gps-off\"\r\n | \"graphic-eq\"\r\n | \"location-disabled\"\r\n | \"location-searching\"\r\n | \"network-cell\"\r\n | \"network-wifi\"\r\n | \"nfc\"\r\n | \"screen-lock-landscape\"\r\n | \"screen-lock-portrait\"\r\n | \"screen-lock-rotation\"\r\n | \"screen-rotation\"\r\n | \"sd-storage\"\r\n | \"settings-system-daydream\"\r\n | \"signal-cellular-0-bar\"\r\n | \"signal-cellular-1-bar\"\r\n | \"signal-cellular-2-bar\"\r\n | \"signal-cellular-3-bar\"\r\n | \"signal-cellular-4-bar\"\r\n | \"signal-cellular-connected-no-internet-0-bar\"\r\n | \"signal-cellular-connected-no-internet-1-bar\"\r\n | \"signal-cellular-connected-no-internet-2-bar\"\r\n | \"signal-cellular-connected-no-internet-3-bar\"\r\n | \"signal-cellular-connected-no-internet-4-bar\"\r\n | \"signal-cellular-no-sim\"\r\n | \"signal-cellular-null\"\r\n | \"signal-cellular-off\"\r\n | \"signal-wifi-0-bar\"\r\n | \"signal-wifi-1-bar\"\r\n | \"signal-wifi-1-bar-lock\"\r\n | \"signal-wifi-2-bar\"\r\n | \"signal-wifi-2-bar-lock\"\r\n | \"signal-wifi-3-bar\"\r\n | \"signal-wifi-3-bar-lock\"\r\n | \"signal-wifi-4-bar\"\r\n | \"signal-wifi-4-bar-lock\"\r\n | \"signal-wifi-off\"\r\n | \"storage\"\r\n | \"usb\"\r\n | \"wallpaper\"\r\n | \"widgets\"\r\n | \"wifi-lock\"\r\n | \"wifi-tethering\"\r\n // === Editor ===\r\n | \"attach-file\"\r\n | \"attach-money\"\r\n | \"border-all\"\r\n | \"border-bottom\"\r\n | \"border-clear\"\r\n | \"border-color\"\r\n | \"border-horizontal\"\r\n | \"border-inner\"\r\n | \"border-left\"\r\n | \"border-outer\"\r\n | \"border-right\"\r\n | \"border-style\"\r\n | \"border-top\"\r\n | \"border-vertical\"\r\n | \"bubble-chart\"\r\n | \"drag-handle\"\r\n | \"format-align-center\"\r\n | \"format-align-justify\"\r\n | \"format-align-left\"\r\n | \"format-align-right\"\r\n | \"format-bold\"\r\n | \"format-clear\"\r\n | \"format-color-fill\"\r\n | \"format-color-reset\"\r\n | \"format-color-text\"\r\n | \"format-indent-decrease\"\r\n | \"format-indent-increase\"\r\n | \"format-italic\"\r\n | \"format-line-spacing\"\r\n | \"format-list-bulleted\"\r\n | \"format-list-numbered\"\r\n | \"format-paint\"\r\n | \"format-quote\"\r\n | \"format-shapes\"\r\n | \"format-size\"\r\n | \"format-strikethrough\"\r\n | \"format-textdirection-l-to-r\"\r\n | \"format-textdirection-r-to-l\"\r\n | \"format-underlined\"\r\n | \"functions\"\r\n | \"highlight\"\r\n | \"insert-chart\"\r\n | \"insert-comment\"\r\n | \"insert-drive-file\"\r\n | \"insert-emoticon\"\r\n | \"insert-invitation\"\r\n | \"insert-link\"\r\n | \"insert-photo\"\r\n | \"linear-scale\"\r\n | \"merge-type\"\r\n | \"mode-comment\"\r\n | \"mode-edit\"\r\n | \"monetization-on\"\r\n | \"money-off\"\r\n | \"multiline-chart\"\r\n | \"pie-chart\"\r\n | \"pie-chart-outlined\"\r\n | \"publish\"\r\n | \"short-text\"\r\n | \"show-chart\"\r\n | \"space-bar\"\r\n | \"strikethrough-s\"\r\n | \"table-chart\"\r\n | \"text-fields\"\r\n | \"title\"\r\n | \"vertical-align-bottom\"\r\n | \"vertical-align-center\"\r\n | \"vertical-align-top\"\r\n | \"wrap-text\"\r\n // === File ===\r\n | \"attachment\"\r\n | \"cloud\"\r\n | \"cloud-circle\"\r\n | \"cloud-done\"\r\n | \"cloud-download\"\r\n | \"cloud-off\"\r\n | \"cloud-queue\"\r\n | \"cloud-upload\"\r\n | \"create-new-folder\"\r\n | \"file-download\"\r\n | \"file-upload\"\r\n | \"folder\"\r\n | \"folder-open\"\r\n | \"folder-shared\"\r\n // === Hardware ===\r\n | \"cast\"\r\n | \"cast-connected\"\r\n | \"computer\"\r\n | \"desktop-mac\"\r\n | \"desktop-windows\"\r\n | \"developer-board\"\r\n | \"device-hub\"\r\n | \"devices-other\"\r\n | \"dock\"\r\n | \"gamepad\"\r\n | \"headset\"\r\n | \"headset-mic\"\r\n | \"keyboard\"\r\n | \"keyboard-arrow-down\"\r\n | \"keyboard-arrow-left\"\r\n | \"keyboard-arrow-right\"\r\n | \"keyboard-arrow-up\"\r\n | \"keyboard-backspace\"\r\n | \"keyboard-capslock\"\r\n | \"keyboard-hide\"\r\n | \"keyboard-return\"\r\n | \"keyboard-tab\"\r\n | \"keyboard-voice\"\r\n | \"laptop\"\r\n | \"laptop-chromebook\"\r\n | \"laptop-mac\"\r\n | \"laptop-windows\"\r\n | \"memory\"\r\n | \"mouse\"\r\n | \"phone-android\"\r\n | \"phone-iphone\"\r\n | \"phonelink\"\r\n | \"phonelink-off\"\r\n | \"power-input\"\r\n | \"router\"\r\n | \"scanner\"\r\n | \"security\"\r\n | \"sim-card\"\r\n | \"smartphone\"\r\n | \"speaker\"\r\n | \"speaker-group\"\r\n | \"tablet\"\r\n | \"tablet-android\"\r\n | \"tablet-mac\"\r\n | \"toys\"\r\n | \"tv\"\r\n | \"videogame-asset\"\r\n | \"watch\"\r\n // === Image ===\r\n | \"add-a-photo\"\r\n | \"add-to-photos\"\r\n | \"adjust\"\r\n | \"assistant\"\r\n | \"assistant-photo\"\r\n | \"audiotrack\"\r\n | \"blur-circular\"\r\n | \"blur-linear\"\r\n | \"blur-off\"\r\n | \"blur-on\"\r\n | \"brightness-1\"\r\n | \"brightness-2\"\r\n | \"brightness-3\"\r\n | \"brightness-4\"\r\n | \"brightness-5\"\r\n | \"brightness-6\"\r\n | \"brightness-7\"\r\n | \"broken-image\"\r\n | \"brush\"\r\n | \"burst-mode\"\r\n | \"camera\"\r\n | \"camera-alt\"\r\n | \"camera-front\"\r\n | \"camera-rear\"\r\n | \"camera-roll\"\r\n | \"center-focus-strong\"\r\n | \"center-focus-weak\"\r\n | \"collections\"\r\n | \"collections-bookmark\"\r\n | \"color-lens\"\r\n | \"colorize\"\r\n | \"compare\"\r\n | \"control-point\"\r\n | \"control-point-duplicate\"\r\n | \"crop\"\r\n | \"crop-16-9\"\r\n | \"crop-3-2\"\r\n | \"crop-5-4\"\r\n | \"crop-7-5\"\r\n | \"crop-din\"\r\n | \"crop-free\"\r\n | \"crop-landscape\"\r\n | \"crop-original\"\r\n | \"crop-portrait\"\r\n | \"crop-rotate\"\r\n | \"crop-square\"\r\n | \"dehaze\"\r\n | \"details\"\r\n | \"edit\"\r\n | \"exposure\"\r\n | \"exposure-neg-1\"\r\n | \"exposure-neg-2\"\r\n | \"exposure-plus-1\"\r\n | \"exposure-plus-2\"\r\n | \"exposure-zero\"\r\n | \"filter\"\r\n | \"filter-1\"\r\n | \"filter-2\"\r\n | \"filter-3\"\r\n | \"filter-4\"\r\n | \"filter-5\"\r\n | \"filter-6\"\r\n | \"filter-7\"\r\n | \"filter-8\"\r\n | \"filter-9\"\r\n | \"filter-9-plus\"\r\n | \"filter-b-and-w\"\r\n | \"filter-center-focus\"\r\n | \"filter-drama\"\r\n | \"filter-frames\"\r\n | \"filter-hdr\"\r\n | \"filter-none\"\r\n | \"filter-tilt-shift\"\r\n | \"filter-vintage\"\r\n | \"flare\"\r\n | \"flash-auto\"\r\n | \"flash-off\"\r\n | \"flash-on\"\r\n | \"flip\"\r\n | \"gradient\"\r\n | \"grain\"\r\n | \"grid-off\"\r\n | \"grid-on\"\r\n | \"hdr-off\"\r\n | \"hdr-on\"\r\n | \"hdr-strong\"\r\n | \"hdr-weak\"\r\n | \"healing\"\r\n | \"image\"\r\n | \"image-aspect-ratio\"\r\n | \"iso\"\r\n | \"landscape\"\r\n | \"leak-add\"\r\n | \"leak-remove\"\r\n | \"lens\"\r\n | \"linked-camera\"\r\n | \"looks\"\r\n | \"looks-3\"\r\n | \"looks-4\"\r\n | \"looks-5\"\r\n | \"looks-6\"\r\n | \"looks-one\"\r\n | \"looks-two\"\r\n | \"loupe\"\r\n | \"monochrome-photos\"\r\n | \"movie-creation\"\r\n | \"movie-filter\"\r\n | \"music-note\"\r\n | \"nature\"\r\n | \"nature-people\"\r\n | \"navigate-before\"\r\n | \"navigate-next\"\r\n | \"palette\"\r\n | \"panorama\"\r\n | \"panorama-fish-eye\"\r\n | \"panorama-horizontal\"\r\n | \"panorama-vertical\"\r\n | \"panorama-wide-angle\"\r\n | \"photo\"\r\n | \"photo-album\"\r\n | \"photo-camera\"\r\n | \"photo-filter\"\r\n | \"photo-library\"\r\n | \"photo-size-select-actual\"\r\n | \"photo-size-select-large\"\r\n | \"photo-size-select-small\"\r\n | \"picture-as-pdf\"\r\n | \"portrait\"\r\n | \"remove-red-eye\"\r\n | \"rotate-90-degrees-ccw\"\r\n | \"rotate-left\"\r\n | \"rotate-right\"\r\n | \"slideshow\"\r\n | \"straighten\"\r\n | \"style\"\r\n | \"switch-camera\"\r\n | \"switch-video\"\r\n | \"tag-faces\"\r\n | \"texture\"\r\n | \"timelapse\"\r\n | \"timer\"\r\n | \"timer-10\"\r\n | \"timer-3\"\r\n | \"timer-off\"\r\n | \"tonality\"\r\n | \"transform\"\r\n | \"tune\"\r\n | \"view-comfy\"\r\n | \"view-compact\"\r\n | \"vignette\"\r\n | \"wb-auto\"\r\n | \"wb-cloudy\"\r\n | \"wb-incandescent\"\r\n | \"wb-iridescent\"\r\n | \"wb-sunny\"\r\n // === Maps ===\r\n | \"add-location\"\r\n | \"beenhere\"\r\n | \"directions\"\r\n | \"directions-bike\"\r\n | \"directions-boat\"\r\n | \"directions-bus\"\r\n | \"directions-car\"\r\n | \"directions-railway\"\r\n | \"directions-run\"\r\n | \"directions-subway\"\r\n | \"directions-transit\"\r\n | \"directions-walk\"\r\n | \"edit-location\"\r\n | \"ev-station\"\r\n | \"explore\"\r\n | \"flight\"\r\n | \"hotel\"\r\n | \"layers\"\r\n | \"layers-clear\"\r\n | \"local-activity\"\r\n | \"local-airport\"\r\n | \"local-atm\"\r\n | \"local-bar\"\r\n | \"local-cafe\"\r\n | \"local-car-wash\"\r\n | \"local-convenience-store\"\r\n | \"local-dining\"\r\n | \"local-drink\"\r\n | \"local-florist\"\r\n | \"local-gas-station\"\r\n | \"local-grocery-store\"\r\n | \"local-hospital\"\r\n | \"local-hotel\"\r\n | \"local-laundry-service\"\r\n | \"local-library\"\r\n | \"local-mall\"\r\n | \"local-movies\"\r\n | \"local-offer\"\r\n | \"local-parking\"\r\n | \"local-pharmacy\"\r\n | \"local-phone\"\r\n | \"local-pizza\"\r\n | \"local-play\"\r\n | \"local-post-office\"\r\n | \"local-printshop\"\r\n | \"local-see\"\r\n | \"local-shipping\"\r\n | \"local-taxi\"\r\n | \"map\"\r\n | \"my-location\"\r\n | \"navigation\"\r\n | \"near-me\"\r\n | \"person-pin\"\r\n | \"person-pin-circle\"\r\n | \"pin-drop\"\r\n | \"place\"\r\n | \"rate-review\"\r\n | \"restaurant\"\r\n | \"restaurant-menu\"\r\n | \"satellite\"\r\n | \"store-mall-directory\"\r\n | \"streetview\"\r\n | \"subway\"\r\n | \"terrain\"\r\n | \"traffic\"\r\n | \"train\"\r\n | \"tram\"\r\n | \"transfer-within-a-station\"\r\n | \"zoom-out-map\"\r\n // === Navigation ===\r\n | \"apps\"\r\n | \"arrow-back\"\r\n | \"arrow-downward\"\r\n | \"arrow-drop-down\"\r\n | \"arrow-drop-down-circle\"\r\n | \"arrow-drop-up\"\r\n | \"arrow-forward\"\r\n | \"arrow-upward\"\r\n | \"cancel\"\r\n | \"check\"\r\n | \"chevron-left\"\r\n | \"chevron-right\"\r\n | \"close\"\r\n | \"expand-less\"\r\n | \"expand-more\"\r\n | \"first-page\"\r\n | \"fullscreen\"\r\n | \"fullscreen-exit\"\r\n | \"last-page\"\r\n | \"menu\"\r\n | \"more-horiz\"\r\n | \"more-vert\"\r\n | \"refresh\"\r\n | \"subdirectory-arrow-left\"\r\n | \"subdirectory-arrow-right\"\r\n | \"unfold-less\"\r\n | \"unfold-more\"\r\n // === Notification ===\r\n | \"adb\"\r\n | \"airline-seat-flat\"\r\n | \"airline-seat-flat-angled\"\r\n | \"airline-seat-individual-suite\"\r\n | \"airline-seat-legroom-extra\"\r\n | \"airline-seat-legroom-normal\"\r\n | \"airline-seat-legroom-reduced\"\r\n | \"airline-seat-recline-extra\"\r\n | \"airline-seat-recline-normal\"\r\n | \"bluetooth-audio\"\r\n | \"confirmation-number\"\r\n | \"disc-full\"\r\n | \"do-not-disturb\"\r\n | \"do-not-disturb-alt\"\r\n | \"do-not-disturb-off\"\r\n | \"do-not-disturb-on\"\r\n | \"drive-eta\"\r\n | \"enhanced-encryption\"\r\n | \"event-available\"\r\n | \"event-busy\"\r\n | \"event-note\"\r\n | \"folder-special\"\r\n | \"live-tv\"\r\n | \"mms\"\r\n | \"more\"\r\n | \"network-check\"\r\n | \"network-locked\"\r\n | \"no-encryption\"\r\n | \"ondemand-video\"\r\n | \"personal-video\"\r\n | \"phone-bluetooth-speaker\"\r\n | \"phone-forwarded\"\r\n | \"phone-in-talk\"\r\n | \"phone-locked\"\r\n | \"phone-missed\"\r\n | \"phone-paused\"\r\n | \"power\"\r\n | \"power-off\"\r\n | \"priority-high\"\r\n | \"sd-card\"\r\n | \"sim-card-alert\"\r\n | \"sms\"\r\n | \"sms-failed\"\r\n | \"sync\"\r\n | \"sync-disabled\"\r\n | \"sync-problem\"\r\n | \"system-update\"\r\n | \"tap-and-play\"\r\n | \"time-to-leave\"\r\n | \"vibration\"\r\n | \"voice-chat\"\r\n | \"vpn-lock\"\r\n | \"wc\"\r\n | \"wifi\"\r\n | \"wifi-off\"\r\n // === Places ===\r\n | \"ac-unit\"\r\n | \"airport-shuttle\"\r\n | \"all-inclusive\"\r\n | \"beach-access\"\r\n | \"business-center\"\r\n | \"casino\"\r\n | \"child-care\"\r\n | \"child-friendly\"\r\n | \"fitness-center\"\r\n | \"free-breakfast\"\r\n | \"golf-course\"\r\n | \"hot-tub\"\r\n | \"kitchen\"\r\n | \"pool\"\r\n | \"room-service\"\r\n | \"rv-hookup\"\r\n | \"smoke-free\"\r\n | \"smoking-rooms\"\r\n | \"spa\"\r\n // === Social ===\r\n | \"cake\"\r\n | \"domain\"\r\n | \"group\"\r\n | \"group-add\"\r\n | \"location-city\"\r\n | \"mood\"\r\n | \"mood-bad\"\r\n | \"notifications\"\r\n | \"notifications-active\"\r\n | \"notifications-none\"\r\n | \"notifications-off\"\r\n | \"notifications-paused\"\r\n | \"pages\"\r\n | \"party-mode\"\r\n | \"people\"\r\n | \"people-outline\"\r\n | \"person\"\r\n | \"person-add\"\r\n | \"person-outline\"\r\n | \"plus-one\"\r\n | \"poll\"\r\n | \"public\"\r\n | \"school\"\r\n | \"sentiment-dissatisfied\"\r\n | \"sentiment-neutral\"\r\n | \"sentiment-satisfied\"\r\n | \"sentiment-very-dissatisfied\"\r\n | \"sentiment-very-satisfied\"\r\n | \"share\"\r\n | \"whatshot\"\r\n // === Toggle ===\r\n | \"check-box\"\r\n | \"check-box-outline-blank\"\r\n | \"indeterminate-check-box\"\r\n | \"radio-button-checked\"\r\n | \"radio-button-unchecked\"\r\n | \"star\"\r\n | \"star-border\"\r\n | \"star-half\"\r\n // === Space Operations Aliases (mapped to existing icons) ===\r\n // Orbit & Trajectory\r\n | \"orbit\"\r\n | \"trajectory\"\r\n | \"orbital\"\r\n // Ground Operations\r\n | \"ground-station\"\r\n | \"ground-control\"\r\n | \"dish\"\r\n | \"tracking-station\"\r\n // Communication\r\n | \"uplink\"\r\n | \"downlink\"\r\n | \"command\"\r\n | \"telemetry\"\r\n | \"comms\"\r\n | \"rf\"\r\n | \"link\"\r\n | \"signal\"\r\n | \"data-link\"\r\n // Satellite States\r\n | \"satellite\"\r\n | \"spacecraft\"\r\n | \"vehicle\"\r\n | \"sat\"\r\n | \"sc\"\r\n // Power Systems\r\n | \"power\"\r\n | \"battery\"\r\n | \"energy\"\r\n | \"solar-array\"\r\n | \"solar-panel\"\r\n | \"photovoltaic\"\r\n // Propulsion\r\n | \"thruster\"\r\n | \"engine\"\r\n | \"burn\"\r\n | \"maneuver\"\r\n | \"delta-v\"\r\n | \"rcs\"\r\n // Thermal\r\n | \"temperature\"\r\n | \"heat\"\r\n | \"cooling\"\r\n | \"heater\"\r\n // Attitude & Control\r\n | \"attitude\"\r\n | \"pointing\"\r\n | \"orientation\"\r\n | \"adcs\"\r\n | \"gyro\"\r\n | \"gyroscope\"\r\n // Navigation\r\n | \"gps\"\r\n | \"gnss\"\r\n | \"position\"\r\n | \"location\"\r\n | \"ephemeris\"\r\n // Status & Health\r\n | \"health\"\r\n | \"status\"\r\n | \"nominal\"\r\n | \"anomaly\"\r\n | \"fault\"\r\n | \"safe-mode\"\r\n | \"emergency\"\r\n | \"critical\"\r\n | \"caution\"\r\n // Time & Scheduling\r\n | \"pass\"\r\n | \"contact\"\r\n | \"access\"\r\n | \"window\"\r\n | \"aos\"\r\n | \"los\"\r\n | \"eclipse\"\r\n | \"sunlight\"\r\n | \"shadow\"\r\n // Subsystems\r\n | \"subsystem\"\r\n | \"computer\"\r\n | \"obc\"\r\n | \"cdh\"\r\n | \"flight-computer\"\r\n | \"sensor\"\r\n | \"instrument\"\r\n // Launch & Deployment\r\n | \"launch\"\r\n | \"rocket\"\r\n | \"liftoff\"\r\n | \"deployment\"\r\n | \"deploy\"\r\n | \"separation\"\r\n // Operations\r\n | \"ops\"\r\n | \"operations\"\r\n | \"control\"\r\n | \"automation\"\r\n | \"sequence\"\r\n | \"procedure\"\r\n // Data & Storage\r\n | \"storage\"\r\n | \"memory\"\r\n | \"recorder\"\r\n | \"playback\"\r\n | \"record\"\r\n // Monitoring\r\n | \"monitor\"\r\n | \"dashboard\"\r\n | \"console\"\r\n | \"display\"\r\n // Crew\r\n | \"astronaut\"\r\n | \"crew\"\r\n | \"eva\"\r\n // Catch-all for any other icon (flexibility)\r\n | (string & {});\r\n\r\nexport type AstroIconSize = \"extra-small\" | \"small\" | \"normal\" | \"large\";\r\n\r\nexport interface AstroIconProps {\r\n /** Icon name from Astro UXD library */\r\n name: AstroIconName;\r\n /** Icon size preset or custom pixel value */\r\n size?: AstroIconSize | number;\r\n /** Custom color (hex, rgb, or CSS color) */\r\n color?: string;\r\n /** Accessibility label (required for screen readers) */\r\n label?: string;\r\n /** Additional CSS class */\r\n className?: string;\r\n /** Additional inline styles */\r\n style?: React.CSSProperties;\r\n /** Click handler */\r\n onClick?: () => void;\r\n /** Test ID for testing */\r\n \"data-testid\"?: string;\r\n}\r\n\r\n// Size mapping for fallback mode\r\nconst SIZE_MAP: Record<AstroIconSize, number> = {\r\n \"extra-small\": 16,\r\n small: 24,\r\n normal: 32,\r\n large: 48,\r\n};\r\n\r\n/**\r\n * Space Operations Icon Aliases\r\n * Maps common space terminology to existing Astro icons.\r\n * Provides better developer experience with intuitive naming.\r\n */\r\nconst ICON_ALIASES: Record<string, string> = {\r\n // === Orbit & Trajectory ===\r\n orbit: \"360\", // Orbital path\r\n trajectory: \"360\", // Flight path\r\n orbital: \"360\", // Orbital mechanics\r\n\r\n // === Ground Operations ===\r\n \"ground-station\": \"antenna\", // Ground station\r\n \"ground-control\": \"antenna\", // Mission control\r\n dish: \"antenna\", // Antenna dish\r\n \"tracking-station\": \"antenna\", // Tracking facility\r\n\r\n // === Communication ===\r\n uplink: \"antenna-transmit\", // Command upload\r\n downlink: \"antenna-receive\", // Data download\r\n command: \"antenna-transmit\", // Send command\r\n telemetry: \"antenna-receive\", // Receive telemetry\r\n comms: \"netcom\", // Communications\r\n rf: \"antenna\", // Radio frequency\r\n link: \"netcom\", // Communication link\r\n signal: \"antenna-transmit\", // Signal transmission\r\n \"data-link\": \"netcom\", // Data link\r\n\r\n // === Satellite States ===\r\n satellite: \"satellite-transmit\", // Default satellite (active)\r\n spacecraft: \"satellite-transmit\", // Spacecraft\r\n vehicle: \"satellite-transmit\", // Space vehicle\r\n sat: \"satellite-transmit\", // Abbreviation\r\n sc: \"satellite-transmit\", // Spacecraft abbreviation\r\n\r\n // === Power Systems ===\r\n power: \"propulsion-power\", // Power system\r\n battery: \"battery-full\", // Battery status\r\n energy: \"propulsion-power\", // Energy management\r\n \"solar-array\": \"solar\", // Solar arrays\r\n \"solar-panel\": \"solar\", // Solar panels\r\n photovoltaic: \"solar\", // PV system\r\n\r\n // === Propulsion ===\r\n thruster: \"propulsion-power\", // Thruster\r\n engine: \"propulsion-power\", // Engine\r\n burn: \"propulsion-power\", // Burn/maneuver\r\n maneuver: \"propulsion-power\", // Orbital maneuver\r\n \"delta-v\": \"propulsion-power\", // Delta-V\r\n rcs: \"propulsion-power\", // Reaction control system\r\n\r\n // === Thermal ===\r\n temperature: \"thermal\", // Temperature\r\n heat: \"thermal\", // Heat management\r\n cooling: \"thermal\", // Cooling system\r\n heater: \"thermal\", // Heater\r\n\r\n // === Attitude & Control ===\r\n attitude: \"explore\", // Attitude control\r\n pointing: \"explore\", // Pointing direction\r\n orientation: \"explore\", // Spacecraft orientation\r\n adcs: \"explore\", // Attitude determination & control\r\n gyro: \"explore\", // Gyroscope\r\n gyroscope: \"explore\", // Gyroscope\r\n\r\n // === Navigation ===\r\n gps: \"gps-fixed\", // GPS/GNSS\r\n gnss: \"gps-fixed\", // Global navigation\r\n position: \"gps-fixed\", // Position\r\n location: \"place\", // Location\r\n ephemeris: \"timeline\", // Ephemeris data\r\n\r\n // === Status & Health ===\r\n health: \"favorite\", // System health\r\n status: \"info\", // Status indicator\r\n nominal: \"check-circle\", // Nominal/OK\r\n anomaly: \"error\", // Anomaly detected\r\n fault: \"error\", // Fault condition\r\n \"safe-mode\": \"warning\", // Safe mode\r\n emergency: \"warning\", // Emergency\r\n critical: \"error\", // Critical status\r\n caution: \"warning\", // Caution\r\n\r\n // === Time & Scheduling ===\r\n pass: \"schedule\", // Satellite pass\r\n contact: \"schedule\", // Ground contact\r\n access: \"schedule\", // Access window\r\n window: \"schedule\", // Time window\r\n aos: \"schedule\", // Acquisition of signal\r\n los: \"schedule\", // Loss of signal\r\n eclipse: \"brightness-3\", // Eclipse period\r\n sunlight: \"wb-sunny\", // In sunlight\r\n shadow: \"brightness-3\", // In shadow\r\n\r\n // === Subsystems ===\r\n subsystem: \"developer-board\", // Generic subsystem\r\n computer: \"memory\", // Onboard computer\r\n obc: \"memory\", // Onboard computer\r\n cdh: \"memory\", // Command & data handling\r\n \"flight-computer\": \"memory\", // Flight computer\r\n sensor: \"settings-input-component\", // Sensor\r\n instrument: \"settings-input-component\", // Instrument\r\n\r\n // === Launch & Deployment ===\r\n launch: \"flight-takeoff\", // Launch\r\n rocket: \"flight-takeoff\", // Rocket\r\n liftoff: \"flight-takeoff\", // Liftoff\r\n deployment: \"open-in-new\", // Deployment\r\n deploy: \"open-in-new\", // Deploy\r\n separation: \"call-split\", // Stage separation\r\n\r\n // === Operations ===\r\n ops: \"build\", // Operations\r\n operations: \"build\", // Operations\r\n control: \"tune\", // Control\r\n automation: \"autorenew\", // Automation\r\n sequence: \"playlist-play\", // Command sequence\r\n procedure: \"list\", // Procedure\r\n\r\n // === Data & Storage ===\r\n storage: \"sd-storage\", // Data storage\r\n memory: \"memory\", // Memory\r\n recorder: \"fiber-dvr\", // Data recorder\r\n playback: \"play-arrow\", // Playback\r\n record: \"fiber-manual-record\", // Recording\r\n\r\n // === Monitoring ===\r\n monitor: \"desktop-mac\", // Monitoring\r\n dashboard: \"dashboard\", // Dashboard\r\n console: \"desktop-windows\", // Console\r\n display: \"tv\", // Display\r\n\r\n // === Crew (if applicable) ===\r\n astronaut: \"person\", // Astronaut\r\n crew: \"group\", // Crew\r\n eva: \"directions-walk\", // Extra-vehicular activity\r\n};\r\n\r\n/**\r\n * Resolve icon alias to actual Astro icon name\r\n */\r\nfunction resolveIconAlias(name: string): string {\r\n return ICON_ALIASES[name] || name;\r\n}\r\n\r\n/**\r\n * Get all available icon aliases\r\n */\r\nexport function getIconAliases(): Record<string, string> {\r\n return { ...ICON_ALIASES };\r\n}\r\n\r\n/**\r\n * Check if an icon name is an alias\r\n */\r\nexport function isIconAlias(name: string): boolean {\r\n return name in ICON_ALIASES;\r\n}\r\n\r\n/**\r\n * All available Astro UXD icon names (official icons, not aliases)\r\n * This is the comprehensive list from the Astro UXD icon library\r\n */\r\nexport const ASTRO_ICON_NAMES: readonly string[] = [\r\n // === Astro Space/Mission Icons (Custom by Rocket Communications) ===\r\n \"altitude\",\r\n \"antenna\",\r\n \"antenna-off\",\r\n \"antenna-receive\",\r\n \"antenna-transmit\",\r\n \"equipment\",\r\n \"hardware\",\r\n \"mission\",\r\n \"netcom\",\r\n \"payload\",\r\n \"processor\",\r\n \"processor-alt\",\r\n \"propulsion-power\",\r\n \"satellite-off\",\r\n \"satellite-receive\",\r\n \"satellite-transmit\",\r\n \"solar\",\r\n \"thermal\",\r\n // === Actions ===\r\n \"settings\",\r\n \"search\",\r\n \"home\",\r\n \"info\",\r\n \"help\",\r\n \"delete\",\r\n \"edit\",\r\n \"lock\",\r\n \"lock-open\",\r\n \"visibility\",\r\n \"visibility-off\",\r\n \"refresh\",\r\n \"sync\",\r\n \"download\",\r\n \"upload\",\r\n \"fullscreen\",\r\n \"fullscreen-exit\",\r\n \"zoom-in\",\r\n \"zoom-out\",\r\n \"schedule\",\r\n \"timeline\",\r\n \"today\",\r\n \"event\",\r\n \"bookmark\",\r\n \"favorite\",\r\n \"star\",\r\n \"check-circle\",\r\n \"done\",\r\n \"done-all\",\r\n \"print\",\r\n \"open-in-new\",\r\n \"launch\",\r\n \"power-settings-new\",\r\n \"history\",\r\n \"cached\",\r\n \"build\",\r\n \"code\",\r\n \"dns\",\r\n \"language\",\r\n \"input\",\r\n \"label\",\r\n \"list\",\r\n \"track-changes\",\r\n \"verified-user\",\r\n \"work\",\r\n // === Alerts ===\r\n \"add-alert\",\r\n \"error\",\r\n \"error-outline\",\r\n \"notification-important\",\r\n \"warning\",\r\n // === AV ===\r\n \"play-arrow\",\r\n \"pause\",\r\n \"stop\",\r\n \"skip-next\",\r\n \"skip-previous\",\r\n \"fast-forward\",\r\n \"fast-rewind\",\r\n \"replay\",\r\n \"loop\",\r\n \"shuffle\",\r\n \"volume-up\",\r\n \"volume-down\",\r\n \"volume-off\",\r\n \"volume-mute\",\r\n \"mic\",\r\n \"mic-off\",\r\n \"videocam\",\r\n \"videocam-off\",\r\n \"movie\",\r\n \"music-note\",\r\n \"equalizer\",\r\n \"library-music\",\r\n \"queue-music\",\r\n // === Communication ===\r\n \"call\",\r\n \"call-end\",\r\n \"chat\",\r\n \"chat-bubble\",\r\n \"chat-bubble-outline\",\r\n \"comment\",\r\n \"contacts\",\r\n \"email\",\r\n \"mail-outline\",\r\n \"message\",\r\n \"phone\",\r\n \"voicemail\",\r\n \"vpn-key\",\r\n \"forum\",\r\n \"live-help\",\r\n \"location-on\",\r\n \"location-off\",\r\n \"business\",\r\n \"import-contacts\",\r\n // === Content ===\r\n \"add\",\r\n \"remove\",\r\n \"add-circle\",\r\n \"add-circle-outline\",\r\n \"remove-circle\",\r\n \"remove-circle-outline\",\r\n \"clear\",\r\n \"content-copy\",\r\n \"content-cut\",\r\n \"content-paste\",\r\n \"create\",\r\n \"flag\",\r\n \"forward\",\r\n \"reply\",\r\n \"reply-all\",\r\n \"save\",\r\n \"save-alt\",\r\n \"select-all\",\r\n \"send\",\r\n \"undo\",\r\n \"redo\",\r\n \"filter-list\",\r\n \"sort\",\r\n \"drafts\",\r\n \"link\",\r\n \"link-off\",\r\n // === Device ===\r\n \"battery-full\",\r\n \"battery-charging-full\",\r\n \"battery-alert\",\r\n \"battery-unknown\",\r\n \"bluetooth\",\r\n \"bluetooth-disabled\",\r\n \"bluetooth-connected\",\r\n \"bluetooth-searching\",\r\n \"brightness-1\",\r\n \"brightness-2\",\r\n \"brightness-3\",\r\n \"brightness-4\",\r\n \"brightness-5\",\r\n \"brightness-6\",\r\n \"brightness-7\",\r\n \"brightness-auto\",\r\n \"brightness-high\",\r\n \"brightness-low\",\r\n \"brightness-medium\",\r\n \"gps-fixed\",\r\n \"gps-not-fixed\",\r\n \"gps-off\",\r\n \"graphic-eq\",\r\n \"network-cell\",\r\n \"network-wifi\",\r\n \"nfc\",\r\n \"screen-rotation\",\r\n \"sd-storage\",\r\n \"settings-system-daydream\",\r\n \"signal-cellular-4-bar\",\r\n \"signal-cellular-connected-no-internet-4-bar\",\r\n \"signal-cellular-no-sim\",\r\n \"signal-cellular-null\",\r\n \"signal-cellular-off\",\r\n \"signal-wifi-4-bar\",\r\n \"signal-wifi-4-bar-lock\",\r\n \"signal-wifi-off\",\r\n \"storage\",\r\n \"usb\",\r\n \"wifi\",\r\n \"wifi-lock\",\r\n \"wifi-off\",\r\n \"wifi-tethering\",\r\n // === Editor ===\r\n \"attach-file\",\r\n \"attach-money\",\r\n \"border-all\",\r\n \"border-bottom\",\r\n \"border-clear\",\r\n \"border-color\",\r\n \"border-horizontal\",\r\n \"border-inner\",\r\n \"border-left\",\r\n \"border-outer\",\r\n \"border-right\",\r\n \"border-style\",\r\n \"border-top\",\r\n \"border-vertical\",\r\n \"format-align-center\",\r\n \"format-align-justify\",\r\n \"format-align-left\",\r\n \"format-align-right\",\r\n \"format-bold\",\r\n \"format-clear\",\r\n \"format-color-fill\",\r\n \"format-color-reset\",\r\n \"format-color-text\",\r\n \"format-indent-decrease\",\r\n \"format-indent-increase\",\r\n \"format-italic\",\r\n \"format-line-spacing\",\r\n \"format-list-bulleted\",\r\n \"format-list-numbered\",\r\n \"format-paint\",\r\n \"format-quote\",\r\n \"format-size\",\r\n \"format-strikethrough\",\r\n \"format-textdirection-l-to-r\",\r\n \"format-textdirection-r-to-l\",\r\n \"format-underlined\",\r\n \"functions\",\r\n \"insert-chart\",\r\n \"insert-comment\",\r\n \"insert-drive-file\",\r\n \"insert-emoticon\",\r\n \"insert-invitation\",\r\n \"insert-link\",\r\n \"insert-photo\",\r\n \"merge-type\",\r\n \"mode-comment\",\r\n \"mode-edit\",\r\n \"publish\",\r\n \"short-text\",\r\n \"space-bar\",\r\n \"strikethrough-s\",\r\n \"text-fields\",\r\n \"title\",\r\n \"vertical-align-bottom\",\r\n \"vertical-align-center\",\r\n \"vertical-align-top\",\r\n \"wrap-text\",\r\n // === File ===\r\n \"attachment\",\r\n \"cloud\",\r\n \"cloud-circle\",\r\n \"cloud-done\",\r\n \"cloud-download\",\r\n \"cloud-off\",\r\n \"cloud-queue\",\r\n \"cloud-upload\",\r\n \"create-new-folder\",\r\n \"file-download\",\r\n \"file-upload\",\r\n \"folder\",\r\n \"folder-open\",\r\n \"folder-shared\",\r\n // === Hardware ===\r\n \"cast\",\r\n \"cast-connected\",\r\n \"computer\",\r\n \"desktop-mac\",\r\n \"desktop-windows\",\r\n \"developer-board\",\r\n \"device-hub\",\r\n \"devices-other\",\r\n \"dock\",\r\n \"gamepad\",\r\n \"headset\",\r\n \"headset-mic\",\r\n \"keyboard\",\r\n \"keyboard-arrow-down\",\r\n \"keyboard-arrow-left\",\r\n \"keyboard-arrow-right\",\r\n \"keyboard-arrow-up\",\r\n \"keyboard-backspace\",\r\n \"keyboard-capslock\",\r\n \"keyboard-hide\",\r\n \"keyboard-return\",\r\n \"keyboard-tab\",\r\n \"keyboard-voice\",\r\n \"laptop\",\r\n \"laptop-chromebook\",\r\n \"laptop-mac\",\r\n \"laptop-windows\",\r\n \"memory\",\r\n \"mouse\",\r\n \"phone-android\",\r\n \"phone-iphone\",\r\n \"phonelink\",\r\n \"phonelink-off\",\r\n \"power-input\",\r\n \"router\",\r\n \"scanner\",\r\n \"security\",\r\n \"sim-card\",\r\n \"smartphone\",\r\n \"speaker\",\r\n \"speaker-group\",\r\n \"tablet\",\r\n \"tablet-android\",\r\n \"tablet-mac\",\r\n \"toys\",\r\n \"tv\",\r\n \"watch\",\r\n // === Image ===\r\n \"add-a-photo\",\r\n \"add-photo-alternate\",\r\n \"add-to-photos\",\r\n \"adjust\",\r\n \"brightness-1\",\r\n \"broken-image\",\r\n \"brush\",\r\n \"burst-mode\",\r\n \"camera\",\r\n \"camera-alt\",\r\n \"camera-front\",\r\n \"camera-rear\",\r\n \"camera-roll\",\r\n \"center-focus-strong\",\r\n \"center-focus-weak\",\r\n \"collections\",\r\n \"collections-bookmark\",\r\n \"color-lens\",\r\n \"colorize\",\r\n \"compare\",\r\n \"control-point\",\r\n \"control-point-duplicate\",\r\n \"crop\",\r\n \"crop-16-9\",\r\n \"crop-3-2\",\r\n \"crop-5-4\",\r\n \"crop-7-5\",\r\n \"crop-din\",\r\n \"crop-free\",\r\n \"crop-landscape\",\r\n \"crop-original\",\r\n \"crop-portrait\",\r\n \"crop-rotate\",\r\n \"crop-square\",\r\n \"dehaze\",\r\n \"details\",\r\n \"edit\",\r\n \"exposure\",\r\n \"exposure-neg-1\",\r\n \"exposure-neg-2\",\r\n \"exposure-plus-1\",\r\n \"exposure-plus-2\",\r\n \"exposure-zero\",\r\n \"filter\",\r\n \"filter-1\",\r\n \"filter-2\",\r\n \"filter-3\",\r\n \"filter-4\",\r\n \"filter-5\",\r\n \"filter-6\",\r\n \"filter-7\",\r\n \"filter-8\",\r\n \"filter-9\",\r\n \"filter-9-plus\",\r\n \"filter-b-and-w\",\r\n \"filter-center-focus\",\r\n \"filter-drama\",\r\n \"filter-frames\",\r\n \"filter-hdr\",\r\n \"filter-none\",\r\n \"filter-tilt-shift\",\r\n \"filter-vintage\",\r\n \"flare\",\r\n \"flash-auto\",\r\n \"flash-off\",\r\n \"flash-on\",\r\n \"flip\",\r\n \"gradient\",\r\n \"grain\",\r\n \"grid-off\",\r\n \"grid-on\",\r\n \"hdr-off\",\r\n \"hdr-on\",\r\n \"hdr-strong\",\r\n \"hdr-weak\",\r\n \"healing\",\r\n \"image\",\r\n \"image-aspect-ratio\",\r\n \"image-search\",\r\n \"iso\",\r\n \"landscape\",\r\n \"leak-add\",\r\n \"leak-remove\",\r\n \"lens\",\r\n \"linked-camera\",\r\n \"looks\",\r\n \"looks-3\",\r\n \"looks-4\",\r\n \"looks-5\",\r\n \"looks-6\",\r\n \"looks-one\",\r\n \"looks-two\",\r\n \"loupe\",\r\n \"monochrome-photos\",\r\n \"movie-creation\",\r\n \"movie-filter\",\r\n \"music-off\",\r\n \"music-on\",\r\n \"navigate-before\",\r\n \"navigate-next\",\r\n \"nature\",\r\n \"nature-people\",\r\n \"palette\",\r\n \"panorama\",\r\n \"panorama-fish-eye\",\r\n \"panorama-horizontal\",\r\n \"panorama-vertical\",\r\n \"panorama-wide-angle\",\r\n \"photo\",\r\n \"photo-album\",\r\n \"photo-camera\",\r\n \"photo-filter\",\r\n \"photo-library\",\r\n \"photo-size-select-actual\",\r\n \"photo-size-select-large\",\r\n \"photo-size-select-small\",\r\n \"picture-as-pdf\",\r\n \"portrait\",\r\n \"remove-red-eye\",\r\n \"rotate-90-degrees-ccw\",\r\n \"rotate-left\",\r\n \"rotate-right\",\r\n \"slideshow\",\r\n \"straighten\",\r\n \"style\",\r\n \"switch-camera\",\r\n \"switch-video\",\r\n \"tag-faces\",\r\n \"texture\",\r\n \"timelapse\",\r\n \"timer\",\r\n \"timer-10\",\r\n \"timer-3\",\r\n \"timer-off\",\r\n \"tonality\",\r\n \"transform\",\r\n \"tune\",\r\n \"view-comfy\",\r\n \"view-compact\",\r\n \"vignette\",\r\n \"wb-auto\",\r\n \"wb-cloudy\",\r\n \"wb-incandescent\",\r\n \"wb-iridescent\",\r\n \"wb-sunny\",\r\n // === Maps ===\r\n \"add-location\",\r\n \"beenhere\",\r\n \"directions\",\r\n \"directions-bike\",\r\n \"directions-boat\",\r\n \"directions-bus\",\r\n \"directions-car\",\r\n \"directions-railway\",\r\n \"directions-run\",\r\n \"directions-subway\",\r\n \"directions-transit\",\r\n \"directions-walk\",\r\n \"edit-location\",\r\n \"ev-station\",\r\n \"flight\",\r\n \"hotel\",\r\n \"layers\",\r\n \"layers-clear\",\r\n \"local-activity\",\r\n \"local-airport\",\r\n \"local-atm\",\r\n \"local-bar\",\r\n \"local-cafe\",\r\n \"local-car-wash\",\r\n \"local-convenience-store\",\r\n \"local-dining\",\r\n \"local-drink\",\r\n \"local-florist\",\r\n \"local-gas-station\",\r\n \"local-grocery-store\",\r\n \"local-hospital\",\r\n \"local-hotel\",\r\n \"local-laundry-service\",\r\n \"local-library\",\r\n \"local-mall\",\r\n \"local-movies\",\r\n \"local-offer\",\r\n \"local-parking\",\r\n \"local-pharmacy\",\r\n \"local-phone\",\r\n \"local-pizza\",\r\n \"local-play\",\r\n \"local-post-office\",\r\n \"local-printshop\",\r\n \"local-see\",\r\n \"local-shipping\",\r\n \"local-taxi\",\r\n \"map\",\r\n \"my-location\",\r\n \"navigation\",\r\n \"near-me\",\r\n \"person-pin\",\r\n \"person-pin-circle\",\r\n \"pin-drop\",\r\n \"place\",\r\n \"rate-review\",\r\n \"restaurant\",\r\n \"restaurant-menu\",\r\n \"satellite\",\r\n \"store-mall-directory\",\r\n \"streetview\",\r\n \"subway\",\r\n \"terrain\",\r\n \"traffic\",\r\n \"train\",\r\n \"tram\",\r\n \"transfer-within-a-station\",\r\n \"zoom-out-map\",\r\n // === Navigation ===\r\n \"apps\",\r\n \"arrow-back\",\r\n \"arrow-downward\",\r\n \"arrow-drop-down\",\r\n \"arrow-drop-down-circle\",\r\n \"arrow-drop-up\",\r\n \"arrow-forward\",\r\n \"arrow-upward\",\r\n \"cancel\",\r\n \"check\",\r\n \"chevron-left\",\r\n \"chevron-right\",\r\n \"close\",\r\n \"expand-less\",\r\n \"expand-more\",\r\n \"first-page\",\r\n \"last-page\",\r\n \"menu\",\r\n \"more-horiz\",\r\n \"more-vert\",\r\n \"subdirectory-arrow-left\",\r\n \"subdirectory-arrow-right\",\r\n \"unfold-less\",\r\n \"unfold-more\",\r\n // === Notification ===\r\n \"adb\",\r\n \"airline-seat-flat\",\r\n \"airline-seat-flat-angled\",\r\n \"airline-seat-individual-suite\",\r\n \"airline-seat-legroom-extra\",\r\n \"airline-seat-legroom-normal\",\r\n \"airline-seat-legroom-reduced\",\r\n \"airline-seat-recline-extra\",\r\n \"airline-seat-recline-normal\",\r\n \"bluetooth-audio\",\r\n \"confirmation-number\",\r\n \"disc-full\",\r\n \"do-not-disturb\",\r\n \"do-not-disturb-alt\",\r\n \"do-not-disturb-off\",\r\n \"do-not-disturb-on\",\r\n \"drive-eta\",\r\n \"enhanced-encryption\",\r\n \"event-available\",\r\n \"event-busy\",\r\n \"event-note\",\r\n \"folder-special\",\r\n \"live-tv\",\r\n \"mms\",\r\n \"more\",\r\n \"network-check\",\r\n \"network-locked\",\r\n \"no-encryption\",\r\n \"ondemand-video\",\r\n \"personal-video\",\r\n \"phone-bluetooth-speaker\",\r\n \"phone-callback\",\r\n \"phone-forwarded\",\r\n \"phone-in-talk\",\r\n \"phone-locked\",\r\n \"phone-missed\",\r\n \"phone-paused\",\r\n \"power\",\r\n \"power-off\",\r\n \"priority-high\",\r\n \"sd-card\",\r\n \"sim-card-alert\",\r\n \"sms\",\r\n \"sms-failed\",\r\n \"sync-disabled\",\r\n \"sync-problem\",\r\n \"system-update\",\r\n \"tap-and-play\",\r\n \"time-to-leave\",\r\n \"vibration\",\r\n \"voice-chat\",\r\n \"vpn-lock\",\r\n \"wc\",\r\n \"wifi\",\r\n \"notifications\",\r\n \"notifications-active\",\r\n \"notifications-none\",\r\n \"notifications-off\",\r\n \"notifications-paused\",\r\n // === Places ===\r\n \"ac-unit\",\r\n \"airport-shuttle\",\r\n \"all-inclusive\",\r\n \"beach-access\",\r\n \"business-center\",\r\n \"casino\",\r\n \"child-care\",\r\n \"child-friendly\",\r\n \"fitness-center\",\r\n \"free-breakfast\",\r\n \"golf-course\",\r\n \"hot-tub\",\r\n \"kitchen\",\r\n \"meeting-room\",\r\n \"no-meeting-room\",\r\n \"pool\",\r\n \"room-service\",\r\n \"rv-hookup\",\r\n \"smoke-free\",\r\n \"smoking-rooms\",\r\n \"spa\",\r\n // === Social ===\r\n \"cake\",\r\n \"domain\",\r\n \"group\",\r\n \"group-add\",\r\n \"location-city\",\r\n \"mood\",\r\n \"mood-bad\",\r\n \"notifications\",\r\n \"pages\",\r\n \"party-mode\",\r\n \"people\",\r\n \"people-outline\",\r\n \"person\",\r\n \"person-add\",\r\n \"person-outline\",\r\n \"plus-one\",\r\n \"poll\",\r\n \"public\",\r\n \"school\",\r\n \"sentiment-dissatisfied\",\r\n \"sentiment-neutral\",\r\n \"sentiment-satisfied\",\r\n \"sentiment-very-dissatisfied\",\r\n \"sentiment-very-satisfied\",\r\n \"share\",\r\n \"thumb-down\",\r\n \"thumb-up\",\r\n \"whatshot\",\r\n // === Toggle ===\r\n \"check-box\",\r\n \"check-box-outline-blank\",\r\n \"indeterminate-check-box\",\r\n \"radio-button-checked\",\r\n \"radio-button-unchecked\",\r\n \"star\",\r\n \"star-border\",\r\n \"star-half\",\r\n // === Additional common icons ===\r\n \"360\",\r\n \"autorenew\",\r\n \"call-split\",\r\n \"explore\",\r\n \"extension\",\r\n \"face\",\r\n \"feedback\",\r\n \"fiber-dvr\",\r\n \"fiber-manual-record\",\r\n \"fiber-new\",\r\n \"fiber-pin\",\r\n \"fiber-smart-record\",\r\n \"get-app\",\r\n \"grade\",\r\n \"highlight-off\",\r\n \"http\",\r\n \"https\",\r\n \"important-devices\",\r\n \"lightbulb\",\r\n \"lightbulb-outline\",\r\n \"perm-camera-mic\",\r\n \"perm-contact-calendar\",\r\n \"perm-data-setting\",\r\n \"perm-device-information\",\r\n \"perm-identity\",\r\n \"perm-media\",\r\n \"perm-phone-msg\",\r\n \"perm-scan-wifi\",\r\n \"pets\",\r\n \"playlist-add\",\r\n \"playlist-add-check\",\r\n \"playlist-play\",\r\n \"pregnant-woman\",\r\n \"query-builder\",\r\n \"question-answer\",\r\n \"receipt\",\r\n \"record-voice-over\",\r\n \"redeem\",\r\n \"report-problem\",\r\n \"restore\",\r\n \"restore-page\",\r\n \"room\",\r\n \"rounded-corner\",\r\n \"rowing\",\r\n \"settings-applications\",\r\n \"settings-backup-restore\",\r\n \"settings-bluetooth\",\r\n \"settings-brightness\",\r\n \"settings-cell\",\r\n \"settings-ethernet\",\r\n \"settings-input-antenna\",\r\n \"settings-input-component\",\r\n \"settings-input-composite\",\r\n \"settings-input-hdmi\",\r\n \"settings-input-svideo\",\r\n \"settings-overscan\",\r\n \"settings-phone\",\r\n \"settings-power\",\r\n \"settings-remote\",\r\n \"settings-voice\",\r\n \"shop\",\r\n \"shop-two\",\r\n \"shopping-basket\",\r\n \"shopping-cart\",\r\n \"speaker-notes\",\r\n \"speaker-notes-off\",\r\n \"spellcheck\",\r\n \"stars\",\r\n \"subject\",\r\n \"supervisor-account\",\r\n \"swap-horiz\",\r\n \"swap-vert\",\r\n \"swap-vertical-circle\",\r\n \"system-update-alt\",\r\n \"tab\",\r\n \"tab-unselected\",\r\n \"theaters\",\r\n \"thumb-down\",\r\n \"thumb-up\",\r\n \"thumbs-up-down\",\r\n \"toc\",\r\n \"toll\",\r\n \"touch-app\",\r\n \"translate\",\r\n \"trending-down\",\r\n \"trending-flat\",\r\n \"trending-up\",\r\n \"turned-in\",\r\n \"turned-in-not\",\r\n \"update\",\r\n \"view-agenda\",\r\n \"view-array\",\r\n \"view-carousel\",\r\n \"view-column\",\r\n \"view-day\",\r\n \"view-headline\",\r\n \"view-list\",\r\n \"view-module\",\r\n \"view-quilt\",\r\n \"view-stream\",\r\n \"view-week\",\r\n \"visibility\",\r\n \"visibility-off\",\r\n \"watch-later\",\r\n \"youtube-searched-for\",\r\n \"aspect-ratio\",\r\n \"assignment\",\r\n \"assignment-ind\",\r\n \"assignment-late\",\r\n \"assignment-return\",\r\n \"assignment-returned\",\r\n \"assignment-turned-in\",\r\n \"backup\",\r\n \"book\",\r\n \"flight-takeoff\",\r\n \"flight-land\",\r\n] as const;\r\n\r\n/**\r\n * Get all available Astro icon names\r\n */\r\nexport function getAstroIconNames(): readonly string[] {\r\n return ASTRO_ICON_NAMES;\r\n}\r\n\r\n/**\r\n * Get all available icon names including aliases\r\n */\r\nexport function getAllIconNames(): {\r\n icons: readonly string[];\r\n aliases: Record<string, string>;\r\n} {\r\n return {\r\n icons: ASTRO_ICON_NAMES,\r\n aliases: ICON_ALIASES,\r\n };\r\n}\r\n\r\n// Global state for RuxIcon loading with subscription pattern\r\ntype LoadState = \"pending\" | \"loading\" | \"loaded\" | \"failed\";\r\nlet loadState: LoadState = \"pending\";\r\nlet RuxIconComponent: React.ComponentType<any> | null = null;\r\nconst subscribers = new Set<() => void>();\r\n\r\nfunction subscribe(callback: () => void) {\r\n subscribers.add(callback);\r\n return () => subscribers.delete(callback);\r\n}\r\n\r\nfunction notifySubscribers() {\r\n subscribers.forEach((cb) => cb());\r\n}\r\n\r\n/**\r\n * Safely load RuxIcon from @astrouxds/react\r\n * Returns null if not available\r\n */\r\nasync function loadRuxIcon(): Promise<React.ComponentType<any> | null> {\r\n if (loadState === \"loaded\") {\r\n return RuxIconComponent;\r\n }\r\n\r\n if (loadState === \"failed\") {\r\n return null;\r\n }\r\n\r\n if (loadState === \"loading\") {\r\n // Wait for the existing load to complete\r\n return new Promise((resolve) => {\r\n const unsub = subscribe(() => {\r\n unsub();\r\n resolve(RuxIconComponent);\r\n });\r\n });\r\n }\r\n\r\n loadState = \"loading\";\r\n\r\n try {\r\n // Dynamic import for tree-shaking and optional dependency\r\n const astroModule = await import(\"@astrouxds/react\");\r\n RuxIconComponent = astroModule.RuxIcon;\r\n loadState = \"loaded\";\r\n notifySubscribers();\r\n return RuxIconComponent;\r\n } catch (err) {\r\n loadState = \"failed\";\r\n notifySubscribers();\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Fallback icon component when @astrouxds/react is not installed.\r\n * Uses built-in Icon SVGs when the name matches, otherwise shows a generic placeholder.\r\n */\r\nfunction FallbackIcon({\r\n name,\r\n size,\r\n color,\r\n label,\r\n className,\r\n style,\r\n onClick,\r\n \"data-testid\": testId,\r\n}: AstroIconProps) {\r\n const { tokens } = useTheme();\r\n const actualSize =\r\n typeof size === \"number\" ? size : SIZE_MAP[size || \"normal\"];\r\n\r\n if (isValidIconName(name)) {\r\n return (\r\n <Icon\r\n name={name}\r\n size={actualSize}\r\n color={color}\r\n className={className}\r\n aria-label={label || name}\r\n onClick={onClick}\r\n style={style}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <span\r\n role=\"img\"\r\n aria-label={label || name}\r\n className={className}\r\n data-testid={testId}\r\n onClick={onClick}\r\n tabIndex={onClick ? 0 : undefined}\r\n onKeyDown={onClick ? (e) => e.key === \"Enter\" && onClick() : undefined}\r\n style={{\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: actualSize,\r\n height: actualSize,\r\n fontSize: actualSize * 0.4,\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n fontWeight: 700,\r\n color: color || tokens.colors.status.off,\r\n backgroundColor: tokens.colors.background.surface,\r\n border: `1px solid ${tokens.colors.border.default}`,\r\n borderRadius: 4,\r\n cursor: onClick ? \"pointer\" : \"default\",\r\n userSelect: \"none\",\r\n ...style,\r\n }}\r\n title={`Icon: ${name} (install @astrouxds/react for official icons)`}\r\n >\r\n <svg\r\n width={actualSize * 0.6}\r\n height={actualSize * 0.6}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"currentColor\"\r\n >\r\n <rect\r\n x=\"3\"\r\n y=\"3\"\r\n width=\"18\"\r\n height=\"18\"\r\n rx=\"2\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.5\"\r\n />\r\n <circle cx=\"12\" cy=\"12\" r=\"2\" fill=\"currentColor\" />\r\n </svg>\r\n </span>\r\n );\r\n}\r\n\r\n/**\r\n * AstroIcon - Official Astro UXD Icons\r\n *\r\n * Displays icons from the official Astro UX Design System.\r\n * Automatically uses @astrouxds/react if installed, otherwise shows fallback.\r\n *\r\n * @example\r\n * ```tsx\r\n * // Basic usage\r\n * <AstroIcon name=\"satellite\" />\r\n *\r\n * // With size\r\n * <AstroIcon name=\"antenna\" size=\"large\" />\r\n * <AstroIcon name=\"thermal\" size={48} />\r\n *\r\n * // With color\r\n * <AstroIcon name=\"warning\" color=\"var(--zendir-status-caution)\" />\r\n *\r\n * // With click handler\r\n * <AstroIcon name=\"settings\" onClick={() => openSettings()} />\r\n * ```\r\n */\r\nexport const AstroIcon = memo(function AstroIcon(props: AstroIconProps) {\r\n const {\r\n name,\r\n size = \"normal\",\r\n color,\r\n label,\r\n className,\r\n style,\r\n onClick,\r\n \"data-testid\": testId,\r\n } = props;\r\n\r\n const [, forceUpdate] = useState(0);\r\n const [currentState, setCurrentState] = useState(loadState);\r\n const mountedRef = useRef(true);\r\n\r\n // Subscribe to load state changes and trigger loading\r\n useEffect(() => {\r\n mountedRef.current = true;\r\n\r\n // Subscribe to state changes\r\n const unsubscribe = subscribe(() => {\r\n if (mountedRef.current) {\r\n setCurrentState(loadState);\r\n forceUpdate((n) => n + 1);\r\n }\r\n });\r\n\r\n // Trigger load if not yet started\r\n if (loadState === \"pending\") {\r\n loadRuxIcon();\r\n }\r\n\r\n return () => {\r\n mountedRef.current = false;\r\n unsubscribe();\r\n };\r\n }, []);\r\n\r\n // If still loading, show a subtle placeholder\r\n if (currentState === \"pending\" || currentState === \"loading\") {\r\n const actualSize = typeof size === \"number\" ? size : SIZE_MAP[size];\r\n return (\r\n <span\r\n style={{\r\n display: \"inline-block\",\r\n width: actualSize,\r\n height: actualSize,\r\n ...style,\r\n }}\r\n className={className}\r\n aria-hidden=\"true\"\r\n />\r\n );\r\n }\r\n\r\n // Resolve icon alias to actual Astro icon name\r\n const resolvedName = resolveIconAlias(name);\r\n\r\n // If @astrouxds/react is available, use official RuxIcon\r\n if (RuxIconComponent) {\r\n const RuxIcon = RuxIconComponent;\r\n const pixelSize = typeof size === \"number\" ? size : SIZE_MAP[size];\r\n\r\n // Map numeric size to closest Astro size preset for RuxIcon\r\n // This helps RuxIcon render at approximately the right size before CSS kicks in\r\n const getClosestAstroSize = (px: number): AstroIconSize => {\r\n if (px <= 18) return \"extra-small\"; // 16px\r\n if (px <= 28) return \"small\"; // 24px\r\n if (px <= 40) return \"normal\"; // 32px\r\n return \"large\"; // 48px\r\n };\r\n const astroSize =\r\n typeof size === \"number\" ? getClosestAstroSize(size) : size;\r\n\r\n // Default to off/grey color if no color specified\r\n const iconColor = color || \"var(--zendir-status-off, #a4abb6)\";\r\n\r\n return (\r\n <span\r\n role=\"img\"\r\n aria-label={label || name}\r\n style={{\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: pixelSize,\r\n height: pixelSize,\r\n minWidth: pixelSize,\r\n minHeight: pixelSize,\r\n flexShrink: 0,\r\n // Don't use overflow:hidden - it clips the icon SVG\r\n ...style,\r\n }}\r\n className={className}\r\n >\r\n <RuxIcon\r\n icon={resolvedName}\r\n size={astroSize}\r\n label={label || name}\r\n data-testid={testId}\r\n onClick={onClick}\r\n style={\r\n {\r\n // Force the RuxIcon to respect our exact pixel size\r\n \"--iconDefaultSize\": `${pixelSize}px`,\r\n \"--iconSize\": `${pixelSize}px`,\r\n \"--size\": `${pixelSize}px`,\r\n color: iconColor,\r\n width: `${pixelSize}px`,\r\n height: `${pixelSize}px`,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n ...(onClick && { cursor: \"pointer\" }),\r\n } as React.CSSProperties\r\n }\r\n />\r\n </span>\r\n );\r\n }\r\n\r\n // Fallback when @astrouxds/react is not installed\r\n return <FallbackIcon {...props} name={resolvedName} />;\r\n});\r\n\r\n/**\r\n * Check if @astrouxds/react is available\r\n * Useful for conditional rendering or feature detection\r\n */\r\nexport function isAstroIconsAvailable(): boolean {\r\n return loadState === \"loaded\" && RuxIconComponent !== null;\r\n}\r\n\r\n/**\r\n * Preload the Astro icons module\r\n * Call this early in your app to ensure icons are ready\r\n */\r\nexport async function preloadAstroIcons(): Promise<boolean> {\r\n const component = await loadRuxIcon();\r\n return component !== null;\r\n}\r\n\r\nexport default AstroIcon;\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAi6BA,IAAM,WAA0C;CAC9C,eAAe;CACf,OAAO;CACP,QAAQ;CACR,OAAO;AACT;;;;;;AAOA,IAAM,eAAuC;CAE3C,OAAO;CACP,YAAY;CACZ,SAAS;CAGT,kBAAkB;CAClB,kBAAkB;CAClB,MAAM;CACN,oBAAoB;CAGpB,QAAQ;CACR,UAAU;CACV,SAAS;CACT,WAAW;CACX,OAAO;CACP,IAAI;CACJ,MAAM;CACN,QAAQ;CACR,aAAa;CAGb,WAAW;CACX,YAAY;CACZ,SAAS;CACT,KAAK;CACL,IAAI;CAGJ,OAAO;CACP,SAAS;CACT,QAAQ;CACR,eAAe;CACf,eAAe;CACf,cAAc;CAGd,UAAU;CACV,QAAQ;CACR,MAAM;CACN,UAAU;CACV,WAAW;CACX,KAAK;CAGL,aAAa;CACb,MAAM;CACN,SAAS;CACT,QAAQ;CAGR,UAAU;CACV,UAAU;CACV,aAAa;CACb,MAAM;CACN,MAAM;CACN,WAAW;CAGX,KAAK;CACL,MAAM;CACN,UAAU;CACV,UAAU;CACV,WAAW;CAGX,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,SAAS;CACT,OAAO;CACP,aAAa;CACb,WAAW;CACX,UAAU;CACV,SAAS;CAGT,MAAM;CACN,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,KAAK;CACL,SAAS;CACT,UAAU;CACV,QAAQ;CAGR,WAAW;CACX,UAAU;CACV,KAAK;CACL,KAAK;CACL,mBAAmB;CACnB,QAAQ;CACR,YAAY;CAGZ,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,YAAY;CACZ,QAAQ;CACR,YAAY;CAGZ,KAAK;CACL,YAAY;CACZ,SAAS;CACT,YAAY;CACZ,UAAU;CACV,WAAW;CAGX,SAAS;CACT,QAAQ;CACR,UAAU;CACV,UAAU;CACV,QAAQ;CAGR,SAAS;CACT,WAAW;CACX,SAAS;CACT,SAAS;CAGT,WAAW;CACX,MAAM;CACN,KAAK;AACP;;;;AAKA,SAAS,iBAAiB,MAAsB;CAC9C,OAAO,aAAa,SAAS;AAC/B;AA6zBA,IAAI,YAAuB;AAC3B,IAAI,mBAAoD;AACxD,IAAM,8BAAc,IAAI,IAAgB;AAExC,SAAS,UAAU,UAAsB;CACvC,YAAY,IAAI,QAAQ;CACxB,aAAa,YAAY,OAAO,QAAQ;AAC1C;AAEA,SAAS,oBAAoB;CAC3B,YAAY,SAAS,OAAO,GAAG,CAAC;AAClC;;;;;AAMA,eAAe,cAAwD;CACrE,IAAI,cAAc,UAChB,OAAO;CAGT,IAAI,cAAc,UAChB,OAAO;CAGT,IAAI,cAAc,WAEhB,OAAO,IAAI,SAAS,YAAY;EAC9B,MAAM,QAAQ,gBAAgB;GAC5B,MAAM;GACN,QAAQ,gBAAgB;EAC1B,CAAC;CACH,CAAC;CAGH,YAAY;CAEZ,IAAI;EAGF,oBAAmB,MADO,OAAO,oBAAA,CACF;EAC/B,YAAY;EACZ,kBAAkB;EAClB,OAAO;CACT,SAAS,KAAK;EACZ,YAAY;EACZ,kBAAkB;EAClB,OAAO;CACT;AACF;;;;;AAMA,SAAS,aAAa,EACpB,MACA,MACA,OACA,OACA,WACA,OACA,SACA,eAAe,UACE;CACjB,MAAM,EAAE,WAAW,SAAS;CAC5B,MAAM,aACJ,OAAO,SAAS,WAAW,OAAO,SAAS,QAAQ;CAErD,IAAI,gBAAgB,IAAI,GACtB,OACE,oBAAC,MAAD;EACQ;EACN,MAAM;EACC;EACI;EACX,cAAY,SAAS;EACZ;EACF;CACR,CAAA;CAIL,OACE,oBAAC,QAAD;EACE,MAAK;EACL,cAAY,SAAS;EACV;EACX,eAAa;EACJ;EACT,UAAU,UAAU,IAAI,KAAA;EACxB,WAAW,WAAW,MAAM,EAAE,QAAQ,WAAW,QAAQ,IAAI,KAAA;EAC7D,OAAO;GACL,SAAS;GACT,YAAY;GACZ,gBAAgB;GAChB,OAAO;GACP,QAAQ;GACR,UAAU,aAAa;GACvB,YAAY,OAAO,WAAW,WAAW;GACzC,YAAY;GACZ,OAAO,SAAS,OAAO,OAAO,OAAO;GACrC,iBAAiB,OAAO,OAAO,WAAW;GAC1C,QAAQ,aAAa,OAAO,OAAO,OAAO;GAC1C,cAAc;GACd,QAAQ,UAAU,YAAY;GAC9B,YAAY;GACZ,GAAG;EACL;EACA,OAAO,SAAS,KAAK;YAErB,qBAAC,OAAD;GACE,OAAO,aAAa;GACpB,QAAQ,aAAa;GACrB,SAAQ;GACR,MAAK;aAJP,CAME,oBAAC,QAAD;IACE,GAAE;IACF,GAAE;IACF,OAAM;IACN,QAAO;IACP,IAAG;IACH,MAAK;IACL,QAAO;IACP,aAAY;GACb,CAAA,GACD,oBAAC,UAAD;IAAQ,IAAG;IAAK,IAAG;IAAK,GAAE;IAAI,MAAK;GAAgB,CAAA,CAChD;;CACD,CAAA;AAEV;;;;;;;;;;;;;;;;;;;;;;;AAwBA,IAAa,YAAY,KAAK,SAAS,UAAU,OAAuB;CACtE,MAAM,EACJ,MACA,OAAO,UACP,OACA,OACA,WACA,OACA,SACA,eAAe,WACb;CAEJ,MAAM,GAAG,eAAe,SAAS,CAAC;CAClC,MAAM,CAAC,cAAc,mBAAmB,SAAS,SAAS;CAC1D,MAAM,aAAa,OAAO,IAAI;CAG9B,gBAAgB;EACd,WAAW,UAAU;EAGrB,MAAM,cAAc,gBAAgB;GAClC,IAAI,WAAW,SAAS;IACtB,gBAAgB,SAAS;IACzB,aAAa,MAAM,IAAI,CAAC;GAC1B;EACF,CAAC;EAGD,IAAI,cAAc,WAChB,YAAY;EAGd,aAAa;GACX,WAAW,UAAU;GACrB,YAAY;EACd;CACF,GAAG,CAAC,CAAC;CAGL,IAAI,iBAAiB,aAAa,iBAAiB,WAAW;EAC5D,MAAM,aAAa,OAAO,SAAS,WAAW,OAAO,SAAS;EAC9D,OACE,oBAAC,QAAD;GACE,OAAO;IACL,SAAS;IACT,OAAO;IACP,QAAQ;IACR,GAAG;GACL;GACW;GACX,eAAY;EACb,CAAA;CAEL;CAGA,MAAM,eAAe,iBAAiB,IAAI;CAG1C,IAAI,kBAAkB;EACpB,MAAM,UAAU;EAChB,MAAM,YAAY,OAAO,SAAS,WAAW,OAAO,SAAS;EAI7D,MAAM,uBAAuB,OAA8B;GACzD,IAAI,MAAM,IAAI,OAAO;GACrB,IAAI,MAAM,IAAI,OAAO;GACrB,IAAI,MAAM,IAAI,OAAO;GACrB,OAAO;EACT;EACA,MAAM,YACJ,OAAO,SAAS,WAAW,oBAAoB,IAAI,IAAI;EAGzD,MAAM,YAAY,SAAS;EAE3B,OACE,oBAAC,QAAD;GACE,MAAK;GACL,cAAY,SAAS;GACrB,OAAO;IACL,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,OAAO;IACP,QAAQ;IACR,UAAU;IACV,WAAW;IACX,YAAY;IAEZ,GAAG;GACL;GACW;aAEX,oBAAC,SAAD;IACE,MAAM;IACN,MAAM;IACN,OAAO,SAAS;IAChB,eAAa;IACJ;IACT,OACE;KAEE,qBAAqB,GAAG,UAAU;KAClC,cAAc,GAAG,UAAU;KAC3B,UAAU,GAAG,UAAU;KACvB,OAAO;KACP,OAAO,GAAG,UAAU;KACpB,QAAQ,GAAG,UAAU;KACrB,SAAS;KACT,YAAY;KACZ,gBAAgB;KAChB,GAAI,WAAW,EAAE,QAAQ,UAAU;IACrC;GAEH,CAAA;EACG,CAAA;CAEV;CAGA,OAAO,oBAAC,cAAD;EAAc,GAAI;EAAO,MAAM;CAAe,CAAA;AACvD,CAAC"}
@@ -1,8 +1,7 @@
1
1
  import { default as React } from 'react';
2
2
  import { StatusLevel } from '../../utils';
3
-
4
- export type BadgeVariant = 'filled' | 'outline' | 'subtle';
5
- export type BadgeSize = 'small' | 'medium';
3
+ export type BadgeVariant = "filled" | "outline" | "subtle";
4
+ export type BadgeSize = "small" | "medium";
6
5
  export interface BadgeProps {
7
6
  /** Visual variant */
8
7
  variant?: BadgeVariant;