@zendir/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/LICENSE +21 -0
  3. package/README.md +589 -0
  4. package/dist/index.d.ts +8 -0
  5. package/dist/index.js +421 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/react/3d/EarthViewer.d.ts +46 -0
  8. package/dist/react/3d/EarthViewer.js +836 -0
  9. package/dist/react/3d/EarthViewer.js.map +1 -0
  10. package/dist/react/3d/SolarSystemViewer.d.ts +43 -0
  11. package/dist/react/3d/SolarSystemViewer.js +372 -0
  12. package/dist/react/3d/SolarSystemViewer.js.map +1 -0
  13. package/dist/react/3d/ZenSpace3D.d.ts +16 -0
  14. package/dist/react/3d/ZenSpace3D.js +1253 -0
  15. package/dist/react/3d/ZenSpace3D.js.map +1 -0
  16. package/dist/react/3d/ZenSpace3DCesium.d.ts +9 -0
  17. package/dist/react/3d/ZenSpace3DCesium.js +186 -0
  18. package/dist/react/3d/ZenSpace3DCesium.js.map +1 -0
  19. package/dist/react/3d/ZenSpace3DShaders.d.ts +78 -0
  20. package/dist/react/3d/ZenSpace3DShaders.js +94 -0
  21. package/dist/react/3d/ZenSpace3DShaders.js.map +1 -0
  22. package/dist/react/3d/ZenSpace3DTypes.d.ts +614 -0
  23. package/dist/react/3d/ZenSpace3DUtils.d.ts +183 -0
  24. package/dist/react/3d/ZenSpace3DUtils.js +213 -0
  25. package/dist/react/3d/ZenSpace3DUtils.js.map +1 -0
  26. package/dist/react/3d/index.d.ts +23 -0
  27. package/dist/react/3d/threeLoader.d.ts +22 -0
  28. package/dist/react/3d/threeLoader.js +18 -0
  29. package/dist/react/3d/threeLoader.js.map +1 -0
  30. package/dist/react/astro/ClassificationBanner.d.ts +25 -0
  31. package/dist/react/astro/ClassificationBanner.js +83 -0
  32. package/dist/react/astro/ClassificationBanner.js.map +1 -0
  33. package/dist/react/astro/GlobalStatusBar.d.ts +42 -0
  34. package/dist/react/astro/GlobalStatusBar.js +165 -0
  35. package/dist/react/astro/GlobalStatusBar.js.map +1 -0
  36. package/dist/react/astro/MissionClock.d.ts +169 -0
  37. package/dist/react/astro/MissionClock.js +411 -0
  38. package/dist/react/astro/MissionClock.js.map +1 -0
  39. package/dist/react/astro/MonitoringIcon.d.ts +60 -0
  40. package/dist/react/astro/MonitoringIcon.js +369 -0
  41. package/dist/react/astro/MonitoringIcon.js.map +1 -0
  42. package/dist/react/astro/Notification.d.ts +42 -0
  43. package/dist/react/astro/Notification.js +156 -0
  44. package/dist/react/astro/Notification.js.map +1 -0
  45. package/dist/react/astro/Progress.d.ts +39 -0
  46. package/dist/react/astro/Progress.js +149 -0
  47. package/dist/react/astro/Progress.js.map +1 -0
  48. package/dist/react/astro/SimulationControls.d.ts +136 -0
  49. package/dist/react/astro/SimulationControls.js +668 -0
  50. package/dist/react/astro/SimulationControls.js.map +1 -0
  51. package/dist/react/astro/StatusIndicator.d.ts +34 -0
  52. package/dist/react/astro/StatusIndicator.js +189 -0
  53. package/dist/react/astro/StatusIndicator.js.map +1 -0
  54. package/dist/react/astro/UnifiedTimeline.d.ts +106 -0
  55. package/dist/react/astro/UnifiedTimeline.js +1768 -0
  56. package/dist/react/astro/UnifiedTimeline.js.map +1 -0
  57. package/dist/react/astro/index.d.ts +63 -0
  58. package/dist/react/cards/AccessCard.d.ts +37 -0
  59. package/dist/react/cards/AccessCard.js +410 -0
  60. package/dist/react/cards/AccessCard.js.map +1 -0
  61. package/dist/react/cards/OrbitCard.d.ts +31 -0
  62. package/dist/react/cards/OrbitCard.js +372 -0
  63. package/dist/react/cards/OrbitCard.js.map +1 -0
  64. package/dist/react/cards/SpacecraftCard.d.ts +54 -0
  65. package/dist/react/cards/SpacecraftCard.js +941 -0
  66. package/dist/react/cards/SpacecraftCard.js.map +1 -0
  67. package/dist/react/cards/TelemetryCard.d.ts +40 -0
  68. package/dist/react/cards/TelemetryCard.js +742 -0
  69. package/dist/react/cards/TelemetryCard.js.map +1 -0
  70. package/dist/react/cards/TelemetryStreamCard.d.ts +59 -0
  71. package/dist/react/cards/TelemetryStreamCard.js +309 -0
  72. package/dist/react/cards/TelemetryStreamCard.js.map +1 -0
  73. package/dist/react/cards/index.d.ts +13 -0
  74. package/dist/react/charts/GroundTrackMap.d.ts +112 -0
  75. package/dist/react/charts/GroundTrackMap.js +1123 -0
  76. package/dist/react/charts/GroundTrackMap.js.map +1 -0
  77. package/dist/react/charts/GroundTrackMapLeaflet.d.ts +26 -0
  78. package/dist/react/charts/GroundTrackMapLeaflet.js +571 -0
  79. package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -0
  80. package/dist/react/charts/groundTrackMapLeafletTiles.d.ts +22 -0
  81. package/dist/react/charts/groundTrackMapLeafletTiles.js +11 -0
  82. package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -0
  83. package/dist/react/charts/groundTrackMapLeafletUtils.d.ts +24 -0
  84. package/dist/react/charts/groundTrackMapLeafletUtils.js +109 -0
  85. package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -0
  86. package/dist/react/charts/index.d.ts +10 -0
  87. package/dist/react/charts/unified/AstroChart.d.ts +24 -0
  88. package/dist/react/charts/unified/AstroChart.js +1405 -0
  89. package/dist/react/charts/unified/AstroChart.js.map +1 -0
  90. package/dist/react/charts/unified/PowerOverviewChart.d.ts +73 -0
  91. package/dist/react/charts/unified/PowerOverviewChart.js +488 -0
  92. package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -0
  93. package/dist/react/charts/unified/domain.d.ts +845 -0
  94. package/dist/react/charts/unified/domain.js +3168 -0
  95. package/dist/react/charts/unified/domain.js.map +1 -0
  96. package/dist/react/charts/unified/generators.d.ts +276 -0
  97. package/dist/react/charts/unified/generators.js +518 -0
  98. package/dist/react/charts/unified/generators.js.map +1 -0
  99. package/dist/react/charts/unified/index.d.ts +55 -0
  100. package/dist/react/charts/unified/presets.d.ts +290 -0
  101. package/dist/react/charts/unified/presets.js +999 -0
  102. package/dist/react/charts/unified/presets.js.map +1 -0
  103. package/dist/react/charts/unified/sync.d.ts +69 -0
  104. package/dist/react/charts/unified/sync.js +219 -0
  105. package/dist/react/charts/unified/sync.js.map +1 -0
  106. package/dist/react/charts/unified/theme.d.ts +447 -0
  107. package/dist/react/charts/unified/theme.js +562 -0
  108. package/dist/react/charts/unified/theme.js.map +1 -0
  109. package/dist/react/charts/unified/types.d.ts +826 -0
  110. package/dist/react/charts/unified/useChartStream.d.ts +58 -0
  111. package/dist/react/charts/unified/useChartStream.js +226 -0
  112. package/dist/react/charts/unified/useChartStream.js.map +1 -0
  113. package/dist/react/chatgpt/AppCard.d.ts +59 -0
  114. package/dist/react/chatgpt/AppCard.js +306 -0
  115. package/dist/react/chatgpt/AppCard.js.map +1 -0
  116. package/dist/react/chatgpt/ChatGPTCard.d.ts +6 -0
  117. package/dist/react/chatgpt/index.d.ts +167 -0
  118. package/dist/react/chatgpt/index.js +166 -0
  119. package/dist/react/chatgpt/index.js.map +1 -0
  120. package/dist/react/context/DisplaySettingsContext.d.ts +107 -0
  121. package/dist/react/context/DisplaySettingsContext.js +169 -0
  122. package/dist/react/context/DisplaySettingsContext.js.map +1 -0
  123. package/dist/react/context/index.d.ts +5 -0
  124. package/dist/react/core/ActivityPlanner.d.ts +45 -0
  125. package/dist/react/core/ActivityPlanner.js +532 -0
  126. package/dist/react/core/ActivityPlanner.js.map +1 -0
  127. package/dist/react/core/AppBar.d.ts +71 -0
  128. package/dist/react/core/AppBar.js +817 -0
  129. package/dist/react/core/AppBar.js.map +1 -0
  130. package/dist/react/core/AstroIcon.d.ts +84 -0
  131. package/dist/react/core/AstroIcon.js +1243 -0
  132. package/dist/react/core/AstroIcon.js.map +1 -0
  133. package/dist/react/core/Badge.d.ts +27 -0
  134. package/dist/react/core/Badge.js +134 -0
  135. package/dist/react/core/Badge.js.map +1 -0
  136. package/dist/react/core/Button.d.ts +26 -0
  137. package/dist/react/core/Button.js +306 -0
  138. package/dist/react/core/Button.js.map +1 -0
  139. package/dist/react/core/CardHeader.d.ts +34 -0
  140. package/dist/react/core/CardHeader.js +316 -0
  141. package/dist/react/core/CardHeader.js.map +1 -0
  142. package/dist/react/core/ChatPanel.d.ts +627 -0
  143. package/dist/react/core/ChatPanel.js +1144 -0
  144. package/dist/react/core/ChatPanel.js.map +1 -0
  145. package/dist/react/core/Checkbox.d.ts +26 -0
  146. package/dist/react/core/Checkbox.js +130 -0
  147. package/dist/react/core/Checkbox.js.map +1 -0
  148. package/dist/react/core/ColorPickerPanel.d.ts +25 -0
  149. package/dist/react/core/ColorPickerPanel.js +293 -0
  150. package/dist/react/core/ColorPickerPanel.js.map +1 -0
  151. package/dist/react/core/CommandBuilder.d.ts +74 -0
  152. package/dist/react/core/CommandBuilder.js +518 -0
  153. package/dist/react/core/CommandBuilder.js.map +1 -0
  154. package/dist/react/core/ConfirmDialog.d.ts +45 -0
  155. package/dist/react/core/ConfirmDialog.js +315 -0
  156. package/dist/react/core/ConfirmDialog.js.map +1 -0
  157. package/dist/react/core/ConnectionForm.d.ts +57 -0
  158. package/dist/react/core/ConnectionForm.js +496 -0
  159. package/dist/react/core/ConnectionForm.js.map +1 -0
  160. package/dist/react/core/Container.d.ts +51 -0
  161. package/dist/react/core/Container.js +670 -0
  162. package/dist/react/core/Container.js.map +1 -0
  163. package/dist/react/core/CopyButton.d.ts +39 -0
  164. package/dist/react/core/CopyButton.js +105 -0
  165. package/dist/react/core/CopyButton.js.map +1 -0
  166. package/dist/react/core/DataTable.d.ts +113 -0
  167. package/dist/react/core/DataTable.js +446 -0
  168. package/dist/react/core/DataTable.js.map +1 -0
  169. package/dist/react/core/DataValue.d.ts +64 -0
  170. package/dist/react/core/DataValue.js +545 -0
  171. package/dist/react/core/DataValue.js.map +1 -0
  172. package/dist/react/core/Dialog.d.ts +32 -0
  173. package/dist/react/core/Dialog.js +201 -0
  174. package/dist/react/core/Dialog.js.map +1 -0
  175. package/dist/react/core/FileExplorer.d.ts +65 -0
  176. package/dist/react/core/FileExplorer.js +520 -0
  177. package/dist/react/core/FileExplorer.js.map +1 -0
  178. package/dist/react/core/GlassCard.d.ts +129 -0
  179. package/dist/react/core/GlassCard.js +375 -0
  180. package/dist/react/core/GlassCard.js.map +1 -0
  181. package/dist/react/core/HeaderIconWithStatus.d.ts +39 -0
  182. package/dist/react/core/HeaderIconWithStatus.js +157 -0
  183. package/dist/react/core/HeaderIconWithStatus.js.map +1 -0
  184. package/dist/react/core/HexViewer.d.ts +143 -0
  185. package/dist/react/core/HexViewer.js +1106 -0
  186. package/dist/react/core/HexViewer.js.map +1 -0
  187. package/dist/react/core/Icon.d.ts +32 -0
  188. package/dist/react/core/Icon.js +142 -0
  189. package/dist/react/core/Icon.js.map +1 -0
  190. package/dist/react/core/ImageGallery.d.ts +41 -0
  191. package/dist/react/core/ImageGallery.js +320 -0
  192. package/dist/react/core/ImageGallery.js.map +1 -0
  193. package/dist/react/core/Input.d.ts +38 -0
  194. package/dist/react/core/Input.js +288 -0
  195. package/dist/react/core/Input.js.map +1 -0
  196. package/dist/react/core/LimitsBar.d.ts +51 -0
  197. package/dist/react/core/LimitsBar.js +200 -0
  198. package/dist/react/core/LimitsBar.js.map +1 -0
  199. package/dist/react/core/LogViewer.d.ts +61 -0
  200. package/dist/react/core/LogViewer.js +599 -0
  201. package/dist/react/core/LogViewer.js.map +1 -0
  202. package/dist/react/core/MessageStream.d.ts +58 -0
  203. package/dist/react/core/MessageStream.js +455 -0
  204. package/dist/react/core/MessageStream.js.map +1 -0
  205. package/dist/react/core/MissionCalendar.d.ts +81 -0
  206. package/dist/react/core/MissionCalendar.js +1049 -0
  207. package/dist/react/core/MissionCalendar.js.map +1 -0
  208. package/dist/react/core/NumberInput.d.ts +85 -0
  209. package/dist/react/core/NumberInput.js +507 -0
  210. package/dist/react/core/NumberInput.js.map +1 -0
  211. package/dist/react/core/PacketViewer.d.ts +73 -0
  212. package/dist/react/core/PacketViewer.js +431 -0
  213. package/dist/react/core/PacketViewer.js.map +1 -0
  214. package/dist/react/core/Pagination.d.ts +30 -0
  215. package/dist/react/core/Pagination.js +190 -0
  216. package/dist/react/core/Pagination.js.map +1 -0
  217. package/dist/react/core/PinInput.d.ts +41 -0
  218. package/dist/react/core/PinInput.js +210 -0
  219. package/dist/react/core/PinInput.js.map +1 -0
  220. package/dist/react/core/Popover.d.ts +55 -0
  221. package/dist/react/core/Popover.js +288 -0
  222. package/dist/react/core/Popover.js.map +1 -0
  223. package/dist/react/core/Select.d.ts +42 -0
  224. package/dist/react/core/Select.js +303 -0
  225. package/dist/react/core/Select.js.map +1 -0
  226. package/dist/react/core/SideNav.d.ts +103 -0
  227. package/dist/react/core/SideNav.js +551 -0
  228. package/dist/react/core/SideNav.js.map +1 -0
  229. package/dist/react/core/SidePanel.d.ts +33 -0
  230. package/dist/react/core/SidePanel.js +199 -0
  231. package/dist/react/core/SidePanel.js.map +1 -0
  232. package/dist/react/core/Tabs.d.ts +47 -0
  233. package/dist/react/core/Tabs.js +129 -0
  234. package/dist/react/core/Tabs.js.map +1 -0
  235. package/dist/react/core/Toast.d.ts +56 -0
  236. package/dist/react/core/Toast.js +229 -0
  237. package/dist/react/core/Toast.js.map +1 -0
  238. package/dist/react/core/Toggle.d.ts +22 -0
  239. package/dist/react/core/Toggle.js +151 -0
  240. package/dist/react/core/Toggle.js.map +1 -0
  241. package/dist/react/core/Tooltip.d.ts +19 -0
  242. package/dist/react/core/Tooltip.js +179 -0
  243. package/dist/react/core/Tooltip.js.map +1 -0
  244. package/dist/react/core/Typography.d.ts +127 -0
  245. package/dist/react/core/Typography.js +187 -0
  246. package/dist/react/core/Typography.js.map +1 -0
  247. package/dist/react/core/index.d.ts +108 -0
  248. package/dist/react/core/layout/Box.d.ts +77 -0
  249. package/dist/react/core/layout/Box.js +126 -0
  250. package/dist/react/core/layout/Box.js.map +1 -0
  251. package/dist/react/core/layout/Center.d.ts +20 -0
  252. package/dist/react/core/layout/Center.js +34 -0
  253. package/dist/react/core/layout/Center.js.map +1 -0
  254. package/dist/react/core/layout/Divider.d.ts +16 -0
  255. package/dist/react/core/layout/Divider.js +108 -0
  256. package/dist/react/core/layout/Divider.js.map +1 -0
  257. package/dist/react/core/layout/Flex.d.ts +30 -0
  258. package/dist/react/core/layout/Flex.js +128 -0
  259. package/dist/react/core/layout/Flex.js.map +1 -0
  260. package/dist/react/core/layout/Grid.d.ts +36 -0
  261. package/dist/react/core/layout/Grid.js +142 -0
  262. package/dist/react/core/layout/Grid.js.map +1 -0
  263. package/dist/react/core/layout/Spacer.d.ts +8 -0
  264. package/dist/react/core/layout/Spacer.js +31 -0
  265. package/dist/react/core/layout/Spacer.js.map +1 -0
  266. package/dist/react/core/layout/Stack.d.ts +54 -0
  267. package/dist/react/core/layout/Stack.js +74 -0
  268. package/dist/react/core/layout/Stack.js.map +1 -0
  269. package/dist/react/core/layout/index.d.ts +38 -0
  270. package/dist/react/core/layout/responsive.d.ts +23 -0
  271. package/dist/react/core/layout/responsive.js +26 -0
  272. package/dist/react/core/layout/responsive.js.map +1 -0
  273. package/dist/react/core/layout/useBreakpoint.d.ts +77 -0
  274. package/dist/react/core/layout/useBreakpoint.js +73 -0
  275. package/dist/react/core/layout/useBreakpoint.js.map +1 -0
  276. package/dist/react/core/propertyConfig.d.ts +443 -0
  277. package/dist/react/core/propertyConfig.js +399 -0
  278. package/dist/react/core/propertyConfig.js.map +1 -0
  279. package/dist/react/hooks/index.d.ts +21 -0
  280. package/dist/react/hooks/useAccessWindows.d.ts +66 -0
  281. package/dist/react/hooks/useCompactMode.d.ts +82 -0
  282. package/dist/react/hooks/useCompactMode.js +62 -0
  283. package/dist/react/hooks/useCompactMode.js.map +1 -0
  284. package/dist/react/hooks/useLiveSelection.d.ts +57 -0
  285. package/dist/react/hooks/useSimulationPlayback.d.ts +97 -0
  286. package/dist/react/hooks/useSimulationTime.d.ts +61 -0
  287. package/dist/react/hooks/useSpacecraftPosition.d.ts +50 -0
  288. package/dist/react/hooks/useSpacecraftPosition.js +89 -0
  289. package/dist/react/hooks/useSpacecraftPosition.js.map +1 -0
  290. package/dist/react/hooks/useTelemetry.d.ts +55 -0
  291. package/dist/react/hooks/useTelemetry.js +73 -0
  292. package/dist/react/hooks/useTelemetry.js.map +1 -0
  293. package/dist/react/hooks/useZendirSession.d.ts +109 -0
  294. package/dist/react/hooks/useZendirSession.js +148 -0
  295. package/dist/react/hooks/useZendirSession.js.map +1 -0
  296. package/dist/react/index.d.ts +74 -0
  297. package/dist/react/shared/ErrorBoundary.d.ts +63 -0
  298. package/dist/react/shared/ErrorBoundary.js +142 -0
  299. package/dist/react/shared/ErrorBoundary.js.map +1 -0
  300. package/dist/react/shared/Skeleton.d.ts +110 -0
  301. package/dist/react/shared/Skeleton.js +324 -0
  302. package/dist/react/shared/Skeleton.js.map +1 -0
  303. package/dist/react/shared/index.d.ts +12 -0
  304. package/dist/react/theme/ThemeProvider.d.ts +385 -0
  305. package/dist/react/theme/ThemeProvider.js +1096 -0
  306. package/dist/react/theme/ThemeProvider.js.map +1 -0
  307. package/dist/react/theme/astro-tokens.d.ts +153 -0
  308. package/dist/react/theme/cardAccent.d.ts +75 -0
  309. package/dist/react/theme/cardAccent.js +137 -0
  310. package/dist/react/theme/cardAccent.js.map +1 -0
  311. package/dist/react/theme/config.d.ts +39 -0
  312. package/dist/react/theme/index.d.ts +9 -0
  313. package/dist/react/types.d.ts +360 -0
  314. package/dist/react/types.js +58 -0
  315. package/dist/react/types.js.map +1 -0
  316. package/dist/react/utils/index.d.ts +247 -0
  317. package/dist/react/utils/index.js +423 -0
  318. package/dist/react/utils/index.js.map +1 -0
  319. package/dist/react/visualizations/EclipseTimerCard.d.ts +17 -0
  320. package/dist/react/visualizations/EclipseTimerCard.js +250 -0
  321. package/dist/react/visualizations/EclipseTimerCard.js.map +1 -0
  322. package/dist/react/visualizations/LinkBudgetCard.d.ts +50 -0
  323. package/dist/react/visualizations/LinkBudgetCard.js +444 -0
  324. package/dist/react/visualizations/LinkBudgetCard.js.map +1 -0
  325. package/dist/react/visualizations/NavBallCard.d.ts +17 -0
  326. package/dist/react/visualizations/NavBallCard.js +243 -0
  327. package/dist/react/visualizations/NavBallCard.js.map +1 -0
  328. package/dist/react/visualizations/PropulsionCard.d.ts +37 -0
  329. package/dist/react/visualizations/PropulsionCard.js +298 -0
  330. package/dist/react/visualizations/PropulsionCard.js.map +1 -0
  331. package/dist/react/visualizations/SensorFootprintCard.d.ts +33 -0
  332. package/dist/react/visualizations/SensorFootprintCard.js +326 -0
  333. package/dist/react/visualizations/SensorFootprintCard.js.map +1 -0
  334. package/dist/react/visualizations/ThermalHeatmapCard.d.ts +38 -0
  335. package/dist/react/visualizations/ThermalHeatmapCard.js +372 -0
  336. package/dist/react/visualizations/ThermalHeatmapCard.js.map +1 -0
  337. package/dist/react/visualizations/index.d.ts +17 -0
  338. package/dist/react.d.ts +1 -0
  339. package/dist/react.js +421 -0
  340. package/dist/react.js.map +1 -0
  341. package/dist/shaders/atmosphere.frag.js +5 -0
  342. package/dist/shaders/atmosphere.frag.js.map +1 -0
  343. package/dist/shaders/atmosphere.vert.js +5 -0
  344. package/dist/shaders/atmosphere.vert.js.map +1 -0
  345. package/dist/shaders/stars.frag.js +5 -0
  346. package/dist/shaders/stars.frag.js.map +1 -0
  347. package/dist/shaders/stars.vert.js +5 -0
  348. package/dist/shaders/stars.vert.js.map +1 -0
  349. package/dist/style.css +143 -0
  350. package/dist/tokens/index.d.ts +296 -0
  351. package/dist/tokens/index.js +263 -0
  352. package/dist/tokens/index.js.map +1 -0
  353. package/dist/tokens/tokens.css +155 -0
  354. package/dist/types/index.d.ts +23 -0
  355. package/dist/types.d.ts +1 -0
  356. package/dist/types.js +2 -0
  357. package/dist/types.js.map +1 -0
  358. package/package.json +220 -0
  359. package/sdk-stub.js +22 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HexViewer.js","sources":["../../../src/react/core/HexViewer.tsx"],"sourcesContent":["/**\n * @zendir/ui - HexViewer Component\n * \n * Displays raw binary data in a hex viewer format for telemetry packet analysis.\n * Shows offset, hex bytes, and ASCII representation side by side.\n * \n * Features:\n * - Hex + ASCII view with configurable bytes per row (8, 16, 32)\n * - Byte highlighting with custom colors (for field boundaries, errors, etc.)\n * - Click-to-select bytes and ranges\n * - Search by hex pattern or ASCII string\n * - Offset display in hex or decimal\n * - Live data streaming support (auto-scroll)\n * - Copy selection as hex, decimal, or ASCII\n * - Byte grouping (1, 2, 4, 8)\n * - Endianness toggle for multi-byte interpretation\n * - Status bar showing cursor position, selection info, data interpretation\n * \n * Astro UX Compliance:\n * - Dark theme with monospace font\n * - Status colors for highlighting\n * - Accessible keyboard navigation\n * \n * @example\n * ```tsx\n * <HexViewer\n * data={new Uint8Array([0x48, 0x65, 0x6C, 0x6C, 0x6F])}\n * bytesPerRow={16}\n * highlights={[{ start: 0, end: 4, color: '#4CAF50', label: 'Header' }]}\n * />\n * ```\n */\n\nimport React, { useState, useRef, useCallback, useMemo, useEffect, memo } from 'react';\nimport { useTheme } from '../theme';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface HexHighlight {\n /** Start byte offset (inclusive) */\n start: number;\n /** End byte offset (inclusive) */\n end: number;\n /** Highlight color (CSS color) */\n color: string;\n /** Optional label for the highlight region */\n label?: string;\n}\n\n/**\n * Named region for structural packet analysis (e.g., CCSDS Primary Header,\n * Secondary Header, User Data). Regions provide persistent background color\n * and a legend entry, unlike transient highlights.\n */\nexport interface HexRegion {\n /** Start byte offset (inclusive) */\n start: number;\n /** End byte offset (exclusive) */\n end: number;\n /** Region display name (e.g., \"Primary Header\") */\n label: string;\n /** Background fill color (CSS rgba recommended) */\n color: string;\n /** Border/accent color for the region */\n borderColor?: string;\n}\n\n/**\n * A decoded field within the packet payload for the fields table.\n * Enables cross-highlighting: hover a field row → highlight its bytes,\n * hover hex bytes → highlight the corresponding field row.\n */\nexport interface DecodedField {\n /** Field name */\n name: string;\n /** Decoded value (displayed via toString) */\n value: string | number | boolean | null;\n /** Engineering units (e.g., \"°C\", \"V\", \"rpm\") */\n unit?: string;\n /** Byte offset within the packet where this field starts */\n byteOffset?: number;\n /** Size in bits */\n sizeBits?: number;\n /** Optional description / tooltip */\n description?: string;\n}\n\n/**\n * Packet header key-value pairs shown in a collapsible summary panel.\n * Supports CCSDS-style primary + secondary header display.\n */\nexport interface PacketHeaderEntry {\n /** Label (e.g., \"APID\", \"Sequence Count\", \"Spacecraft ID\") */\n label: string;\n /** Value */\n value: string | number;\n /** Render value in monospace font */\n mono?: boolean;\n}\n\n/** Pre-defined region color palette for space packet headers */\nexport const REGION_COLORS = {\n primary: 'rgba(96, 165, 250, 0.15)',\n secondary: 'rgba(168, 85, 247, 0.15)',\n tertiary: 'rgba(251, 191, 36, 0.15)',\n userData: 'rgba(34, 197, 94, 0.15)',\n error: 'rgba(255, 56, 56, 0.15)',\n} as const;\n\nexport const REGION_BORDER_COLORS = {\n primary: 'rgba(96, 165, 250, 0.5)',\n secondary: 'rgba(168, 85, 247, 0.5)',\n tertiary: 'rgba(251, 191, 36, 0.5)',\n userData: 'rgba(34, 197, 94, 0.5)',\n error: 'rgba(255, 56, 56, 0.5)',\n} as const;\n\nexport type ByteGrouping = 1 | 2 | 4 | 8;\nexport type OffsetBase = 'hex' | 'decimal';\nexport type Endianness = 'big' | 'little';\n\nexport interface HexViewerProps {\n /** Binary data to display */\n data: Uint8Array | number[];\n /** Bytes per row (default: 16) */\n bytesPerRow?: 8 | 16 | 32;\n /** Byte grouping for hex display (default: 1) */\n byteGrouping?: ByteGrouping;\n /** Offset display base (default: 'hex') */\n offsetBase?: OffsetBase;\n /** Highlighted byte regions (transient, e.g., search results or field hover) */\n highlights?: HexHighlight[];\n /** Named structural regions (persistent background, e.g., Primary/Secondary Header) */\n regions?: HexRegion[];\n /** Decoded fields for the fields table (cross-highlights with hex bytes) */\n decodedFields?: DecodedField[];\n /** Packet header entries for the summary panel */\n packetHeaders?: PacketHeaderEntry[];\n /** External hover highlight range (for cross-component linking) */\n externalHighlight?: { start: number; end: number } | null;\n /** Whether to show the ASCII column (default: true) */\n showAscii?: boolean;\n /** Whether to show the offset column (default: true) */\n showOffset?: boolean;\n /** Whether to show the status/info bar (default: true) */\n showStatusBar?: boolean;\n /** Whether to show the search bar (default: true) */\n showSearch?: boolean;\n /** Whether to show the toolbar (default: true) */\n showToolbar?: boolean;\n /** Whether to show the decoded fields table (default: true if decodedFields provided) */\n showFieldsTable?: boolean;\n /** Whether to show the packet header summary (default: true if packetHeaders provided) */\n showHeaderSummary?: boolean;\n /**\n * Height of the viewer (default: 400).\n * When constrained, HexViewer enables outer scroll fallback so expanded\n * panels (headers/decoded fields) never trap lower sections.\n */\n height?: number | string;\n /** Title for the viewer */\n title?: string;\n /** Whether data is streaming (auto-scroll to bottom) */\n streaming?: boolean;\n /** Endianness for multi-byte interpretation (default: 'big') */\n endianness?: Endianness;\n /** Called when byte selection changes */\n onSelectionChange?: (start: number, end: number) => void;\n /** Called when a byte is clicked */\n onByteClick?: (offset: number, value: number) => void;\n /** Called when hovering a byte (for external cross-highlighting) */\n onByteHover?: (byteIndex: number) => void;\n /** Called when mouse leaves hex area */\n onByteLeave?: () => void;\n /** CSS class name */\n className?: string;\n /** Show outer container border (default: true). Set false when embedded inside a Container/card. */\n bordered?: boolean;\n /** Custom style overrides for the outer container */\n style?: React.CSSProperties;\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction toUint8Array(data: Uint8Array | number[]): Uint8Array {\n return data instanceof Uint8Array ? data : new Uint8Array(data);\n}\n\nfunction byteToHex(byte: number): string {\n return byte.toString(16).padStart(2, '0').toUpperCase();\n}\n\nfunction byteToAscii(byte: number): string {\n return byte >= 0x20 && byte <= 0x7E ? String.fromCharCode(byte) : '.';\n}\n\nfunction formatOffset(offset: number, base: OffsetBase, totalBytes: number): string {\n if (base === 'hex') {\n const width = Math.max(4, Math.ceil(Math.log2(Math.max(totalBytes, 1)) / 4) * 1);\n return offset.toString(16).padStart(Math.max(width, 4), '0').toUpperCase();\n }\n const width = Math.max(4, totalBytes.toString().length);\n return offset.toString().padStart(width, ' ');\n}\n\nfunction interpretBytes(\n data: Uint8Array,\n offset: number,\n endianness: Endianness,\n): { u8: number; i8: number; u16?: number; i16?: number; u32?: number; i32?: number; f32?: number; f64?: number } {\n const result: ReturnType<typeof interpretBytes> = {\n u8: data[offset],\n i8: data[offset] > 127 ? data[offset] - 256 : data[offset],\n };\n\n if (offset + 1 < data.length) {\n const view = new DataView(data.buffer, data.byteOffset + offset, Math.min(8, data.length - offset));\n const be = endianness === 'big';\n result.u16 = view.getUint16(0, !be);\n result.i16 = view.getInt16(0, !be);\n if (offset + 3 < data.length) {\n result.u32 = view.getUint32(0, !be);\n result.i32 = view.getInt32(0, !be);\n result.f32 = view.getFloat32(0, !be);\n }\n if (offset + 7 < data.length) {\n result.f64 = view.getFloat64(0, !be);\n }\n }\n return result;\n}\n\nconst HEX_ROW_HEIGHT = 22;\nconst HEX_OVERSCAN_ROWS = 16;\nconst MAX_RENDERED_SEARCH_HIGHLIGHTS = 400;\n\n// =============================================================================\n// Sub-components\n// =============================================================================\n\nconst HexRow = memo(function HexRow({\n offset,\n bytes,\n bytesPerRow,\n byteGrouping,\n offsetBase,\n totalBytes,\n showAscii,\n showOffset,\n highlights,\n regions,\n effectiveHighlight,\n selectedStart,\n selectedEnd,\n cursorOffset,\n onByteMouseDown,\n onByteMouseEnter,\n onByteClick,\n handleByteHoverInternal,\n handleByteLeaveInternal,\n tokens,\n}: {\n offset: number;\n bytes: Uint8Array;\n bytesPerRow: number;\n byteGrouping: ByteGrouping;\n offsetBase: OffsetBase;\n totalBytes: number;\n showAscii: boolean;\n showOffset: boolean;\n highlights: HexHighlight[];\n regions: HexRegion[];\n effectiveHighlight: { start: number; end: number } | null | undefined;\n selectedStart: number;\n selectedEnd: number;\n cursorOffset: number;\n onByteMouseDown: (idx: number) => void;\n onByteMouseEnter: (idx: number) => void;\n onByteClick: (idx: number) => void;\n handleByteHoverInternal: (idx: number) => void;\n handleByteLeaveInternal: () => void;\n tokens: ReturnType<typeof useTheme>['tokens'];\n}) {\n const hexCells: React.ReactNode[] = [];\n const asciiCells: React.ReactNode[] = [];\n\n for (let i = 0; i < bytesPerRow; i++) {\n const byteIdx = offset + i;\n const isValid = i < bytes.length;\n const byte = isValid ? bytes[i] : 0;\n\n // Determine highlight color (priority: selection > cross-highlight > search highlight > region)\n let bgColor = 'transparent';\n let fgColor = tokens.colors.text.primary;\n let borderBottom = '2px solid transparent';\n const isSelected = byteIdx >= Math.min(selectedStart, selectedEnd) && byteIdx <= Math.max(selectedStart, selectedEnd) && selectedStart >= 0;\n const isCursor = byteIdx === cursorOffset;\n\n // 1. Region background (lowest priority — always visible unless overridden)\n let regionColor: string | null = null;\n for (let r = 0; r < regions.length; r++) {\n const region = regions[r];\n if (byteIdx < region.start) break;\n if (byteIdx >= region.start && byteIdx < region.end) {\n regionColor = region.color;\n break;\n }\n }\n if (regionColor) {\n bgColor = regionColor;\n }\n\n // 2. Search highlights\n for (const h of highlights) {\n if (byteIdx >= h.start && byteIdx <= h.end) {\n bgColor = `${h.color}33`;\n fgColor = h.color;\n break;\n }\n }\n\n // 3. Cross-highlight from field hover or external\n if (effectiveHighlight && byteIdx >= effectiveHighlight.start && byteIdx < effectiveHighlight.end) {\n bgColor = `${tokens.colors.status.caution}4D`;\n borderBottom = `2px solid ${tokens.colors.status.caution}`;\n }\n\n // 4. Selection (highest priority)\n if (isSelected) {\n bgColor = `${tokens.colors.interactive.default}4D`;\n fgColor = tokens.colors.interactive.default;\n }\n\n // Add grouping space\n const needsGroupSpace = i > 0 && i % byteGrouping === 0;\n\n hexCells.push(\n <span\n key={`hex-${i}`}\n role=\"button\"\n tabIndex={isValid ? 0 : -1}\n onMouseDown={() => isValid && onByteMouseDown(byteIdx)}\n onMouseEnter={() => { isValid && onByteMouseEnter(byteIdx); isValid && handleByteHoverInternal(byteIdx); }}\n onMouseLeave={() => isValid && handleByteLeaveInternal()}\n onClick={() => isValid && onByteClick(byteIdx)}\n onKeyDown={e => { if (isValid && (e.key === 'Enter' || e.key === ' ')) { e.preventDefault(); onByteClick(byteIdx); } }}\n style={{\n padding: '0 2px',\n marginLeft: needsGroupSpace ? 6 : 0,\n background: bgColor,\n color: isValid ? fgColor : `${tokens.colors.text.muted}26`,\n cursor: isValid ? 'pointer' : 'default',\n borderBottom: isCursor ? `2px solid ${tokens.colors.status.normal}` : borderBottom,\n borderRadius: tokens.borderRadius.sm,\n userSelect: 'none',\n transition: 'background 0.1s ease',\n }}\n >\n {isValid ? byteToHex(byte) : ' '}\n </span>,\n );\n\n if (showAscii) {\n asciiCells.push(\n <span\n key={`ascii-${i}`}\n role=\"button\"\n tabIndex={isValid ? 0 : -1}\n onMouseDown={() => isValid && onByteMouseDown(byteIdx)}\n onMouseEnter={() => { isValid && onByteMouseEnter(byteIdx); isValid && handleByteHoverInternal(byteIdx); }}\n onMouseLeave={() => isValid && handleByteLeaveInternal()}\n onClick={() => isValid && onByteClick(byteIdx)}\n onKeyDown={e => { if (isValid && (e.key === 'Enter' || e.key === ' ')) { e.preventDefault(); onByteClick(byteIdx); } }}\n style={{\n background: bgColor,\n color: isValid ? (byte >= 0x20 && byte <= 0x7E ? fgColor : `${tokens.colors.text.muted}33`) : 'transparent',\n cursor: isValid ? 'pointer' : 'default',\n borderBottom: isCursor ? `2px solid ${tokens.colors.status.normal}` : borderBottom,\n borderRadius: tokens.borderRadius.sm,\n userSelect: 'none',\n width: 8,\n textAlign: 'center' as const,\n }}\n >\n {isValid ? byteToAscii(byte) : ' '}\n </span>,\n );\n }\n }\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', height: HEX_ROW_HEIGHT, lineHeight: `${HEX_ROW_HEIGHT}px` }}>\n {showOffset && (\n <span style={{ color: tokens.colors.text.muted, marginRight: 12, minWidth: 60, textAlign: 'right' }}>\n {formatOffset(offset, offsetBase, totalBytes)}\n </span>\n )}\n <span style={{ display: 'flex', gap: 1, marginRight: showAscii ? 16 : 0, letterSpacing: '0.5px' }}>\n {hexCells}\n </span>\n {showAscii && (\n <>\n <span style={{ color: `${tokens.colors.border.muted}`, marginRight: 8 }}>│</span>\n <span style={{ display: 'flex', letterSpacing: '1px' }}>\n {asciiCells}\n </span>\n </>\n )}\n </div>\n );\n});\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\nexport function HexViewer({\n data: rawData,\n bytesPerRow = 16,\n byteGrouping = 1,\n offsetBase = 'hex',\n highlights = [],\n regions = [],\n decodedFields,\n packetHeaders,\n externalHighlight,\n showAscii = true,\n showOffset = true,\n showStatusBar = true,\n showSearch = true,\n showToolbar = true,\n showFieldsTable,\n showHeaderSummary,\n height = 400,\n title,\n streaming = false,\n endianness = 'big',\n onSelectionChange,\n onByteClick,\n onByteHover,\n onByteLeave,\n className = '',\n bordered = true,\n style: styleProp,\n}: HexViewerProps): React.ReactElement {\n const { tokens } = useTheme();\n const data = useMemo(() => toUint8Array(rawData), [rawData]);\n const [hoveredFieldIdx, setHoveredFieldIdx] = useState<number | null>(null);\n const [fieldHighlight, setFieldHighlight] = useState<{ start: number; end: number } | null>(null);\n const [showHeaders, setShowHeaders] = useState(true);\n const [showFields, setShowFields] = useState(true);\n\n const sortedRegions = useMemo(\n () => [...regions].sort((a, b) => a.start - b.start),\n [regions],\n );\n\n // Build field byte ranges for cross-highlighting\n const fieldByteRanges = useMemo(() => {\n if (!decodedFields) return [];\n return decodedFields.map(f => ({\n start: f.byteOffset ?? 0,\n end: (f.byteOffset ?? 0) + Math.ceil((f.sizeBits ?? 0) / 8),\n name: f.name,\n }));\n }, [decodedFields]);\n\n // Cross-highlight: field hover → byte highlight\n const handleFieldHover = useCallback((fieldIdx: number) => {\n setHoveredFieldIdx(fieldIdx);\n const range = fieldByteRanges[fieldIdx];\n if (range && range.end > range.start) setFieldHighlight(range);\n }, [fieldByteRanges]);\n\n const handleFieldLeave = useCallback(() => {\n setHoveredFieldIdx(null);\n setFieldHighlight(null);\n }, []);\n\n // Cross-highlight: byte hover → field highlight\n const handleByteHoverInternal = useCallback((byteIdx: number) => {\n onByteHover?.(byteIdx);\n const fi = fieldByteRanges.findIndex(r => byteIdx >= r.start && byteIdx < r.end);\n if (fi >= 0) {\n setHoveredFieldIdx(fi);\n setFieldHighlight(fieldByteRanges[fi]);\n } else {\n setHoveredFieldIdx(null);\n setFieldHighlight({ start: byteIdx, end: byteIdx + 1 });\n }\n }, [fieldByteRanges, onByteHover]);\n\n const handleByteLeaveInternal = useCallback(() => {\n onByteLeave?.();\n setHoveredFieldIdx(null);\n setFieldHighlight(null);\n }, [onByteLeave]);\n\n // Merge field highlight + external highlight into effective highlights\n const effectiveHighlight = externalHighlight || fieldHighlight;\n\n const shouldShowFieldsTable = showFieldsTable ?? (decodedFields && decodedFields.length > 0);\n const shouldShowHeaderSummary = showHeaderSummary ?? (packetHeaders && packetHeaders.length > 0);\n const scrollRef = useRef<HTMLDivElement>(null);\n const hasConstrainedHeight = useMemo(() => {\n if (height === undefined || height === null) return false;\n if (typeof height === 'string') return height.trim().toLowerCase() !== 'auto';\n return true;\n }, [height]);\n const decodedFieldsMaxHeight = useMemo(() => {\n if (typeof height === 'number') {\n // Keep decoded fields useful but avoid starving the hex grid.\n return Math.min(220, Math.max(120, Math.floor(height * 0.32)));\n }\n return 200;\n }, [height]);\n\n const [cursorOffset, setCursorOffset] = useState(-1);\n const [selectStart, setSelectStart] = useState(-1);\n const [selectEnd, setSelectEnd] = useState(-1);\n const [isDragging, setIsDragging] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [searchType, setSearchType] = useState<'hex' | 'ascii'>('hex');\n const [searchResults, setSearchResults] = useState<number[]>([]);\n const [currentSearchIdx, setCurrentSearchIdx] = useState(-1);\n const [localBytesPerRow, setLocalBytesPerRow] = useState(bytesPerRow);\n const [localGrouping, setLocalGrouping] = useState(byteGrouping);\n const [localOffsetBase, setLocalOffsetBase] = useState(offsetBase);\n const [localEndianness, setLocalEndianness] = useState(endianness);\n const [localShowAscii, setLocalShowAscii] = useState(showAscii);\n const [scrollTop, setScrollTop] = useState(0);\n const [viewportHeight, setViewportHeight] = useState(160);\n\n // Auto-scroll when streaming\n useEffect(() => {\n if (streaming && scrollRef.current) {\n scrollRef.current.scrollTop = scrollRef.current.scrollHeight;\n }\n }, [data, streaming]);\n\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return undefined;\n\n const updateViewportHeight = () => {\n setViewportHeight(Math.max(120, el.clientHeight || 160));\n };\n\n updateViewportHeight();\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(updateViewportHeight);\n observer.observe(el);\n return () => observer.disconnect();\n }\n\n window.addEventListener('resize', updateViewportHeight);\n return () => window.removeEventListener('resize', updateViewportHeight);\n }, []);\n\n const totalRows = Math.max(1, Math.ceil(data.length / localBytesPerRow));\n const startRow = Math.max(0, Math.floor(scrollTop / HEX_ROW_HEIGHT) - HEX_OVERSCAN_ROWS);\n const visibleRowCount = Math.ceil(viewportHeight / HEX_ROW_HEIGHT) + HEX_OVERSCAN_ROWS * 2;\n const endRow = Math.min(totalRows, startRow + visibleRowCount);\n const virtualRows = useMemo(() => {\n const result: { offset: number; bytes: Uint8Array }[] = [];\n for (let row = startRow; row < endRow; row++) {\n const offset = row * localBytesPerRow;\n const bytes = data.subarray(offset, Math.min(data.length, offset + localBytesPerRow));\n result.push({ offset, bytes });\n }\n if (result.length === 0) {\n result.push({ offset: 0, bytes: new Uint8Array(0) });\n }\n return result;\n }, [data, localBytesPerRow, startRow, endRow]);\n\n // Search\n const doSearch = useCallback(() => {\n if (!searchQuery.trim()) {\n setSearchResults([]);\n setCurrentSearchIdx(-1);\n return;\n }\n\n const results: number[] = [];\n if (searchType === 'hex') {\n const hexStr = searchQuery.replace(/\\s+/g, '');\n if (hexStr.length % 2 !== 0 || !/^[0-9a-fA-F]+$/.test(hexStr)) return;\n const searchBytes = new Uint8Array(hexStr.length / 2);\n for (let i = 0; i < searchBytes.length; i++) {\n searchBytes[i] = parseInt(hexStr.slice(i * 2, i * 2 + 2), 16);\n }\n for (let i = 0; i <= data.length - searchBytes.length; i++) {\n let match = true;\n for (let j = 0; j < searchBytes.length; j++) {\n if (data[i + j] !== searchBytes[j]) { match = false; break; }\n }\n if (match) results.push(i);\n }\n } else {\n const encoder = new TextEncoder();\n const searchBytes = encoder.encode(searchQuery);\n for (let i = 0; i <= data.length - searchBytes.length; i++) {\n let match = true;\n for (let j = 0; j < searchBytes.length; j++) {\n if (data[i + j] !== searchBytes[j]) { match = false; break; }\n }\n if (match) results.push(i);\n }\n }\n setSearchResults(results);\n setCurrentSearchIdx(results.length > 0 ? 0 : -1);\n if (results.length > 0) {\n setCursorOffset(results[0]);\n if (scrollRef.current) {\n const rowIdx = Math.floor(results[0] / localBytesPerRow);\n scrollRef.current.scrollTop = Math.max(0, rowIdx * HEX_ROW_HEIGHT - 100);\n }\n }\n }, [searchQuery, searchType, data, localBytesPerRow]);\n\n const scrollToOffset = useCallback((offset: number) => {\n if (!scrollRef.current) return;\n const rowIdx = Math.floor(offset / localBytesPerRow);\n scrollRef.current.scrollTop = Math.max(0, rowIdx * HEX_ROW_HEIGHT - 100);\n }, [localBytesPerRow]);\n\n const handleHexScroll = useCallback((event: React.UIEvent<HTMLDivElement>) => {\n setScrollTop(event.currentTarget.scrollTop);\n }, []);\n\n const nextSearchResult = useCallback(() => {\n if (searchResults.length === 0) return;\n const nextIdx = (currentSearchIdx + 1) % searchResults.length;\n setCurrentSearchIdx(nextIdx);\n setCursorOffset(searchResults[nextIdx]);\n scrollToOffset(searchResults[nextIdx]);\n }, [searchResults, currentSearchIdx, scrollToOffset]);\n\n const prevSearchResult = useCallback(() => {\n if (searchResults.length === 0) return;\n const prevIdx = (currentSearchIdx - 1 + searchResults.length) % searchResults.length;\n setCurrentSearchIdx(prevIdx);\n setCursorOffset(searchResults[prevIdx]);\n scrollToOffset(searchResults[prevIdx]);\n }, [searchResults, currentSearchIdx, scrollToOffset]);\n\n // Selection handlers\n const handleByteMouseDown = useCallback((idx: number) => {\n setSelectStart(idx);\n setSelectEnd(idx);\n setCursorOffset(idx);\n setIsDragging(true);\n }, []);\n\n const handleByteMouseEnter = useCallback((idx: number) => {\n if (isDragging) {\n setSelectEnd(idx);\n }\n }, [isDragging]);\n\n const handleMouseUp = useCallback(() => {\n if (isDragging) {\n setIsDragging(false);\n if (onSelectionChange && selectStart >= 0 && selectEnd >= 0) {\n onSelectionChange(Math.min(selectStart, selectEnd), Math.max(selectStart, selectEnd));\n }\n }\n }, [isDragging, selectStart, selectEnd, onSelectionChange]);\n\n useEffect(() => {\n window.addEventListener('mouseup', handleMouseUp);\n return () => window.removeEventListener('mouseup', handleMouseUp);\n }, [handleMouseUp]);\n\n const handleByteClickCb = useCallback((idx: number) => {\n setCursorOffset(idx);\n if (onByteClick) {\n onByteClick(idx, data[idx]);\n }\n }, [data, onByteClick]);\n\n // Copy selection\n const copySelection = useCallback((format: 'hex' | 'decimal' | 'ascii') => {\n if (selectStart < 0 || selectEnd < 0) return;\n const start = Math.min(selectStart, selectEnd);\n const end = Math.max(selectStart, selectEnd);\n const selected = data.slice(start, end + 1);\n\n let text: string;\n if (format === 'hex') {\n text = Array.from(selected).map(b => byteToHex(b)).join(' ');\n } else if (format === 'decimal') {\n text = Array.from(selected).join(', ');\n } else {\n text = Array.from(selected).map(b => byteToAscii(b)).join('');\n }\n navigator.clipboard?.writeText(text);\n }, [data, selectStart, selectEnd]);\n\n // Interpretation of cursor byte\n const interpretation = useMemo(() => {\n if (cursorOffset < 0 || cursorOffset >= data.length) return null;\n return interpretBytes(data, cursorOffset, localEndianness);\n }, [data, cursorOffset, localEndianness]);\n\n const renderedSearchResultEntries = useMemo(() => {\n if (searchResults.length <= MAX_RENDERED_SEARCH_HIGHLIGHTS) {\n return searchResults.map((pos, idx) => ({ pos, idx }));\n }\n\n const halfWindow = Math.floor(MAX_RENDERED_SEARCH_HIGHLIGHTS / 2);\n const anchor = currentSearchIdx >= 0 ? currentSearchIdx : 0;\n const start = Math.max(0, anchor - halfWindow);\n const end = Math.min(searchResults.length, start + MAX_RENDERED_SEARCH_HIGHLIGHTS);\n const adjustedStart = Math.max(0, end - MAX_RENDERED_SEARCH_HIGHLIGHTS);\n\n return searchResults\n .slice(adjustedStart, end)\n .map((pos, i) => ({ pos, idx: adjustedStart + i }));\n }, [searchResults, currentSearchIdx]);\n\n // Search highlights\n const allHighlights = useMemo(() => {\n const h = [...highlights];\n const searchLen = searchType === 'hex' ? searchQuery.replace(/\\s+/g, '').length / 2 : searchQuery.length;\n renderedSearchResultEntries.forEach(({ pos, idx }) => {\n h.push({\n start: pos,\n end: pos + Math.max(0, searchLen - 1),\n color: idx === currentSearchIdx ? tokens.colors.status.serious : tokens.colors.status.caution,\n label: `Search match ${idx + 1}`,\n });\n });\n return h;\n }, [highlights, renderedSearchResultEntries, currentSearchIdx, searchQuery, searchType, tokens]);\n\n const containerStyle: React.CSSProperties = {\n fontFamily: tokens.typography.fontFamily.mono,\n fontSize: 13,\n lineHeight: '22px',\n background: tokens.colors.background.base,\n border: bordered ? `1px solid ${tokens.colors.border.muted}` : 'none',\n borderRadius: tokens.borderRadius.lg,\n overflowX: 'hidden',\n overflowY: hasConstrainedHeight ? 'auto' : 'visible',\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n height: hasConstrainedHeight ? height : undefined,\n color: tokens.colors.text.primary,\n ...styleProp,\n };\n\n return (\n <div\n className={`hex-viewer ${className}`}\n style={containerStyle}\n >\n {/* Sticky header: title bar + toolbar stay pinned while content scrolls */}\n <div style={{\n position: 'sticky',\n top: 0,\n zIndex: 10,\n background: tokens.colors.background.surface,\n flexShrink: 0,\n }}>\n {/* Title bar */}\n {title && (\n <div style={{\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}>\n <span style={{ fontWeight: tokens.typography.fontWeight.medium, fontSize: tokens.typography.fontSize.base, fontFamily: tokens.typography.fontFamily.primary }}>\n {title}\n </span>\n <span style={{ fontSize: tokens.typography.fontSize.sm, color: tokens.colors.text.muted }}>\n {data.length.toLocaleString()} bytes\n </span>\n </div>\n )}\n\n {/* Toolbar */}\n {showToolbar && (\n <div role=\"toolbar\" aria-label=\"Hex viewer controls\" style={{\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n display: 'flex',\n alignItems: 'center',\n gap: tokens.spacing.sm,\n flexWrap: 'wrap',\n fontSize: tokens.typography.fontSize.sm,\n }}>\n <label style={{ display: 'flex', alignItems: 'center', gap: 4, color: tokens.colors.text.muted }}>\n Bytes/Row:\n <select\n aria-label=\"Bytes per row\"\n value={localBytesPerRow}\n onChange={e => setLocalBytesPerRow(Number(e.target.value) as 8 | 16 | 32)}\n style={{\n background: tokens.colors.background.base,\n color: tokens.colors.text.primary,\n border: `1px solid ${tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.md, padding: '2px 4px', fontSize: 11,\n }}\n >\n <option value={8}>8</option>\n <option value={16}>16</option>\n <option value={32}>32</option>\n </select>\n </label>\n <label style={{ display: 'flex', alignItems: 'center', gap: 4, color: tokens.colors.text.muted }}>\n Group:\n <select\n aria-label=\"Byte grouping\"\n value={localGrouping}\n onChange={e => setLocalGrouping(Number(e.target.value) as ByteGrouping)}\n style={{\n background: tokens.colors.background.base,\n color: tokens.colors.text.primary,\n border: `1px solid ${tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.md, padding: '2px 4px', fontSize: 11,\n }}\n >\n <option value={1}>1</option>\n <option value={2}>2</option>\n <option value={4}>4</option>\n <option value={8}>8</option>\n </select>\n </label>\n <label style={{ display: 'flex', alignItems: 'center', gap: 4, color: tokens.colors.text.muted }}>\n Offset:\n <select\n aria-label=\"Offset format\"\n value={localOffsetBase}\n onChange={e => setLocalOffsetBase(e.target.value as OffsetBase)}\n style={{\n background: tokens.colors.background.base,\n color: tokens.colors.text.primary,\n border: `1px solid ${tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.md, padding: '2px 4px', fontSize: 11,\n }}\n >\n <option value=\"hex\">Hex</option>\n <option value=\"decimal\">Dec</option>\n </select>\n </label>\n <label style={{ display: 'flex', alignItems: 'center', gap: 4, color: tokens.colors.text.muted }}>\n Endian:\n <select\n aria-label=\"Endianness\"\n value={localEndianness}\n onChange={e => setLocalEndianness(e.target.value as Endianness)}\n style={{\n background: tokens.colors.background.base,\n color: tokens.colors.text.primary,\n border: `1px solid ${tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.md, padding: '2px 4px', fontSize: 11,\n }}\n >\n <option value=\"big\">Big</option>\n <option value=\"little\">Little</option>\n </select>\n </label>\n <label style={{ display: 'flex', alignItems: 'center', gap: 4, color: tokens.colors.text.muted, cursor: 'pointer' }}>\n <input\n type=\"checkbox\"\n checked={localShowAscii}\n onChange={e => setLocalShowAscii(e.target.checked)}\n style={{ accentColor: tokens.colors.interactive.default }}\n />\n ASCII\n </label>\n <div style={{ flex: 1 }} />\n {selectStart >= 0 && selectEnd >= 0 && (\n <div style={{ display: 'flex', gap: 4 }}>\n {(['hex', 'decimal', 'ascii'] as const).map(fmt => (\n <button\n key={fmt}\n onClick={() => copySelection(fmt)}\n style={{\n background: tokens.colors.background.base,\n color: tokens.colors.text.secondary,\n border: `1px solid ${tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.md, padding: '2px 8px', fontSize: 10,\n cursor: 'pointer',\n }}\n >\n Copy {fmt}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* Search bar */}\n {showSearch && (\n <div role=\"search\" style={{\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n display: 'flex',\n alignItems: 'center',\n gap: tokens.spacing.sm,\n }}>\n <label\n htmlFor=\"hex-search-type\"\n style={{ position: 'absolute', width: 1, height: 1, padding: 0, margin: -1, overflow: 'hidden', clip: 'rect(0, 0, 0, 0)', border: 0 }}\n >\n Search type\n </label>\n <select\n id=\"hex-search-type\"\n value={searchType}\n onChange={e => setSearchType(e.target.value as 'hex' | 'ascii')}\n style={{\n background: tokens.colors.background.base,\n color: tokens.colors.text.primary,\n border: `1px solid ${tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.md, padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`, fontSize: tokens.typography.fontSize.sm,\n }}\n >\n <option value=\"hex\">Hex</option>\n <option value=\"ascii\">ASCII</option>\n </select>\n <input\n type=\"text\"\n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter') doSearch(); }}\n placeholder={searchType === 'hex' ? 'e.g. 48 65 6C 6C 6F' : 'Search ASCII...'}\n aria-label=\"Search hex data\"\n style={{\n flex: 1,\n background: tokens.colors.background.base,\n color: tokens.colors.text.primary,\n border: `1px solid ${tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.md, padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`, fontSize: tokens.typography.fontSize.sm,\n outline: 'none',\n fontFamily: 'inherit',\n }}\n />\n <button onClick={doSearch} aria-label=\"Find matches\" style={{\n background: tokens.colors.interactive.default,\n color: tokens.colors.text.inverse, border: 'none', borderRadius: tokens.borderRadius.md,\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`, fontSize: tokens.typography.fontSize.sm, cursor: 'pointer',\n fontWeight: tokens.typography.fontWeight.medium,\n }}>\n Find\n </button>\n {searchResults.length > 0 && (\n <>\n <span style={{ fontSize: tokens.typography.fontSize.sm, color: tokens.colors.text.muted }} aria-live=\"polite\">\n {currentSearchIdx + 1}/{searchResults.length}\n </span>\n <button onClick={prevSearchResult} aria-label=\"Previous match\" style={{ background: 'none', border: 'none', color: tokens.colors.text.secondary, cursor: 'pointer', fontSize: tokens.typography.fontSize.base, padding: tokens.spacing.xs }}>&#x25B2;</button>\n <button onClick={nextSearchResult} aria-label=\"Next match\" style={{ background: 'none', border: 'none', color: tokens.colors.text.secondary, cursor: 'pointer', fontSize: tokens.typography.fontSize.base, padding: tokens.spacing.xs }}>&#x25BC;</button>\n </>\n )}\n </div>\n )}\n </div>{/* end sticky header */}\n\n {/* Packet Header Summary (collapsible) */}\n {shouldShowHeaderSummary && packetHeaders && packetHeaders.length > 0 && (\n <div style={{ flexShrink: 0 }}>\n <div\n role=\"button\"\n tabIndex={0}\n aria-expanded={showHeaders}\n aria-label=\"Toggle packet headers\"\n onClick={() => setShowHeaders(!showHeaders)}\n onKeyDown={e => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setShowHeaders(!showHeaders); } }}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: tokens.spacing.sm,\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\n background: tokens.colors.background.surface,\n cursor: 'pointer',\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n userSelect: 'none',\n }}\n >\n <span aria-hidden=\"true\" style={{ fontSize: tokens.typography.fontSize.micro, color: tokens.colors.text.muted, transition: 'transform 150ms ease', transform: showHeaders ? 'rotate(0deg)' : 'rotate(-90deg)' }}>\n {'\\u25BC'}\n </span>\n <span style={{ fontSize: tokens.typography.fontSize.sm, color: tokens.colors.text.secondary, fontWeight: tokens.typography.fontWeight.medium }}>\n Packet Headers\n </span>\n </div>\n {showHeaders && (\n <div style={{\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n background: tokens.colors.background.base,\n }}>\n <div style={{\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n gap: `${tokens.spacing.xxs} ${tokens.spacing.md}`,\n fontSize: tokens.typography.fontSize.sm,\n lineHeight: tokens.typography.lineHeight.tight,\n }}>\n {packetHeaders.map((entry, i) => (\n <React.Fragment key={i}>\n <span style={{ color: tokens.colors.text.muted }}>{entry.label}</span>\n <span style={{\n color: tokens.colors.text.primary,\n fontWeight: tokens.typography.fontWeight.medium,\n fontFamily: entry.mono ? tokens.typography.fontFamily.mono : 'inherit',\n }}>\n {entry.value}\n </span>\n </React.Fragment>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Decoded Fields Table (collapsible) */}\n {shouldShowFieldsTable && decodedFields && decodedFields.length > 0 && (\n <div style={{ flexShrink: 0 }}>\n <div\n role=\"button\"\n tabIndex={0}\n aria-expanded={showFields}\n aria-label=\"Toggle decoded fields\"\n onClick={() => setShowFields(!showFields)}\n onKeyDown={e => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setShowFields(!showFields); } }}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: tokens.spacing.sm,\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\n background: tokens.colors.background.surface,\n cursor: 'pointer',\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n userSelect: 'none',\n }}\n >\n <span aria-hidden=\"true\" style={{ fontSize: tokens.typography.fontSize.micro, color: tokens.colors.text.muted, transition: 'transform 150ms ease', transform: showFields ? 'rotate(0deg)' : 'rotate(-90deg)' }}>\n {'\\u25BC'}\n </span>\n <span style={{ fontSize: tokens.typography.fontSize.sm, color: tokens.colors.text.secondary, fontWeight: tokens.typography.fontWeight.medium }}>\n Decoded Fields ({decodedFields.length})\n </span>\n </div>\n {showFields && (\n <div\n role=\"table\"\n aria-label=\"Decoded packet fields\"\n style={{\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n maxHeight: decodedFieldsMaxHeight,\n overflowY: 'auto',\n }}\n >\n {/* Fields table header */}\n <div role=\"row\" style={{\n display: 'flex',\n alignItems: 'center',\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n gap: tokens.spacing.sm,\n position: 'sticky',\n top: 0,\n background: tokens.colors.background.surface,\n zIndex: 1,\n }}>\n <span role=\"columnheader\" style={{ flex: 2, fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.text.muted, textTransform: 'uppercase', letterSpacing: '0.5px' }}>Field</span>\n <span role=\"columnheader\" style={{ flex: 2, fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.text.muted, textTransform: 'uppercase', letterSpacing: '0.5px', textAlign: 'right' }}>Value</span>\n <span role=\"columnheader\" style={{ flex: 1, fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.text.muted, textTransform: 'uppercase', letterSpacing: '0.5px', textAlign: 'right' }}>Unit</span>\n <span role=\"columnheader\" style={{ flex: 1, fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.text.muted, textTransform: 'uppercase', letterSpacing: '0.5px', textAlign: 'right' }}>Offset</span>\n <span role=\"columnheader\" style={{ flex: 1, fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.text.muted, textTransform: 'uppercase', letterSpacing: '0.5px', textAlign: 'right' }}>Size</span>\n </div>\n {/* Field rows */}\n {decodedFields.map((field, fi) => {\n const isHovered = hoveredFieldIdx === fi;\n return (\n <div\n key={fi}\n onMouseEnter={() => handleFieldHover(fi)}\n onMouseLeave={handleFieldLeave}\n title={field.description}\n style={{\n display: 'flex',\n alignItems: 'center',\n padding: `3px ${tokens.spacing.smd}`,\n gap: tokens.spacing.sm,\n background: isHovered\n ? `${tokens.colors.status.caution}14`\n : (fi % 2 === 0 ? tokens.colors.background.base : 'transparent'),\n transition: 'background 0.15s ease',\n cursor: 'default',\n minHeight: tokens.elementSize.sm,\n }}\n >\n <span role=\"cell\" style={{\n flex: 2, fontSize: tokens.typography.fontSize.sm, color: tokens.colors.text.secondary,\n overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap',\n }}>\n {field.name}\n </span>\n <span role=\"cell\" style={{\n flex: 2, fontSize: tokens.typography.fontSize.sm, color: tokens.colors.text.primary,\n fontWeight: tokens.typography.fontWeight.medium,\n fontFamily: tokens.typography.fontFamily.mono, textAlign: 'right',\n }}>\n {field.value === null || field.value === undefined ? '\\u2014' : String(field.value)}\n </span>\n <span role=\"cell\" style={{\n flex: 1, fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.text.muted, textAlign: 'right',\n }}>\n {field.unit || ''}\n </span>\n <span role=\"cell\" style={{\n flex: 1, fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.text.muted, textAlign: 'right',\n fontFamily: tokens.typography.fontFamily.mono,\n }}>\n {field.byteOffset !== undefined ? field.byteOffset : ''}\n </span>\n <span role=\"cell\" style={{\n flex: 1, fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.text.muted, textAlign: 'right',\n fontFamily: tokens.typography.fontFamily.mono,\n }}>\n {field.sizeBits ? `${field.sizeBits}b` : ''}\n </span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n )}\n\n {/* Region legend */}\n {regions.length > 0 && (\n <div\n role=\"group\"\n aria-label=\"Packet structure regions\"\n style={{\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n display: 'flex',\n alignItems: 'center',\n gap: tokens.spacing.smd,\n flexWrap: 'wrap',\n fontSize: tokens.typography.fontSize.xxs,\n background: tokens.colors.background.surface,\n }}\n >\n {regions.map((r, i) => (\n <span key={i} style={{ display: 'inline-flex', alignItems: 'center', gap: tokens.spacing.xs }}>\n <span aria-hidden=\"true\" style={{\n display: 'inline-block',\n width: 10, height: 10,\n borderRadius: tokens.borderRadius.sm,\n background: r.color,\n border: `1px solid ${r.borderColor || 'transparent'}`,\n }} />\n <span style={{ color: tokens.colors.text.muted }}>\n {r.label} ({r.end - r.start}B)\n </span>\n </span>\n ))}\n </div>\n )}\n\n {/* Column headers */}\n <div role=\"row\" aria-label=\"Column headers\" style={{\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n display: 'flex',\n alignItems: 'center',\n fontSize: tokens.typography.fontSize.xxs,\n color: tokens.colors.text.muted,\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n fontWeight: tokens.typography.fontWeight.medium,\n background: tokens.colors.background.surface,\n }}>\n {showOffset && <span style={{ marginRight: tokens.spacing.smd, minWidth: 60, textAlign: 'right' }}>Offset</span>}\n <span style={{ flex: 1 }}>Hex</span>\n {localShowAscii && (\n <>\n <span aria-hidden=\"true\" style={{ color: `${tokens.colors.border.muted}`, marginRight: tokens.spacing.sm }}>|</span>\n <span>ASCII</span>\n </>\n )}\n </div>\n\n {/* Hex content */}\n <div\n ref={scrollRef}\n role=\"grid\"\n aria-label=\"Hex data\"\n tabIndex={0}\n onScroll={handleHexScroll}\n style={{\n flex: '1 1 160px',\n minHeight: 160,\n overflow: 'auto',\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,\n }}\n >\n <div style={{ height: totalRows * HEX_ROW_HEIGHT, position: 'relative' }}>\n <div style={{ position: 'absolute', top: startRow * HEX_ROW_HEIGHT, left: 0, right: 0 }}>\n {virtualRows.map(row => (\n <HexRow\n key={row.offset}\n offset={row.offset}\n bytes={row.bytes}\n bytesPerRow={localBytesPerRow}\n byteGrouping={localGrouping}\n offsetBase={localOffsetBase}\n totalBytes={data.length}\n showAscii={localShowAscii}\n showOffset={showOffset}\n highlights={allHighlights}\n regions={sortedRegions}\n effectiveHighlight={effectiveHighlight}\n selectedStart={selectStart}\n selectedEnd={selectEnd}\n cursorOffset={cursorOffset}\n onByteMouseDown={handleByteMouseDown}\n onByteMouseEnter={handleByteMouseEnter}\n onByteClick={handleByteClickCb}\n handleByteHoverInternal={handleByteHoverInternal}\n handleByteLeaveInternal={handleByteLeaveInternal}\n tokens={tokens}\n />\n ))}\n </div>\n </div>\n </div>\n\n {/* Highlight legend */}\n {highlights.length > 0 && (\n <div role=\"group\" aria-label=\"Search highlights\" style={{\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,\n borderTop: `1px solid ${tokens.colors.border.muted}`,\n display: 'flex',\n alignItems: 'center',\n gap: tokens.spacing.smd,\n flexWrap: 'wrap',\n fontSize: tokens.typography.fontSize.xxs,\n background: tokens.colors.background.surface,\n }}>\n {highlights.filter(h => h.label).map((h, i) => (\n <span key={i} style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.xs }}>\n <span aria-hidden=\"true\" style={{ width: 10, height: 10, borderRadius: tokens.borderRadius.sm, background: h.color, display: 'inline-block' }} />\n <span style={{ color: tokens.colors.text.muted }}>\n {h.label} (0x{h.start.toString(16)}-0x{h.end.toString(16)})\n </span>\n </span>\n ))}\n </div>\n )}\n\n {/* Status bar */}\n {showStatusBar && (\n <div role=\"status\" aria-live=\"polite\" style={{\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\n borderTop: `1px solid ${tokens.colors.border.muted}`,\n display: 'flex',\n alignItems: 'center',\n gap: tokens.spacing.md,\n fontSize: tokens.typography.fontSize.sm,\n background: tokens.colors.background.surface,\n color: tokens.colors.text.muted,\n flexWrap: 'wrap',\n }}>\n <span>Size: {data.length.toLocaleString()} bytes</span>\n {cursorOffset >= 0 && cursorOffset < data.length && (\n <>\n <span>\n Offset: 0x{cursorOffset.toString(16).toUpperCase()} ({cursorOffset})\n </span>\n <span>\n Value: 0x{byteToHex(data[cursorOffset])} ({data[cursorOffset]})\n </span>\n </>\n )}\n {selectStart >= 0 && selectEnd >= 0 && selectStart !== selectEnd && (\n <span>\n Selection: {Math.abs(selectEnd - selectStart) + 1} bytes\n (0x{Math.min(selectStart, selectEnd).toString(16).toUpperCase()}-0x{Math.max(selectStart, selectEnd).toString(16).toUpperCase()})\n </span>\n )}\n {interpretation && (\n <span style={{ display: 'flex', gap: tokens.spacing.sm, color: tokens.colors.text.secondary }}>\n <span>U8: {interpretation.u8}</span>\n <span>I8: {interpretation.i8}</span>\n {interpretation.u16 !== undefined && <span>U16: {interpretation.u16}</span>}\n {interpretation.u32 !== undefined && <span>U32: {interpretation.u32}</span>}\n {interpretation.f32 !== undefined && <span>F32: {interpretation.f32.toFixed(6)}</span>}\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default HexViewer;\n"],"names":["width","HexRow"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { default as React } from 'react';
2
+ import { StatusLevel } from '../utils';
3
+
4
+ export type IconName = 'satellite' | 'satellite-transmit' | 'satellite-receive' | 'satellite-off' | 'antenna' | 'antenna-transmit' | 'antenna-receive' | 'antenna-off' | 'mission' | 'altitude' | 'solar' | 'thermal' | 'propulsion' | 'payload' | 'processor' | 'equipment' | 'netcom' | 'hardware' | 'orbit' | 'ground-station' | 'battery' | 'location' | 'rocket' | 'thermometer' | 'settings' | 'notifications' | 'notifications-off' | 'warning' | 'error' | 'info' | 'check' | 'close' | 'add' | 'remove' | 'edit' | 'delete' | 'search' | 'filter' | 'refresh' | 'sync' | 'download' | 'upload' | 'expand' | 'collapse' | 'fullscreen' | 'fullscreen-exit' | 'visibility' | 'visibility-off' | 'lock' | 'unlock' | 'arrow-up' | 'arrow-down' | 'arrow-left' | 'arrow-right' | 'chevron-up' | 'chevron-down' | 'chevron-left' | 'chevron-right' | 'menu' | 'more-vert' | 'more-horiz' | 'chart' | 'list' | 'grid' | 'timeline' | 'calendar' | 'clock' | 'play' | 'pause' | 'stop' | 'record' | 'link' | 'link-off' | 'send' | 'message' | 'mail';
5
+ export interface IconProps {
6
+ /** Icon name from the library */
7
+ name: IconName;
8
+ /** Icon size in pixels (default: 24) */
9
+ size?: number;
10
+ /** Status-based coloring (uses Astro status colors) */
11
+ status?: StatusLevel;
12
+ /** Custom color (overrides status) */
13
+ color?: string;
14
+ /** Custom className */
15
+ className?: string;
16
+ /** Accessibility label */
17
+ 'aria-label'?: string;
18
+ /** Click handler */
19
+ onClick?: () => void;
20
+ /** Custom style */
21
+ style?: React.CSSProperties;
22
+ }
23
+ export declare const Icon: React.NamedExoticComponent<IconProps>;
24
+ /**
25
+ * Get all available icon names
26
+ */
27
+ export declare function getIconNames(): IconName[];
28
+ /**
29
+ * Check if an icon name exists
30
+ */
31
+ export declare function isValidIconName(name: string): name is IconName;
32
+ export default Icon;
@@ -0,0 +1,142 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { memo } from "react";
3
+ import { useTheme } from "../theme/ThemeProvider.js";
4
+ const ICON_PATHS = {
5
+ // === Astro Space/Mission Icons ===
6
+ satellite: "M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14zm-7-2h2v-4h4v-2h-4V7h-2v4H8v2h4v4z",
7
+ "satellite-transmit": "M6 6L1 11l5 5 1.41-1.41L4.83 12l2.58-2.59L6 6zm6-4l-3 7 3 3 3-3-3-7zm6 4l-1.41 1.41L19.17 10H6.83l2.58-2.59L8 6l-5 5 5 5 1.41-1.41L6.83 12h12.34l-2.58 2.59L18 16l5-5-5-5z",
8
+ "satellite-receive": "M18 6l-1.41 1.41L19.17 10H6.83l2.58-2.59L8 6l-5 5 5 5 1.41-1.41L6.83 12h12.34l-2.58 2.59L18 16l5-5-5-5z",
9
+ "satellite-off": "M1 21l5-5 1.41 1.41-5 5L1 21zm22-9l-5-5-1.41 1.41 5 5L23 12zm-9-9l-5 5 1.41 1.41 5-5L14 3z",
10
+ antenna: "M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0 4c-1.66 0-3 1.34-3 3h2c0-.55.45-1 1-1s1 .45 1 1h2c0-1.66-1.34-3-3-3zm0-8C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11zm0 18c-3.87 0-7-3.13-7-7H3c0 4.97 4.03 9 9 9s9-4.03 9-9h-2c0 3.87-3.13 7-7 7z",
11
+ "antenna-transmit": "M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0 4c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm0-8C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11z",
12
+ "antenna-receive": "M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0-4C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11zm0 18c-3.87 0-7-3.13-7-7H3c0 4.97 4.03 9 9 9s9-4.03 9-9h-2c0 3.87-3.13 7-7 7z",
13
+ "antenna-off": "M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zM2.81 2.81L1.39 4.22l2.69 2.69C2.78 8.6 2 10.2 2 12h2c0-1.26.52-2.4 1.35-3.23l1.42 1.42C5.71 11.04 5.17 12 5.17 12.88L5 13h2c0-.55.45-1 1-1 .23 0 .44.08.6.21l1.42 1.42c-.62.24-1.02.83-1.02 1.5 0 .83.67 1.5 1.5 1.5.67 0 1.26-.4 1.5-1.02l6.78 6.78 1.41-1.41L2.81 2.81zM12 1C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11z",
14
+ mission: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z",
15
+ altitude: "M12 2L4.5 20.29l.71.71L12 18l6.79 3 .71-.71L12 2z",
16
+ solar: "M20 18V6c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zM6 6h12v4H6V6zm0 6h4v6H6v-6zm6 6v-6h6v6h-6z",
17
+ thermal: "M15 13V5c0-1.66-1.34-3-3-3S9 3.34 9 5v8c-1.21.91-2 2.37-2 4 0 2.76 2.24 5 5 5s5-2.24 5-5c0-1.63-.79-3.09-2-4zm-4-8c0-.55.45-1 1-1s1 .45 1 1h-1v1h1v2h-1v1h1v2h-2V5z",
18
+ propulsion: "M13 3h-2v10h2V3zm4.83 2.17l-1.42 1.42A6.92 6.92 0 0119 12c0 3.87-3.13 7-7 7s-7-3.13-7-7c0-2.53 1.37-4.77 3.4-6l-1.42-1.42A8.962 8.962 0 003 12c0 4.97 4.03 9 9 9s9-4.03 9-9a8.96 8.96 0 00-4.17-7.83z",
19
+ payload: "M17 3H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H7V5h10v14zm-5-7c1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3 1.34 3 3 3z",
20
+ processor: "M22 9V7h-2V5c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v2H2v2h2v2H2v2h2v2H2v2h2v2c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-2h2v-2h-2v-2h2v-2h-2V9h2zm-4 10H6V5h12v14zm-5-7h-2V8h2v4zm0 6h-2v-4h2v4z",
21
+ equipment: "M22 9V7h-2V5c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-2h2v-2h-2v-2h2v-2h-2V9h2zm-4 10H4V5h14v14zM6 13h5v4H6v-4zm6-6h4v3h-4V7zM6 7h5v5H6V7zm6 4h4v6h-4v-6z",
22
+ netcom: "M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1z",
23
+ hardware: "M17 3H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H7V5h10v14zm-3-8h-4v2h4v-2z",
24
+ orbit: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm0 10c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z",
25
+ "ground-station": "M12 3L2 12h3v8h6v-6h2v6h6v-8h3L12 3zm0 11.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z",
26
+ battery: "M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v15.33C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V5.33C17 4.6 16.4 4 15.67 4zM11 20v-5.5H9L13 7v5.5h2L11 20z",
27
+ location: "M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z",
28
+ rocket: "M12 2c0 0-6.5 5-6.5 12 0 2.5.5 4 1 5.5l5.5-3 5.5 3c.5-1.5 1-3 1-5.5C18.5 7 12 2 12 2zm0 13c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM7 22l1.5-1.5L10 22l2-2 2 2 1.5-1.5L17 22l-2.5-2.5-2.5 2.5-2.5-2.5L7 22z",
29
+ thermometer: "M15 13V5c0-1.66-1.34-3-3-3S9 3.34 9 5v8c-1.21.91-2 2.37-2 4 0 2.76 2.24 5 5 5s5-2.24 5-5c0-1.63-.79-3.09-2-4zm-4-8c0-.55.45-1 1-1s1 .45 1 1h-1v1h1v2h-1v1h1v2h-2V5z",
30
+ // === System Icons ===
31
+ settings: "M19.14 12.94c.04-.31.06-.63.06-.94 0-.31-.02-.63-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.04.31-.06.63-.06.94s.02.63.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z",
32
+ notifications: "M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z",
33
+ "notifications-off": "M20 18.69L7.84 6.14 5.27 3.49 4 4.76l2.8 2.8v.01c-.52.99-.8 2.16-.8 3.42v5l-2 2v1h13.73l2 2L21 19.72l-1-1.03zM12 22c1.11 0 2-.89 2-2h-4c0 1.11.89 2 2 2zm6-7.32V11c0-3.08-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-.15.03-.29.08-.42.12-.1.03-.2.07-.3.11h-.01c-.01 0-.01 0-.02.01-.23.09-.46.2-.68.31 0 0-.01 0-.01.01L18 14.68z",
34
+ warning: "M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z",
35
+ error: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z",
36
+ info: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z",
37
+ check: "M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z",
38
+ close: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z",
39
+ add: "M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z",
40
+ remove: "M19 13H5v-2h14v2z",
41
+ edit: "M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z",
42
+ delete: "M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z",
43
+ search: "M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z",
44
+ filter: "M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z",
45
+ refresh: "M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z",
46
+ sync: "M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z",
47
+ download: "M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z",
48
+ upload: "M9 16h6v-6h4l-7-7-7 7h4v6zm-4 2h14v2H5v-2z",
49
+ expand: "M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z",
50
+ collapse: "M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z",
51
+ fullscreen: "M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z",
52
+ "fullscreen-exit": "M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z",
53
+ visibility: "M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z",
54
+ "visibility-off": "M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z",
55
+ lock: "M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z",
56
+ unlock: "M12 17c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6-9h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6h1.9c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm0 12H6V10h12v10z",
57
+ // === Navigation Icons ===
58
+ "arrow-up": "M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z",
59
+ "arrow-down": "M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z",
60
+ "arrow-left": "M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z",
61
+ "arrow-right": "M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8-8-8z",
62
+ "chevron-up": "M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z",
63
+ "chevron-down": "M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z",
64
+ "chevron-left": "M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z",
65
+ "chevron-right": "M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z",
66
+ menu: "M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z",
67
+ "more-vert": "M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z",
68
+ "more-horiz": "M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z",
69
+ // === Data Icons ===
70
+ chart: "M3.5 18.49l6-6.01 4 4L22 6.92l-1.41-1.41-7.09 7.97-4-4L2 16.99z",
71
+ list: "M3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7z",
72
+ grid: "M3 3h8v8H3V3zm0 10h8v8H3v-8zm10-10h8v8h-8V3zm0 10h8v8h-8v-8z",
73
+ timeline: "M23 8c0 1.1-.9 2-2 2-.18 0-.35-.02-.51-.07l-3.56 3.55c.05.16.07.34.07.52 0 1.1-.9 2-2 2s-2-.9-2-2c0-.18.02-.36.07-.52l-2.55-2.55c-.16.05-.34.07-.52.07s-.36-.02-.52-.07l-4.55 4.56c.05.16.07.33.07.51 0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2c.18 0 .35.02.51.07l4.56-4.55C8.02 9.36 8 9.18 8 9c0-1.1.9-2 2-2s2 .9 2 2c0 .18-.02.36-.07.52l2.55 2.55c.16-.05.34-.07.52-.07s.36.02.52.07l3.55-3.56C19.02 8.35 19 8.18 19 8c0-1.1.9-2 2-2s2 .9 2 2z",
74
+ calendar: "M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM9 10H7v2h2v-2zm4 0h-2v2h2v-2zm4 0h-2v2h2v-2z",
75
+ clock: "M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z",
76
+ play: "M8 5v14l11-7z",
77
+ pause: "M6 19h4V5H6v14zm8-14v14h4V5h-4z",
78
+ stop: "M6 6h12v12H6z",
79
+ record: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 14c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z",
80
+ // === Communication Icons ===
81
+ link: "M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z",
82
+ "link-off": "M17 7h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.43-.98 2.63-2.31 2.98l1.46 1.46C20.88 15.61 22 13.95 22 12c0-2.76-2.24-5-5-5zm-1 4h-2.19l2 2H16v-2zM2 4.27l3.11 3.11C3.29 8.12 2 9.91 2 12c0 2.76 2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1 0-1.59 1.21-2.9 2.76-3.07L8.73 11H8v2h2.73L13 15.27V17h1.73l4.01 4L20 19.74 3.27 3 2 4.27z",
83
+ send: "M2.01 21L23 12 2.01 3 2 10l15 2-15 2z",
84
+ message: "M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-2 12H6v-2h12v2zm0-3H6V9h12v2zm0-3H6V6h12v2z",
85
+ mail: "M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"
86
+ };
87
+ const Icon = memo(function Icon2({
88
+ name,
89
+ size = 24,
90
+ status,
91
+ color,
92
+ className = "",
93
+ "aria-label": ariaLabel,
94
+ onClick,
95
+ style
96
+ }) {
97
+ const { tokens } = useTheme();
98
+ const iconColor = color ?? (status ? tokens.colors.status[status] : tokens.colors.text.primary);
99
+ const pathData = ICON_PATHS[name];
100
+ const isInteractive = !!onClick;
101
+ return /* @__PURE__ */ jsx(
102
+ "svg",
103
+ {
104
+ xmlns: "http://www.w3.org/2000/svg",
105
+ width: size,
106
+ height: size,
107
+ viewBox: "0 0 24 24",
108
+ fill: iconColor,
109
+ className,
110
+ role: ariaLabel ? "img" : "presentation",
111
+ "aria-label": ariaLabel ?? name,
112
+ "aria-hidden": !ariaLabel,
113
+ onClick,
114
+ onKeyDown: onClick ? (e) => {
115
+ if (e.key === "Enter" || e.key === " ") {
116
+ e.preventDefault();
117
+ onClick();
118
+ }
119
+ } : void 0,
120
+ tabIndex: isInteractive ? 0 : void 0,
121
+ style: {
122
+ cursor: isInteractive ? "pointer" : "default",
123
+ flexShrink: 0,
124
+ transition: `fill ${tokens.animation.fast}`,
125
+ ...style
126
+ },
127
+ children: Array.isArray(pathData) ? pathData.map((d, i) => /* @__PURE__ */ jsx("path", { d }, i)) : /* @__PURE__ */ jsx("path", { d: pathData })
128
+ }
129
+ );
130
+ });
131
+ function getIconNames() {
132
+ return Object.keys(ICON_PATHS);
133
+ }
134
+ function isValidIconName(name) {
135
+ return name in ICON_PATHS;
136
+ }
137
+ export {
138
+ Icon,
139
+ getIconNames,
140
+ isValidIconName
141
+ };
142
+ //# sourceMappingURL=Icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Icon.js","sources":["../../../src/react/core/Icon.tsx"],"sourcesContent":["/**\n * @zendir/ui - Icon Component\n * \n * Complete icon library following Astro UX Design System.\n * \n * Astro UX Compliance (https://www.astrouxds.com/components/icons-and-symbols/):\n * - Consistent icon sizing\n * - Accessibility via aria-label\n * - Use with MonitoringIcon for status indication\n * \n * IMPORTANT per Astro UX Guidelines:\n * - Icons themselves should NOT change color based on status\n * - Status is communicated via a separate StatusIndicator/StatusSymbol\n * - Use MonitoringIcon component to combine icon + status + label\n * - The `status` prop is provided for convenience but should be used sparingly\n * \n * @example\n * ```tsx\n * // Standard usage - neutral color\n * <Icon name=\"satellite\" />\n * <Icon name=\"antenna\" size={32} />\n * \n * // Custom color (use sparingly)\n * <Icon name=\"thermal\" color=\"#4dacff\" />\n * \n * // For status indication, use MonitoringIcon instead:\n * <MonitoringIcon icon=\"antenna\" status=\"normal\" label=\"Antenna-1\" />\n * ```\n */\n\nimport React, { memo } from 'react';\nimport { useTheme } from '../theme';\nimport type { StatusLevel } from '../utils';\n\nexport type IconName =\n // Astro Space/Mission Icons\n | 'satellite'\n | 'satellite-transmit'\n | 'satellite-receive'\n | 'satellite-off'\n | 'antenna'\n | 'antenna-transmit'\n | 'antenna-receive'\n | 'antenna-off'\n | 'mission'\n | 'altitude'\n | 'solar'\n | 'thermal'\n | 'propulsion'\n | 'payload'\n | 'processor'\n | 'equipment'\n | 'netcom'\n | 'hardware'\n | 'orbit'\n | 'ground-station'\n | 'battery'\n | 'location'\n | 'rocket'\n | 'thermometer'\n // System Icons\n | 'settings'\n | 'notifications'\n | 'notifications-off'\n | 'warning'\n | 'error'\n | 'info'\n | 'check'\n | 'close'\n | 'add'\n | 'remove'\n | 'edit'\n | 'delete'\n | 'search'\n | 'filter'\n | 'refresh'\n | 'sync'\n | 'download'\n | 'upload'\n | 'expand'\n | 'collapse'\n | 'fullscreen'\n | 'fullscreen-exit'\n | 'visibility'\n | 'visibility-off'\n | 'lock'\n | 'unlock'\n // Navigation Icons\n | 'arrow-up'\n | 'arrow-down'\n | 'arrow-left'\n | 'arrow-right'\n | 'chevron-up'\n | 'chevron-down'\n | 'chevron-left'\n | 'chevron-right'\n | 'menu'\n | 'more-vert'\n | 'more-horiz'\n // Data Icons\n | 'chart'\n | 'list'\n | 'grid'\n | 'timeline'\n | 'calendar'\n | 'clock'\n | 'play'\n | 'pause'\n | 'stop'\n | 'record'\n // Communication Icons\n | 'link'\n | 'link-off'\n | 'send'\n | 'message'\n | 'mail';\n\nexport interface IconProps {\n /** Icon name from the library */\n name: IconName;\n /** Icon size in pixels (default: 24) */\n size?: number;\n /** Status-based coloring (uses Astro status colors) */\n status?: StatusLevel;\n /** Custom color (overrides status) */\n color?: string;\n /** Custom className */\n className?: string;\n /** Accessibility label */\n 'aria-label'?: string;\n /** Click handler */\n onClick?: () => void;\n /** Custom style */\n style?: React.CSSProperties;\n}\n\n/**\n * Complete Astro UX Icon Library\n * SVG paths for 24x24 viewBox\n */\nconst ICON_PATHS: Record<IconName, string | string[]> = {\n // === Astro Space/Mission Icons ===\n satellite: 'M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14zm-7-2h2v-4h4v-2h-4V7h-2v4H8v2h4v4z',\n 'satellite-transmit': 'M6 6L1 11l5 5 1.41-1.41L4.83 12l2.58-2.59L6 6zm6-4l-3 7 3 3 3-3-3-7zm6 4l-1.41 1.41L19.17 10H6.83l2.58-2.59L8 6l-5 5 5 5 1.41-1.41L6.83 12h12.34l-2.58 2.59L18 16l5-5-5-5z',\n 'satellite-receive': 'M18 6l-1.41 1.41L19.17 10H6.83l2.58-2.59L8 6l-5 5 5 5 1.41-1.41L6.83 12h12.34l-2.58 2.59L18 16l5-5-5-5z',\n 'satellite-off': 'M1 21l5-5 1.41 1.41-5 5L1 21zm22-9l-5-5-1.41 1.41 5 5L23 12zm-9-9l-5 5 1.41 1.41 5-5L14 3z',\n antenna: 'M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0 4c-1.66 0-3 1.34-3 3h2c0-.55.45-1 1-1s1 .45 1 1h2c0-1.66-1.34-3-3-3zm0-8C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11zm0 18c-3.87 0-7-3.13-7-7H3c0 4.97 4.03 9 9 9s9-4.03 9-9h-2c0 3.87-3.13 7-7 7z',\n 'antenna-transmit': 'M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0 4c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm0-8C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11z',\n 'antenna-receive': 'M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0-4C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11zm0 18c-3.87 0-7-3.13-7-7H3c0 4.97 4.03 9 9 9s9-4.03 9-9h-2c0 3.87-3.13 7-7 7z',\n 'antenna-off': 'M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zM2.81 2.81L1.39 4.22l2.69 2.69C2.78 8.6 2 10.2 2 12h2c0-1.26.52-2.4 1.35-3.23l1.42 1.42C5.71 11.04 5.17 12 5.17 12.88L5 13h2c0-.55.45-1 1-1 .23 0 .44.08.6.21l1.42 1.42c-.62.24-1.02.83-1.02 1.5 0 .83.67 1.5 1.5 1.5.67 0 1.26-.4 1.5-1.02l6.78 6.78 1.41-1.41L2.81 2.81zM12 1C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11z',\n mission: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z',\n altitude: 'M12 2L4.5 20.29l.71.71L12 18l6.79 3 .71-.71L12 2z',\n solar: 'M20 18V6c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zM6 6h12v4H6V6zm0 6h4v6H6v-6zm6 6v-6h6v6h-6z',\n thermal: 'M15 13V5c0-1.66-1.34-3-3-3S9 3.34 9 5v8c-1.21.91-2 2.37-2 4 0 2.76 2.24 5 5 5s5-2.24 5-5c0-1.63-.79-3.09-2-4zm-4-8c0-.55.45-1 1-1s1 .45 1 1h-1v1h1v2h-1v1h1v2h-2V5z',\n propulsion: 'M13 3h-2v10h2V3zm4.83 2.17l-1.42 1.42A6.92 6.92 0 0119 12c0 3.87-3.13 7-7 7s-7-3.13-7-7c0-2.53 1.37-4.77 3.4-6l-1.42-1.42A8.962 8.962 0 003 12c0 4.97 4.03 9 9 9s9-4.03 9-9a8.96 8.96 0 00-4.17-7.83z',\n payload: 'M17 3H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H7V5h10v14zm-5-7c1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3 1.34 3 3 3z',\n processor: 'M22 9V7h-2V5c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v2H2v2h2v2H2v2h2v2H2v2h2v2c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-2h2v-2h-2v-2h2v-2h-2V9h2zm-4 10H6V5h12v14zm-5-7h-2V8h2v4zm0 6h-2v-4h2v4z',\n equipment: 'M22 9V7h-2V5c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-2h2v-2h-2v-2h2v-2h-2V9h2zm-4 10H4V5h14v14zM6 13h5v4H6v-4zm6-6h4v3h-4V7zM6 7h5v5H6V7zm6 4h4v6h-4v-6z',\n netcom: 'M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1z',\n hardware: 'M17 3H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H7V5h10v14zm-3-8h-4v2h4v-2z',\n orbit: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm0 10c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z',\n 'ground-station': 'M12 3L2 12h3v8h6v-6h2v6h6v-8h3L12 3zm0 11.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z',\n battery: 'M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v15.33C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V5.33C17 4.6 16.4 4 15.67 4zM11 20v-5.5H9L13 7v5.5h2L11 20z',\n location: 'M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z',\n rocket: 'M12 2c0 0-6.5 5-6.5 12 0 2.5.5 4 1 5.5l5.5-3 5.5 3c.5-1.5 1-3 1-5.5C18.5 7 12 2 12 2zm0 13c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM7 22l1.5-1.5L10 22l2-2 2 2 1.5-1.5L17 22l-2.5-2.5-2.5 2.5-2.5-2.5L7 22z',\n thermometer: 'M15 13V5c0-1.66-1.34-3-3-3S9 3.34 9 5v8c-1.21.91-2 2.37-2 4 0 2.76 2.24 5 5 5s5-2.24 5-5c0-1.63-.79-3.09-2-4zm-4-8c0-.55.45-1 1-1s1 .45 1 1h-1v1h1v2h-1v1h1v2h-2V5z',\n \n // === System Icons ===\n settings: 'M19.14 12.94c.04-.31.06-.63.06-.94 0-.31-.02-.63-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.04.31-.06.63-.06.94s.02.63.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z',\n notifications: 'M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z',\n 'notifications-off': 'M20 18.69L7.84 6.14 5.27 3.49 4 4.76l2.8 2.8v.01c-.52.99-.8 2.16-.8 3.42v5l-2 2v1h13.73l2 2L21 19.72l-1-1.03zM12 22c1.11 0 2-.89 2-2h-4c0 1.11.89 2 2 2zm6-7.32V11c0-3.08-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-.15.03-.29.08-.42.12-.1.03-.2.07-.3.11h-.01c-.01 0-.01 0-.02.01-.23.09-.46.2-.68.31 0 0-.01 0-.01.01L18 14.68z',\n warning: 'M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z',\n error: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z',\n info: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z',\n check: 'M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z',\n close: 'M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z',\n add: 'M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z',\n remove: 'M19 13H5v-2h14v2z',\n edit: 'M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z',\n delete: 'M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z',\n search: 'M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z',\n filter: 'M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z',\n refresh: 'M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z',\n sync: 'M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z',\n download: 'M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z',\n upload: 'M9 16h6v-6h4l-7-7-7 7h4v6zm-4 2h14v2H5v-2z',\n expand: 'M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z',\n collapse: 'M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z',\n fullscreen: 'M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z',\n 'fullscreen-exit': 'M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z',\n visibility: 'M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z',\n 'visibility-off': 'M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z',\n lock: 'M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z',\n unlock: 'M12 17c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6-9h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6h1.9c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm0 12H6V10h12v10z',\n \n // === Navigation Icons ===\n 'arrow-up': 'M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z',\n 'arrow-down': 'M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z',\n 'arrow-left': 'M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z',\n 'arrow-right': 'M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8-8-8z',\n 'chevron-up': 'M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z',\n 'chevron-down': 'M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z',\n 'chevron-left': 'M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z',\n 'chevron-right': 'M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z',\n menu: 'M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z',\n 'more-vert': 'M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z',\n 'more-horiz': 'M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z',\n \n // === Data Icons ===\n chart: 'M3.5 18.49l6-6.01 4 4L22 6.92l-1.41-1.41-7.09 7.97-4-4L2 16.99z',\n list: 'M3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7z',\n grid: 'M3 3h8v8H3V3zm0 10h8v8H3v-8zm10-10h8v8h-8V3zm0 10h8v8h-8v-8z',\n timeline: 'M23 8c0 1.1-.9 2-2 2-.18 0-.35-.02-.51-.07l-3.56 3.55c.05.16.07.34.07.52 0 1.1-.9 2-2 2s-2-.9-2-2c0-.18.02-.36.07-.52l-2.55-2.55c-.16.05-.34.07-.52.07s-.36-.02-.52-.07l-4.55 4.56c.05.16.07.33.07.51 0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2c.18 0 .35.02.51.07l4.56-4.55C8.02 9.36 8 9.18 8 9c0-1.1.9-2 2-2s2 .9 2 2c0 .18-.02.36-.07.52l2.55 2.55c.16-.05.34-.07.52-.07s.36.02.52.07l3.55-3.56C19.02 8.35 19 8.18 19 8c0-1.1.9-2 2-2s2 .9 2 2z',\n calendar: 'M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM9 10H7v2h2v-2zm4 0h-2v2h2v-2zm4 0h-2v2h2v-2z',\n clock: 'M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z',\n play: 'M8 5v14l11-7z',\n pause: 'M6 19h4V5H6v14zm8-14v14h4V5h-4z',\n stop: 'M6 6h12v12H6z',\n record: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 14c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z',\n \n // === Communication Icons ===\n link: 'M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z',\n 'link-off': 'M17 7h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.43-.98 2.63-2.31 2.98l1.46 1.46C20.88 15.61 22 13.95 22 12c0-2.76-2.24-5-5-5zm-1 4h-2.19l2 2H16v-2zM2 4.27l3.11 3.11C3.29 8.12 2 9.91 2 12c0 2.76 2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1 0-1.59 1.21-2.9 2.76-3.07L8.73 11H8v2h2.73L13 15.27V17h1.73l4.01 4L20 19.74 3.27 3 2 4.27z',\n send: 'M2.01 21L23 12 2.01 3 2 10l15 2-15 2z',\n message: 'M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-2 12H6v-2h12v2zm0-3H6V9h12v2zm0-3H6V6h12v2z',\n mail: 'M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z',\n};\n\nexport const Icon = memo(function Icon({\n name,\n size = 24,\n status,\n color,\n className = '',\n 'aria-label': ariaLabel,\n onClick,\n style,\n}: IconProps): React.ReactElement {\n const { tokens } = useTheme();\n \n // Determine color: custom > status > default\n const iconColor = color \n ?? (status ? tokens.colors.status[status] : tokens.colors.text.primary);\n \n const pathData = ICON_PATHS[name];\n const isInteractive = !!onClick;\n \n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={iconColor}\n className={className}\n role={ariaLabel ? 'img' : 'presentation'}\n aria-label={ariaLabel ?? name}\n aria-hidden={!ariaLabel}\n onClick={onClick}\n onKeyDown={onClick ? (e: React.KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onClick(); } } : undefined}\n tabIndex={isInteractive ? 0 : undefined}\n style={{\n cursor: isInteractive ? 'pointer' : 'default',\n flexShrink: 0,\n transition: `fill ${tokens.animation.fast}`,\n ...style,\n }}\n >\n {Array.isArray(pathData) ? (\n pathData.map((d, i) => <path key={i} d={d} />)\n ) : (\n <path d={pathData} />\n )}\n </svg>\n );\n});\n\n/**\n * Get all available icon names\n */\nexport function getIconNames(): IconName[] {\n return Object.keys(ICON_PATHS) as IconName[];\n}\n\n/**\n * Check if an icon name exists\n */\nexport function isValidIconName(name: string): name is IconName {\n return name in ICON_PATHS;\n}\n\nexport default Icon;\n"],"names":["Icon"],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { default as React } from 'react';
2
+ import { ResponsiveValue } from './layout/useBreakpoint';
3
+
4
+ export interface GalleryImage {
5
+ /** Unique identifier */
6
+ id: string;
7
+ /** Display name */
8
+ name: string;
9
+ /** Image source URL or data URL */
10
+ src: string;
11
+ /** Timestamp (ms since epoch) */
12
+ timestamp?: number;
13
+ /** Optional metadata */
14
+ metadata?: Record<string, unknown>;
15
+ }
16
+ export interface ImageGalleryProps {
17
+ /** Array of images */
18
+ images: GalleryImage[];
19
+ /** Number of columns (responsive) */
20
+ columns?: ResponsiveValue<number>;
21
+ /** Images per page (0 = no pagination) */
22
+ pageSize?: number;
23
+ /** Download handler */
24
+ onDownload?: (image: GalleryImage) => void;
25
+ /** Delete handler (shows delete button when provided) */
26
+ onDelete?: (image: GalleryImage) => void;
27
+ /** Click handler */
28
+ onClick?: (image: GalleryImage) => void;
29
+ /** Show lightbox on click (default true) */
30
+ lightbox?: boolean;
31
+ /** Thumbnail height */
32
+ thumbnailHeight?: number;
33
+ /** Empty state message */
34
+ emptyMessage?: string;
35
+ /** New image badge count (shows badge on component) */
36
+ newCount?: number;
37
+ /** Custom style */
38
+ style?: React.CSSProperties;
39
+ }
40
+ export declare const ImageGallery: React.NamedExoticComponent<ImageGalleryProps>;
41
+ export default ImageGallery;