@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,518 +1,626 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { memo, useState, useCallback, useMemo } from "react";
3
1
  import { useTheme } from "../../theme/ThemeProvider.js";
4
- const CommandBuilder = memo(function CommandBuilder2({
5
- target,
6
- command,
7
- description,
8
- hazardous = false,
9
- hazardousDescription,
10
- parameters,
11
- onSend,
12
- history = [],
13
- showHistory = true,
14
- showPreview = true,
15
- disabled = false,
16
- height,
17
- className = "",
18
- bordered = true,
19
- style: styleProp
20
- }) {
21
- const { tokens, theme } = useTheme();
22
- const isTransparentTheme = theme === "transparent" || theme === "transparent-bold" || theme === "transparent-minimal";
23
- const [values, setValues] = useState(() => {
24
- const defaults = {};
25
- parameters.forEach((p) => {
26
- var _a;
27
- if (p.default !== void 0) defaults[p.name] = p.default;
28
- else if (p.type === "boolean") defaults[p.name] = false;
29
- else if (p.type === "enum" && ((_a = p.options) == null ? void 0 : _a.length)) defaults[p.name] = p.options[0];
30
- else defaults[p.name] = "";
31
- });
32
- return defaults;
33
- });
34
- const [errors, setErrors] = useState({});
35
- const [sending, setSending] = useState(false);
36
- const [showConfirm, setShowConfirm] = useState(false);
37
- const [showHistoryPanel, setShowHistoryPanel] = useState(false);
38
- const setValue = useCallback((name, value) => {
39
- setValues((prev) => ({ ...prev, [name]: value }));
40
- setErrors((prev) => {
41
- const next = { ...prev };
42
- delete next[name];
43
- return next;
44
- });
45
- }, []);
46
- const validate = useCallback(() => {
47
- const errs = {};
48
- parameters.forEach((p) => {
49
- const val = values[p.name];
50
- const required = p.required !== false;
51
- if (required && (val === void 0 || val === "" || val === null)) {
52
- errs[p.name] = "Required";
53
- return;
54
- }
55
- if (val === "" || val === void 0) return;
56
- if ((p.type === "int" || p.type === "uint" || p.type === "float") && typeof val === "string") {
57
- const num = Number(val);
58
- if (isNaN(num)) {
59
- errs[p.name] = "Must be a number";
60
- return;
61
- }
62
- if (p.min !== void 0 && num < p.min) {
63
- errs[p.name] = `Min: ${p.min}`;
64
- return;
65
- }
66
- if (p.max !== void 0 && num > p.max) {
67
- errs[p.name] = `Max: ${p.max}`;
68
- return;
69
- }
70
- if (p.type === "uint" && num < 0) {
71
- errs[p.name] = "Must be >= 0";
72
- return;
73
- }
74
- if (p.type === "int" && !Number.isInteger(num)) {
75
- errs[p.name] = "Must be integer";
76
- return;
77
- }
78
- }
79
- if (p.type === "string" && p.pattern && typeof val === "string") {
80
- if (!new RegExp(p.pattern).test(val)) {
81
- errs[p.name] = "Invalid format";
82
- }
83
- }
84
- });
85
- setErrors(errs);
86
- return Object.keys(errs).length === 0;
87
- }, [parameters, values]);
88
- const handleSend = useCallback(async () => {
89
- if (!validate()) return;
90
- if (hazardous && !showConfirm) {
91
- setShowConfirm(true);
92
- return;
93
- }
94
- setShowConfirm(false);
95
- setSending(true);
96
- try {
97
- const processedValues = {};
98
- parameters.forEach((p) => {
99
- let val = values[p.name];
100
- if ((p.type === "int" || p.type === "uint" || p.type === "float") && typeof val === "string") {
101
- val = Number(val);
102
- }
103
- processedValues[p.name] = val;
104
- });
105
- await onSend(processedValues);
106
- } finally {
107
- setSending(false);
108
- }
109
- }, [validate, hazardous, showConfirm, parameters, values, onSend]);
110
- const commandString = useMemo(() => {
111
- const params = parameters.map((p) => `${p.name}=${JSON.stringify(values[p.name] ?? "")}`).join(", ");
112
- return `cmd("${target} ${command}" ${params ? `with ${params}` : ""})`;
113
- }, [target, command, parameters, values]);
114
- const resetToDefaults = useCallback(() => {
115
- const defaults = {};
116
- parameters.forEach((p) => {
117
- var _a;
118
- if (p.default !== void 0) defaults[p.name] = p.default;
119
- else if (p.type === "boolean") defaults[p.name] = false;
120
- else if (p.type === "enum" && ((_a = p.options) == null ? void 0 : _a.length)) defaults[p.name] = p.options[0];
121
- else defaults[p.name] = "";
122
- });
123
- setValues(defaults);
124
- setErrors({});
125
- }, [parameters]);
126
- const inputStyle = {
127
- background: tokens.colors.background.base,
128
- color: tokens.colors.text.primary,
129
- border: `1px solid ${tokens.colors.border.muted}`,
130
- borderRadius: tokens.borderRadius.md,
131
- padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,
132
- fontSize: tokens.typography.fontSize.xs,
133
- outline: "none",
134
- fontFamily: tokens.typography.fontFamily.mono,
135
- width: "100%",
136
- minHeight: 40,
137
- boxSizing: "border-box",
138
- transition: "border-color 150ms ease"
139
- };
140
- return /* @__PURE__ */ jsxs(
141
- "div",
142
- {
143
- className: `command-builder ${className}`,
144
- style: {
145
- height: typeof height === "number" ? height : void 0,
146
- background: tokens.colors.background.base,
147
- ...bordered ? tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` } : { border: "none" },
148
- borderRadius: tokens.borderRadius.lg,
149
- overflow: "hidden",
150
- display: "flex",
151
- flexDirection: "column",
152
- fontFamily: tokens.typography.fontFamily.primary,
153
- color: tokens.colors.text.primary,
154
- backdropFilter: isTransparentTheme ? "blur(10px)" : void 0,
155
- WebkitBackdropFilter: isTransparentTheme ? "blur(10px)" : void 0,
156
- ...styleProp
157
- },
158
- children: [
159
- /* @__PURE__ */ jsxs("div", { style: {
160
- padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,
161
- borderBottom: `1px solid ${tokens.colors.border.muted}`,
162
- background: hazardous ? `${tokens.colors.status.critical}12` : tokens.colors.background.surface,
163
- display: "flex",
164
- alignItems: "center",
165
- justifyContent: "space-between"
166
- }, children: [
167
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: tokens.spacing.sm }, children: [
168
- hazardous && /* @__PURE__ */ jsx("span", { role: "img", "aria-label": "Hazardous command", style: { fontSize: tokens.typography.fontSize.lg }, children: "⚠" }),
169
- /* @__PURE__ */ jsx("span", { style: {
170
- background: `${tokens.colors.interactive.default}22`,
171
- color: tokens.colors.interactive.default,
172
- padding: `${tokens.spacing.xxs} ${tokens.spacing.sm}`,
173
- borderRadius: tokens.borderRadius.md,
174
- fontSize: tokens.typography.fontSize.xxs,
175
- fontWeight: tokens.typography.fontWeight.medium
176
- }, children: target }),
177
- /* @__PURE__ */ jsx("span", { style: { fontWeight: tokens.typography.fontWeight.bold, fontSize: tokens.typography.fontSize.sm }, children: command }),
178
- hazardous && /* @__PURE__ */ jsx("span", { style: {
179
- background: `${tokens.colors.status.critical}22`,
180
- color: tokens.colors.status.critical,
181
- padding: `${tokens.spacing.xxs} ${tokens.spacing.sm}`,
182
- borderRadius: tokens.borderRadius.sm,
183
- fontSize: tokens.typography.fontSize.micro,
184
- fontWeight: tokens.typography.fontWeight.bold,
185
- textTransform: "uppercase",
186
- letterSpacing: "0.5px"
187
- }, children: "Hazardous" })
188
- ] }),
189
- showHistory && history.length > 0 && /* @__PURE__ */ jsxs(
190
- "button",
191
- {
192
- onClick: () => setShowHistoryPanel((p) => !p),
193
- "aria-expanded": showHistoryPanel,
194
- "aria-label": `Command history (${history.length} entries)`,
195
- style: {
196
- background: tokens.colors.background.base,
197
- color: tokens.colors.text.secondary,
198
- border: `1px solid ${tokens.colors.border.muted}`,
199
- borderRadius: tokens.borderRadius.md,
200
- padding: `${tokens.spacing.xxs} ${tokens.spacing.sm}`,
201
- fontSize: tokens.typography.fontSize.xxs,
202
- cursor: "pointer",
203
- transition: "all 150ms ease"
204
- },
205
- children: [
206
- "History (",
207
- history.length,
208
- ")"
209
- ]
210
- }
211
- )
212
- ] }),
213
- description && /* @__PURE__ */ jsx("div", { style: {
214
- padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,
215
- fontSize: tokens.typography.fontSize.xs,
216
- color: tokens.colors.text.secondary,
217
- borderBottom: `1px solid ${tokens.colors.border.muted}`,
218
- lineHeight: tokens.typography.lineHeight.normal
219
- }, children: description }),
220
- /* @__PURE__ */ jsx("div", { role: "form", "aria-label": `${target} ${command} parameters`, style: { flex: 1, overflow: "auto", padding: tokens.spacing.smd }, children: parameters.length === 0 ? /* @__PURE__ */ jsx("div", { style: {
221
- color: tokens.colors.text.muted,
222
- fontSize: tokens.typography.fontSize.xs,
223
- textAlign: "center",
224
- padding: tokens.spacing.xl
225
- }, children: "No parameters — command will be sent as-is" }) : /* @__PURE__ */ jsx("div", { style: { display: "flex", flexDirection: "column", gap: tokens.spacing.smd }, children: parameters.map((p) => {
226
- var _a;
227
- return /* @__PURE__ */ jsxs("div", { children: [
228
- /* @__PURE__ */ jsxs("div", { style: {
229
- display: "flex",
230
- alignItems: "center",
231
- gap: tokens.spacing.sm,
232
- marginBottom: tokens.spacing.xs
233
- }, children: [
234
- /* @__PURE__ */ jsxs("label", { htmlFor: `cmd-param-${p.name}`, style: {
235
- fontWeight: tokens.typography.fontWeight.medium,
236
- fontSize: tokens.typography.fontSize.xs,
237
- color: tokens.colors.text.primary
238
- }, children: [
239
- p.name,
240
- p.required !== false && /* @__PURE__ */ jsx("span", { "aria-label": "required", style: { color: tokens.colors.status.critical, marginLeft: tokens.spacing.xxs }, children: "*" })
241
- ] }),
242
- /* @__PURE__ */ jsxs("span", { style: {
243
- fontSize: tokens.typography.fontSize.xxs,
244
- color: tokens.colors.text.muted,
245
- background: tokens.colors.background.surface,
246
- padding: `1px ${tokens.spacing.xs}`,
247
- borderRadius: tokens.borderRadius.sm
248
- }, children: [
249
- p.type,
250
- p.bitSize ? ` (${p.bitSize}b)` : ""
251
- ] }),
252
- p.units && /* @__PURE__ */ jsxs("span", { style: { fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.interactive.default }, children: [
253
- "[",
254
- p.units,
255
- "]"
256
- ] }),
257
- p.hazardous && /* @__PURE__ */ jsx("span", { "aria-label": "Hazardous parameter", style: { fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.status.critical }, children: "⚠" })
258
- ] }),
259
- p.description && /* @__PURE__ */ jsx("div", { id: `cmd-param-desc-${p.name}`, style: {
260
- fontSize: tokens.typography.fontSize.xxs,
261
- color: tokens.colors.text.muted,
262
- marginBottom: tokens.spacing.xs,
263
- lineHeight: tokens.typography.lineHeight.tight
264
- }, children: p.description }),
265
- p.type === "boolean" ? /* @__PURE__ */ jsxs("label", { style: {
266
- display: "flex",
267
- alignItems: "center",
268
- gap: tokens.spacing.sm,
269
- fontSize: tokens.typography.fontSize.xs,
270
- cursor: "pointer"
271
- }, children: [
272
- /* @__PURE__ */ jsx(
273
- "input",
274
- {
275
- id: `cmd-param-${p.name}`,
276
- type: "checkbox",
277
- checked: !!values[p.name],
278
- onChange: (e) => setValue(p.name, e.target.checked),
279
- "aria-describedby": p.description ? `cmd-param-desc-${p.name}` : void 0,
280
- style: { accentColor: tokens.colors.interactive.default }
281
- }
282
- ),
283
- values[p.name] ? "TRUE" : "FALSE"
284
- ] }) : p.type === "enum" ? /* @__PURE__ */ jsx(
285
- "select",
286
- {
287
- id: `cmd-param-${p.name}`,
288
- value: String(values[p.name] ?? ""),
289
- onChange: (e) => setValue(p.name, e.target.value),
290
- "aria-describedby": p.description ? `cmd-param-desc-${p.name}` : void 0,
291
- style: inputStyle,
292
- children: (_a = p.options) == null ? void 0 : _a.map((opt) => /* @__PURE__ */ jsx("option", { value: String(opt), children: String(opt) }, String(opt)))
293
- }
294
- ) : /* @__PURE__ */ jsx(
295
- "input",
296
- {
297
- id: `cmd-param-${p.name}`,
298
- type: p.type === "int" || p.type === "uint" || p.type === "float" ? "number" : "text",
299
- value: String(values[p.name] ?? ""),
300
- onChange: (e) => setValue(p.name, e.target.value),
301
- placeholder: p.default !== void 0 ? `Default: ${p.default}` : void 0,
302
- min: p.min,
303
- max: p.max,
304
- step: p.type === "float" ? "any" : 1,
305
- "aria-describedby": p.description ? `cmd-param-desc-${p.name}` : void 0,
306
- "aria-invalid": !!errors[p.name],
307
- style: {
308
- ...inputStyle,
309
- borderColor: errors[p.name] ? tokens.colors.status.critical : tokens.colors.border.muted
310
- }
311
- }
312
- ),
313
- errors[p.name] && /* @__PURE__ */ jsx("span", { role: "alert", style: {
314
- display: "block",
315
- fontSize: tokens.typography.fontSize.xxs,
316
- color: tokens.colors.status.critical,
317
- marginTop: tokens.spacing.xxs
318
- }, children: errors[p.name] })
319
- ] }, p.name);
320
- }) }) }),
321
- showPreview && /* @__PURE__ */ jsx("div", { "aria-label": "Command preview", style: {
322
- padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,
323
- borderTop: `1px solid ${tokens.colors.border.muted}`,
324
- background: tokens.colors.background.surface,
325
- fontFamily: tokens.typography.fontFamily.mono,
326
- fontSize: tokens.typography.fontSize.xxs,
327
- color: tokens.colors.text.muted,
328
- overflow: "hidden",
329
- textOverflow: "ellipsis",
330
- whiteSpace: "nowrap"
331
- }, children: commandString }),
332
- showConfirm && /* @__PURE__ */ jsxs("div", { role: "alertdialog", "aria-label": "Confirm hazardous command", style: {
333
- padding: tokens.spacing.smd,
334
- borderTop: `1px solid ${tokens.colors.status.critical}44`,
335
- background: `${tokens.colors.status.critical}12`
336
- }, children: [
337
- /* @__PURE__ */ jsx("div", { style: {
338
- fontWeight: tokens.typography.fontWeight.bold,
339
- color: tokens.colors.status.critical,
340
- marginBottom: tokens.spacing.sm,
341
- fontSize: tokens.typography.fontSize.sm
342
- }, children: "Confirm Hazardous Command" }),
343
- /* @__PURE__ */ jsx("p", { style: {
344
- fontSize: tokens.typography.fontSize.xs,
345
- color: tokens.colors.text.secondary,
346
- marginBottom: tokens.spacing.smd,
347
- lineHeight: tokens.typography.lineHeight.normal
348
- }, children: hazardousDescription || `Are you sure you want to send ${target} ${command}?` }),
349
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: tokens.spacing.sm }, children: [
350
- /* @__PURE__ */ jsx(
351
- "button",
352
- {
353
- onClick: handleSend,
354
- style: {
355
- background: tokens.colors.status.critical,
356
- color: tokens.colors.text.inverse,
357
- border: "none",
358
- borderRadius: tokens.borderRadius.md,
359
- padding: `${tokens.spacing.sm} ${tokens.spacing.md}`,
360
- fontSize: tokens.typography.fontSize.xs,
361
- fontWeight: tokens.typography.fontWeight.medium,
362
- cursor: "pointer",
363
- transition: "opacity 150ms ease"
364
- },
365
- children: "Confirm Send"
366
- }
367
- ),
368
- /* @__PURE__ */ jsx(
369
- "button",
370
- {
371
- onClick: () => setShowConfirm(false),
372
- style: {
373
- background: tokens.colors.background.base,
374
- color: tokens.colors.text.secondary,
375
- border: `1px solid ${tokens.colors.border.muted}`,
376
- borderRadius: tokens.borderRadius.md,
377
- padding: `${tokens.spacing.sm} ${tokens.spacing.md}`,
378
- fontSize: tokens.typography.fontSize.xs,
379
- cursor: "pointer",
380
- transition: "opacity 150ms ease"
381
- },
382
- children: "Cancel"
383
- }
384
- )
385
- ] })
386
- ] }),
387
- !showConfirm && /* @__PURE__ */ jsxs("div", { style: {
388
- padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,
389
- borderTop: `1px solid ${tokens.colors.border.muted}`,
390
- background: tokens.colors.background.surface,
391
- display: "flex",
392
- alignItems: "center",
393
- justifyContent: "space-between"
394
- }, children: [
395
- /* @__PURE__ */ jsx("button", { onClick: resetToDefaults, "aria-label": "Reset all parameters to defaults", style: {
396
- background: "transparent",
397
- color: tokens.colors.text.muted,
398
- border: `1px solid ${tokens.colors.border.muted}`,
399
- borderRadius: tokens.borderRadius.md,
400
- padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,
401
- fontSize: tokens.typography.fontSize.xxs,
402
- cursor: "pointer",
403
- transition: "all 150ms ease"
404
- }, children: "Reset Defaults" }),
405
- /* @__PURE__ */ jsx(
406
- "button",
407
- {
408
- onClick: handleSend,
409
- disabled: disabled || sending,
410
- "aria-busy": sending,
411
- style: {
412
- background: hazardous ? tokens.colors.status.critical : tokens.colors.interactive.default,
413
- color: tokens.colors.text.inverse,
414
- border: "none",
415
- borderRadius: tokens.borderRadius.md,
416
- padding: `${tokens.spacing.sm} ${tokens.spacing.lg}`,
417
- fontSize: tokens.typography.fontSize.sm,
418
- fontWeight: tokens.typography.fontWeight.medium,
419
- cursor: disabled || sending ? "not-allowed" : "pointer",
420
- opacity: disabled || sending ? 0.5 : 1,
421
- transition: "opacity 150ms ease"
422
- },
423
- children: sending ? "Sending..." : "Send Command"
424
- }
425
- )
426
- ] }),
427
- showHistoryPanel && history.length > 0 && /* @__PURE__ */ jsxs("div", { role: "list", "aria-label": "Command history", style: {
428
- borderTop: `1px solid ${tokens.colors.border.muted}`,
429
- background: tokens.colors.background.surface,
430
- maxHeight: 200,
431
- overflow: "auto"
432
- }, children: [
433
- /* @__PURE__ */ jsx("div", { style: {
434
- padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,
435
- fontSize: tokens.typography.fontSize.xxs,
436
- color: tokens.colors.text.muted,
437
- fontWeight: tokens.typography.fontWeight.medium,
438
- textTransform: "uppercase",
439
- letterSpacing: "0.5px"
440
- }, children: "Command History" }),
441
- history.slice().reverse().map((h) => /* @__PURE__ */ jsx(
442
- "div",
443
- {
444
- role: "listitem",
445
- style: {
446
- borderBottom: `1px solid ${tokens.colors.border.muted}`
447
- },
448
- children: /* @__PURE__ */ jsxs(
449
- "button",
450
- {
451
- type: "button",
452
- "aria-label": `${h.status} at ${h.timestamp.toLocaleTimeString()}`,
453
- style: {
454
- width: "100%",
455
- textAlign: "left",
456
- padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,
457
- fontSize: tokens.typography.fontSize.xxs,
458
- display: "flex",
459
- alignItems: "center",
460
- gap: tokens.spacing.sm,
461
- cursor: "pointer",
462
- transition: "background 150ms ease",
463
- border: "none",
464
- background: "transparent",
465
- color: "inherit"
466
- },
467
- onClick: () => setValues(h.parameters),
468
- children: [
469
- /* @__PURE__ */ jsx("span", { "aria-hidden": "true", style: {
470
- width: 8,
471
- height: 8,
472
- flexShrink: 0,
473
- ...h.status === "success" ? {
474
- borderRadius: tokens.borderRadius.full,
475
- background: tokens.colors.status.normal
476
- } : h.status === "error" ? {
477
- borderRadius: 0,
478
- background: tokens.colors.status.critical,
479
- clipPath: "polygon(50% 100%, 0% 0%, 100% 0%)"
480
- } : {
481
- borderRadius: tokens.borderRadius.full,
482
- background: "transparent",
483
- border: `2px solid ${tokens.colors.status.standby}`
484
- }
485
- } }),
486
- /* @__PURE__ */ jsx("span", { style: {
487
- color: tokens.colors.text.muted,
488
- fontFamily: tokens.typography.fontFamily.mono,
489
- fontSize: tokens.typography.fontSize.xxs,
490
- flexShrink: 0
491
- }, children: h.timestamp.toLocaleTimeString() }),
492
- /* @__PURE__ */ jsx("span", { style: {
493
- fontFamily: tokens.typography.fontFamily.mono,
494
- fontSize: tokens.typography.fontSize.xxs,
495
- flex: 1,
496
- overflow: "hidden",
497
- textOverflow: "ellipsis",
498
- whiteSpace: "nowrap"
499
- }, children: Object.entries(h.parameters).map(([k, v]) => `${k}=${JSON.stringify(v)}`).join(", ") }),
500
- h.error && /* @__PURE__ */ jsx("span", { style: {
501
- fontSize: tokens.typography.fontSize.micro,
502
- color: tokens.colors.status.critical
503
- }, children: h.error })
504
- ]
505
- }
506
- )
507
- },
508
- h.id
509
- ))
510
- ] })
511
- ]
512
- }
513
- );
2
+ import { memo, useCallback, useMemo, useState } from "react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/react/core/widgets/CommandBuilder.tsx
5
+ /**
6
+ * @zendir/ui - CommandBuilder Component
7
+ *
8
+ * Dynamic command parameter form for spacecraft command construction and execution.
9
+ * Builds a form from a command definition with type-appropriate inputs,
10
+ * validation, hazardous warnings, and send/history functionality.
11
+ *
12
+ * Features:
13
+ * - Auto-generated form from command parameter definitions
14
+ * - Type-appropriate inputs (number, string, boolean, enum/state, hex)
15
+ * - Validation with min/max/regex constraints
16
+ * - Hazardous command warnings
17
+ * - Command history with re-send
18
+ * - Raw command preview
19
+ * - Required/optional parameter indicators
20
+ * - Default values
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * <CommandBuilder
25
+ * target="INST"
26
+ * command="COLLECT"
27
+ * parameters={[
28
+ * { name: 'TYPE', type: 'enum', options: ['NORMAL', 'SPECIAL'], required: true },
29
+ * { name: 'DURATION', type: 'float', min: 0, max: 100, default: 1.0, units: 'sec' },
30
+ * ]}
31
+ * onSend={(params) => console.log('Send:', params)}
32
+ * />
33
+ * ```
34
+ */
35
+ var CommandBuilder = memo(function CommandBuilder({ target, command, description, hazardous = false, hazardousDescription, parameters, onSend, history = [], showHistory = true, showPreview = true, disabled = false, height, className = "", bordered = true, style: styleProp }) {
36
+ const { tokens, theme } = useTheme();
37
+ const isTransparentTheme = theme === "transparent" || theme === "transparent-bold" || theme === "transparent-minimal";
38
+ const [values, setValues] = useState(() => {
39
+ const defaults = {};
40
+ parameters.forEach((p) => {
41
+ if (p.default !== void 0) defaults[p.name] = p.default;
42
+ else if (p.type === "boolean") defaults[p.name] = false;
43
+ else if (p.type === "enum" && p.options?.length) defaults[p.name] = p.options[0];
44
+ else defaults[p.name] = "";
45
+ });
46
+ return defaults;
47
+ });
48
+ const [errors, setErrors] = useState({});
49
+ const [sending, setSending] = useState(false);
50
+ const [showConfirm, setShowConfirm] = useState(false);
51
+ const [showHistoryPanel, setShowHistoryPanel] = useState(false);
52
+ const setValue = useCallback((name, value) => {
53
+ setValues((prev) => ({
54
+ ...prev,
55
+ [name]: value
56
+ }));
57
+ setErrors((prev) => {
58
+ const next = { ...prev };
59
+ delete next[name];
60
+ return next;
61
+ });
62
+ }, []);
63
+ const validate = useCallback(() => {
64
+ const errs = {};
65
+ parameters.forEach((p) => {
66
+ const val = values[p.name];
67
+ if (p.required !== false && (val === void 0 || val === "" || val === null)) {
68
+ errs[p.name] = "Required";
69
+ return;
70
+ }
71
+ if (val === "" || val === void 0) return;
72
+ if ((p.type === "int" || p.type === "uint" || p.type === "float") && typeof val === "string") {
73
+ const num = Number(val);
74
+ if (isNaN(num)) {
75
+ errs[p.name] = "Must be a number";
76
+ return;
77
+ }
78
+ if (p.min !== void 0 && num < p.min) {
79
+ errs[p.name] = `Min: ${p.min}`;
80
+ return;
81
+ }
82
+ if (p.max !== void 0 && num > p.max) {
83
+ errs[p.name] = `Max: ${p.max}`;
84
+ return;
85
+ }
86
+ if (p.type === "uint" && num < 0) {
87
+ errs[p.name] = "Must be >= 0";
88
+ return;
89
+ }
90
+ if (p.type === "int" && !Number.isInteger(num)) {
91
+ errs[p.name] = "Must be integer";
92
+ return;
93
+ }
94
+ }
95
+ if (p.type === "string" && p.pattern && typeof val === "string") {
96
+ if (!new RegExp(p.pattern).test(val)) errs[p.name] = "Invalid format";
97
+ }
98
+ });
99
+ setErrors(errs);
100
+ return Object.keys(errs).length === 0;
101
+ }, [parameters, values]);
102
+ const handleSend = useCallback(async () => {
103
+ if (!validate()) return;
104
+ if (hazardous && !showConfirm) {
105
+ setShowConfirm(true);
106
+ return;
107
+ }
108
+ setShowConfirm(false);
109
+ setSending(true);
110
+ try {
111
+ const processedValues = {};
112
+ parameters.forEach((p) => {
113
+ let val = values[p.name];
114
+ if ((p.type === "int" || p.type === "uint" || p.type === "float") && typeof val === "string") val = Number(val);
115
+ processedValues[p.name] = val;
116
+ });
117
+ await onSend(processedValues);
118
+ } finally {
119
+ setSending(false);
120
+ }
121
+ }, [
122
+ validate,
123
+ hazardous,
124
+ showConfirm,
125
+ parameters,
126
+ values,
127
+ onSend
128
+ ]);
129
+ const commandString = useMemo(() => {
130
+ const params = parameters.map((p) => `${p.name}=${JSON.stringify(values[p.name] ?? "")}`).join(", ");
131
+ return `cmd("${target} ${command}" ${params ? `with ${params}` : ""})`;
132
+ }, [
133
+ target,
134
+ command,
135
+ parameters,
136
+ values
137
+ ]);
138
+ const resetToDefaults = useCallback(() => {
139
+ const defaults = {};
140
+ parameters.forEach((p) => {
141
+ if (p.default !== void 0) defaults[p.name] = p.default;
142
+ else if (p.type === "boolean") defaults[p.name] = false;
143
+ else if (p.type === "enum" && p.options?.length) defaults[p.name] = p.options[0];
144
+ else defaults[p.name] = "";
145
+ });
146
+ setValues(defaults);
147
+ setErrors({});
148
+ }, [parameters]);
149
+ const inputStyle = {
150
+ background: tokens.colors.background.base,
151
+ color: tokens.colors.text.primary,
152
+ border: `1px solid ${tokens.colors.border.muted}`,
153
+ borderRadius: tokens.borderRadius.md,
154
+ padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,
155
+ fontSize: tokens.typography.fontSize.xs,
156
+ outline: "none",
157
+ fontFamily: tokens.typography.fontFamily.mono,
158
+ width: "100%",
159
+ minHeight: 40,
160
+ boxSizing: "border-box",
161
+ transition: "border-color 150ms ease"
162
+ };
163
+ return /* @__PURE__ */ jsxs("div", {
164
+ className: `command-builder ${className}`,
165
+ style: {
166
+ height: typeof height === "number" ? height : void 0,
167
+ background: tokens.colors.background.base,
168
+ ...bordered ? tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` } : { border: "none" },
169
+ borderRadius: tokens.borderRadius.lg,
170
+ overflow: "hidden",
171
+ display: "flex",
172
+ flexDirection: "column",
173
+ fontFamily: tokens.typography.fontFamily.primary,
174
+ color: tokens.colors.text.primary,
175
+ backdropFilter: isTransparentTheme ? "blur(10px)" : void 0,
176
+ WebkitBackdropFilter: isTransparentTheme ? "blur(10px)" : void 0,
177
+ ...styleProp
178
+ },
179
+ children: [
180
+ /* @__PURE__ */ jsxs("div", {
181
+ style: {
182
+ padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,
183
+ borderBottom: `1px solid ${tokens.colors.border.muted}`,
184
+ background: hazardous ? `${tokens.colors.status.critical}12` : tokens.colors.background.surface,
185
+ display: "flex",
186
+ alignItems: "center",
187
+ justifyContent: "space-between"
188
+ },
189
+ children: [/* @__PURE__ */ jsxs("div", {
190
+ style: {
191
+ display: "flex",
192
+ alignItems: "center",
193
+ gap: tokens.spacing.sm
194
+ },
195
+ children: [
196
+ hazardous && /* @__PURE__ */ jsx("span", {
197
+ role: "img",
198
+ "aria-label": "Hazardous command",
199
+ style: { fontSize: tokens.typography.fontSize.lg },
200
+ children: ""
201
+ }),
202
+ /* @__PURE__ */ jsx("span", {
203
+ style: {
204
+ background: `${tokens.colors.interactive.default}22`,
205
+ color: tokens.colors.interactive.default,
206
+ padding: `${tokens.spacing.xxs} ${tokens.spacing.sm}`,
207
+ borderRadius: tokens.borderRadius.md,
208
+ fontSize: tokens.typography.fontSize.xxs,
209
+ fontWeight: tokens.typography.fontWeight.medium
210
+ },
211
+ children: target
212
+ }),
213
+ /* @__PURE__ */ jsx("span", {
214
+ style: {
215
+ fontWeight: tokens.typography.fontWeight.bold,
216
+ fontSize: tokens.typography.fontSize.sm
217
+ },
218
+ children: command
219
+ }),
220
+ hazardous && /* @__PURE__ */ jsx("span", {
221
+ style: {
222
+ background: `${tokens.colors.status.critical}22`,
223
+ color: tokens.colors.status.critical,
224
+ padding: `${tokens.spacing.xxs} ${tokens.spacing.sm}`,
225
+ borderRadius: tokens.borderRadius.sm,
226
+ fontSize: tokens.typography.fontSize.micro,
227
+ fontWeight: tokens.typography.fontWeight.bold,
228
+ textTransform: "uppercase",
229
+ letterSpacing: "0.5px"
230
+ },
231
+ children: "Hazardous"
232
+ })
233
+ ]
234
+ }), showHistory && history.length > 0 && /* @__PURE__ */ jsxs("button", {
235
+ onClick: () => setShowHistoryPanel((p) => !p),
236
+ "aria-expanded": showHistoryPanel,
237
+ "aria-label": `Command history (${history.length} entries)`,
238
+ style: {
239
+ background: tokens.colors.background.base,
240
+ color: tokens.colors.text.secondary,
241
+ border: `1px solid ${tokens.colors.border.muted}`,
242
+ borderRadius: tokens.borderRadius.md,
243
+ padding: `${tokens.spacing.xxs} ${tokens.spacing.sm}`,
244
+ fontSize: tokens.typography.fontSize.xxs,
245
+ cursor: "pointer",
246
+ transition: "all 150ms ease"
247
+ },
248
+ children: [
249
+ "History (",
250
+ history.length,
251
+ ")"
252
+ ]
253
+ })]
254
+ }),
255
+ description && /* @__PURE__ */ jsx("div", {
256
+ style: {
257
+ padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,
258
+ fontSize: tokens.typography.fontSize.xs,
259
+ color: tokens.colors.text.secondary,
260
+ borderBottom: `1px solid ${tokens.colors.border.muted}`,
261
+ lineHeight: tokens.typography.lineHeight.normal
262
+ },
263
+ children: description
264
+ }),
265
+ /* @__PURE__ */ jsx("div", {
266
+ role: "form",
267
+ "aria-label": `${target} ${command} parameters`,
268
+ style: {
269
+ flex: 1,
270
+ overflow: "auto",
271
+ padding: tokens.spacing.smd
272
+ },
273
+ children: parameters.length === 0 ? /* @__PURE__ */ jsx("div", {
274
+ style: {
275
+ color: tokens.colors.text.muted,
276
+ fontSize: tokens.typography.fontSize.xs,
277
+ textAlign: "center",
278
+ padding: tokens.spacing.xl
279
+ },
280
+ children: "No parameters — command will be sent as-is"
281
+ }) : /* @__PURE__ */ jsx("div", {
282
+ style: {
283
+ display: "flex",
284
+ flexDirection: "column",
285
+ gap: tokens.spacing.smd
286
+ },
287
+ children: parameters.map((p) => /* @__PURE__ */ jsxs("div", { children: [
288
+ /* @__PURE__ */ jsxs("div", {
289
+ style: {
290
+ display: "flex",
291
+ alignItems: "center",
292
+ gap: tokens.spacing.sm,
293
+ marginBottom: tokens.spacing.xs
294
+ },
295
+ children: [
296
+ /* @__PURE__ */ jsxs("label", {
297
+ htmlFor: `cmd-param-${p.name}`,
298
+ style: {
299
+ fontWeight: tokens.typography.fontWeight.medium,
300
+ fontSize: tokens.typography.fontSize.xs,
301
+ color: tokens.colors.text.primary
302
+ },
303
+ children: [p.name, p.required !== false && /* @__PURE__ */ jsx("span", {
304
+ "aria-label": "required",
305
+ style: {
306
+ color: tokens.colors.status.critical,
307
+ marginLeft: tokens.spacing.xxs
308
+ },
309
+ children: "*"
310
+ })]
311
+ }),
312
+ /* @__PURE__ */ jsxs("span", {
313
+ style: {
314
+ fontSize: tokens.typography.fontSize.xxs,
315
+ color: tokens.colors.text.muted,
316
+ background: tokens.colors.background.surface,
317
+ padding: `1px ${tokens.spacing.xs}`,
318
+ borderRadius: tokens.borderRadius.sm
319
+ },
320
+ children: [p.type, p.bitSize ? ` (${p.bitSize}b)` : ""]
321
+ }),
322
+ p.units && /* @__PURE__ */ jsxs("span", {
323
+ style: {
324
+ fontSize: tokens.typography.fontSize.xxs,
325
+ color: tokens.colors.interactive.default
326
+ },
327
+ children: [
328
+ "[",
329
+ p.units,
330
+ "]"
331
+ ]
332
+ }),
333
+ p.hazardous && /* @__PURE__ */ jsx("span", {
334
+ "aria-label": "Hazardous parameter",
335
+ style: {
336
+ fontSize: tokens.typography.fontSize.xxs,
337
+ color: tokens.colors.status.critical
338
+ },
339
+ children: "⚠"
340
+ })
341
+ ]
342
+ }),
343
+ p.description && /* @__PURE__ */ jsx("div", {
344
+ id: `cmd-param-desc-${p.name}`,
345
+ style: {
346
+ fontSize: tokens.typography.fontSize.xxs,
347
+ color: tokens.colors.text.muted,
348
+ marginBottom: tokens.spacing.xs,
349
+ lineHeight: tokens.typography.lineHeight.tight
350
+ },
351
+ children: p.description
352
+ }),
353
+ p.type === "boolean" ? /* @__PURE__ */ jsxs("label", {
354
+ style: {
355
+ display: "flex",
356
+ alignItems: "center",
357
+ gap: tokens.spacing.sm,
358
+ fontSize: tokens.typography.fontSize.xs,
359
+ cursor: "pointer"
360
+ },
361
+ children: [/* @__PURE__ */ jsx("input", {
362
+ id: `cmd-param-${p.name}`,
363
+ type: "checkbox",
364
+ checked: !!values[p.name],
365
+ onChange: (e) => setValue(p.name, e.target.checked),
366
+ "aria-describedby": p.description ? `cmd-param-desc-${p.name}` : void 0,
367
+ style: { accentColor: tokens.colors.interactive.default }
368
+ }), values[p.name] ? "TRUE" : "FALSE"]
369
+ }) : p.type === "enum" ? /* @__PURE__ */ jsx("select", {
370
+ id: `cmd-param-${p.name}`,
371
+ value: String(values[p.name] ?? ""),
372
+ onChange: (e) => setValue(p.name, e.target.value),
373
+ "aria-describedby": p.description ? `cmd-param-desc-${p.name}` : void 0,
374
+ style: inputStyle,
375
+ children: p.options?.map((opt) => /* @__PURE__ */ jsx("option", {
376
+ value: String(opt),
377
+ children: String(opt)
378
+ }, String(opt)))
379
+ }) : /* @__PURE__ */ jsx("input", {
380
+ id: `cmd-param-${p.name}`,
381
+ type: p.type === "int" || p.type === "uint" || p.type === "float" ? "number" : "text",
382
+ value: String(values[p.name] ?? ""),
383
+ onChange: (e) => setValue(p.name, e.target.value),
384
+ placeholder: p.default !== void 0 ? `Default: ${p.default}` : void 0,
385
+ min: p.min,
386
+ max: p.max,
387
+ step: p.type === "float" ? "any" : 1,
388
+ "aria-describedby": p.description ? `cmd-param-desc-${p.name}` : void 0,
389
+ "aria-invalid": !!errors[p.name],
390
+ style: {
391
+ ...inputStyle,
392
+ borderColor: errors[p.name] ? tokens.colors.status.critical : tokens.colors.border.muted
393
+ }
394
+ }),
395
+ errors[p.name] && /* @__PURE__ */ jsx("span", {
396
+ role: "alert",
397
+ style: {
398
+ display: "block",
399
+ fontSize: tokens.typography.fontSize.xxs,
400
+ color: tokens.colors.status.critical,
401
+ marginTop: tokens.spacing.xxs
402
+ },
403
+ children: errors[p.name]
404
+ })
405
+ ] }, p.name))
406
+ })
407
+ }),
408
+ showPreview && /* @__PURE__ */ jsx("div", {
409
+ "aria-label": "Command preview",
410
+ style: {
411
+ padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,
412
+ borderTop: `1px solid ${tokens.colors.border.muted}`,
413
+ background: tokens.colors.background.surface,
414
+ fontFamily: tokens.typography.fontFamily.mono,
415
+ fontSize: tokens.typography.fontSize.xxs,
416
+ color: tokens.colors.text.muted,
417
+ overflow: "hidden",
418
+ textOverflow: "ellipsis",
419
+ whiteSpace: "nowrap"
420
+ },
421
+ children: commandString
422
+ }),
423
+ showConfirm && /* @__PURE__ */ jsxs("div", {
424
+ role: "alertdialog",
425
+ "aria-label": "Confirm hazardous command",
426
+ style: {
427
+ padding: tokens.spacing.smd,
428
+ borderTop: `1px solid ${tokens.colors.status.critical}44`,
429
+ background: `${tokens.colors.status.critical}12`
430
+ },
431
+ children: [
432
+ /* @__PURE__ */ jsx("div", {
433
+ style: {
434
+ fontWeight: tokens.typography.fontWeight.bold,
435
+ color: tokens.colors.status.critical,
436
+ marginBottom: tokens.spacing.sm,
437
+ fontSize: tokens.typography.fontSize.sm
438
+ },
439
+ children: "Confirm Hazardous Command"
440
+ }),
441
+ /* @__PURE__ */ jsx("p", {
442
+ style: {
443
+ fontSize: tokens.typography.fontSize.xs,
444
+ color: tokens.colors.text.secondary,
445
+ marginBottom: tokens.spacing.smd,
446
+ lineHeight: tokens.typography.lineHeight.normal
447
+ },
448
+ children: hazardousDescription || `Are you sure you want to send ${target} ${command}?`
449
+ }),
450
+ /* @__PURE__ */ jsxs("div", {
451
+ style: {
452
+ display: "flex",
453
+ gap: tokens.spacing.sm
454
+ },
455
+ children: [/* @__PURE__ */ jsx("button", {
456
+ onClick: handleSend,
457
+ style: {
458
+ background: tokens.colors.status.critical,
459
+ color: tokens.colors.text.inverse,
460
+ border: "none",
461
+ borderRadius: tokens.borderRadius.md,
462
+ padding: `${tokens.spacing.sm} ${tokens.spacing.md}`,
463
+ fontSize: tokens.typography.fontSize.xs,
464
+ fontWeight: tokens.typography.fontWeight.medium,
465
+ cursor: "pointer",
466
+ transition: "opacity 150ms ease"
467
+ },
468
+ children: "Confirm Send"
469
+ }), /* @__PURE__ */ jsx("button", {
470
+ onClick: () => setShowConfirm(false),
471
+ style: {
472
+ background: tokens.colors.background.base,
473
+ color: tokens.colors.text.secondary,
474
+ border: `1px solid ${tokens.colors.border.muted}`,
475
+ borderRadius: tokens.borderRadius.md,
476
+ padding: `${tokens.spacing.sm} ${tokens.spacing.md}`,
477
+ fontSize: tokens.typography.fontSize.xs,
478
+ cursor: "pointer",
479
+ transition: "opacity 150ms ease"
480
+ },
481
+ children: "Cancel"
482
+ })]
483
+ })
484
+ ]
485
+ }),
486
+ !showConfirm && /* @__PURE__ */ jsxs("div", {
487
+ style: {
488
+ padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,
489
+ borderTop: `1px solid ${tokens.colors.border.muted}`,
490
+ background: tokens.colors.background.surface,
491
+ display: "flex",
492
+ alignItems: "center",
493
+ justifyContent: "space-between"
494
+ },
495
+ children: [/* @__PURE__ */ jsx("button", {
496
+ onClick: resetToDefaults,
497
+ "aria-label": "Reset all parameters to defaults",
498
+ style: {
499
+ background: "transparent",
500
+ color: tokens.colors.text.muted,
501
+ border: `1px solid ${tokens.colors.border.muted}`,
502
+ borderRadius: tokens.borderRadius.md,
503
+ padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,
504
+ fontSize: tokens.typography.fontSize.xxs,
505
+ cursor: "pointer",
506
+ transition: "all 150ms ease"
507
+ },
508
+ children: "Reset Defaults"
509
+ }), /* @__PURE__ */ jsx("button", {
510
+ onClick: handleSend,
511
+ disabled: disabled || sending,
512
+ "aria-busy": sending,
513
+ style: {
514
+ background: hazardous ? tokens.colors.status.critical : tokens.colors.interactive.default,
515
+ color: tokens.colors.text.inverse,
516
+ border: "none",
517
+ borderRadius: tokens.borderRadius.md,
518
+ padding: `${tokens.spacing.sm} ${tokens.spacing.lg}`,
519
+ fontSize: tokens.typography.fontSize.sm,
520
+ fontWeight: tokens.typography.fontWeight.medium,
521
+ cursor: disabled || sending ? "not-allowed" : "pointer",
522
+ opacity: disabled || sending ? .5 : 1,
523
+ transition: "opacity 150ms ease"
524
+ },
525
+ children: sending ? "Sending..." : "Send Command"
526
+ })]
527
+ }),
528
+ showHistoryPanel && history.length > 0 && /* @__PURE__ */ jsxs("div", {
529
+ role: "list",
530
+ "aria-label": "Command history",
531
+ style: {
532
+ borderTop: `1px solid ${tokens.colors.border.muted}`,
533
+ background: tokens.colors.background.surface,
534
+ maxHeight: 200,
535
+ overflow: "auto"
536
+ },
537
+ children: [/* @__PURE__ */ jsx("div", {
538
+ style: {
539
+ padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,
540
+ fontSize: tokens.typography.fontSize.xxs,
541
+ color: tokens.colors.text.muted,
542
+ fontWeight: tokens.typography.fontWeight.medium,
543
+ textTransform: "uppercase",
544
+ letterSpacing: "0.5px"
545
+ },
546
+ children: "Command History"
547
+ }), history.slice().reverse().map((h) => /* @__PURE__ */ jsx("div", {
548
+ role: "listitem",
549
+ style: { borderBottom: `1px solid ${tokens.colors.border.muted}` },
550
+ children: /* @__PURE__ */ jsxs("button", {
551
+ type: "button",
552
+ "aria-label": `${h.status} at ${h.timestamp.toLocaleTimeString()}`,
553
+ style: {
554
+ width: "100%",
555
+ textAlign: "left",
556
+ padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,
557
+ fontSize: tokens.typography.fontSize.xxs,
558
+ display: "flex",
559
+ alignItems: "center",
560
+ gap: tokens.spacing.sm,
561
+ cursor: "pointer",
562
+ transition: "background 150ms ease",
563
+ border: "none",
564
+ background: "transparent",
565
+ color: "inherit"
566
+ },
567
+ onClick: () => setValues(h.parameters),
568
+ children: [
569
+ /* @__PURE__ */ jsx("span", {
570
+ "aria-hidden": "true",
571
+ style: {
572
+ width: 8,
573
+ height: 8,
574
+ flexShrink: 0,
575
+ ...h.status === "success" ? {
576
+ borderRadius: tokens.borderRadius.full,
577
+ background: tokens.colors.status.normal
578
+ } : h.status === "error" ? {
579
+ borderRadius: 0,
580
+ background: tokens.colors.status.critical,
581
+ clipPath: "polygon(50% 100%, 0% 0%, 100% 0%)"
582
+ } : {
583
+ borderRadius: tokens.borderRadius.full,
584
+ background: "transparent",
585
+ border: `2px solid ${tokens.colors.status.standby}`
586
+ }
587
+ }
588
+ }),
589
+ /* @__PURE__ */ jsx("span", {
590
+ style: {
591
+ color: tokens.colors.text.muted,
592
+ fontFamily: tokens.typography.fontFamily.mono,
593
+ fontSize: tokens.typography.fontSize.xxs,
594
+ flexShrink: 0
595
+ },
596
+ children: h.timestamp.toLocaleTimeString()
597
+ }),
598
+ /* @__PURE__ */ jsx("span", {
599
+ style: {
600
+ fontFamily: tokens.typography.fontFamily.mono,
601
+ fontSize: tokens.typography.fontSize.xxs,
602
+ flex: 1,
603
+ overflow: "hidden",
604
+ textOverflow: "ellipsis",
605
+ whiteSpace: "nowrap"
606
+ },
607
+ children: Object.entries(h.parameters).map(([k, v]) => `${k}=${JSON.stringify(v)}`).join(", ")
608
+ }),
609
+ h.error && /* @__PURE__ */ jsx("span", {
610
+ style: {
611
+ fontSize: tokens.typography.fontSize.micro,
612
+ color: tokens.colors.status.critical
613
+ },
614
+ children: h.error
615
+ })
616
+ ]
617
+ })
618
+ }, h.id))]
619
+ })
620
+ ]
621
+ });
514
622
  });
515
- export {
516
- CommandBuilder
517
- };
518
- //# sourceMappingURL=CommandBuilder.js.map
623
+ //#endregion
624
+ export { CommandBuilder, CommandBuilder as default };
625
+
626
+ //# sourceMappingURL=CommandBuilder.js.map