@zendir/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/LICENSE +21 -0
  3. package/README.md +589 -0
  4. package/dist/index.d.ts +8 -0
  5. package/dist/index.js +421 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/react/3d/EarthViewer.d.ts +46 -0
  8. package/dist/react/3d/EarthViewer.js +836 -0
  9. package/dist/react/3d/EarthViewer.js.map +1 -0
  10. package/dist/react/3d/SolarSystemViewer.d.ts +43 -0
  11. package/dist/react/3d/SolarSystemViewer.js +372 -0
  12. package/dist/react/3d/SolarSystemViewer.js.map +1 -0
  13. package/dist/react/3d/ZenSpace3D.d.ts +16 -0
  14. package/dist/react/3d/ZenSpace3D.js +1253 -0
  15. package/dist/react/3d/ZenSpace3D.js.map +1 -0
  16. package/dist/react/3d/ZenSpace3DCesium.d.ts +9 -0
  17. package/dist/react/3d/ZenSpace3DCesium.js +186 -0
  18. package/dist/react/3d/ZenSpace3DCesium.js.map +1 -0
  19. package/dist/react/3d/ZenSpace3DShaders.d.ts +78 -0
  20. package/dist/react/3d/ZenSpace3DShaders.js +94 -0
  21. package/dist/react/3d/ZenSpace3DShaders.js.map +1 -0
  22. package/dist/react/3d/ZenSpace3DTypes.d.ts +614 -0
  23. package/dist/react/3d/ZenSpace3DUtils.d.ts +183 -0
  24. package/dist/react/3d/ZenSpace3DUtils.js +213 -0
  25. package/dist/react/3d/ZenSpace3DUtils.js.map +1 -0
  26. package/dist/react/3d/index.d.ts +23 -0
  27. package/dist/react/3d/threeLoader.d.ts +22 -0
  28. package/dist/react/3d/threeLoader.js +18 -0
  29. package/dist/react/3d/threeLoader.js.map +1 -0
  30. package/dist/react/astro/ClassificationBanner.d.ts +25 -0
  31. package/dist/react/astro/ClassificationBanner.js +83 -0
  32. package/dist/react/astro/ClassificationBanner.js.map +1 -0
  33. package/dist/react/astro/GlobalStatusBar.d.ts +42 -0
  34. package/dist/react/astro/GlobalStatusBar.js +165 -0
  35. package/dist/react/astro/GlobalStatusBar.js.map +1 -0
  36. package/dist/react/astro/MissionClock.d.ts +169 -0
  37. package/dist/react/astro/MissionClock.js +411 -0
  38. package/dist/react/astro/MissionClock.js.map +1 -0
  39. package/dist/react/astro/MonitoringIcon.d.ts +60 -0
  40. package/dist/react/astro/MonitoringIcon.js +369 -0
  41. package/dist/react/astro/MonitoringIcon.js.map +1 -0
  42. package/dist/react/astro/Notification.d.ts +42 -0
  43. package/dist/react/astro/Notification.js +156 -0
  44. package/dist/react/astro/Notification.js.map +1 -0
  45. package/dist/react/astro/Progress.d.ts +39 -0
  46. package/dist/react/astro/Progress.js +149 -0
  47. package/dist/react/astro/Progress.js.map +1 -0
  48. package/dist/react/astro/SimulationControls.d.ts +136 -0
  49. package/dist/react/astro/SimulationControls.js +668 -0
  50. package/dist/react/astro/SimulationControls.js.map +1 -0
  51. package/dist/react/astro/StatusIndicator.d.ts +34 -0
  52. package/dist/react/astro/StatusIndicator.js +189 -0
  53. package/dist/react/astro/StatusIndicator.js.map +1 -0
  54. package/dist/react/astro/UnifiedTimeline.d.ts +106 -0
  55. package/dist/react/astro/UnifiedTimeline.js +1768 -0
  56. package/dist/react/astro/UnifiedTimeline.js.map +1 -0
  57. package/dist/react/astro/index.d.ts +63 -0
  58. package/dist/react/cards/AccessCard.d.ts +37 -0
  59. package/dist/react/cards/AccessCard.js +410 -0
  60. package/dist/react/cards/AccessCard.js.map +1 -0
  61. package/dist/react/cards/OrbitCard.d.ts +31 -0
  62. package/dist/react/cards/OrbitCard.js +372 -0
  63. package/dist/react/cards/OrbitCard.js.map +1 -0
  64. package/dist/react/cards/SpacecraftCard.d.ts +54 -0
  65. package/dist/react/cards/SpacecraftCard.js +941 -0
  66. package/dist/react/cards/SpacecraftCard.js.map +1 -0
  67. package/dist/react/cards/TelemetryCard.d.ts +40 -0
  68. package/dist/react/cards/TelemetryCard.js +742 -0
  69. package/dist/react/cards/TelemetryCard.js.map +1 -0
  70. package/dist/react/cards/TelemetryStreamCard.d.ts +59 -0
  71. package/dist/react/cards/TelemetryStreamCard.js +309 -0
  72. package/dist/react/cards/TelemetryStreamCard.js.map +1 -0
  73. package/dist/react/cards/index.d.ts +13 -0
  74. package/dist/react/charts/GroundTrackMap.d.ts +112 -0
  75. package/dist/react/charts/GroundTrackMap.js +1123 -0
  76. package/dist/react/charts/GroundTrackMap.js.map +1 -0
  77. package/dist/react/charts/GroundTrackMapLeaflet.d.ts +26 -0
  78. package/dist/react/charts/GroundTrackMapLeaflet.js +571 -0
  79. package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -0
  80. package/dist/react/charts/groundTrackMapLeafletTiles.d.ts +22 -0
  81. package/dist/react/charts/groundTrackMapLeafletTiles.js +11 -0
  82. package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -0
  83. package/dist/react/charts/groundTrackMapLeafletUtils.d.ts +24 -0
  84. package/dist/react/charts/groundTrackMapLeafletUtils.js +109 -0
  85. package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -0
  86. package/dist/react/charts/index.d.ts +10 -0
  87. package/dist/react/charts/unified/AstroChart.d.ts +24 -0
  88. package/dist/react/charts/unified/AstroChart.js +1405 -0
  89. package/dist/react/charts/unified/AstroChart.js.map +1 -0
  90. package/dist/react/charts/unified/PowerOverviewChart.d.ts +73 -0
  91. package/dist/react/charts/unified/PowerOverviewChart.js +488 -0
  92. package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -0
  93. package/dist/react/charts/unified/domain.d.ts +845 -0
  94. package/dist/react/charts/unified/domain.js +3168 -0
  95. package/dist/react/charts/unified/domain.js.map +1 -0
  96. package/dist/react/charts/unified/generators.d.ts +276 -0
  97. package/dist/react/charts/unified/generators.js +518 -0
  98. package/dist/react/charts/unified/generators.js.map +1 -0
  99. package/dist/react/charts/unified/index.d.ts +55 -0
  100. package/dist/react/charts/unified/presets.d.ts +290 -0
  101. package/dist/react/charts/unified/presets.js +999 -0
  102. package/dist/react/charts/unified/presets.js.map +1 -0
  103. package/dist/react/charts/unified/sync.d.ts +69 -0
  104. package/dist/react/charts/unified/sync.js +219 -0
  105. package/dist/react/charts/unified/sync.js.map +1 -0
  106. package/dist/react/charts/unified/theme.d.ts +447 -0
  107. package/dist/react/charts/unified/theme.js +562 -0
  108. package/dist/react/charts/unified/theme.js.map +1 -0
  109. package/dist/react/charts/unified/types.d.ts +826 -0
  110. package/dist/react/charts/unified/useChartStream.d.ts +58 -0
  111. package/dist/react/charts/unified/useChartStream.js +226 -0
  112. package/dist/react/charts/unified/useChartStream.js.map +1 -0
  113. package/dist/react/chatgpt/AppCard.d.ts +59 -0
  114. package/dist/react/chatgpt/AppCard.js +306 -0
  115. package/dist/react/chatgpt/AppCard.js.map +1 -0
  116. package/dist/react/chatgpt/ChatGPTCard.d.ts +6 -0
  117. package/dist/react/chatgpt/index.d.ts +167 -0
  118. package/dist/react/chatgpt/index.js +166 -0
  119. package/dist/react/chatgpt/index.js.map +1 -0
  120. package/dist/react/context/DisplaySettingsContext.d.ts +107 -0
  121. package/dist/react/context/DisplaySettingsContext.js +169 -0
  122. package/dist/react/context/DisplaySettingsContext.js.map +1 -0
  123. package/dist/react/context/index.d.ts +5 -0
  124. package/dist/react/core/ActivityPlanner.d.ts +45 -0
  125. package/dist/react/core/ActivityPlanner.js +532 -0
  126. package/dist/react/core/ActivityPlanner.js.map +1 -0
  127. package/dist/react/core/AppBar.d.ts +71 -0
  128. package/dist/react/core/AppBar.js +817 -0
  129. package/dist/react/core/AppBar.js.map +1 -0
  130. package/dist/react/core/AstroIcon.d.ts +84 -0
  131. package/dist/react/core/AstroIcon.js +1243 -0
  132. package/dist/react/core/AstroIcon.js.map +1 -0
  133. package/dist/react/core/Badge.d.ts +27 -0
  134. package/dist/react/core/Badge.js +134 -0
  135. package/dist/react/core/Badge.js.map +1 -0
  136. package/dist/react/core/Button.d.ts +26 -0
  137. package/dist/react/core/Button.js +306 -0
  138. package/dist/react/core/Button.js.map +1 -0
  139. package/dist/react/core/CardHeader.d.ts +34 -0
  140. package/dist/react/core/CardHeader.js +316 -0
  141. package/dist/react/core/CardHeader.js.map +1 -0
  142. package/dist/react/core/ChatPanel.d.ts +627 -0
  143. package/dist/react/core/ChatPanel.js +1144 -0
  144. package/dist/react/core/ChatPanel.js.map +1 -0
  145. package/dist/react/core/Checkbox.d.ts +26 -0
  146. package/dist/react/core/Checkbox.js +130 -0
  147. package/dist/react/core/Checkbox.js.map +1 -0
  148. package/dist/react/core/ColorPickerPanel.d.ts +25 -0
  149. package/dist/react/core/ColorPickerPanel.js +293 -0
  150. package/dist/react/core/ColorPickerPanel.js.map +1 -0
  151. package/dist/react/core/CommandBuilder.d.ts +74 -0
  152. package/dist/react/core/CommandBuilder.js +518 -0
  153. package/dist/react/core/CommandBuilder.js.map +1 -0
  154. package/dist/react/core/ConfirmDialog.d.ts +45 -0
  155. package/dist/react/core/ConfirmDialog.js +315 -0
  156. package/dist/react/core/ConfirmDialog.js.map +1 -0
  157. package/dist/react/core/ConnectionForm.d.ts +57 -0
  158. package/dist/react/core/ConnectionForm.js +496 -0
  159. package/dist/react/core/ConnectionForm.js.map +1 -0
  160. package/dist/react/core/Container.d.ts +51 -0
  161. package/dist/react/core/Container.js +670 -0
  162. package/dist/react/core/Container.js.map +1 -0
  163. package/dist/react/core/CopyButton.d.ts +39 -0
  164. package/dist/react/core/CopyButton.js +105 -0
  165. package/dist/react/core/CopyButton.js.map +1 -0
  166. package/dist/react/core/DataTable.d.ts +113 -0
  167. package/dist/react/core/DataTable.js +446 -0
  168. package/dist/react/core/DataTable.js.map +1 -0
  169. package/dist/react/core/DataValue.d.ts +64 -0
  170. package/dist/react/core/DataValue.js +545 -0
  171. package/dist/react/core/DataValue.js.map +1 -0
  172. package/dist/react/core/Dialog.d.ts +32 -0
  173. package/dist/react/core/Dialog.js +201 -0
  174. package/dist/react/core/Dialog.js.map +1 -0
  175. package/dist/react/core/FileExplorer.d.ts +65 -0
  176. package/dist/react/core/FileExplorer.js +520 -0
  177. package/dist/react/core/FileExplorer.js.map +1 -0
  178. package/dist/react/core/GlassCard.d.ts +129 -0
  179. package/dist/react/core/GlassCard.js +375 -0
  180. package/dist/react/core/GlassCard.js.map +1 -0
  181. package/dist/react/core/HeaderIconWithStatus.d.ts +39 -0
  182. package/dist/react/core/HeaderIconWithStatus.js +157 -0
  183. package/dist/react/core/HeaderIconWithStatus.js.map +1 -0
  184. package/dist/react/core/HexViewer.d.ts +143 -0
  185. package/dist/react/core/HexViewer.js +1106 -0
  186. package/dist/react/core/HexViewer.js.map +1 -0
  187. package/dist/react/core/Icon.d.ts +32 -0
  188. package/dist/react/core/Icon.js +142 -0
  189. package/dist/react/core/Icon.js.map +1 -0
  190. package/dist/react/core/ImageGallery.d.ts +41 -0
  191. package/dist/react/core/ImageGallery.js +320 -0
  192. package/dist/react/core/ImageGallery.js.map +1 -0
  193. package/dist/react/core/Input.d.ts +38 -0
  194. package/dist/react/core/Input.js +288 -0
  195. package/dist/react/core/Input.js.map +1 -0
  196. package/dist/react/core/LimitsBar.d.ts +51 -0
  197. package/dist/react/core/LimitsBar.js +200 -0
  198. package/dist/react/core/LimitsBar.js.map +1 -0
  199. package/dist/react/core/LogViewer.d.ts +61 -0
  200. package/dist/react/core/LogViewer.js +599 -0
  201. package/dist/react/core/LogViewer.js.map +1 -0
  202. package/dist/react/core/MessageStream.d.ts +58 -0
  203. package/dist/react/core/MessageStream.js +455 -0
  204. package/dist/react/core/MessageStream.js.map +1 -0
  205. package/dist/react/core/MissionCalendar.d.ts +81 -0
  206. package/dist/react/core/MissionCalendar.js +1049 -0
  207. package/dist/react/core/MissionCalendar.js.map +1 -0
  208. package/dist/react/core/NumberInput.d.ts +85 -0
  209. package/dist/react/core/NumberInput.js +507 -0
  210. package/dist/react/core/NumberInput.js.map +1 -0
  211. package/dist/react/core/PacketViewer.d.ts +73 -0
  212. package/dist/react/core/PacketViewer.js +431 -0
  213. package/dist/react/core/PacketViewer.js.map +1 -0
  214. package/dist/react/core/Pagination.d.ts +30 -0
  215. package/dist/react/core/Pagination.js +190 -0
  216. package/dist/react/core/Pagination.js.map +1 -0
  217. package/dist/react/core/PinInput.d.ts +41 -0
  218. package/dist/react/core/PinInput.js +210 -0
  219. package/dist/react/core/PinInput.js.map +1 -0
  220. package/dist/react/core/Popover.d.ts +55 -0
  221. package/dist/react/core/Popover.js +288 -0
  222. package/dist/react/core/Popover.js.map +1 -0
  223. package/dist/react/core/Select.d.ts +42 -0
  224. package/dist/react/core/Select.js +303 -0
  225. package/dist/react/core/Select.js.map +1 -0
  226. package/dist/react/core/SideNav.d.ts +103 -0
  227. package/dist/react/core/SideNav.js +551 -0
  228. package/dist/react/core/SideNav.js.map +1 -0
  229. package/dist/react/core/SidePanel.d.ts +33 -0
  230. package/dist/react/core/SidePanel.js +199 -0
  231. package/dist/react/core/SidePanel.js.map +1 -0
  232. package/dist/react/core/Tabs.d.ts +47 -0
  233. package/dist/react/core/Tabs.js +129 -0
  234. package/dist/react/core/Tabs.js.map +1 -0
  235. package/dist/react/core/Toast.d.ts +56 -0
  236. package/dist/react/core/Toast.js +229 -0
  237. package/dist/react/core/Toast.js.map +1 -0
  238. package/dist/react/core/Toggle.d.ts +22 -0
  239. package/dist/react/core/Toggle.js +151 -0
  240. package/dist/react/core/Toggle.js.map +1 -0
  241. package/dist/react/core/Tooltip.d.ts +19 -0
  242. package/dist/react/core/Tooltip.js +179 -0
  243. package/dist/react/core/Tooltip.js.map +1 -0
  244. package/dist/react/core/Typography.d.ts +127 -0
  245. package/dist/react/core/Typography.js +187 -0
  246. package/dist/react/core/Typography.js.map +1 -0
  247. package/dist/react/core/index.d.ts +108 -0
  248. package/dist/react/core/layout/Box.d.ts +77 -0
  249. package/dist/react/core/layout/Box.js +126 -0
  250. package/dist/react/core/layout/Box.js.map +1 -0
  251. package/dist/react/core/layout/Center.d.ts +20 -0
  252. package/dist/react/core/layout/Center.js +34 -0
  253. package/dist/react/core/layout/Center.js.map +1 -0
  254. package/dist/react/core/layout/Divider.d.ts +16 -0
  255. package/dist/react/core/layout/Divider.js +108 -0
  256. package/dist/react/core/layout/Divider.js.map +1 -0
  257. package/dist/react/core/layout/Flex.d.ts +30 -0
  258. package/dist/react/core/layout/Flex.js +128 -0
  259. package/dist/react/core/layout/Flex.js.map +1 -0
  260. package/dist/react/core/layout/Grid.d.ts +36 -0
  261. package/dist/react/core/layout/Grid.js +142 -0
  262. package/dist/react/core/layout/Grid.js.map +1 -0
  263. package/dist/react/core/layout/Spacer.d.ts +8 -0
  264. package/dist/react/core/layout/Spacer.js +31 -0
  265. package/dist/react/core/layout/Spacer.js.map +1 -0
  266. package/dist/react/core/layout/Stack.d.ts +54 -0
  267. package/dist/react/core/layout/Stack.js +74 -0
  268. package/dist/react/core/layout/Stack.js.map +1 -0
  269. package/dist/react/core/layout/index.d.ts +38 -0
  270. package/dist/react/core/layout/responsive.d.ts +23 -0
  271. package/dist/react/core/layout/responsive.js +26 -0
  272. package/dist/react/core/layout/responsive.js.map +1 -0
  273. package/dist/react/core/layout/useBreakpoint.d.ts +77 -0
  274. package/dist/react/core/layout/useBreakpoint.js +73 -0
  275. package/dist/react/core/layout/useBreakpoint.js.map +1 -0
  276. package/dist/react/core/propertyConfig.d.ts +443 -0
  277. package/dist/react/core/propertyConfig.js +399 -0
  278. package/dist/react/core/propertyConfig.js.map +1 -0
  279. package/dist/react/hooks/index.d.ts +21 -0
  280. package/dist/react/hooks/useAccessWindows.d.ts +66 -0
  281. package/dist/react/hooks/useCompactMode.d.ts +82 -0
  282. package/dist/react/hooks/useCompactMode.js +62 -0
  283. package/dist/react/hooks/useCompactMode.js.map +1 -0
  284. package/dist/react/hooks/useLiveSelection.d.ts +57 -0
  285. package/dist/react/hooks/useSimulationPlayback.d.ts +97 -0
  286. package/dist/react/hooks/useSimulationTime.d.ts +61 -0
  287. package/dist/react/hooks/useSpacecraftPosition.d.ts +50 -0
  288. package/dist/react/hooks/useSpacecraftPosition.js +89 -0
  289. package/dist/react/hooks/useSpacecraftPosition.js.map +1 -0
  290. package/dist/react/hooks/useTelemetry.d.ts +55 -0
  291. package/dist/react/hooks/useTelemetry.js +73 -0
  292. package/dist/react/hooks/useTelemetry.js.map +1 -0
  293. package/dist/react/hooks/useZendirSession.d.ts +109 -0
  294. package/dist/react/hooks/useZendirSession.js +148 -0
  295. package/dist/react/hooks/useZendirSession.js.map +1 -0
  296. package/dist/react/index.d.ts +74 -0
  297. package/dist/react/shared/ErrorBoundary.d.ts +63 -0
  298. package/dist/react/shared/ErrorBoundary.js +142 -0
  299. package/dist/react/shared/ErrorBoundary.js.map +1 -0
  300. package/dist/react/shared/Skeleton.d.ts +110 -0
  301. package/dist/react/shared/Skeleton.js +324 -0
  302. package/dist/react/shared/Skeleton.js.map +1 -0
  303. package/dist/react/shared/index.d.ts +12 -0
  304. package/dist/react/theme/ThemeProvider.d.ts +385 -0
  305. package/dist/react/theme/ThemeProvider.js +1096 -0
  306. package/dist/react/theme/ThemeProvider.js.map +1 -0
  307. package/dist/react/theme/astro-tokens.d.ts +153 -0
  308. package/dist/react/theme/cardAccent.d.ts +75 -0
  309. package/dist/react/theme/cardAccent.js +137 -0
  310. package/dist/react/theme/cardAccent.js.map +1 -0
  311. package/dist/react/theme/config.d.ts +39 -0
  312. package/dist/react/theme/index.d.ts +9 -0
  313. package/dist/react/types.d.ts +360 -0
  314. package/dist/react/types.js +58 -0
  315. package/dist/react/types.js.map +1 -0
  316. package/dist/react/utils/index.d.ts +247 -0
  317. package/dist/react/utils/index.js +423 -0
  318. package/dist/react/utils/index.js.map +1 -0
  319. package/dist/react/visualizations/EclipseTimerCard.d.ts +17 -0
  320. package/dist/react/visualizations/EclipseTimerCard.js +250 -0
  321. package/dist/react/visualizations/EclipseTimerCard.js.map +1 -0
  322. package/dist/react/visualizations/LinkBudgetCard.d.ts +50 -0
  323. package/dist/react/visualizations/LinkBudgetCard.js +444 -0
  324. package/dist/react/visualizations/LinkBudgetCard.js.map +1 -0
  325. package/dist/react/visualizations/NavBallCard.d.ts +17 -0
  326. package/dist/react/visualizations/NavBallCard.js +243 -0
  327. package/dist/react/visualizations/NavBallCard.js.map +1 -0
  328. package/dist/react/visualizations/PropulsionCard.d.ts +37 -0
  329. package/dist/react/visualizations/PropulsionCard.js +298 -0
  330. package/dist/react/visualizations/PropulsionCard.js.map +1 -0
  331. package/dist/react/visualizations/SensorFootprintCard.d.ts +33 -0
  332. package/dist/react/visualizations/SensorFootprintCard.js +326 -0
  333. package/dist/react/visualizations/SensorFootprintCard.js.map +1 -0
  334. package/dist/react/visualizations/ThermalHeatmapCard.d.ts +38 -0
  335. package/dist/react/visualizations/ThermalHeatmapCard.js +372 -0
  336. package/dist/react/visualizations/ThermalHeatmapCard.js.map +1 -0
  337. package/dist/react/visualizations/index.d.ts +17 -0
  338. package/dist/react.d.ts +1 -0
  339. package/dist/react.js +421 -0
  340. package/dist/react.js.map +1 -0
  341. package/dist/shaders/atmosphere.frag.js +5 -0
  342. package/dist/shaders/atmosphere.frag.js.map +1 -0
  343. package/dist/shaders/atmosphere.vert.js +5 -0
  344. package/dist/shaders/atmosphere.vert.js.map +1 -0
  345. package/dist/shaders/stars.frag.js +5 -0
  346. package/dist/shaders/stars.frag.js.map +1 -0
  347. package/dist/shaders/stars.vert.js +5 -0
  348. package/dist/shaders/stars.vert.js.map +1 -0
  349. package/dist/style.css +143 -0
  350. package/dist/tokens/index.d.ts +296 -0
  351. package/dist/tokens/index.js +263 -0
  352. package/dist/tokens/index.js.map +1 -0
  353. package/dist/tokens/tokens.css +155 -0
  354. package/dist/types/index.d.ts +23 -0
  355. package/dist/types.d.ts +1 -0
  356. package/dist/types.js +2 -0
  357. package/dist/types.js.map +1 -0
  358. package/package.json +220 -0
  359. package/sdk-stub.js +22 -0
@@ -0,0 +1,431 @@
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import React, { memo, useState, useMemo, useCallback } from "react";
3
+ import { useTheme } from "../theme/ThemeProvider.js";
4
+ function getLimitsColor(state, tokens) {
5
+ switch (state) {
6
+ case "RED":
7
+ case "RED_LOW":
8
+ case "RED_HIGH":
9
+ return tokens.colors.status.critical;
10
+ case "YELLOW":
11
+ case "YELLOW_LOW":
12
+ case "YELLOW_HIGH":
13
+ return tokens.colors.status.caution;
14
+ case "GREEN":
15
+ return tokens.colors.status.normal;
16
+ case "BLUE":
17
+ return tokens.colors.status.standby;
18
+ case "STALE":
19
+ return tokens.colors.status.off;
20
+ default:
21
+ return tokens.colors.text.primary;
22
+ }
23
+ }
24
+ function getLimitsBg(state, tokens) {
25
+ const color = getLimitsColor(state, tokens);
26
+ return state ? `${color}18` : "transparent";
27
+ }
28
+ function getLimitsShapeStyle(state, color) {
29
+ const base = {
30
+ width: 8,
31
+ height: 8,
32
+ display: "inline-block",
33
+ background: color,
34
+ boxShadow: `0 0 4px ${color}66`
35
+ };
36
+ switch (state) {
37
+ case "GREEN":
38
+ return { ...base, borderRadius: "50%" };
39
+ case "YELLOW":
40
+ case "YELLOW_LOW":
41
+ case "YELLOW_HIGH":
42
+ return { ...base, borderRadius: "1px" };
43
+ case "RED":
44
+ case "RED_LOW":
45
+ case "RED_HIGH":
46
+ return {
47
+ ...base,
48
+ borderRadius: 0,
49
+ // critical → triangle down
50
+ clipPath: "polygon(50% 100%, 0% 0%, 100% 0%)"
51
+ };
52
+ case "BLUE":
53
+ return {
54
+ ...base,
55
+ borderRadius: "50%",
56
+ width: 6,
57
+ height: 6,
58
+ // standby → hollow ring
59
+ background: "transparent",
60
+ border: `2px solid ${color}`,
61
+ boxShadow: "none"
62
+ };
63
+ case "STALE":
64
+ return {
65
+ ...base,
66
+ borderRadius: "50%",
67
+ width: 5,
68
+ height: 5,
69
+ // off → small dot
70
+ opacity: 0.6
71
+ };
72
+ default:
73
+ return { ...base, borderRadius: "50%" };
74
+ }
75
+ }
76
+ function getDisplayValue(item, mode) {
77
+ switch (mode) {
78
+ case "raw":
79
+ return String(item.value);
80
+ case "converted":
81
+ return String(item.convertedValue ?? item.value);
82
+ case "formatted":
83
+ return item.formattedValue ?? String(item.convertedValue ?? item.value);
84
+ case "with_units": {
85
+ const val = item.formattedValue ?? String(item.convertedValue ?? item.value);
86
+ return item.units ? `${val} ${item.units}` : val;
87
+ }
88
+ }
89
+ }
90
+ const PacketViewer = memo(function PacketViewer2({
91
+ target,
92
+ packet,
93
+ items,
94
+ viewMode: initialViewMode = "converted",
95
+ height = 500,
96
+ derivedLast = true,
97
+ showSearch = true,
98
+ showViewMode = true,
99
+ compact = false,
100
+ onItemClick,
101
+ className = "",
102
+ bordered = true,
103
+ style: styleProp
104
+ }) {
105
+ const { tokens, theme } = useTheme();
106
+ const isTransparentTheme = theme === "transparent" || theme === "transparent-bold" || theme === "transparent-minimal";
107
+ const [searchQuery, setSearchQuery] = useState("");
108
+ const [viewMode, setViewMode] = useState(initialViewMode);
109
+ const [selectedItem, setSelectedItem] = useState(null);
110
+ const [showDetails, setShowDetails] = useState(false);
111
+ const [scrollTop, setScrollTop] = useState(0);
112
+ const [viewportHeight, setViewportHeight] = useState(240);
113
+ const listRef = React.useRef(null);
114
+ const sortedItems = useMemo(() => {
115
+ let filtered = items;
116
+ if (searchQuery.trim()) {
117
+ const q = searchQuery.toLowerCase();
118
+ filtered = items.filter((i) => i.name.toLowerCase().includes(q) || i.description && i.description.toLowerCase().includes(q));
119
+ }
120
+ if (derivedLast) {
121
+ const regular = filtered.filter((i) => !i.derived);
122
+ const derived = filtered.filter((i) => i.derived);
123
+ return [...regular, ...derived];
124
+ }
125
+ return filtered;
126
+ }, [items, searchQuery, derivedLast]);
127
+ const handleItemClick = useCallback((item) => {
128
+ setSelectedItem(item);
129
+ setShowDetails(true);
130
+ onItemClick == null ? void 0 : onItemClick(item);
131
+ }, [onItemClick]);
132
+ const rowHeight = compact ? 26 : 32;
133
+ const overscanRows = 12;
134
+ const totalRows = sortedItems.length;
135
+ const startRow = Math.max(0, Math.floor(scrollTop / rowHeight) - overscanRows);
136
+ const visibleRows = Math.ceil(viewportHeight / rowHeight) + overscanRows * 2;
137
+ const endRow = Math.min(totalRows, startRow + visibleRows);
138
+ const visibleItems = useMemo(
139
+ () => sortedItems.slice(startRow, endRow),
140
+ [sortedItems, startRow, endRow]
141
+ );
142
+ React.useEffect(() => {
143
+ const el = listRef.current;
144
+ if (!el) return void 0;
145
+ const updateHeight = () => setViewportHeight(Math.max(rowHeight * 4, el.clientHeight || 240));
146
+ updateHeight();
147
+ if (typeof ResizeObserver !== "undefined") {
148
+ const observer = new ResizeObserver(updateHeight);
149
+ observer.observe(el);
150
+ return () => observer.disconnect();
151
+ }
152
+ window.addEventListener("resize", updateHeight);
153
+ return () => window.removeEventListener("resize", updateHeight);
154
+ }, [rowHeight]);
155
+ return /* @__PURE__ */ jsxs(
156
+ "div",
157
+ {
158
+ className: `packet-viewer ${className}`,
159
+ style: {
160
+ height: typeof height === "number" ? height : void 0,
161
+ background: tokens.colors.background.base,
162
+ ...bordered ? tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` } : { border: "none" },
163
+ borderRadius: tokens.borderRadius.lg,
164
+ overflow: "hidden",
165
+ display: "flex",
166
+ flexDirection: "column",
167
+ fontFamily: tokens.typography.fontFamily.primary,
168
+ color: tokens.colors.text.primary,
169
+ backdropFilter: isTransparentTheme ? "blur(10px)" : void 0,
170
+ WebkitBackdropFilter: isTransparentTheme ? "blur(10px)" : void 0,
171
+ ...styleProp
172
+ },
173
+ children: [
174
+ /* @__PURE__ */ jsxs("div", { style: {
175
+ padding: "8px 12px",
176
+ borderBottom: `1px solid ${tokens.colors.border.muted}`,
177
+ display: "flex",
178
+ alignItems: "center",
179
+ justifyContent: "space-between",
180
+ background: tokens.colors.background.surface,
181
+ backdropFilter: "blur(8px)",
182
+ flexWrap: "wrap",
183
+ gap: 8
184
+ }, children: [
185
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
186
+ target && /* @__PURE__ */ jsx("span", { style: {
187
+ background: `${tokens.colors.interactive.default}22`,
188
+ color: tokens.colors.interactive.default,
189
+ padding: "2px 8px",
190
+ borderRadius: tokens.borderRadius.md,
191
+ fontSize: tokens.typography.fontSize.xxs,
192
+ fontWeight: 600
193
+ }, children: target }),
194
+ packet && /* @__PURE__ */ jsx("span", { style: { fontWeight: 600, fontSize: tokens.typography.fontSize.sm }, children: packet }),
195
+ /* @__PURE__ */ jsxs("span", { style: { fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.text.muted }, children: [
196
+ sortedItems.length,
197
+ " items"
198
+ ] })
199
+ ] }),
200
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
201
+ showViewMode && /* @__PURE__ */ jsxs(
202
+ "select",
203
+ {
204
+ value: viewMode,
205
+ onChange: (e) => setViewMode(e.target.value),
206
+ "aria-label": "Packet view mode",
207
+ style: {
208
+ background: tokens.colors.background.base,
209
+ color: tokens.colors.text.primary,
210
+ border: `1px solid ${tokens.colors.border.muted}`,
211
+ borderRadius: tokens.borderRadius.md,
212
+ padding: "3px 8px",
213
+ fontSize: tokens.typography.fontSize.xxs
214
+ },
215
+ children: [
216
+ /* @__PURE__ */ jsx("option", { value: "raw", children: "Raw" }),
217
+ /* @__PURE__ */ jsx("option", { value: "converted", children: "Converted" }),
218
+ /* @__PURE__ */ jsx("option", { value: "formatted", children: "Formatted" }),
219
+ /* @__PURE__ */ jsx("option", { value: "with_units", children: "With Units" })
220
+ ]
221
+ }
222
+ ),
223
+ showSearch && /* @__PURE__ */ jsx(
224
+ "input",
225
+ {
226
+ type: "text",
227
+ value: searchQuery,
228
+ onChange: (e) => setSearchQuery(e.target.value),
229
+ placeholder: "Filter items...",
230
+ "aria-label": "Filter packet items",
231
+ style: {
232
+ background: tokens.colors.background.base,
233
+ color: tokens.colors.text.primary,
234
+ border: `1px solid ${tokens.colors.border.muted}`,
235
+ borderRadius: tokens.borderRadius.md,
236
+ padding: "3px 8px",
237
+ fontSize: tokens.typography.fontSize.xxs,
238
+ outline: "none",
239
+ minWidth: 120
240
+ }
241
+ }
242
+ )
243
+ ] })
244
+ ] }),
245
+ /* @__PURE__ */ jsxs("div", { role: "row", style: {
246
+ display: "grid",
247
+ gridTemplateColumns: "1fr 1fr auto",
248
+ padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,
249
+ borderBottom: `1px solid ${tokens.colors.border.muted}`,
250
+ background: tokens.colors.background.surface,
251
+ fontSize: tokens.typography.fontSize.xxs,
252
+ color: tokens.colors.text.muted,
253
+ textTransform: "uppercase",
254
+ letterSpacing: "0.5px",
255
+ fontWeight: tokens.typography.fontWeight.medium
256
+ }, children: [
257
+ /* @__PURE__ */ jsx("span", { role: "columnheader", children: "Item" }),
258
+ /* @__PURE__ */ jsx("span", { role: "columnheader", style: { textAlign: "right" }, children: "Value" }),
259
+ /* @__PURE__ */ jsx("span", { role: "columnheader", style: { minWidth: 50, textAlign: "center" }, children: "Limits" })
260
+ ] }),
261
+ /* @__PURE__ */ jsx(
262
+ "div",
263
+ {
264
+ ref: listRef,
265
+ role: "rowgroup",
266
+ onScroll: (e) => setScrollTop(e.currentTarget.scrollTop),
267
+ style: { flex: 1, overflow: "auto" },
268
+ children: /* @__PURE__ */ jsx("div", { style: { height: totalRows * rowHeight, position: "relative" }, children: /* @__PURE__ */ jsx("div", { style: { position: "absolute", top: startRow * rowHeight, left: 0, right: 0 }, children: visibleItems.map((item, visibleIdx) => {
269
+ var _a, _b, _c, _d;
270
+ const idx = startRow + visibleIdx;
271
+ const limitsColor = item.stale ? tokens.colors.status.off : getLimitsColor(((_a = item.limits) == null ? void 0 : _a.state) ?? null, tokens);
272
+ const limitsBg = item.stale ? `${tokens.colors.status.off}14` : getLimitsBg(((_b = item.limits) == null ? void 0 : _b.state) ?? null, tokens);
273
+ return /* @__PURE__ */ jsxs(
274
+ "div",
275
+ {
276
+ role: "row",
277
+ tabIndex: 0,
278
+ onClick: () => handleItemClick(item),
279
+ onKeyDown: (e) => {
280
+ if (e.key === "Enter" || e.key === " ") {
281
+ e.preventDefault();
282
+ handleItemClick(item);
283
+ }
284
+ },
285
+ "aria-label": `${item.name}: ${getDisplayValue(item, viewMode)}${((_c = item.limits) == null ? void 0 : _c.state) ? `, ${item.limits.state}` : ""}`,
286
+ style: {
287
+ display: "grid",
288
+ gridTemplateColumns: "1fr 1fr auto",
289
+ padding: `0 ${tokens.spacing.smd}`,
290
+ height: rowHeight,
291
+ alignItems: "center",
292
+ borderBottom: `1px solid ${tokens.colors.border.muted}`,
293
+ cursor: "pointer",
294
+ transition: "background 150ms ease",
295
+ background: item.derived ? `${tokens.colors.background.surface}44` : "transparent"
296
+ },
297
+ onMouseEnter: (e) => {
298
+ e.currentTarget.style.background = tokens.colors.background.surface;
299
+ },
300
+ onMouseLeave: (e) => {
301
+ e.currentTarget.style.background = item.derived ? `${tokens.colors.background.surface}44` : "transparent";
302
+ },
303
+ children: [
304
+ /* @__PURE__ */ jsx("span", { style: {
305
+ fontSize: compact ? tokens.typography.fontSize.xxs : tokens.typography.fontSize.xs,
306
+ fontWeight: 500,
307
+ color: item.derived ? tokens.colors.text.muted : tokens.colors.text.primary,
308
+ fontStyle: item.derived ? "italic" : "normal",
309
+ overflow: "hidden",
310
+ textOverflow: "ellipsis",
311
+ whiteSpace: "nowrap"
312
+ }, children: item.name }),
313
+ /* @__PURE__ */ jsx("span", { style: {
314
+ textAlign: "right",
315
+ fontFamily: tokens.typography.fontFamily.mono,
316
+ fontSize: compact ? tokens.typography.fontSize.xxs : tokens.typography.fontSize.xs,
317
+ fontWeight: 600,
318
+ color: limitsColor,
319
+ background: limitsBg,
320
+ padding: "2px 8px",
321
+ borderRadius: tokens.borderRadius.sm,
322
+ overflow: "hidden",
323
+ textOverflow: "ellipsis",
324
+ whiteSpace: "nowrap"
325
+ }, children: getDisplayValue(item, viewMode) }),
326
+ /* @__PURE__ */ jsx("div", { style: { minWidth: 50, display: "flex", justifyContent: "center" }, children: ((_d = item.limits) == null ? void 0 : _d.state) && /* @__PURE__ */ jsxs("div", { style: {
327
+ display: "flex",
328
+ alignItems: "center",
329
+ gap: 3
330
+ }, children: [
331
+ /* @__PURE__ */ jsx("span", { style: getLimitsShapeStyle(item.limits.state, limitsColor) }),
332
+ /* @__PURE__ */ jsx("span", { style: { fontSize: tokens.typography.fontSize.micro, color: limitsColor, fontWeight: 600 }, children: item.limits.state.replace(/_/g, " ") })
333
+ ] }) })
334
+ ]
335
+ },
336
+ item.name + idx
337
+ );
338
+ }) }) })
339
+ }
340
+ ),
341
+ showDetails && selectedItem && /* @__PURE__ */ jsxs("div", { style: {
342
+ borderTop: `1px solid ${tokens.colors.border.muted}`,
343
+ background: tokens.colors.background.surface,
344
+ padding: 12,
345
+ maxHeight: 200,
346
+ overflow: "auto"
347
+ }, children: [
348
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", marginBottom: tokens.spacing.sm }, children: [
349
+ /* @__PURE__ */ jsx("span", { style: { fontWeight: tokens.typography.fontWeight.bold, fontSize: tokens.typography.fontSize.sm }, children: selectedItem.name }),
350
+ /* @__PURE__ */ jsx(
351
+ "button",
352
+ {
353
+ onClick: () => setShowDetails(false),
354
+ "aria-label": "Close details panel",
355
+ style: { background: "none", border: "none", color: tokens.colors.text.muted, cursor: "pointer", fontSize: tokens.typography.fontSize.lg, padding: tokens.spacing.xs, lineHeight: 1 },
356
+ children: "✕"
357
+ }
358
+ )
359
+ ] }),
360
+ selectedItem.description && /* @__PURE__ */ jsx("p", { style: { color: tokens.colors.text.secondary, fontSize: tokens.typography.fontSize.xs, marginBottom: 8 }, children: selectedItem.description }),
361
+ /* @__PURE__ */ jsxs("div", { style: {
362
+ display: "grid",
363
+ gridTemplateColumns: "auto 1fr",
364
+ gap: "4px 12px",
365
+ fontSize: tokens.typography.fontSize.xxs,
366
+ fontFamily: tokens.typography.fontFamily.mono
367
+ }, children: [
368
+ /* @__PURE__ */ jsx("span", { style: { color: tokens.colors.text.muted }, children: "Raw:" }),
369
+ /* @__PURE__ */ jsx("span", { children: String(selectedItem.value) }),
370
+ selectedItem.convertedValue !== void 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
371
+ /* @__PURE__ */ jsx("span", { style: { color: tokens.colors.text.muted }, children: "Converted:" }),
372
+ /* @__PURE__ */ jsx("span", { children: String(selectedItem.convertedValue) })
373
+ ] }),
374
+ selectedItem.units && /* @__PURE__ */ jsxs(Fragment, { children: [
375
+ /* @__PURE__ */ jsx("span", { style: { color: tokens.colors.text.muted }, children: "Units:" }),
376
+ /* @__PURE__ */ jsx("span", { children: selectedItem.units })
377
+ ] }),
378
+ selectedItem.dataType && /* @__PURE__ */ jsxs(Fragment, { children: [
379
+ /* @__PURE__ */ jsx("span", { style: { color: tokens.colors.text.muted }, children: "Type:" }),
380
+ /* @__PURE__ */ jsx("span", { children: selectedItem.dataType })
381
+ ] }),
382
+ selectedItem.bitSize !== void 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
383
+ /* @__PURE__ */ jsx("span", { style: { color: tokens.colors.text.muted }, children: "Bit Size:" }),
384
+ /* @__PURE__ */ jsx("span", { children: selectedItem.bitSize })
385
+ ] }),
386
+ selectedItem.bitOffset !== void 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
387
+ /* @__PURE__ */ jsx("span", { style: { color: tokens.colors.text.muted }, children: "Bit Offset:" }),
388
+ /* @__PURE__ */ jsx("span", { children: selectedItem.bitOffset })
389
+ ] }),
390
+ selectedItem.conversion && /* @__PURE__ */ jsxs(Fragment, { children: [
391
+ /* @__PURE__ */ jsx("span", { style: { color: tokens.colors.text.muted }, children: "Conversion:" }),
392
+ /* @__PURE__ */ jsx("span", { children: selectedItem.conversion })
393
+ ] }),
394
+ selectedItem.limits && /* @__PURE__ */ jsxs(Fragment, { children: [
395
+ /* @__PURE__ */ jsx("span", { style: { color: tokens.colors.text.muted }, children: "Limits State:" }),
396
+ /* @__PURE__ */ jsx("span", { style: { color: getLimitsColor(selectedItem.limits.state, tokens) }, children: selectedItem.limits.state }),
397
+ selectedItem.limits.redLow !== void 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
398
+ /* @__PURE__ */ jsx("span", { style: { color: tokens.colors.text.muted }, children: "Red Low:" }),
399
+ /* @__PURE__ */ jsx("span", { children: selectedItem.limits.redLow })
400
+ ] }),
401
+ selectedItem.limits.yellowLow !== void 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
402
+ /* @__PURE__ */ jsx("span", { style: { color: tokens.colors.text.muted }, children: "Yellow Low:" }),
403
+ /* @__PURE__ */ jsx("span", { children: selectedItem.limits.yellowLow })
404
+ ] }),
405
+ selectedItem.limits.greenHigh !== void 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
406
+ /* @__PURE__ */ jsx("span", { style: { color: tokens.colors.text.muted }, children: "Green High:" }),
407
+ /* @__PURE__ */ jsx("span", { children: selectedItem.limits.greenHigh })
408
+ ] }),
409
+ selectedItem.limits.yellowHigh !== void 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
410
+ /* @__PURE__ */ jsx("span", { style: { color: tokens.colors.text.muted }, children: "Yellow High:" }),
411
+ /* @__PURE__ */ jsx("span", { children: selectedItem.limits.yellowHigh })
412
+ ] }),
413
+ selectedItem.limits.redHigh !== void 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
414
+ /* @__PURE__ */ jsx("span", { style: { color: tokens.colors.text.muted }, children: "Red High:" }),
415
+ /* @__PURE__ */ jsx("span", { children: selectedItem.limits.redHigh })
416
+ ] })
417
+ ] }),
418
+ selectedItem.states && /* @__PURE__ */ jsxs(Fragment, { children: [
419
+ /* @__PURE__ */ jsx("span", { style: { color: tokens.colors.text.muted }, children: "States:" }),
420
+ /* @__PURE__ */ jsx("span", { children: Object.entries(selectedItem.states).map(([k, v]) => `${k}=${v}`).join(", ") })
421
+ ] })
422
+ ] })
423
+ ] })
424
+ ]
425
+ }
426
+ );
427
+ });
428
+ export {
429
+ PacketViewer
430
+ };
431
+ //# sourceMappingURL=PacketViewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PacketViewer.js","sources":["../../../src/react/core/PacketViewer.tsx"],"sourcesContent":["/**\n * @zendir/ui - PacketViewer Component\n * \n * Live telemetry packet viewer for spacecraft data analysis and monitoring.\n * Displays telemetry items with limits coloring, raw/converted/formatted views,\n * item details, and search filtering.\n * \n * Features:\n * - Table of telemetry items with name, value, limits status\n * - Limits coloring (blue, green, yellow, red) on values\n * - View modes: raw, converted, formatted, with-units\n * - Item search/filter\n * - Item details on click (type, conversion, limits, description)\n * - Stale data detection\n * - Configurable refresh rate display\n * - Compact mode for high-density displays\n * \n * @example\n * ```tsx\n * <PacketViewer\n * target=\"INST\"\n * packet=\"HEALTH_STATUS\"\n * items={[\n * { name: 'TEMP1', value: 72.5, limits: { state: 'GREEN', redLow: 0, yellowLow: 20, greenLow: 40, greenHigh: 80, yellowHigh: 90, redHigh: 100 } },\n * { name: 'VOLTAGE', value: 28.1, units: 'V' },\n * ]}\n * />\n * ```\n */\n\nimport React, { useState, useMemo, useCallback, memo } from 'react';\nimport { useTheme } from '../theme';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type PacketItemLimitsState = 'BLUE' | 'GREEN' | 'YELLOW' | 'YELLOW_LOW' | 'YELLOW_HIGH' | 'RED' | 'RED_LOW' | 'RED_HIGH' | 'STALE' | null;\nexport type PacketViewMode = 'raw' | 'converted' | 'formatted' | 'with_units';\n\nexport interface PacketItemLimits {\n state: PacketItemLimitsState;\n redLow?: number;\n yellowLow?: number;\n greenLow?: number;\n greenHigh?: number;\n yellowHigh?: number;\n redHigh?: number;\n}\n\nexport interface PacketItem {\n /** Item name (e.g., TEMP1, VOLTAGE) */\n name: string;\n /** Raw value */\n value: number | string | boolean;\n /** Converted value (after read conversion) */\n convertedValue?: number | string;\n /** Formatted value (with format string applied) */\n formattedValue?: string;\n /** Units string */\n units?: string;\n /** Limits definition and current state */\n limits?: PacketItemLimits;\n /** Item description */\n description?: string;\n /** Data type (e.g., UINT, INT, FLOAT, STRING, BLOCK, DERIVED) */\n dataType?: string;\n /** Bit size */\n bitSize?: number;\n /** Bit offset */\n bitOffset?: number;\n /** Whether this is a derived item */\n derived?: boolean;\n /** Conversion applied */\n conversion?: string;\n /** States map (for state items) */\n states?: Record<string, number | string>;\n /** Whether value is stale */\n stale?: boolean;\n}\n\nexport interface PacketViewerProps {\n /** Target name */\n target?: string;\n /** Packet name */\n packet?: string;\n /** Array of packet items */\n items: PacketItem[];\n /** View mode (default: 'converted') */\n viewMode?: PacketViewMode;\n /** Height (default: 500) */\n height?: number | string;\n /** Show derived items last (default: true) */\n derivedLast?: boolean;\n /** Show search bar (default: true) */\n showSearch?: boolean;\n /** Show view mode selector (default: true) */\n showViewMode?: boolean;\n /** Compact mode */\n compact?: boolean;\n /** Called when an item is clicked */\n onItemClick?: (item: PacketItem) => void;\n /** CSS class */\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 getLimitsColor(state: PacketItemLimitsState, tokens: ReturnType<typeof useTheme>['tokens']): string {\n switch (state) {\n case 'RED': case 'RED_LOW': case 'RED_HIGH': return tokens.colors.status.critical;\n case 'YELLOW': case 'YELLOW_LOW': case 'YELLOW_HIGH': return tokens.colors.status.caution;\n case 'GREEN': return tokens.colors.status.normal;\n case 'BLUE': return tokens.colors.status.standby;\n case 'STALE': return tokens.colors.status.off;\n default: return tokens.colors.text.primary;\n }\n}\n\nfunction getLimitsBg(state: PacketItemLimitsState, tokens: ReturnType<typeof useTheme>['tokens']): string {\n const color = getLimitsColor(state, tokens);\n return state ? `${color}18` : 'transparent';\n}\n\n/**\n * Return Astro UX-compliant status shape style for a limits state.\n * Maps packet limits levels to the canonical Astro status shapes:\n * BLUE/STALE → off (small circle), GREEN → normal (filled circle),\n * YELLOW → caution (square), RED → critical (triangle down via clip-path)\n */\nfunction getLimitsShapeStyle(state: PacketItemLimitsState, color: string): React.CSSProperties {\n const base: React.CSSProperties = {\n width: 8, height: 8, display: 'inline-block',\n background: color, boxShadow: `0 0 4px ${color}66`,\n };\n switch (state) {\n case 'GREEN':\n return { ...base, borderRadius: '50%' }; // normal → circle\n case 'YELLOW': case 'YELLOW_LOW': case 'YELLOW_HIGH':\n return { ...base, borderRadius: '1px' }; // caution → square\n case 'RED': case 'RED_LOW': case 'RED_HIGH':\n return { ...base, borderRadius: 0, // critical → triangle down\n clipPath: 'polygon(50% 100%, 0% 0%, 100% 0%)' };\n case 'BLUE':\n return { ...base, borderRadius: '50%', width: 6, height: 6, // standby → hollow ring\n background: 'transparent', border: `2px solid ${color}`, boxShadow: 'none' };\n case 'STALE':\n return { ...base, borderRadius: '50%', width: 5, height: 5, // off → small dot\n opacity: 0.6 };\n default:\n return { ...base, borderRadius: '50%' };\n }\n}\n\nfunction getDisplayValue(item: PacketItem, mode: PacketViewMode): string {\n switch (mode) {\n case 'raw': return String(item.value);\n case 'converted': return String(item.convertedValue ?? item.value);\n case 'formatted': return item.formattedValue ?? String(item.convertedValue ?? item.value);\n case 'with_units': {\n const val = item.formattedValue ?? String(item.convertedValue ?? item.value);\n return item.units ? `${val} ${item.units}` : val;\n }\n }\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\nexport const PacketViewer = memo(function PacketViewer({\n target,\n packet,\n items,\n viewMode: initialViewMode = 'converted',\n height = 500,\n derivedLast = true,\n showSearch = true,\n showViewMode = true,\n compact = false,\n onItemClick,\n className = '',\n bordered = true,\n style: styleProp,\n}: PacketViewerProps): React.ReactElement {\n const { tokens, theme } = useTheme();\n const isTransparentTheme =\n theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n const [searchQuery, setSearchQuery] = useState('');\n const [viewMode, setViewMode] = useState(initialViewMode);\n const [selectedItem, setSelectedItem] = useState<PacketItem | null>(null);\n const [showDetails, setShowDetails] = useState(false);\n const [scrollTop, setScrollTop] = useState(0);\n const [viewportHeight, setViewportHeight] = useState(240);\n const listRef = React.useRef<HTMLDivElement>(null);\n\n const sortedItems = useMemo(() => {\n let filtered = items;\n if (searchQuery.trim()) {\n const q = searchQuery.toLowerCase();\n filtered = items.filter(i => i.name.toLowerCase().includes(q) || (i.description && i.description.toLowerCase().includes(q)));\n }\n if (derivedLast) {\n const regular = filtered.filter(i => !i.derived);\n const derived = filtered.filter(i => i.derived);\n return [...regular, ...derived];\n }\n return filtered;\n }, [items, searchQuery, derivedLast]);\n\n const handleItemClick = useCallback((item: PacketItem) => {\n setSelectedItem(item);\n setShowDetails(true);\n onItemClick?.(item);\n }, [onItemClick]);\n\n const rowHeight = compact ? 26 : 32;\n const overscanRows = 12;\n const totalRows = sortedItems.length;\n const startRow = Math.max(0, Math.floor(scrollTop / rowHeight) - overscanRows);\n const visibleRows = Math.ceil(viewportHeight / rowHeight) + overscanRows * 2;\n const endRow = Math.min(totalRows, startRow + visibleRows);\n const visibleItems = useMemo(\n () => sortedItems.slice(startRow, endRow),\n [sortedItems, startRow, endRow],\n );\n\n React.useEffect(() => {\n const el = listRef.current;\n if (!el) return undefined;\n\n const updateHeight = () => setViewportHeight(Math.max(rowHeight * 4, el.clientHeight || 240));\n updateHeight();\n\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(updateHeight);\n observer.observe(el);\n return () => observer.disconnect();\n }\n\n window.addEventListener('resize', updateHeight);\n return () => window.removeEventListener('resize', updateHeight);\n }, [rowHeight]);\n\n return (\n <div\n className={`packet-viewer ${className}`}\n style={{\n height: typeof height === 'number' ? height : undefined,\n background: tokens.colors.background.base,\n ...(bordered ? (tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` }) : { border: 'none' }),\n borderRadius: tokens.borderRadius.lg,\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n fontFamily: tokens.typography.fontFamily.primary,\n color: tokens.colors.text.primary,\n backdropFilter: isTransparentTheme ? 'blur(10px)' : undefined,\n WebkitBackdropFilter: isTransparentTheme ? 'blur(10px)' : undefined,\n ...styleProp,\n }}\n >\n {/* Header */}\n <div style={{\n padding: '8px 12px',\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n background: tokens.colors.background.surface,\n backdropFilter: 'blur(8px)',\n flexWrap: 'wrap',\n gap: 8,\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {target && (\n <span style={{\n background: `${tokens.colors.interactive.default}22`,\n color: tokens.colors.interactive.default,\n padding: '2px 8px', borderRadius: tokens.borderRadius.md, fontSize: tokens.typography.fontSize.xxs, fontWeight: 600,\n }}>\n {target}\n </span>\n )}\n {packet && (\n <span style={{ fontWeight: 600, fontSize: tokens.typography.fontSize.sm }}>{packet}</span>\n )}\n <span style={{ fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.text.muted }}>\n {sortedItems.length} items\n </span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {showViewMode && (\n <select\n value={viewMode}\n onChange={e => setViewMode(e.target.value as PacketViewMode)}\n aria-label=\"Packet view mode\"\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: '3px 8px', fontSize: tokens.typography.fontSize.xxs,\n }}\n >\n <option value=\"raw\">Raw</option>\n <option value=\"converted\">Converted</option>\n <option value=\"formatted\">Formatted</option>\n <option value=\"with_units\">With Units</option>\n </select>\n )}\n {showSearch && (\n <input\n type=\"text\"\n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n placeholder=\"Filter items...\"\n aria-label=\"Filter packet items\"\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: '3px 8px', fontSize: tokens.typography.fontSize.xxs,\n outline: 'none', minWidth: 120,\n }}\n />\n )}\n </div>\n </div>\n\n {/* Column headers */}\n <div role=\"row\" style={{\n display: 'grid',\n gridTemplateColumns: '1fr 1fr auto',\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n background: tokens.colors.background.surface,\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 }}>\n <span role=\"columnheader\">Item</span>\n <span role=\"columnheader\" style={{ textAlign: 'right' }}>Value</span>\n <span role=\"columnheader\" style={{ minWidth: 50, textAlign: 'center' }}>Limits</span>\n </div>\n\n {/* Items list */}\n <div\n ref={listRef}\n role=\"rowgroup\"\n onScroll={e => setScrollTop(e.currentTarget.scrollTop)}\n style={{ flex: 1, overflow: 'auto' }}\n >\n <div style={{ height: totalRows * rowHeight, position: 'relative' }}>\n <div style={{ position: 'absolute', top: startRow * rowHeight, left: 0, right: 0 }}>\n {visibleItems.map((item, visibleIdx) => {\n const idx = startRow + visibleIdx;\n const limitsColor = item.stale\n ? tokens.colors.status.off\n : getLimitsColor(item.limits?.state ?? null, tokens);\n const limitsBg = item.stale\n ? `${tokens.colors.status.off}14`\n : getLimitsBg(item.limits?.state ?? null, tokens);\n\n return (\n <div\n role=\"row\"\n tabIndex={0}\n key={item.name + idx}\n onClick={() => handleItemClick(item)}\n onKeyDown={e => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleItemClick(item); } }}\n aria-label={`${item.name}: ${getDisplayValue(item, viewMode)}${item.limits?.state ? `, ${item.limits.state}` : ''}`}\n style={{\n display: 'grid',\n gridTemplateColumns: '1fr 1fr auto',\n padding: `0 ${tokens.spacing.smd}`,\n height: rowHeight,\n alignItems: 'center',\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n cursor: 'pointer',\n transition: 'background 150ms ease',\n background: item.derived ? `${tokens.colors.background.surface}44` : 'transparent',\n }}\n onMouseEnter={e => { (e.currentTarget as HTMLDivElement).style.background = tokens.colors.background.surface; }}\n onMouseLeave={e => { (e.currentTarget as HTMLDivElement).style.background = item.derived ? `${tokens.colors.background.surface}44` : 'transparent'; }}\n >\n {/* Item name */}\n <span style={{\n fontSize: compact ? tokens.typography.fontSize.xxs : tokens.typography.fontSize.xs,\n fontWeight: 500,\n color: item.derived ? tokens.colors.text.muted : tokens.colors.text.primary,\n fontStyle: item.derived ? 'italic' : 'normal',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}>\n {item.name}\n </span>\n\n {/* Value */}\n <span style={{\n textAlign: 'right',\n fontFamily: tokens.typography.fontFamily.mono,\n fontSize: compact ? tokens.typography.fontSize.xxs : tokens.typography.fontSize.xs,\n fontWeight: 600,\n color: limitsColor,\n background: limitsBg,\n padding: '2px 8px',\n borderRadius: tokens.borderRadius.sm,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}>\n {getDisplayValue(item, viewMode)}\n </span>\n\n {/* Limits indicator — Astro UX status shape */}\n <div style={{ minWidth: 50, display: 'flex', justifyContent: 'center' }}>\n {item.limits?.state && (\n <div style={{\n display: 'flex', alignItems: 'center', gap: 3,\n }}>\n <span style={getLimitsShapeStyle(item.limits.state, limitsColor)} />\n <span style={{ fontSize: tokens.typography.fontSize.micro, color: limitsColor, fontWeight: 600 }}>\n {item.limits.state.replace(/_/g, ' ')}\n </span>\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Details panel */}\n {showDetails && selectedItem && (\n <div style={{\n borderTop: `1px solid ${tokens.colors.border.muted}`,\n background: tokens.colors.background.surface,\n padding: 12,\n maxHeight: 200,\n overflow: 'auto',\n }}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: tokens.spacing.sm }}>\n <span style={{ fontWeight: tokens.typography.fontWeight.bold, fontSize: tokens.typography.fontSize.sm }}>{selectedItem.name}</span>\n <button\n onClick={() => setShowDetails(false)}\n aria-label=\"Close details panel\"\n style={{ background: 'none', border: 'none', color: tokens.colors.text.muted, cursor: 'pointer', fontSize: tokens.typography.fontSize.lg, padding: tokens.spacing.xs, lineHeight: 1 }}\n >\n &#x2715;\n </button>\n </div>\n {selectedItem.description && (\n <p style={{ color: tokens.colors.text.secondary, fontSize: tokens.typography.fontSize.xs, marginBottom: 8 }}>\n {selectedItem.description}\n </p>\n )}\n <div style={{\n display: 'grid', gridTemplateColumns: 'auto 1fr', gap: '4px 12px',\n fontSize: tokens.typography.fontSize.xxs, fontFamily: tokens.typography.fontFamily.mono,\n }}>\n <span style={{ color: tokens.colors.text.muted }}>Raw:</span>\n <span>{String(selectedItem.value)}</span>\n {selectedItem.convertedValue !== undefined && (\n <><span style={{ color: tokens.colors.text.muted }}>Converted:</span><span>{String(selectedItem.convertedValue)}</span></>\n )}\n {selectedItem.units && (\n <><span style={{ color: tokens.colors.text.muted }}>Units:</span><span>{selectedItem.units}</span></>\n )}\n {selectedItem.dataType && (\n <><span style={{ color: tokens.colors.text.muted }}>Type:</span><span>{selectedItem.dataType}</span></>\n )}\n {selectedItem.bitSize !== undefined && (\n <><span style={{ color: tokens.colors.text.muted }}>Bit Size:</span><span>{selectedItem.bitSize}</span></>\n )}\n {selectedItem.bitOffset !== undefined && (\n <><span style={{ color: tokens.colors.text.muted }}>Bit Offset:</span><span>{selectedItem.bitOffset}</span></>\n )}\n {selectedItem.conversion && (\n <><span style={{ color: tokens.colors.text.muted }}>Conversion:</span><span>{selectedItem.conversion}</span></>\n )}\n {selectedItem.limits && (\n <>\n <span style={{ color: tokens.colors.text.muted }}>Limits State:</span>\n <span style={{ color: getLimitsColor(selectedItem.limits.state, tokens) }}>\n {selectedItem.limits.state}\n </span>\n {selectedItem.limits.redLow !== undefined && (\n <><span style={{ color: tokens.colors.text.muted }}>Red Low:</span><span>{selectedItem.limits.redLow}</span></>\n )}\n {selectedItem.limits.yellowLow !== undefined && (\n <><span style={{ color: tokens.colors.text.muted }}>Yellow Low:</span><span>{selectedItem.limits.yellowLow}</span></>\n )}\n {selectedItem.limits.greenHigh !== undefined && (\n <><span style={{ color: tokens.colors.text.muted }}>Green High:</span><span>{selectedItem.limits.greenHigh}</span></>\n )}\n {selectedItem.limits.yellowHigh !== undefined && (\n <><span style={{ color: tokens.colors.text.muted }}>Yellow High:</span><span>{selectedItem.limits.yellowHigh}</span></>\n )}\n {selectedItem.limits.redHigh !== undefined && (\n <><span style={{ color: tokens.colors.text.muted }}>Red High:</span><span>{selectedItem.limits.redHigh}</span></>\n )}\n </>\n )}\n {selectedItem.states && (\n <>\n <span style={{ color: tokens.colors.text.muted }}>States:</span>\n <span>{Object.entries(selectedItem.states).map(([k, v]) => `${k}=${v}`).join(', ')}</span>\n </>\n )}\n </div>\n </div>\n )}\n </div>\n );\n});\n\nexport default PacketViewer;\n"],"names":["PacketViewer"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { default as React } from 'react';
2
+
3
+ export interface PaginationProps {
4
+ /** Current page (1-indexed) */
5
+ currentPage: number;
6
+ /** Total number of pages */
7
+ totalPages: number;
8
+ /** Change handler */
9
+ onChange: (page: number) => void;
10
+ /** Number of page buttons to show */
11
+ siblingCount?: number;
12
+ /** Show first/last buttons */
13
+ showFirstLast?: boolean;
14
+ /** Show prev/next buttons */
15
+ showPrevNext?: boolean;
16
+ /** Size variant */
17
+ size?: 'small' | 'medium';
18
+ /**
19
+ * Display mode.
20
+ * - `'buttons'` — numbered page buttons with ellipsis (default).
21
+ * - `'text'` — compact "Page X of Y" label with prev/next arrows.
22
+ */
23
+ displayMode?: 'buttons' | 'text';
24
+ /** Disabled state */
25
+ disabled?: boolean;
26
+ /** Custom className */
27
+ className?: string;
28
+ }
29
+ export declare const Pagination: React.NamedExoticComponent<PaginationProps>;
30
+ export default Pagination;