@zendir/ui 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/CHANGELOG.md +419 -386
  2. package/README.md +640 -631
  3. package/dist/_virtual/_rolldown/runtime.js +13 -0
  4. package/dist/index.js +17 -221
  5. package/dist/react/3d/CesiumCaptureSource.d.ts +0 -1
  6. package/dist/react/3d/CesiumCaptureSource.js +364 -283
  7. package/dist/react/3d/CesiumCaptureSource.js.map +1 -1
  8. package/dist/react/3d/ZenSpace3D.d.ts +2 -3
  9. package/dist/react/3d/ZenSpace3D.js +1681 -1237
  10. package/dist/react/3d/ZenSpace3D.js.map +1 -1
  11. package/dist/react/3d/ZenSpace3DCesium.d.ts +0 -1
  12. package/dist/react/3d/ZenSpace3DCesium.js +513 -560
  13. package/dist/react/3d/ZenSpace3DCesium.js.map +1 -1
  14. package/dist/react/3d/ZenSpace3DShaders.js +61 -66
  15. package/dist/react/3d/ZenSpace3DShaders.js.map +1 -1
  16. package/dist/react/3d/ZenSpace3DTypes.d.ts +19 -20
  17. package/dist/react/3d/ZenSpace3DUtils.d.ts +0 -1
  18. package/dist/react/3d/ZenSpace3DUtils.js +37 -24
  19. package/dist/react/3d/ZenSpace3DUtils.js.map +1 -1
  20. package/dist/react/3d/capturePngAnalysis.js +42 -36
  21. package/dist/react/3d/capturePngAnalysis.js.map +1 -1
  22. package/dist/react/3d/index.d.ts +3 -3
  23. package/dist/react/3d/index.js +5 -53
  24. package/dist/react/3d/threeLoader.d.ts +1 -1
  25. package/dist/react/3d/threeLoader.js +23 -18
  26. package/dist/react/3d/threeLoader.js.map +1 -1
  27. package/dist/react/astro/ClassificationBanner.d.ts +2 -3
  28. package/dist/react/astro/ClassificationBanner.js +95 -79
  29. package/dist/react/astro/ClassificationBanner.js.map +1 -1
  30. package/dist/react/astro/GlobalStatusBar.d.ts +0 -1
  31. package/dist/react/astro/GlobalStatusBar.js +157 -163
  32. package/dist/react/astro/GlobalStatusBar.js.map +1 -1
  33. package/dist/react/astro/MissionClock.d.ts +7 -8
  34. package/dist/react/astro/MissionClock.js +377 -400
  35. package/dist/react/astro/MissionClock.js.map +1 -1
  36. package/dist/react/astro/MonitoringIcon.d.ts +1 -2
  37. package/dist/react/astro/MonitoringIcon.js +422 -358
  38. package/dist/react/astro/MonitoringIcon.js.map +1 -1
  39. package/dist/react/astro/Notification.d.ts +1 -2
  40. package/dist/react/astro/Notification.js +229 -126
  41. package/dist/react/astro/Notification.js.map +1 -1
  42. package/dist/react/astro/Progress.d.ts +0 -1
  43. package/dist/react/astro/Progress.js +199 -141
  44. package/dist/react/astro/Progress.js.map +1 -1
  45. package/dist/react/astro/SimulationControls.d.ts +3 -4
  46. package/dist/react/astro/SimulationControls.js +596 -650
  47. package/dist/react/astro/SimulationControls.js.map +1 -1
  48. package/dist/react/astro/StatusIndicator.d.ts +0 -1
  49. package/dist/react/astro/StatusIndicator.js +236 -170
  50. package/dist/react/astro/StatusIndicator.js.map +1 -1
  51. package/dist/react/astro/UnifiedTimeline.d.ts +9 -10
  52. package/dist/react/astro/UnifiedTimeline.js +2345 -2392
  53. package/dist/react/astro/UnifiedTimeline.js.map +1 -1
  54. package/dist/react/astro/index.d.ts +5 -5
  55. package/dist/react/astro/index.js +1 -25
  56. package/dist/react/cards/AccessCard.d.ts +0 -1
  57. package/dist/react/cards/AccessCard.js +471 -405
  58. package/dist/react/cards/AccessCard.js.map +1 -1
  59. package/dist/react/cards/OrbitCard.d.ts +0 -1
  60. package/dist/react/cards/OrbitCard.js +487 -364
  61. package/dist/react/cards/OrbitCard.js.map +1 -1
  62. package/dist/react/cards/SpacecraftCard.d.ts +0 -1
  63. package/dist/react/cards/SpacecraftCard.js +813 -925
  64. package/dist/react/cards/SpacecraftCard.js.map +1 -1
  65. package/dist/react/cards/TelemetryCard.d.ts +0 -1
  66. package/dist/react/cards/TelemetryCard.js +1055 -732
  67. package/dist/react/cards/TelemetryCard.js.map +1 -1
  68. package/dist/react/cards/TelemetryStreamCard.d.ts +0 -1
  69. package/dist/react/cards/TelemetryStreamCard.js +323 -297
  70. package/dist/react/cards/TelemetryStreamCard.js.map +1 -1
  71. package/dist/react/cards/index.d.ts +1 -1
  72. package/dist/react/cards/index.js +1 -8
  73. package/dist/react/charts/GroundTrackMap.d.ts +6 -7
  74. package/dist/react/charts/GroundTrackMap.js +1377 -1256
  75. package/dist/react/charts/GroundTrackMap.js.map +1 -1
  76. package/dist/react/charts/GroundTrackMapLeaflet.d.ts +1 -2
  77. package/dist/react/charts/GroundTrackMapLeaflet.js +1065 -987
  78. package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -1
  79. package/dist/react/charts/groundTrackMapLeafletTiles.js +34 -25
  80. package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -1
  81. package/dist/react/charts/groundTrackMapLeafletUtils.js +70 -61
  82. package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -1
  83. package/dist/react/charts/index.d.ts +1 -1
  84. package/dist/react/charts/index.js +7 -100
  85. package/dist/react/charts/unified/AstroChart.d.ts +1 -2
  86. package/dist/react/charts/unified/AstroChart.js +1331 -1411
  87. package/dist/react/charts/unified/AstroChart.js.map +1 -1
  88. package/dist/react/charts/unified/PowerOverviewChart.d.ts +3 -3
  89. package/dist/react/charts/unified/PowerOverviewChart.js +495 -478
  90. package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -1
  91. package/dist/react/charts/unified/domain.d.ts +12 -13
  92. package/dist/react/charts/unified/domain.js +3999 -3145
  93. package/dist/react/charts/unified/domain.js.map +1 -1
  94. package/dist/react/charts/unified/generators.d.ts +3 -4
  95. package/dist/react/charts/unified/generators.js +561 -498
  96. package/dist/react/charts/unified/generators.js.map +1 -1
  97. package/dist/react/charts/unified/index.d.ts +1 -1
  98. package/dist/react/charts/unified/presets.d.ts +14 -15
  99. package/dist/react/charts/unified/presets.js +857 -994
  100. package/dist/react/charts/unified/presets.js.map +1 -1
  101. package/dist/react/charts/unified/sync.d.ts +2 -3
  102. package/dist/react/charts/unified/sync.js +229 -195
  103. package/dist/react/charts/unified/sync.js.map +1 -1
  104. package/dist/react/charts/unified/theme.d.ts +11 -12
  105. package/dist/react/charts/unified/theme.js +606 -642
  106. package/dist/react/charts/unified/theme.js.map +1 -1
  107. package/dist/react/charts/unified/types.d.ts +32 -33
  108. package/dist/react/charts/unified/useChartStream.d.ts +1 -2
  109. package/dist/react/charts/unified/useChartStream.js +203 -216
  110. package/dist/react/charts/unified/useChartStream.js.map +1 -1
  111. package/dist/react/chatgpt/AppCard.d.ts +1 -2
  112. package/dist/react/chatgpt/index.d.ts +7 -7
  113. package/dist/react/chatgpt/index.js +160 -139
  114. package/dist/react/chatgpt/index.js.map +1 -1
  115. package/dist/react/context/CategoryContext.d.ts +0 -1
  116. package/dist/react/context/CategoryContext.js +78 -29
  117. package/dist/react/context/CategoryContext.js.map +1 -1
  118. package/dist/react/context/DisplaySettingsContext.d.ts +1 -2
  119. package/dist/react/context/DisplaySettingsContext.js +205 -156
  120. package/dist/react/context/DisplaySettingsContext.js.map +1 -1
  121. package/dist/react/context/SpatialSelectionContext.d.ts +0 -1
  122. package/dist/react/context/SpatialSelectionContext.js +36 -7
  123. package/dist/react/context/SpatialSelectionContext.js.map +1 -1
  124. package/dist/react/core/data/DataTable.d.ts +3 -4
  125. package/dist/react/core/data/DataTable.js +473 -440
  126. package/dist/react/core/data/DataTable.js.map +1 -1
  127. package/dist/react/core/data/DataValue.d.ts +4 -5
  128. package/dist/react/core/data/DataValue.js +605 -571
  129. package/dist/react/core/data/DataValue.js.map +1 -1
  130. package/dist/react/core/data/propertyConfig.d.ts +1 -2
  131. package/dist/react/core/data/propertyConfig.js +446 -382
  132. package/dist/react/core/data/propertyConfig.js.map +1 -1
  133. package/dist/react/core/display/AstroIcon.d.ts +4 -5
  134. package/dist/react/core/display/AstroIcon.js +339 -429
  135. package/dist/react/core/display/AstroIcon.js.map +1 -1
  136. package/dist/react/core/display/Badge.d.ts +2 -3
  137. package/dist/react/core/display/Badge.js +131 -131
  138. package/dist/react/core/display/Badge.js.map +1 -1
  139. package/dist/react/core/display/CardHeader.d.ts +0 -1
  140. package/dist/react/core/display/CardHeader.js +398 -311
  141. package/dist/react/core/display/CardHeader.js.map +1 -1
  142. package/dist/react/core/display/Container.d.ts +2 -3
  143. package/dist/react/core/display/Container.js +640 -668
  144. package/dist/react/core/display/Container.js.map +1 -1
  145. package/dist/react/core/display/CopyButton.d.ts +1 -2
  146. package/dist/react/core/display/CopyButton.js +158 -101
  147. package/dist/react/core/display/CopyButton.js.map +1 -1
  148. package/dist/react/core/display/GlassCard.d.ts +3 -4
  149. package/dist/react/core/display/GlassCard.js +416 -369
  150. package/dist/react/core/display/GlassCard.js.map +1 -1
  151. package/dist/react/core/display/HeaderIconWithStatus.d.ts +0 -1
  152. package/dist/react/core/display/HeaderIconWithStatus.js +152 -152
  153. package/dist/react/core/display/HeaderIconWithStatus.js.map +1 -1
  154. package/dist/react/core/display/Icon.d.ts +2 -3
  155. package/dist/react/core/display/Icon.js +172 -143
  156. package/dist/react/core/display/Icon.js.map +1 -1
  157. package/dist/react/core/display/Typography.d.ts +24 -25
  158. package/dist/react/core/display/Typography.js +360 -178
  159. package/dist/react/core/display/Typography.js.map +1 -1
  160. package/dist/react/core/feedback/ConfirmDialog.d.ts +1 -2
  161. package/dist/react/core/feedback/ConfirmDialog.js +343 -304
  162. package/dist/react/core/feedback/ConfirmDialog.js.map +1 -1
  163. package/dist/react/core/feedback/Dialog.d.ts +2 -3
  164. package/dist/react/core/feedback/Dialog.js +189 -197
  165. package/dist/react/core/feedback/Dialog.js.map +1 -1
  166. package/dist/react/core/feedback/Toast.d.ts +2 -3
  167. package/dist/react/core/feedback/Toast.js +346 -207
  168. package/dist/react/core/feedback/Toast.js.map +1 -1
  169. package/dist/react/core/index.d.ts +26 -26
  170. package/dist/react/core/index.js +7 -119
  171. package/dist/react/core/inputs/Button.d.ts +2 -3
  172. package/dist/react/core/inputs/Button.js +281 -304
  173. package/dist/react/core/inputs/Button.js.map +1 -1
  174. package/dist/react/core/inputs/Checkbox.d.ts +2 -3
  175. package/dist/react/core/inputs/Checkbox.js +139 -127
  176. package/dist/react/core/inputs/Checkbox.js.map +1 -1
  177. package/dist/react/core/inputs/Input.d.ts +3 -4
  178. package/dist/react/core/inputs/Input.js +277 -285
  179. package/dist/react/core/inputs/Input.js.map +1 -1
  180. package/dist/react/core/inputs/LimitsBar.d.ts +1 -2
  181. package/dist/react/core/inputs/LimitsBar.js +271 -196
  182. package/dist/react/core/inputs/LimitsBar.js.map +1 -1
  183. package/dist/react/core/inputs/NumberInput.d.ts +2 -3
  184. package/dist/react/core/inputs/NumberInput.js +531 -503
  185. package/dist/react/core/inputs/NumberInput.js.map +1 -1
  186. package/dist/react/core/inputs/PinInput.d.ts +2 -3
  187. package/dist/react/core/inputs/PinInput.js +224 -207
  188. package/dist/react/core/inputs/PinInput.js.map +1 -1
  189. package/dist/react/core/inputs/Select.d.ts +1 -2
  190. package/dist/react/core/inputs/Select.js +298 -299
  191. package/dist/react/core/inputs/Select.js.map +1 -1
  192. package/dist/react/core/inputs/Toggle.d.ts +2 -3
  193. package/dist/react/core/inputs/Toggle.js +142 -148
  194. package/dist/react/core/inputs/Toggle.js.map +1 -1
  195. package/dist/react/core/layout/Box.d.ts +3 -4
  196. package/dist/react/core/layout/Box.js +118 -122
  197. package/dist/react/core/layout/Box.js.map +1 -1
  198. package/dist/react/core/layout/Center.d.ts +0 -1
  199. package/dist/react/core/layout/Center.js +45 -32
  200. package/dist/react/core/layout/Center.js.map +1 -1
  201. package/dist/react/core/layout/Divider.d.ts +1 -2
  202. package/dist/react/core/layout/Divider.js +112 -106
  203. package/dist/react/core/layout/Divider.js.map +1 -1
  204. package/dist/react/core/layout/Flex.d.ts +4 -5
  205. package/dist/react/core/layout/Flex.js +120 -124
  206. package/dist/react/core/layout/Flex.js.map +1 -1
  207. package/dist/react/core/layout/Grid.d.ts +5 -6
  208. package/dist/react/core/layout/Grid.js +131 -138
  209. package/dist/react/core/layout/Grid.js.map +1 -1
  210. package/dist/react/core/layout/Spacer.d.ts +0 -1
  211. package/dist/react/core/layout/Spacer.js +36 -29
  212. package/dist/react/core/layout/Spacer.js.map +1 -1
  213. package/dist/react/core/layout/Stack.d.ts +4 -5
  214. package/dist/react/core/layout/Stack.js +127 -70
  215. package/dist/react/core/layout/Stack.js.map +1 -1
  216. package/dist/react/core/layout/responsive.d.ts +1 -2
  217. package/dist/react/core/layout/responsive.js +25 -19
  218. package/dist/react/core/layout/responsive.js.map +1 -1
  219. package/dist/react/core/layout/useBreakpoint.d.ts +1 -1
  220. package/dist/react/core/layout/useBreakpoint.js +119 -66
  221. package/dist/react/core/layout/useBreakpoint.js.map +1 -1
  222. package/dist/react/core/navigation/AppBar.d.ts +1 -2
  223. package/dist/react/core/navigation/AppBar.js +827 -805
  224. package/dist/react/core/navigation/AppBar.js.map +1 -1
  225. package/dist/react/core/navigation/Pagination.d.ts +2 -3
  226. package/dist/react/core/navigation/Pagination.js +207 -187
  227. package/dist/react/core/navigation/Pagination.js.map +1 -1
  228. package/dist/react/core/navigation/SideNav.d.ts +5 -6
  229. package/dist/react/core/navigation/SideNav.js +855 -629
  230. package/dist/react/core/navigation/SideNav.js.map +1 -1
  231. package/dist/react/core/navigation/Tabs.d.ts +0 -1
  232. package/dist/react/core/navigation/Tabs.js +113 -119
  233. package/dist/react/core/navigation/Tabs.js.map +1 -1
  234. package/dist/react/core/overlays/Popover.d.ts +2 -3
  235. package/dist/react/core/overlays/Popover.js +303 -282
  236. package/dist/react/core/overlays/Popover.js.map +1 -1
  237. package/dist/react/core/overlays/SidePanel.d.ts +1 -2
  238. package/dist/react/core/overlays/SidePanel.js +217 -212
  239. package/dist/react/core/overlays/SidePanel.js.map +1 -1
  240. package/dist/react/core/overlays/Tooltip.d.ts +1 -2
  241. package/dist/react/core/overlays/Tooltip.js +170 -176
  242. package/dist/react/core/overlays/Tooltip.js.map +1 -1
  243. package/dist/react/core/widgets/ActivityPlanner.d.ts +0 -1
  244. package/dist/react/core/widgets/ActivityPlanner.js +855 -517
  245. package/dist/react/core/widgets/ActivityPlanner.js.map +1 -1
  246. package/dist/react/core/widgets/Capture.d.ts +2 -3
  247. package/dist/react/core/widgets/Capture.js +965 -779
  248. package/dist/react/core/widgets/Capture.js.map +1 -1
  249. package/dist/react/core/widgets/ChatPanel.d.ts +16 -17
  250. package/dist/react/core/widgets/ChatPanel.js +1734 -1034
  251. package/dist/react/core/widgets/ChatPanel.js.map +1 -1
  252. package/dist/react/core/widgets/ColorPickerPanel.d.ts +0 -1
  253. package/dist/react/core/widgets/ColorPickerPanel.js +298 -287
  254. package/dist/react/core/widgets/ColorPickerPanel.js.map +1 -1
  255. package/dist/react/core/widgets/CommandBuilder.d.ts +2 -3
  256. package/dist/react/core/widgets/CommandBuilder.js +624 -516
  257. package/dist/react/core/widgets/CommandBuilder.js.map +1 -1
  258. package/dist/react/core/widgets/ConnectionForm.d.ts +2 -3
  259. package/dist/react/core/widgets/ConnectionForm.js +528 -492
  260. package/dist/react/core/widgets/ConnectionForm.js.map +1 -1
  261. package/dist/react/core/widgets/FileExplorer.d.ts +3 -4
  262. package/dist/react/core/widgets/FileExplorer.js +617 -505
  263. package/dist/react/core/widgets/FileExplorer.js.map +1 -1
  264. package/dist/react/core/widgets/HexViewer.d.ts +2 -3
  265. package/dist/react/core/widgets/HexViewer.js +1353 -1091
  266. package/dist/react/core/widgets/HexViewer.js.map +1 -1
  267. package/dist/react/core/widgets/ImageFrame.d.ts +1 -2
  268. package/dist/react/core/widgets/ImageFrame.js +230 -193
  269. package/dist/react/core/widgets/ImageFrame.js.map +1 -1
  270. package/dist/react/core/widgets/ImageGallery.d.ts +2 -1
  271. package/dist/react/core/widgets/ImageGallery.js +380 -314
  272. package/dist/react/core/widgets/ImageGallery.js.map +1 -1
  273. package/dist/react/core/widgets/ImagePanel.d.ts +0 -1
  274. package/dist/react/core/widgets/ImagePanel.js +110 -101
  275. package/dist/react/core/widgets/ImagePanel.js.map +1 -1
  276. package/dist/react/core/widgets/LogViewer.d.ts +2 -3
  277. package/dist/react/core/widgets/LogViewer.js +711 -607
  278. package/dist/react/core/widgets/LogViewer.js.map +1 -1
  279. package/dist/react/core/widgets/MessageStream.d.ts +3 -4
  280. package/dist/react/core/widgets/MessageStream.js +514 -444
  281. package/dist/react/core/widgets/MessageStream.js.map +1 -1
  282. package/dist/react/core/widgets/MissionCalendar.d.ts +3 -4
  283. package/dist/react/core/widgets/MissionCalendar.js +1488 -1020
  284. package/dist/react/core/widgets/MissionCalendar.js.map +1 -1
  285. package/dist/react/core/widgets/PacketViewer.d.ts +2 -3
  286. package/dist/react/core/widgets/PacketViewer.js +550 -421
  287. package/dist/react/core/widgets/PacketViewer.js.map +1 -1
  288. package/dist/react/core/widgets/capture-placeholder.png.js +6 -5
  289. package/dist/react/core/widgets/capture-placeholder.png.js.map +1 -1
  290. package/dist/react/hooks/index.d.ts +5 -5
  291. package/dist/react/hooks/useAccessWindows.d.ts +0 -1
  292. package/dist/react/hooks/useCompactMode.d.ts +1 -1
  293. package/dist/react/hooks/useCompactMode.js +104 -58
  294. package/dist/react/hooks/useCompactMode.js.map +1 -1
  295. package/dist/react/hooks/useGroundTrackHistory.d.ts +0 -1
  296. package/dist/react/hooks/useSimulationScene.d.ts +1 -2
  297. package/dist/react/hooks/useSimulationScene.js +481 -374
  298. package/dist/react/hooks/useSimulationScene.js.map +1 -1
  299. package/dist/react/index.d.ts +3 -3
  300. package/dist/react/panels/LayerControlPanel.d.ts +1 -2
  301. package/dist/react/panels/LayerControlPanel.js +223 -180
  302. package/dist/react/panels/LayerControlPanel.js.map +1 -1
  303. package/dist/react/panels/ObjectInventoryPanel.d.ts +2 -3
  304. package/dist/react/panels/ObjectInventoryPanel.js +315 -250
  305. package/dist/react/panels/ObjectInventoryPanel.js.map +1 -1
  306. package/dist/react/panels/index.d.ts +1 -1
  307. package/dist/react/panels/index.js +1 -6
  308. package/dist/react/shared/ErrorBoundary.d.ts +1 -2
  309. package/dist/react/shared/ErrorBoundary.js +170 -139
  310. package/dist/react/shared/ErrorBoundary.js.map +1 -1
  311. package/dist/react/shared/Skeleton.d.ts +1 -2
  312. package/dist/react/shared/Skeleton.js +300 -301
  313. package/dist/react/shared/Skeleton.js.map +1 -1
  314. package/dist/react/theme/ThemeProvider.d.ts +2 -321
  315. package/dist/react/theme/ThemeProvider.js +313 -939
  316. package/dist/react/theme/ThemeProvider.js.map +1 -1
  317. package/dist/react/theme/cardAccent.d.ts +1 -2
  318. package/dist/react/theme/cardAccent.js +196 -126
  319. package/dist/react/theme/cardAccent.js.map +1 -1
  320. package/dist/react/theme/config.d.ts +0 -1
  321. package/dist/react/theme/config.js +47 -25
  322. package/dist/react/theme/config.js.map +1 -1
  323. package/dist/react/theme/index.d.ts +2 -2
  324. package/dist/react/theme/index.js +1 -16
  325. package/dist/react/theme/types.d.ts +332 -0
  326. package/dist/react/theme/types.js +39 -0
  327. package/dist/react/theme/types.js.map +1 -0
  328. package/dist/react/types.d.ts +8 -8
  329. package/dist/react/types.js +147 -47
  330. package/dist/react/types.js.map +1 -1
  331. package/dist/react/utils/categoryPalette.d.ts +0 -1
  332. package/dist/react/utils/categoryPalette.js +91 -102
  333. package/dist/react/utils/categoryPalette.js.map +1 -1
  334. package/dist/react/utils/index.d.ts +5 -5
  335. package/dist/react/utils/index.js +457 -371
  336. package/dist/react/utils/index.js.map +1 -1
  337. package/dist/react/visualizations/EclipseTimerCard.d.ts +0 -1
  338. package/dist/react/visualizations/LinkBudgetCard.d.ts +0 -1
  339. package/dist/react/visualizations/NavBallCard.d.ts +0 -1
  340. package/dist/react/visualizations/PropulsionCard.d.ts +1 -2
  341. package/dist/react/visualizations/SensorFootprintCard.d.ts +1 -2
  342. package/dist/react/visualizations/ThermalHeatmapCard.d.ts +0 -1
  343. package/dist/react/visualizations/index.d.ts +3 -3
  344. package/dist/react.d.ts +2 -1
  345. package/dist/react.js +17 -221
  346. package/dist/shaders/atmosphere.frag.js +6 -5
  347. package/dist/shaders/atmosphere.frag.js.map +1 -1
  348. package/dist/shaders/atmosphere.vert.js +6 -5
  349. package/dist/shaders/atmosphere.vert.js.map +1 -1
  350. package/dist/shaders/stars.frag.js +6 -5
  351. package/dist/shaders/stars.frag.js.map +1 -1
  352. package/dist/shaders/stars.vert.js +6 -5
  353. package/dist/shaders/stars.vert.js.map +1 -1
  354. package/dist/style.css +26 -3
  355. package/dist/tokens/core.d.ts +159 -0
  356. package/dist/tokens/core.js +144 -0
  357. package/dist/tokens/core.js.map +1 -0
  358. package/dist/tokens/css-vars.d.ts +213 -2
  359. package/dist/tokens/css-vars.js +590 -227
  360. package/dist/tokens/css-vars.js.map +1 -1
  361. package/dist/tokens/index.d.ts +31 -228
  362. package/dist/tokens/index.js +281 -366
  363. package/dist/tokens/index.js.map +1 -1
  364. package/dist/tokens/palettes/astro.d.ts +129 -0
  365. package/dist/tokens/palettes/astro.js +112 -0
  366. package/dist/tokens/palettes/astro.js.map +1 -0
  367. package/dist/tokens/palettes/index.d.ts +288 -0
  368. package/dist/tokens/palettes/index.js +35 -0
  369. package/dist/tokens/palettes/index.js.map +1 -0
  370. package/dist/tokens/palettes/tailwind.d.ts +324 -0
  371. package/dist/tokens/palettes/tailwind.js +201 -0
  372. package/dist/tokens/palettes/tailwind.js.map +1 -0
  373. package/dist/tokens/palettes/zendir.d.ts +126 -0
  374. package/dist/tokens/palettes/zendir.js +92 -0
  375. package/dist/tokens/palettes/zendir.js.map +1 -0
  376. package/dist/tokens/themes.d.ts +30 -0
  377. package/dist/tokens/themes.js +704 -0
  378. package/dist/tokens/themes.js.map +1 -0
  379. package/dist/tokens/tokens.css +533 -155
  380. package/dist/types/index.d.ts +2 -2
  381. package/package.json +310 -313
  382. package/dist/index.js.map +0 -1
  383. package/dist/react/3d/index.js.map +0 -1
  384. package/dist/react/astro/index.js.map +0 -1
  385. package/dist/react/cards/index.js.map +0 -1
  386. package/dist/react/charts/index.js.map +0 -1
  387. package/dist/react/core/index.js.map +0 -1
  388. package/dist/react/panels/index.js.map +0 -1
  389. package/dist/react/theme/astro-tokens.d.ts +0 -153
  390. package/dist/react/theme/index.js.map +0 -1
  391. package/dist/react.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"HexViewer.js","sources":["../../../../src/react/core/widgets/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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"}
1
+ {"version":3,"file":"HexViewer.js","names":[],"sources":["../../../../src/react/core/widgets/HexViewer.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - HexViewer Component\r\n *\r\n * Displays raw binary data in a hex viewer format for telemetry packet analysis.\r\n * Shows offset, hex bytes, and ASCII representation side by side.\r\n *\r\n * Features:\r\n * - Hex + ASCII view with configurable bytes per row (8, 16, 32)\r\n * - Byte highlighting with custom colors (for field boundaries, errors, etc.)\r\n * - Click-to-select bytes and ranges\r\n * - Search by hex pattern or ASCII string\r\n * - Offset display in hex or decimal\r\n * - Live data streaming support (auto-scroll)\r\n * - Copy selection as hex, decimal, or ASCII\r\n * - Byte grouping (1, 2, 4, 8)\r\n * - Endianness toggle for multi-byte interpretation\r\n * - Status bar showing cursor position, selection info, data interpretation\r\n *\r\n * Astro UX Compliance:\r\n * - Dark theme with monospace font\r\n * - Status colors for highlighting\r\n * - Accessible keyboard navigation\r\n *\r\n * @example\r\n * ```tsx\r\n * <HexViewer\r\n * data={new Uint8Array([0x48, 0x65, 0x6C, 0x6C, 0x6F])}\r\n * bytesPerRow={16}\r\n * highlights={[{ start: 0, end: 4, color: '#4CAF50', label: 'Header' }]}\r\n * />\r\n * ```\r\n */\r\n\r\nimport React, {\r\n useState,\r\n useRef,\r\n useCallback,\r\n useMemo,\r\n useEffect,\r\n memo,\r\n} from \"react\";\r\nimport { useTheme } from \"../../theme\";\r\n\r\n// =============================================================================\r\n// Types\r\n// =============================================================================\r\n\r\nexport interface HexHighlight {\r\n /** Start byte offset (inclusive) */\r\n start: number;\r\n /** End byte offset (inclusive) */\r\n end: number;\r\n /** Highlight color (CSS color) */\r\n color: string;\r\n /** Optional label for the highlight region */\r\n label?: string;\r\n}\r\n\r\n/**\r\n * Named region for structural packet analysis (e.g., CCSDS Primary Header,\r\n * Secondary Header, User Data). Regions provide persistent background color\r\n * and a legend entry, unlike transient highlights.\r\n */\r\nexport interface HexRegion {\r\n /** Start byte offset (inclusive) */\r\n start: number;\r\n /** End byte offset (exclusive) */\r\n end: number;\r\n /** Region display name (e.g., \"Primary Header\") */\r\n label: string;\r\n /** Background fill color (CSS rgba recommended) */\r\n color: string;\r\n /** Border/accent color for the region */\r\n borderColor?: string;\r\n}\r\n\r\n/**\r\n * A decoded field within the packet payload for the fields table.\r\n * Enables cross-highlighting: hover a field row → highlight its bytes,\r\n * hover hex bytes → highlight the corresponding field row.\r\n */\r\nexport interface DecodedField {\r\n /** Field name */\r\n name: string;\r\n /** Decoded value (displayed via toString) */\r\n value: string | number | boolean | null;\r\n /** Engineering units (e.g., \"°C\", \"V\", \"rpm\") */\r\n unit?: string;\r\n /** Byte offset within the packet where this field starts */\r\n byteOffset?: number;\r\n /** Size in bits */\r\n sizeBits?: number;\r\n /** Optional description / tooltip */\r\n description?: string;\r\n}\r\n\r\n/**\r\n * Packet header key-value pairs shown in a collapsible summary panel.\r\n * Supports CCSDS-style primary + secondary header display.\r\n */\r\nexport interface PacketHeaderEntry {\r\n /** Label (e.g., \"APID\", \"Sequence Count\", \"Spacecraft ID\") */\r\n label: string;\r\n /** Value */\r\n value: string | number;\r\n /** Render value in monospace font */\r\n mono?: boolean;\r\n}\r\n\r\n/** Pre-defined region color palette for space packet headers */\r\nexport const REGION_COLORS = {\r\n primary: \"rgba(96, 165, 250, 0.15)\",\r\n secondary: \"rgba(168, 85, 247, 0.15)\",\r\n tertiary: \"rgba(251, 191, 36, 0.15)\",\r\n userData: \"rgba(34, 197, 94, 0.15)\",\r\n error: \"rgba(255, 56, 56, 0.15)\",\r\n} as const;\r\n\r\nexport const REGION_BORDER_COLORS = {\r\n primary: \"rgba(96, 165, 250, 0.5)\",\r\n secondary: \"rgba(168, 85, 247, 0.5)\",\r\n tertiary: \"rgba(251, 191, 36, 0.5)\",\r\n userData: \"rgba(34, 197, 94, 0.5)\",\r\n error: \"rgba(255, 56, 56, 0.5)\",\r\n} as const;\r\n\r\nexport type ByteGrouping = 1 | 2 | 4 | 8;\r\nexport type OffsetBase = \"hex\" | \"decimal\";\r\nexport type Endianness = \"big\" | \"little\";\r\n\r\nexport interface HexViewerProps {\r\n /** Binary data to display */\r\n data: Uint8Array | number[];\r\n /** Bytes per row (default: 16) */\r\n bytesPerRow?: 8 | 16 | 32;\r\n /** Byte grouping for hex display (default: 1) */\r\n byteGrouping?: ByteGrouping;\r\n /** Offset display base (default: 'hex') */\r\n offsetBase?: OffsetBase;\r\n /** Highlighted byte regions (transient, e.g., search results or field hover) */\r\n highlights?: HexHighlight[];\r\n /** Named structural regions (persistent background, e.g., Primary/Secondary Header) */\r\n regions?: HexRegion[];\r\n /** Decoded fields for the fields table (cross-highlights with hex bytes) */\r\n decodedFields?: DecodedField[];\r\n /** Packet header entries for the summary panel */\r\n packetHeaders?: PacketHeaderEntry[];\r\n /** External hover highlight range (for cross-component linking) */\r\n externalHighlight?: { start: number; end: number } | null;\r\n /** Whether to show the ASCII column (default: true) */\r\n showAscii?: boolean;\r\n /** Whether to show the offset column (default: true) */\r\n showOffset?: boolean;\r\n /** Whether to show the status/info bar (default: true) */\r\n showStatusBar?: boolean;\r\n /** Whether to show the search bar (default: true) */\r\n showSearch?: boolean;\r\n /** Whether to show the toolbar (default: true) */\r\n showToolbar?: boolean;\r\n /** Whether to show the decoded fields table (default: true if decodedFields provided) */\r\n showFieldsTable?: boolean;\r\n /** Whether to show the packet header summary (default: true if packetHeaders provided) */\r\n showHeaderSummary?: boolean;\r\n /**\r\n * Height of the viewer (default: 400).\r\n * When constrained, HexViewer enables outer scroll fallback so expanded\r\n * panels (headers/decoded fields) never trap lower sections.\r\n */\r\n height?: number | string;\r\n /** Title for the viewer */\r\n title?: string;\r\n /** Whether data is streaming (auto-scroll to bottom) */\r\n streaming?: boolean;\r\n /** Endianness for multi-byte interpretation (default: 'big') */\r\n endianness?: Endianness;\r\n /** Called when byte selection changes */\r\n onSelectionChange?: (start: number, end: number) => void;\r\n /** Called when a byte is clicked */\r\n onByteClick?: (offset: number, value: number) => void;\r\n /** Called when hovering a byte (for external cross-highlighting) */\r\n onByteHover?: (byteIndex: number) => void;\r\n /** Called when mouse leaves hex area */\r\n onByteLeave?: () => void;\r\n /** CSS class name */\r\n className?: string;\r\n /** Show outer container border (default: true). Set false when embedded inside a Container/card. */\r\n bordered?: boolean;\r\n /** Custom style overrides for the outer container */\r\n style?: React.CSSProperties;\r\n}\r\n\r\n// =============================================================================\r\n// Helpers\r\n// =============================================================================\r\n\r\nfunction toUint8Array(data: Uint8Array | number[]): Uint8Array {\r\n return data instanceof Uint8Array ? data : new Uint8Array(data);\r\n}\r\n\r\nfunction byteToHex(byte: number): string {\r\n return byte.toString(16).padStart(2, \"0\").toUpperCase();\r\n}\r\n\r\nfunction byteToAscii(byte: number): string {\r\n return byte >= 0x20 && byte <= 0x7e ? String.fromCharCode(byte) : \".\";\r\n}\r\n\r\nfunction formatOffset(\r\n offset: number,\r\n base: OffsetBase,\r\n totalBytes: number,\r\n): string {\r\n if (base === \"hex\") {\r\n const width = Math.max(\r\n 4,\r\n Math.ceil(Math.log2(Math.max(totalBytes, 1)) / 4) * 1,\r\n );\r\n return offset.toString(16).padStart(Math.max(width, 4), \"0\").toUpperCase();\r\n }\r\n const width = Math.max(4, totalBytes.toString().length);\r\n return offset.toString().padStart(width, \" \");\r\n}\r\n\r\nfunction interpretBytes(\r\n data: Uint8Array,\r\n offset: number,\r\n endianness: Endianness,\r\n): {\r\n u8: number;\r\n i8: number;\r\n u16?: number;\r\n i16?: number;\r\n u32?: number;\r\n i32?: number;\r\n f32?: number;\r\n f64?: number;\r\n} {\r\n const result: ReturnType<typeof interpretBytes> = {\r\n u8: data[offset],\r\n i8: data[offset] > 127 ? data[offset] - 256 : data[offset],\r\n };\r\n\r\n if (offset + 1 < data.length) {\r\n const view = new DataView(\r\n data.buffer,\r\n data.byteOffset + offset,\r\n Math.min(8, data.length - offset),\r\n );\r\n const be = endianness === \"big\";\r\n result.u16 = view.getUint16(0, !be);\r\n result.i16 = view.getInt16(0, !be);\r\n if (offset + 3 < data.length) {\r\n result.u32 = view.getUint32(0, !be);\r\n result.i32 = view.getInt32(0, !be);\r\n result.f32 = view.getFloat32(0, !be);\r\n }\r\n if (offset + 7 < data.length) {\r\n result.f64 = view.getFloat64(0, !be);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nconst HEX_ROW_HEIGHT = 22;\r\nconst HEX_OVERSCAN_ROWS = 16;\r\nconst MAX_RENDERED_SEARCH_HIGHLIGHTS = 400;\r\n\r\n// =============================================================================\r\n// Sub-components\r\n// =============================================================================\r\n\r\nconst HexRow = memo(function HexRow({\r\n offset,\r\n bytes,\r\n bytesPerRow,\r\n byteGrouping,\r\n offsetBase,\r\n totalBytes,\r\n showAscii,\r\n showOffset,\r\n highlights,\r\n regions,\r\n effectiveHighlight,\r\n selectedStart,\r\n selectedEnd,\r\n cursorOffset,\r\n onByteMouseDown,\r\n onByteMouseEnter,\r\n onByteClick,\r\n handleByteHoverInternal,\r\n handleByteLeaveInternal,\r\n tokens,\r\n}: {\r\n offset: number;\r\n bytes: Uint8Array;\r\n bytesPerRow: number;\r\n byteGrouping: ByteGrouping;\r\n offsetBase: OffsetBase;\r\n totalBytes: number;\r\n showAscii: boolean;\r\n showOffset: boolean;\r\n highlights: HexHighlight[];\r\n regions: HexRegion[];\r\n effectiveHighlight: { start: number; end: number } | null | undefined;\r\n selectedStart: number;\r\n selectedEnd: number;\r\n cursorOffset: number;\r\n onByteMouseDown: (idx: number) => void;\r\n onByteMouseEnter: (idx: number) => void;\r\n onByteClick: (idx: number) => void;\r\n handleByteHoverInternal: (idx: number) => void;\r\n handleByteLeaveInternal: () => void;\r\n tokens: ReturnType<typeof useTheme>[\"tokens\"];\r\n}) {\r\n const hexCells: React.ReactNode[] = [];\r\n const asciiCells: React.ReactNode[] = [];\r\n\r\n for (let i = 0; i < bytesPerRow; i++) {\r\n const byteIdx = offset + i;\r\n const isValid = i < bytes.length;\r\n const byte = isValid ? bytes[i] : 0;\r\n\r\n // Determine highlight color (priority: selection > cross-highlight > search highlight > region)\r\n let bgColor = \"transparent\";\r\n let fgColor = tokens.colors.text.primary;\r\n let borderBottom = \"2px solid transparent\";\r\n const isSelected =\r\n byteIdx >= Math.min(selectedStart, selectedEnd) &&\r\n byteIdx <= Math.max(selectedStart, selectedEnd) &&\r\n selectedStart >= 0;\r\n const isCursor = byteIdx === cursorOffset;\r\n\r\n // 1. Region background (lowest priority — always visible unless overridden)\r\n let regionColor: string | null = null;\r\n for (let r = 0; r < regions.length; r++) {\r\n const region = regions[r];\r\n if (byteIdx < region.start) break;\r\n if (byteIdx >= region.start && byteIdx < region.end) {\r\n regionColor = region.color;\r\n break;\r\n }\r\n }\r\n if (regionColor) {\r\n bgColor = regionColor;\r\n }\r\n\r\n // 2. Search highlights\r\n for (const h of highlights) {\r\n if (byteIdx >= h.start && byteIdx <= h.end) {\r\n bgColor = `${h.color}33`;\r\n fgColor = h.color;\r\n break;\r\n }\r\n }\r\n\r\n // 3. Cross-highlight from field hover or external\r\n if (\r\n effectiveHighlight &&\r\n byteIdx >= effectiveHighlight.start &&\r\n byteIdx < effectiveHighlight.end\r\n ) {\r\n bgColor = `${tokens.colors.status.caution}4D`;\r\n borderBottom = `2px solid ${tokens.colors.status.caution}`;\r\n }\r\n\r\n // 4. Selection (highest priority)\r\n if (isSelected) {\r\n bgColor = `${tokens.colors.interactive.default}4D`;\r\n fgColor = tokens.colors.interactive.default;\r\n }\r\n\r\n // Add grouping space\r\n const needsGroupSpace = i > 0 && i % byteGrouping === 0;\r\n\r\n hexCells.push(\r\n <span\r\n key={`hex-${i}`}\r\n role=\"button\"\r\n tabIndex={isValid ? 0 : -1}\r\n onMouseDown={() => isValid && onByteMouseDown(byteIdx)}\r\n onMouseEnter={() => {\r\n isValid && onByteMouseEnter(byteIdx);\r\n isValid && handleByteHoverInternal(byteIdx);\r\n }}\r\n onMouseLeave={() => isValid && handleByteLeaveInternal()}\r\n onClick={() => isValid && onByteClick(byteIdx)}\r\n onKeyDown={(e) => {\r\n if (isValid && (e.key === \"Enter\" || e.key === \" \")) {\r\n e.preventDefault();\r\n onByteClick(byteIdx);\r\n }\r\n }}\r\n style={{\r\n padding: \"0 2px\",\r\n marginLeft: needsGroupSpace ? 6 : 0,\r\n background: bgColor,\r\n color: isValid ? fgColor : `${tokens.colors.text.muted}26`,\r\n cursor: isValid ? \"pointer\" : \"default\",\r\n borderBottom: isCursor\r\n ? `2px solid ${tokens.colors.status.normal}`\r\n : borderBottom,\r\n borderRadius: tokens.borderRadius.sm,\r\n userSelect: \"none\",\r\n transition: \"background 0.1s ease\",\r\n }}\r\n >\r\n {isValid ? byteToHex(byte) : \" \"}\r\n </span>,\r\n );\r\n\r\n if (showAscii) {\r\n asciiCells.push(\r\n <span\r\n key={`ascii-${i}`}\r\n role=\"button\"\r\n tabIndex={isValid ? 0 : -1}\r\n onMouseDown={() => isValid && onByteMouseDown(byteIdx)}\r\n onMouseEnter={() => {\r\n isValid && onByteMouseEnter(byteIdx);\r\n isValid && handleByteHoverInternal(byteIdx);\r\n }}\r\n onMouseLeave={() => isValid && handleByteLeaveInternal()}\r\n onClick={() => isValid && onByteClick(byteIdx)}\r\n onKeyDown={(e) => {\r\n if (isValid && (e.key === \"Enter\" || e.key === \" \")) {\r\n e.preventDefault();\r\n onByteClick(byteIdx);\r\n }\r\n }}\r\n style={{\r\n background: bgColor,\r\n color: isValid\r\n ? byte >= 0x20 && byte <= 0x7e\r\n ? fgColor\r\n : `${tokens.colors.text.muted}33`\r\n : \"transparent\",\r\n cursor: isValid ? \"pointer\" : \"default\",\r\n borderBottom: isCursor\r\n ? `2px solid ${tokens.colors.status.normal}`\r\n : borderBottom,\r\n borderRadius: tokens.borderRadius.sm,\r\n userSelect: \"none\",\r\n width: 8,\r\n textAlign: \"center\" as const,\r\n }}\r\n >\r\n {isValid ? byteToAscii(byte) : \" \"}\r\n </span>,\r\n );\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n height: HEX_ROW_HEIGHT,\r\n lineHeight: `${HEX_ROW_HEIGHT}px`,\r\n }}\r\n >\r\n {showOffset && (\r\n <span\r\n style={{\r\n color: tokens.colors.text.muted,\r\n marginRight: 12,\r\n minWidth: 60,\r\n textAlign: \"right\",\r\n }}\r\n >\r\n {formatOffset(offset, offsetBase, totalBytes)}\r\n </span>\r\n )}\r\n <span\r\n style={{\r\n display: \"flex\",\r\n gap: 1,\r\n marginRight: showAscii ? 16 : 0,\r\n letterSpacing: \"0.5px\",\r\n }}\r\n >\r\n {hexCells}\r\n </span>\r\n {showAscii && (\r\n <>\r\n <span\r\n style={{ color: `${tokens.colors.border.muted}`, marginRight: 8 }}\r\n >\r\n │\r\n </span>\r\n <span style={{ display: \"flex\", letterSpacing: \"1px\" }}>\r\n {asciiCells}\r\n </span>\r\n </>\r\n )}\r\n </div>\r\n );\r\n});\r\n\r\n// =============================================================================\r\n// Main Component\r\n// =============================================================================\r\n\r\nexport function HexViewer({\r\n data: rawData,\r\n bytesPerRow = 16,\r\n byteGrouping = 1,\r\n offsetBase = \"hex\",\r\n highlights = [],\r\n regions = [],\r\n decodedFields,\r\n packetHeaders,\r\n externalHighlight,\r\n showAscii = true,\r\n showOffset = true,\r\n showStatusBar = true,\r\n showSearch = true,\r\n showToolbar = true,\r\n showFieldsTable,\r\n showHeaderSummary,\r\n height = 400,\r\n title,\r\n streaming = false,\r\n endianness = \"big\",\r\n onSelectionChange,\r\n onByteClick,\r\n onByteHover,\r\n onByteLeave,\r\n className = \"\",\r\n bordered = true,\r\n style: styleProp,\r\n}: HexViewerProps): React.ReactElement {\r\n const { tokens } = useTheme();\r\n const data = useMemo(() => toUint8Array(rawData), [rawData]);\r\n const [hoveredFieldIdx, setHoveredFieldIdx] = useState<number | null>(null);\r\n const [fieldHighlight, setFieldHighlight] = useState<{\r\n start: number;\r\n end: number;\r\n } | null>(null);\r\n const [showHeaders, setShowHeaders] = useState(true);\r\n const [showFields, setShowFields] = useState(true);\r\n\r\n const sortedRegions = useMemo(\r\n () => [...regions].sort((a, b) => a.start - b.start),\r\n [regions],\r\n );\r\n\r\n // Build field byte ranges for cross-highlighting\r\n const fieldByteRanges = useMemo(() => {\r\n if (!decodedFields) return [];\r\n return decodedFields.map((f) => ({\r\n start: f.byteOffset ?? 0,\r\n end: (f.byteOffset ?? 0) + Math.ceil((f.sizeBits ?? 0) / 8),\r\n name: f.name,\r\n }));\r\n }, [decodedFields]);\r\n\r\n // Cross-highlight: field hover → byte highlight\r\n const handleFieldHover = useCallback(\r\n (fieldIdx: number) => {\r\n setHoveredFieldIdx(fieldIdx);\r\n const range = fieldByteRanges[fieldIdx];\r\n if (range && range.end > range.start) setFieldHighlight(range);\r\n },\r\n [fieldByteRanges],\r\n );\r\n\r\n const handleFieldLeave = useCallback(() => {\r\n setHoveredFieldIdx(null);\r\n setFieldHighlight(null);\r\n }, []);\r\n\r\n // Cross-highlight: byte hover → field highlight\r\n const handleByteHoverInternal = useCallback(\r\n (byteIdx: number) => {\r\n onByteHover?.(byteIdx);\r\n const fi = fieldByteRanges.findIndex(\r\n (r) => byteIdx >= r.start && byteIdx < r.end,\r\n );\r\n if (fi >= 0) {\r\n setHoveredFieldIdx(fi);\r\n setFieldHighlight(fieldByteRanges[fi]);\r\n } else {\r\n setHoveredFieldIdx(null);\r\n setFieldHighlight({ start: byteIdx, end: byteIdx + 1 });\r\n }\r\n },\r\n [fieldByteRanges, onByteHover],\r\n );\r\n\r\n const handleByteLeaveInternal = useCallback(() => {\r\n onByteLeave?.();\r\n setHoveredFieldIdx(null);\r\n setFieldHighlight(null);\r\n }, [onByteLeave]);\r\n\r\n // Merge field highlight + external highlight into effective highlights\r\n const effectiveHighlight = externalHighlight || fieldHighlight;\r\n\r\n const shouldShowFieldsTable =\r\n showFieldsTable ?? (decodedFields && decodedFields.length > 0);\r\n const shouldShowHeaderSummary =\r\n showHeaderSummary ?? (packetHeaders && packetHeaders.length > 0);\r\n const scrollRef = useRef<HTMLDivElement>(null);\r\n const hasConstrainedHeight = useMemo(() => {\r\n if (height === undefined || height === null) return false;\r\n if (typeof height === \"string\")\r\n return height.trim().toLowerCase() !== \"auto\";\r\n return true;\r\n }, [height]);\r\n const decodedFieldsMaxHeight = useMemo(() => {\r\n if (typeof height === \"number\") {\r\n // Keep decoded fields useful but avoid starving the hex grid.\r\n return Math.min(220, Math.max(120, Math.floor(height * 0.32)));\r\n }\r\n return 200;\r\n }, [height]);\r\n\r\n const [cursorOffset, setCursorOffset] = useState(-1);\r\n const [selectStart, setSelectStart] = useState(-1);\r\n const [selectEnd, setSelectEnd] = useState(-1);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [searchQuery, setSearchQuery] = useState(\"\");\r\n const [searchType, setSearchType] = useState<\"hex\" | \"ascii\">(\"hex\");\r\n const [searchResults, setSearchResults] = useState<number[]>([]);\r\n const [currentSearchIdx, setCurrentSearchIdx] = useState(-1);\r\n const [localBytesPerRow, setLocalBytesPerRow] = useState(bytesPerRow);\r\n const [localGrouping, setLocalGrouping] = useState(byteGrouping);\r\n const [localOffsetBase, setLocalOffsetBase] = useState(offsetBase);\r\n const [localEndianness, setLocalEndianness] = useState(endianness);\r\n const [localShowAscii, setLocalShowAscii] = useState(showAscii);\r\n const [scrollTop, setScrollTop] = useState(0);\r\n const [viewportHeight, setViewportHeight] = useState(160);\r\n\r\n // Auto-scroll when streaming\r\n useEffect(() => {\r\n if (streaming && scrollRef.current) {\r\n scrollRef.current.scrollTop = scrollRef.current.scrollHeight;\r\n }\r\n }, [data, streaming]);\r\n\r\n useEffect(() => {\r\n const el = scrollRef.current;\r\n if (!el) return undefined;\r\n\r\n const updateViewportHeight = () => {\r\n setViewportHeight(Math.max(120, el.clientHeight || 160));\r\n };\r\n\r\n updateViewportHeight();\r\n if (typeof ResizeObserver !== \"undefined\") {\r\n const observer = new ResizeObserver(updateViewportHeight);\r\n observer.observe(el);\r\n return () => observer.disconnect();\r\n }\r\n\r\n window.addEventListener(\"resize\", updateViewportHeight);\r\n return () => window.removeEventListener(\"resize\", updateViewportHeight);\r\n }, []);\r\n\r\n const totalRows = Math.max(1, Math.ceil(data.length / localBytesPerRow));\r\n const startRow = Math.max(\r\n 0,\r\n Math.floor(scrollTop / HEX_ROW_HEIGHT) - HEX_OVERSCAN_ROWS,\r\n );\r\n const visibleRowCount =\r\n Math.ceil(viewportHeight / HEX_ROW_HEIGHT) + HEX_OVERSCAN_ROWS * 2;\r\n const endRow = Math.min(totalRows, startRow + visibleRowCount);\r\n const virtualRows = useMemo(() => {\r\n const result: { offset: number; bytes: Uint8Array }[] = [];\r\n for (let row = startRow; row < endRow; row++) {\r\n const offset = row * localBytesPerRow;\r\n const bytes = data.subarray(\r\n offset,\r\n Math.min(data.length, offset + localBytesPerRow),\r\n );\r\n result.push({ offset, bytes });\r\n }\r\n if (result.length === 0) {\r\n result.push({ offset: 0, bytes: new Uint8Array(0) });\r\n }\r\n return result;\r\n }, [data, localBytesPerRow, startRow, endRow]);\r\n\r\n // Search\r\n const doSearch = useCallback(() => {\r\n if (!searchQuery.trim()) {\r\n setSearchResults([]);\r\n setCurrentSearchIdx(-1);\r\n return;\r\n }\r\n\r\n const results: number[] = [];\r\n if (searchType === \"hex\") {\r\n const hexStr = searchQuery.replace(/\\s+/g, \"\");\r\n if (hexStr.length % 2 !== 0 || !/^[0-9a-fA-F]+$/.test(hexStr)) return;\r\n const searchBytes = new Uint8Array(hexStr.length / 2);\r\n for (let i = 0; i < searchBytes.length; i++) {\r\n searchBytes[i] = parseInt(hexStr.slice(i * 2, i * 2 + 2), 16);\r\n }\r\n for (let i = 0; i <= data.length - searchBytes.length; i++) {\r\n let match = true;\r\n for (let j = 0; j < searchBytes.length; j++) {\r\n if (data[i + j] !== searchBytes[j]) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n if (match) results.push(i);\r\n }\r\n } else {\r\n const encoder = new TextEncoder();\r\n const searchBytes = encoder.encode(searchQuery);\r\n for (let i = 0; i <= data.length - searchBytes.length; i++) {\r\n let match = true;\r\n for (let j = 0; j < searchBytes.length; j++) {\r\n if (data[i + j] !== searchBytes[j]) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n if (match) results.push(i);\r\n }\r\n }\r\n setSearchResults(results);\r\n setCurrentSearchIdx(results.length > 0 ? 0 : -1);\r\n if (results.length > 0) {\r\n setCursorOffset(results[0]);\r\n if (scrollRef.current) {\r\n const rowIdx = Math.floor(results[0] / localBytesPerRow);\r\n scrollRef.current.scrollTop = Math.max(\r\n 0,\r\n rowIdx * HEX_ROW_HEIGHT - 100,\r\n );\r\n }\r\n }\r\n }, [searchQuery, searchType, data, localBytesPerRow]);\r\n\r\n const scrollToOffset = useCallback(\r\n (offset: number) => {\r\n if (!scrollRef.current) return;\r\n const rowIdx = Math.floor(offset / localBytesPerRow);\r\n scrollRef.current.scrollTop = Math.max(0, rowIdx * HEX_ROW_HEIGHT - 100);\r\n },\r\n [localBytesPerRow],\r\n );\r\n\r\n const handleHexScroll = useCallback(\r\n (event: React.UIEvent<HTMLDivElement>) => {\r\n setScrollTop(event.currentTarget.scrollTop);\r\n },\r\n [],\r\n );\r\n\r\n const nextSearchResult = useCallback(() => {\r\n if (searchResults.length === 0) return;\r\n const nextIdx = (currentSearchIdx + 1) % searchResults.length;\r\n setCurrentSearchIdx(nextIdx);\r\n setCursorOffset(searchResults[nextIdx]);\r\n scrollToOffset(searchResults[nextIdx]);\r\n }, [searchResults, currentSearchIdx, scrollToOffset]);\r\n\r\n const prevSearchResult = useCallback(() => {\r\n if (searchResults.length === 0) return;\r\n const prevIdx =\r\n (currentSearchIdx - 1 + searchResults.length) % searchResults.length;\r\n setCurrentSearchIdx(prevIdx);\r\n setCursorOffset(searchResults[prevIdx]);\r\n scrollToOffset(searchResults[prevIdx]);\r\n }, [searchResults, currentSearchIdx, scrollToOffset]);\r\n\r\n // Selection handlers\r\n const handleByteMouseDown = useCallback((idx: number) => {\r\n setSelectStart(idx);\r\n setSelectEnd(idx);\r\n setCursorOffset(idx);\r\n setIsDragging(true);\r\n }, []);\r\n\r\n const handleByteMouseEnter = useCallback(\r\n (idx: number) => {\r\n if (isDragging) {\r\n setSelectEnd(idx);\r\n }\r\n },\r\n [isDragging],\r\n );\r\n\r\n const handleMouseUp = useCallback(() => {\r\n if (isDragging) {\r\n setIsDragging(false);\r\n if (onSelectionChange && selectStart >= 0 && selectEnd >= 0) {\r\n onSelectionChange(\r\n Math.min(selectStart, selectEnd),\r\n Math.max(selectStart, selectEnd),\r\n );\r\n }\r\n }\r\n }, [isDragging, selectStart, selectEnd, onSelectionChange]);\r\n\r\n useEffect(() => {\r\n window.addEventListener(\"mouseup\", handleMouseUp);\r\n return () => window.removeEventListener(\"mouseup\", handleMouseUp);\r\n }, [handleMouseUp]);\r\n\r\n const handleByteClickCb = useCallback(\r\n (idx: number) => {\r\n setCursorOffset(idx);\r\n if (onByteClick) {\r\n onByteClick(idx, data[idx]);\r\n }\r\n },\r\n [data, onByteClick],\r\n );\r\n\r\n // Copy selection\r\n const copySelection = useCallback(\r\n (format: \"hex\" | \"decimal\" | \"ascii\") => {\r\n if (selectStart < 0 || selectEnd < 0) return;\r\n const start = Math.min(selectStart, selectEnd);\r\n const end = Math.max(selectStart, selectEnd);\r\n const selected = data.slice(start, end + 1);\r\n\r\n let text: string;\r\n if (format === \"hex\") {\r\n text = Array.from(selected)\r\n .map((b) => byteToHex(b))\r\n .join(\" \");\r\n } else if (format === \"decimal\") {\r\n text = Array.from(selected).join(\", \");\r\n } else {\r\n text = Array.from(selected)\r\n .map((b) => byteToAscii(b))\r\n .join(\"\");\r\n }\r\n navigator.clipboard?.writeText(text);\r\n },\r\n [data, selectStart, selectEnd],\r\n );\r\n\r\n // Interpretation of cursor byte\r\n const interpretation = useMemo(() => {\r\n if (cursorOffset < 0 || cursorOffset >= data.length) return null;\r\n return interpretBytes(data, cursorOffset, localEndianness);\r\n }, [data, cursorOffset, localEndianness]);\r\n\r\n const renderedSearchResultEntries = useMemo(() => {\r\n if (searchResults.length <= MAX_RENDERED_SEARCH_HIGHLIGHTS) {\r\n return searchResults.map((pos, idx) => ({ pos, idx }));\r\n }\r\n\r\n const halfWindow = Math.floor(MAX_RENDERED_SEARCH_HIGHLIGHTS / 2);\r\n const anchor = currentSearchIdx >= 0 ? currentSearchIdx : 0;\r\n const start = Math.max(0, anchor - halfWindow);\r\n const end = Math.min(\r\n searchResults.length,\r\n start + MAX_RENDERED_SEARCH_HIGHLIGHTS,\r\n );\r\n const adjustedStart = Math.max(0, end - MAX_RENDERED_SEARCH_HIGHLIGHTS);\r\n\r\n return searchResults\r\n .slice(adjustedStart, end)\r\n .map((pos, i) => ({ pos, idx: adjustedStart + i }));\r\n }, [searchResults, currentSearchIdx]);\r\n\r\n // Search highlights\r\n const allHighlights = useMemo(() => {\r\n const h = [...highlights];\r\n const searchLen =\r\n searchType === \"hex\"\r\n ? searchQuery.replace(/\\s+/g, \"\").length / 2\r\n : searchQuery.length;\r\n renderedSearchResultEntries.forEach(({ pos, idx }) => {\r\n h.push({\r\n start: pos,\r\n end: pos + Math.max(0, searchLen - 1),\r\n color:\r\n idx === currentSearchIdx\r\n ? tokens.colors.status.serious\r\n : tokens.colors.status.caution,\r\n label: `Search match ${idx + 1}`,\r\n });\r\n });\r\n return h;\r\n }, [\r\n highlights,\r\n renderedSearchResultEntries,\r\n currentSearchIdx,\r\n searchQuery,\r\n searchType,\r\n tokens,\r\n ]);\r\n\r\n const containerStyle: React.CSSProperties = {\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n fontSize: 13,\r\n lineHeight: \"22px\",\r\n background: tokens.colors.background.base,\r\n border: bordered ? `1px solid ${tokens.colors.border.muted}` : \"none\",\r\n borderRadius: tokens.borderRadius.lg,\r\n overflowX: \"hidden\",\r\n overflowY: hasConstrainedHeight ? \"auto\" : \"visible\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n minHeight: 0,\r\n height: hasConstrainedHeight ? height : undefined,\r\n color: tokens.colors.text.primary,\r\n ...styleProp,\r\n };\r\n\r\n return (\r\n <div className={`hex-viewer ${className}`} style={containerStyle}>\r\n {/* Sticky header: title bar + toolbar stay pinned while content scrolls */}\r\n <div\r\n style={{\r\n position: \"sticky\",\r\n top: 0,\r\n zIndex: 10,\r\n background: tokens.colors.background.surface,\r\n flexShrink: 0,\r\n }}\r\n >\r\n {/* Title bar */}\r\n {title && (\r\n <div\r\n style={{\r\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n }}\r\n >\r\n <span\r\n style={{\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n fontSize: tokens.typography.fontSize.base,\r\n fontFamily: tokens.typography.fontFamily.primary,\r\n }}\r\n >\r\n {title}\r\n </span>\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.sm,\r\n color: tokens.colors.text.muted,\r\n }}\r\n >\r\n {data.length.toLocaleString()} bytes\r\n </span>\r\n </div>\r\n )}\r\n\r\n {/* Toolbar */}\r\n {showToolbar && (\r\n <div\r\n role=\"toolbar\"\r\n aria-label=\"Hex viewer controls\"\r\n style={{\r\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.sm,\r\n flexWrap: \"wrap\",\r\n fontSize: tokens.typography.fontSize.sm,\r\n }}\r\n >\r\n <label\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 4,\r\n color: tokens.colors.text.muted,\r\n }}\r\n >\r\n Bytes/Row:\r\n <select\r\n aria-label=\"Bytes per row\"\r\n value={localBytesPerRow}\r\n onChange={(e) =>\r\n setLocalBytesPerRow(Number(e.target.value) as 8 | 16 | 32)\r\n }\r\n style={{\r\n background: tokens.colors.background.base,\r\n color: tokens.colors.text.primary,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md,\r\n padding: \"2px 4px\",\r\n fontSize: 11,\r\n }}\r\n >\r\n <option value={8}>8</option>\r\n <option value={16}>16</option>\r\n <option value={32}>32</option>\r\n </select>\r\n </label>\r\n <label\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 4,\r\n color: tokens.colors.text.muted,\r\n }}\r\n >\r\n Group:\r\n <select\r\n aria-label=\"Byte grouping\"\r\n value={localGrouping}\r\n onChange={(e) =>\r\n setLocalGrouping(Number(e.target.value) as ByteGrouping)\r\n }\r\n style={{\r\n background: tokens.colors.background.base,\r\n color: tokens.colors.text.primary,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md,\r\n padding: \"2px 4px\",\r\n fontSize: 11,\r\n }}\r\n >\r\n <option value={1}>1</option>\r\n <option value={2}>2</option>\r\n <option value={4}>4</option>\r\n <option value={8}>8</option>\r\n </select>\r\n </label>\r\n <label\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 4,\r\n color: tokens.colors.text.muted,\r\n }}\r\n >\r\n Offset:\r\n <select\r\n aria-label=\"Offset format\"\r\n value={localOffsetBase}\r\n onChange={(e) =>\r\n setLocalOffsetBase(e.target.value as OffsetBase)\r\n }\r\n style={{\r\n background: tokens.colors.background.base,\r\n color: tokens.colors.text.primary,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md,\r\n padding: \"2px 4px\",\r\n fontSize: 11,\r\n }}\r\n >\r\n <option value=\"hex\">Hex</option>\r\n <option value=\"decimal\">Dec</option>\r\n </select>\r\n </label>\r\n <label\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 4,\r\n color: tokens.colors.text.muted,\r\n }}\r\n >\r\n Endian:\r\n <select\r\n aria-label=\"Endianness\"\r\n value={localEndianness}\r\n onChange={(e) =>\r\n setLocalEndianness(e.target.value as Endianness)\r\n }\r\n style={{\r\n background: tokens.colors.background.base,\r\n color: tokens.colors.text.primary,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md,\r\n padding: \"2px 4px\",\r\n fontSize: 11,\r\n }}\r\n >\r\n <option value=\"big\">Big</option>\r\n <option value=\"little\">Little</option>\r\n </select>\r\n </label>\r\n <label\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 4,\r\n color: tokens.colors.text.muted,\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n checked={localShowAscii}\r\n onChange={(e) => setLocalShowAscii(e.target.checked)}\r\n style={{ accentColor: tokens.colors.interactive.default }}\r\n />\r\n ASCII\r\n </label>\r\n <div style={{ flex: 1 }} />\r\n {selectStart >= 0 && selectEnd >= 0 && (\r\n <div style={{ display: \"flex\", gap: 4 }}>\r\n {([\"hex\", \"decimal\", \"ascii\"] as const).map((fmt) => (\r\n <button\r\n key={fmt}\r\n onClick={() => copySelection(fmt)}\r\n style={{\r\n background: tokens.colors.background.base,\r\n color: tokens.colors.text.secondary,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md,\r\n padding: \"2px 8px\",\r\n fontSize: 10,\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n Copy {fmt}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Search bar */}\r\n {showSearch && (\r\n <div\r\n role=\"search\"\r\n style={{\r\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.sm,\r\n }}\r\n >\r\n <label\r\n htmlFor=\"hex-search-type\"\r\n style={{\r\n position: \"absolute\",\r\n width: 1,\r\n height: 1,\r\n padding: 0,\r\n margin: -1,\r\n overflow: \"hidden\",\r\n clip: \"rect(0, 0, 0, 0)\",\r\n border: 0,\r\n }}\r\n >\r\n Search type\r\n </label>\r\n <select\r\n id=\"hex-search-type\"\r\n value={searchType}\r\n onChange={(e) => setSearchType(e.target.value as \"hex\" | \"ascii\")}\r\n style={{\r\n background: tokens.colors.background.base,\r\n color: tokens.colors.text.primary,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md,\r\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\r\n fontSize: tokens.typography.fontSize.sm,\r\n }}\r\n >\r\n <option value=\"hex\">Hex</option>\r\n <option value=\"ascii\">ASCII</option>\r\n </select>\r\n <input\r\n type=\"text\"\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") doSearch();\r\n }}\r\n placeholder={\r\n searchType === \"hex\" ? \"e.g. 48 65 6C 6C 6F\" : \"Search ASCII...\"\r\n }\r\n aria-label=\"Search hex data\"\r\n style={{\r\n flex: 1,\r\n background: tokens.colors.background.base,\r\n color: tokens.colors.text.primary,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md,\r\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\r\n fontSize: tokens.typography.fontSize.sm,\r\n outline: \"none\",\r\n fontFamily: \"inherit\",\r\n }}\r\n />\r\n <button\r\n onClick={doSearch}\r\n aria-label=\"Find matches\"\r\n style={{\r\n background: tokens.colors.interactive.default,\r\n color: tokens.colors.text.inverse,\r\n border: \"none\",\r\n borderRadius: tokens.borderRadius.md,\r\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,\r\n fontSize: tokens.typography.fontSize.sm,\r\n cursor: \"pointer\",\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n }}\r\n >\r\n Find\r\n </button>\r\n {searchResults.length > 0 && (\r\n <>\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.sm,\r\n color: tokens.colors.text.muted,\r\n }}\r\n aria-live=\"polite\"\r\n >\r\n {currentSearchIdx + 1}/{searchResults.length}\r\n </span>\r\n <button\r\n onClick={prevSearchResult}\r\n aria-label=\"Previous match\"\r\n style={{\r\n background: \"none\",\r\n border: \"none\",\r\n color: tokens.colors.text.secondary,\r\n cursor: \"pointer\",\r\n fontSize: tokens.typography.fontSize.base,\r\n padding: tokens.spacing.xs,\r\n }}\r\n >\r\n &#x25B2;\r\n </button>\r\n <button\r\n onClick={nextSearchResult}\r\n aria-label=\"Next match\"\r\n style={{\r\n background: \"none\",\r\n border: \"none\",\r\n color: tokens.colors.text.secondary,\r\n cursor: \"pointer\",\r\n fontSize: tokens.typography.fontSize.base,\r\n padding: tokens.spacing.xs,\r\n }}\r\n >\r\n &#x25BC;\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n {/* end sticky header */}\r\n\r\n {/* Packet Header Summary (collapsible) */}\r\n {shouldShowHeaderSummary && packetHeaders && packetHeaders.length > 0 && (\r\n <div style={{ flexShrink: 0 }}>\r\n <div\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-expanded={showHeaders}\r\n aria-label=\"Toggle packet headers\"\r\n onClick={() => setShowHeaders(!showHeaders)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n setShowHeaders(!showHeaders);\r\n }\r\n }}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.sm,\r\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\r\n background: tokens.colors.background.surface,\r\n cursor: \"pointer\",\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n userSelect: \"none\",\r\n }}\r\n >\r\n <span\r\n aria-hidden=\"true\"\r\n style={{\r\n fontSize: tokens.typography.fontSize.micro,\r\n color: tokens.colors.text.muted,\r\n transition: \"transform 150ms ease\",\r\n transform: showHeaders ? \"rotate(0deg)\" : \"rotate(-90deg)\",\r\n }}\r\n >\r\n {\"\\u25BC\"}\r\n </span>\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.sm,\r\n color: tokens.colors.text.secondary,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n }}\r\n >\r\n Packet Headers\r\n </span>\r\n </div>\r\n {showHeaders && (\r\n <div\r\n style={{\r\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n background: tokens.colors.background.base,\r\n }}\r\n >\r\n <div\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"auto 1fr\",\r\n gap: `${tokens.spacing.xxs} ${tokens.spacing.md}`,\r\n fontSize: tokens.typography.fontSize.sm,\r\n lineHeight: tokens.typography.lineHeight.tight,\r\n }}\r\n >\r\n {packetHeaders.map((entry, i) => (\r\n <React.Fragment key={i}>\r\n <span style={{ color: tokens.colors.text.muted }}>\r\n {entry.label}\r\n </span>\r\n <span\r\n style={{\r\n color: tokens.colors.text.primary,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n fontFamily: entry.mono\r\n ? tokens.typography.fontFamily.mono\r\n : \"inherit\",\r\n }}\r\n >\r\n {entry.value}\r\n </span>\r\n </React.Fragment>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Decoded Fields Table (collapsible) */}\r\n {shouldShowFieldsTable && decodedFields && decodedFields.length > 0 && (\r\n <div style={{ flexShrink: 0 }}>\r\n <div\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-expanded={showFields}\r\n aria-label=\"Toggle decoded fields\"\r\n onClick={() => setShowFields(!showFields)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n setShowFields(!showFields);\r\n }\r\n }}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.sm,\r\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\r\n background: tokens.colors.background.surface,\r\n cursor: \"pointer\",\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n userSelect: \"none\",\r\n }}\r\n >\r\n <span\r\n aria-hidden=\"true\"\r\n style={{\r\n fontSize: tokens.typography.fontSize.micro,\r\n color: tokens.colors.text.muted,\r\n transition: \"transform 150ms ease\",\r\n transform: showFields ? \"rotate(0deg)\" : \"rotate(-90deg)\",\r\n }}\r\n >\r\n {\"\\u25BC\"}\r\n </span>\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.sm,\r\n color: tokens.colors.text.secondary,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n }}\r\n >\r\n Decoded Fields ({decodedFields.length})\r\n </span>\r\n </div>\r\n {showFields && (\r\n <div\r\n role=\"table\"\r\n aria-label=\"Decoded packet fields\"\r\n style={{\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n maxHeight: decodedFieldsMaxHeight,\r\n overflowY: \"auto\",\r\n }}\r\n >\r\n {/* Fields table header */}\r\n <div\r\n role=\"row\"\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n gap: tokens.spacing.sm,\r\n position: \"sticky\",\r\n top: 0,\r\n background: tokens.colors.background.surface,\r\n zIndex: 1,\r\n }}\r\n >\r\n <span\r\n role=\"columnheader\"\r\n style={{\r\n flex: 2,\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.muted,\r\n textTransform: \"uppercase\",\r\n letterSpacing: \"0.5px\",\r\n }}\r\n >\r\n Field\r\n </span>\r\n <span\r\n role=\"columnheader\"\r\n style={{\r\n flex: 2,\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.muted,\r\n textTransform: \"uppercase\",\r\n letterSpacing: \"0.5px\",\r\n textAlign: \"right\",\r\n }}\r\n >\r\n Value\r\n </span>\r\n <span\r\n role=\"columnheader\"\r\n style={{\r\n flex: 1,\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.muted,\r\n textTransform: \"uppercase\",\r\n letterSpacing: \"0.5px\",\r\n textAlign: \"right\",\r\n }}\r\n >\r\n Unit\r\n </span>\r\n <span\r\n role=\"columnheader\"\r\n style={{\r\n flex: 1,\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.muted,\r\n textTransform: \"uppercase\",\r\n letterSpacing: \"0.5px\",\r\n textAlign: \"right\",\r\n }}\r\n >\r\n Offset\r\n </span>\r\n <span\r\n role=\"columnheader\"\r\n style={{\r\n flex: 1,\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.muted,\r\n textTransform: \"uppercase\",\r\n letterSpacing: \"0.5px\",\r\n textAlign: \"right\",\r\n }}\r\n >\r\n Size\r\n </span>\r\n </div>\r\n {/* Field rows */}\r\n {decodedFields.map((field, fi) => {\r\n const isHovered = hoveredFieldIdx === fi;\r\n return (\r\n <div\r\n key={fi}\r\n onMouseEnter={() => handleFieldHover(fi)}\r\n onMouseLeave={handleFieldLeave}\r\n title={field.description}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n padding: `3px ${tokens.spacing.smd}`,\r\n gap: tokens.spacing.sm,\r\n background: isHovered\r\n ? `${tokens.colors.status.caution}14`\r\n : fi % 2 === 0\r\n ? tokens.colors.background.base\r\n : \"transparent\",\r\n transition: \"background 0.15s ease\",\r\n cursor: \"default\",\r\n minHeight: tokens.elementSize.sm,\r\n }}\r\n >\r\n <span\r\n role=\"cell\"\r\n style={{\r\n flex: 2,\r\n fontSize: tokens.typography.fontSize.sm,\r\n color: tokens.colors.text.secondary,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n {field.name}\r\n </span>\r\n <span\r\n role=\"cell\"\r\n style={{\r\n flex: 2,\r\n fontSize: tokens.typography.fontSize.sm,\r\n color: tokens.colors.text.primary,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n textAlign: \"right\",\r\n }}\r\n >\r\n {field.value === null || field.value === undefined\r\n ? \"\\u2014\"\r\n : String(field.value)}\r\n </span>\r\n <span\r\n role=\"cell\"\r\n style={{\r\n flex: 1,\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.muted,\r\n textAlign: \"right\",\r\n }}\r\n >\r\n {field.unit || \"\"}\r\n </span>\r\n <span\r\n role=\"cell\"\r\n style={{\r\n flex: 1,\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.muted,\r\n textAlign: \"right\",\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n }}\r\n >\r\n {field.byteOffset !== undefined ? field.byteOffset : \"\"}\r\n </span>\r\n <span\r\n role=\"cell\"\r\n style={{\r\n flex: 1,\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.muted,\r\n textAlign: \"right\",\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n }}\r\n >\r\n {field.sizeBits ? `${field.sizeBits}b` : \"\"}\r\n </span>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Region legend */}\r\n {regions.length > 0 && (\r\n <div\r\n role=\"group\"\r\n aria-label=\"Packet structure regions\"\r\n style={{\r\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.smd,\r\n flexWrap: \"wrap\",\r\n fontSize: tokens.typography.fontSize.xxs,\r\n background: tokens.colors.background.surface,\r\n }}\r\n >\r\n {regions.map((r, i) => (\r\n <span\r\n key={i}\r\n style={{\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.xs,\r\n }}\r\n >\r\n <span\r\n aria-hidden=\"true\"\r\n style={{\r\n display: \"inline-block\",\r\n width: 10,\r\n height: 10,\r\n borderRadius: tokens.borderRadius.sm,\r\n background: r.color,\r\n border: `1px solid ${r.borderColor || \"transparent\"}`,\r\n }}\r\n />\r\n <span style={{ color: tokens.colors.text.muted }}>\r\n {r.label} ({r.end - r.start}B)\r\n </span>\r\n </span>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Column headers */}\r\n <div\r\n role=\"row\"\r\n aria-label=\"Column headers\"\r\n style={{\r\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.muted,\r\n textTransform: \"uppercase\",\r\n letterSpacing: \"0.5px\",\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n background: tokens.colors.background.surface,\r\n }}\r\n >\r\n {showOffset && (\r\n <span\r\n style={{\r\n marginRight: tokens.spacing.smd,\r\n minWidth: 60,\r\n textAlign: \"right\",\r\n }}\r\n >\r\n Offset\r\n </span>\r\n )}\r\n <span style={{ flex: 1 }}>Hex</span>\r\n {localShowAscii && (\r\n <>\r\n <span\r\n aria-hidden=\"true\"\r\n style={{\r\n color: `${tokens.colors.border.muted}`,\r\n marginRight: tokens.spacing.sm,\r\n }}\r\n >\r\n |\r\n </span>\r\n <span>ASCII</span>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Hex content */}\r\n <div\r\n ref={scrollRef}\r\n role=\"grid\"\r\n aria-label=\"Hex data\"\r\n tabIndex={0}\r\n onScroll={handleHexScroll}\r\n style={{\r\n flex: \"1 1 160px\",\r\n minHeight: 160,\r\n overflow: \"auto\",\r\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,\r\n }}\r\n >\r\n <div\r\n style={{ height: totalRows * HEX_ROW_HEIGHT, position: \"relative\" }}\r\n >\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: startRow * HEX_ROW_HEIGHT,\r\n left: 0,\r\n right: 0,\r\n }}\r\n >\r\n {virtualRows.map((row) => (\r\n <HexRow\r\n key={row.offset}\r\n offset={row.offset}\r\n bytes={row.bytes}\r\n bytesPerRow={localBytesPerRow}\r\n byteGrouping={localGrouping}\r\n offsetBase={localOffsetBase}\r\n totalBytes={data.length}\r\n showAscii={localShowAscii}\r\n showOffset={showOffset}\r\n highlights={allHighlights}\r\n regions={sortedRegions}\r\n effectiveHighlight={effectiveHighlight}\r\n selectedStart={selectStart}\r\n selectedEnd={selectEnd}\r\n cursorOffset={cursorOffset}\r\n onByteMouseDown={handleByteMouseDown}\r\n onByteMouseEnter={handleByteMouseEnter}\r\n onByteClick={handleByteClickCb}\r\n handleByteHoverInternal={handleByteHoverInternal}\r\n handleByteLeaveInternal={handleByteLeaveInternal}\r\n tokens={tokens}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Highlight legend */}\r\n {highlights.length > 0 && (\r\n <div\r\n role=\"group\"\r\n aria-label=\"Search highlights\"\r\n style={{\r\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,\r\n borderTop: `1px solid ${tokens.colors.border.muted}`,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.smd,\r\n flexWrap: \"wrap\",\r\n fontSize: tokens.typography.fontSize.xxs,\r\n background: tokens.colors.background.surface,\r\n }}\r\n >\r\n {highlights\r\n .filter((h) => h.label)\r\n .map((h, i) => (\r\n <span\r\n key={i}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.xs,\r\n }}\r\n >\r\n <span\r\n aria-hidden=\"true\"\r\n style={{\r\n width: 10,\r\n height: 10,\r\n borderRadius: tokens.borderRadius.sm,\r\n background: h.color,\r\n display: \"inline-block\",\r\n }}\r\n />\r\n <span style={{ color: tokens.colors.text.muted }}>\r\n {h.label} (0x{h.start.toString(16)}-0x{h.end.toString(16)})\r\n </span>\r\n </span>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Status bar */}\r\n {showStatusBar && (\r\n <div\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n style={{\r\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\r\n borderTop: `1px solid ${tokens.colors.border.muted}`,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.md,\r\n fontSize: tokens.typography.fontSize.sm,\r\n background: tokens.colors.background.surface,\r\n color: tokens.colors.text.muted,\r\n flexWrap: \"wrap\",\r\n }}\r\n >\r\n <span>Size: {data.length.toLocaleString()} bytes</span>\r\n {cursorOffset >= 0 && cursorOffset < data.length && (\r\n <>\r\n <span>\r\n Offset: 0x{cursorOffset.toString(16).toUpperCase()} (\r\n {cursorOffset})\r\n </span>\r\n <span>\r\n Value: 0x{byteToHex(data[cursorOffset])} ({data[cursorOffset]})\r\n </span>\r\n </>\r\n )}\r\n {selectStart >= 0 && selectEnd >= 0 && selectStart !== selectEnd && (\r\n <span>\r\n Selection: {Math.abs(selectEnd - selectStart) + 1} bytes (0x\r\n {Math.min(selectStart, selectEnd).toString(16).toUpperCase()}-0x\r\n {Math.max(selectStart, selectEnd).toString(16).toUpperCase()})\r\n </span>\r\n )}\r\n {interpretation && (\r\n <span\r\n style={{\r\n display: \"flex\",\r\n gap: tokens.spacing.sm,\r\n color: tokens.colors.text.secondary,\r\n }}\r\n >\r\n <span>U8: {interpretation.u8}</span>\r\n <span>I8: {interpretation.i8}</span>\r\n {interpretation.u16 !== undefined && (\r\n <span>U16: {interpretation.u16}</span>\r\n )}\r\n {interpretation.u32 !== undefined && (\r\n <span>U32: {interpretation.u32}</span>\r\n )}\r\n {interpretation.f32 !== undefined && (\r\n <span>F32: {interpretation.f32.toFixed(6)}</span>\r\n )}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default HexViewer;\r\n"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  import { default as React } from 'react';
2
-
3
2
  /** Built-in colormap names. */
4
- export type ImageColormap = 'cividis' | 'gray';
3
+ export type ImageColormap = "cividis" | "gray";
5
4
  export interface ImageFrameProps {
6
5
  /** Flat, row-major single-channel samples. Length must equal width*height. */
7
6
  data?: number[];