@zendir/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/LICENSE +21 -0
  3. package/README.md +589 -0
  4. package/dist/index.d.ts +8 -0
  5. package/dist/index.js +421 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/react/3d/EarthViewer.d.ts +46 -0
  8. package/dist/react/3d/EarthViewer.js +836 -0
  9. package/dist/react/3d/EarthViewer.js.map +1 -0
  10. package/dist/react/3d/SolarSystemViewer.d.ts +43 -0
  11. package/dist/react/3d/SolarSystemViewer.js +372 -0
  12. package/dist/react/3d/SolarSystemViewer.js.map +1 -0
  13. package/dist/react/3d/ZenSpace3D.d.ts +16 -0
  14. package/dist/react/3d/ZenSpace3D.js +1253 -0
  15. package/dist/react/3d/ZenSpace3D.js.map +1 -0
  16. package/dist/react/3d/ZenSpace3DCesium.d.ts +9 -0
  17. package/dist/react/3d/ZenSpace3DCesium.js +186 -0
  18. package/dist/react/3d/ZenSpace3DCesium.js.map +1 -0
  19. package/dist/react/3d/ZenSpace3DShaders.d.ts +78 -0
  20. package/dist/react/3d/ZenSpace3DShaders.js +94 -0
  21. package/dist/react/3d/ZenSpace3DShaders.js.map +1 -0
  22. package/dist/react/3d/ZenSpace3DTypes.d.ts +614 -0
  23. package/dist/react/3d/ZenSpace3DUtils.d.ts +183 -0
  24. package/dist/react/3d/ZenSpace3DUtils.js +213 -0
  25. package/dist/react/3d/ZenSpace3DUtils.js.map +1 -0
  26. package/dist/react/3d/index.d.ts +23 -0
  27. package/dist/react/3d/threeLoader.d.ts +22 -0
  28. package/dist/react/3d/threeLoader.js +18 -0
  29. package/dist/react/3d/threeLoader.js.map +1 -0
  30. package/dist/react/astro/ClassificationBanner.d.ts +25 -0
  31. package/dist/react/astro/ClassificationBanner.js +83 -0
  32. package/dist/react/astro/ClassificationBanner.js.map +1 -0
  33. package/dist/react/astro/GlobalStatusBar.d.ts +42 -0
  34. package/dist/react/astro/GlobalStatusBar.js +165 -0
  35. package/dist/react/astro/GlobalStatusBar.js.map +1 -0
  36. package/dist/react/astro/MissionClock.d.ts +169 -0
  37. package/dist/react/astro/MissionClock.js +411 -0
  38. package/dist/react/astro/MissionClock.js.map +1 -0
  39. package/dist/react/astro/MonitoringIcon.d.ts +60 -0
  40. package/dist/react/astro/MonitoringIcon.js +369 -0
  41. package/dist/react/astro/MonitoringIcon.js.map +1 -0
  42. package/dist/react/astro/Notification.d.ts +42 -0
  43. package/dist/react/astro/Notification.js +156 -0
  44. package/dist/react/astro/Notification.js.map +1 -0
  45. package/dist/react/astro/Progress.d.ts +39 -0
  46. package/dist/react/astro/Progress.js +149 -0
  47. package/dist/react/astro/Progress.js.map +1 -0
  48. package/dist/react/astro/SimulationControls.d.ts +136 -0
  49. package/dist/react/astro/SimulationControls.js +668 -0
  50. package/dist/react/astro/SimulationControls.js.map +1 -0
  51. package/dist/react/astro/StatusIndicator.d.ts +34 -0
  52. package/dist/react/astro/StatusIndicator.js +189 -0
  53. package/dist/react/astro/StatusIndicator.js.map +1 -0
  54. package/dist/react/astro/UnifiedTimeline.d.ts +106 -0
  55. package/dist/react/astro/UnifiedTimeline.js +1768 -0
  56. package/dist/react/astro/UnifiedTimeline.js.map +1 -0
  57. package/dist/react/astro/index.d.ts +63 -0
  58. package/dist/react/cards/AccessCard.d.ts +37 -0
  59. package/dist/react/cards/AccessCard.js +410 -0
  60. package/dist/react/cards/AccessCard.js.map +1 -0
  61. package/dist/react/cards/OrbitCard.d.ts +31 -0
  62. package/dist/react/cards/OrbitCard.js +372 -0
  63. package/dist/react/cards/OrbitCard.js.map +1 -0
  64. package/dist/react/cards/SpacecraftCard.d.ts +54 -0
  65. package/dist/react/cards/SpacecraftCard.js +941 -0
  66. package/dist/react/cards/SpacecraftCard.js.map +1 -0
  67. package/dist/react/cards/TelemetryCard.d.ts +40 -0
  68. package/dist/react/cards/TelemetryCard.js +742 -0
  69. package/dist/react/cards/TelemetryCard.js.map +1 -0
  70. package/dist/react/cards/TelemetryStreamCard.d.ts +59 -0
  71. package/dist/react/cards/TelemetryStreamCard.js +309 -0
  72. package/dist/react/cards/TelemetryStreamCard.js.map +1 -0
  73. package/dist/react/cards/index.d.ts +13 -0
  74. package/dist/react/charts/GroundTrackMap.d.ts +112 -0
  75. package/dist/react/charts/GroundTrackMap.js +1123 -0
  76. package/dist/react/charts/GroundTrackMap.js.map +1 -0
  77. package/dist/react/charts/GroundTrackMapLeaflet.d.ts +26 -0
  78. package/dist/react/charts/GroundTrackMapLeaflet.js +571 -0
  79. package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -0
  80. package/dist/react/charts/groundTrackMapLeafletTiles.d.ts +22 -0
  81. package/dist/react/charts/groundTrackMapLeafletTiles.js +11 -0
  82. package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -0
  83. package/dist/react/charts/groundTrackMapLeafletUtils.d.ts +24 -0
  84. package/dist/react/charts/groundTrackMapLeafletUtils.js +109 -0
  85. package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -0
  86. package/dist/react/charts/index.d.ts +10 -0
  87. package/dist/react/charts/unified/AstroChart.d.ts +24 -0
  88. package/dist/react/charts/unified/AstroChart.js +1405 -0
  89. package/dist/react/charts/unified/AstroChart.js.map +1 -0
  90. package/dist/react/charts/unified/PowerOverviewChart.d.ts +73 -0
  91. package/dist/react/charts/unified/PowerOverviewChart.js +488 -0
  92. package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -0
  93. package/dist/react/charts/unified/domain.d.ts +845 -0
  94. package/dist/react/charts/unified/domain.js +3168 -0
  95. package/dist/react/charts/unified/domain.js.map +1 -0
  96. package/dist/react/charts/unified/generators.d.ts +276 -0
  97. package/dist/react/charts/unified/generators.js +518 -0
  98. package/dist/react/charts/unified/generators.js.map +1 -0
  99. package/dist/react/charts/unified/index.d.ts +55 -0
  100. package/dist/react/charts/unified/presets.d.ts +290 -0
  101. package/dist/react/charts/unified/presets.js +999 -0
  102. package/dist/react/charts/unified/presets.js.map +1 -0
  103. package/dist/react/charts/unified/sync.d.ts +69 -0
  104. package/dist/react/charts/unified/sync.js +219 -0
  105. package/dist/react/charts/unified/sync.js.map +1 -0
  106. package/dist/react/charts/unified/theme.d.ts +447 -0
  107. package/dist/react/charts/unified/theme.js +562 -0
  108. package/dist/react/charts/unified/theme.js.map +1 -0
  109. package/dist/react/charts/unified/types.d.ts +826 -0
  110. package/dist/react/charts/unified/useChartStream.d.ts +58 -0
  111. package/dist/react/charts/unified/useChartStream.js +226 -0
  112. package/dist/react/charts/unified/useChartStream.js.map +1 -0
  113. package/dist/react/chatgpt/AppCard.d.ts +59 -0
  114. package/dist/react/chatgpt/AppCard.js +306 -0
  115. package/dist/react/chatgpt/AppCard.js.map +1 -0
  116. package/dist/react/chatgpt/ChatGPTCard.d.ts +6 -0
  117. package/dist/react/chatgpt/index.d.ts +167 -0
  118. package/dist/react/chatgpt/index.js +166 -0
  119. package/dist/react/chatgpt/index.js.map +1 -0
  120. package/dist/react/context/DisplaySettingsContext.d.ts +107 -0
  121. package/dist/react/context/DisplaySettingsContext.js +169 -0
  122. package/dist/react/context/DisplaySettingsContext.js.map +1 -0
  123. package/dist/react/context/index.d.ts +5 -0
  124. package/dist/react/core/ActivityPlanner.d.ts +45 -0
  125. package/dist/react/core/ActivityPlanner.js +532 -0
  126. package/dist/react/core/ActivityPlanner.js.map +1 -0
  127. package/dist/react/core/AppBar.d.ts +71 -0
  128. package/dist/react/core/AppBar.js +817 -0
  129. package/dist/react/core/AppBar.js.map +1 -0
  130. package/dist/react/core/AstroIcon.d.ts +84 -0
  131. package/dist/react/core/AstroIcon.js +1243 -0
  132. package/dist/react/core/AstroIcon.js.map +1 -0
  133. package/dist/react/core/Badge.d.ts +27 -0
  134. package/dist/react/core/Badge.js +134 -0
  135. package/dist/react/core/Badge.js.map +1 -0
  136. package/dist/react/core/Button.d.ts +26 -0
  137. package/dist/react/core/Button.js +306 -0
  138. package/dist/react/core/Button.js.map +1 -0
  139. package/dist/react/core/CardHeader.d.ts +34 -0
  140. package/dist/react/core/CardHeader.js +316 -0
  141. package/dist/react/core/CardHeader.js.map +1 -0
  142. package/dist/react/core/ChatPanel.d.ts +627 -0
  143. package/dist/react/core/ChatPanel.js +1144 -0
  144. package/dist/react/core/ChatPanel.js.map +1 -0
  145. package/dist/react/core/Checkbox.d.ts +26 -0
  146. package/dist/react/core/Checkbox.js +130 -0
  147. package/dist/react/core/Checkbox.js.map +1 -0
  148. package/dist/react/core/ColorPickerPanel.d.ts +25 -0
  149. package/dist/react/core/ColorPickerPanel.js +293 -0
  150. package/dist/react/core/ColorPickerPanel.js.map +1 -0
  151. package/dist/react/core/CommandBuilder.d.ts +74 -0
  152. package/dist/react/core/CommandBuilder.js +518 -0
  153. package/dist/react/core/CommandBuilder.js.map +1 -0
  154. package/dist/react/core/ConfirmDialog.d.ts +45 -0
  155. package/dist/react/core/ConfirmDialog.js +315 -0
  156. package/dist/react/core/ConfirmDialog.js.map +1 -0
  157. package/dist/react/core/ConnectionForm.d.ts +57 -0
  158. package/dist/react/core/ConnectionForm.js +496 -0
  159. package/dist/react/core/ConnectionForm.js.map +1 -0
  160. package/dist/react/core/Container.d.ts +51 -0
  161. package/dist/react/core/Container.js +670 -0
  162. package/dist/react/core/Container.js.map +1 -0
  163. package/dist/react/core/CopyButton.d.ts +39 -0
  164. package/dist/react/core/CopyButton.js +105 -0
  165. package/dist/react/core/CopyButton.js.map +1 -0
  166. package/dist/react/core/DataTable.d.ts +113 -0
  167. package/dist/react/core/DataTable.js +446 -0
  168. package/dist/react/core/DataTable.js.map +1 -0
  169. package/dist/react/core/DataValue.d.ts +64 -0
  170. package/dist/react/core/DataValue.js +545 -0
  171. package/dist/react/core/DataValue.js.map +1 -0
  172. package/dist/react/core/Dialog.d.ts +32 -0
  173. package/dist/react/core/Dialog.js +201 -0
  174. package/dist/react/core/Dialog.js.map +1 -0
  175. package/dist/react/core/FileExplorer.d.ts +65 -0
  176. package/dist/react/core/FileExplorer.js +520 -0
  177. package/dist/react/core/FileExplorer.js.map +1 -0
  178. package/dist/react/core/GlassCard.d.ts +129 -0
  179. package/dist/react/core/GlassCard.js +375 -0
  180. package/dist/react/core/GlassCard.js.map +1 -0
  181. package/dist/react/core/HeaderIconWithStatus.d.ts +39 -0
  182. package/dist/react/core/HeaderIconWithStatus.js +157 -0
  183. package/dist/react/core/HeaderIconWithStatus.js.map +1 -0
  184. package/dist/react/core/HexViewer.d.ts +143 -0
  185. package/dist/react/core/HexViewer.js +1106 -0
  186. package/dist/react/core/HexViewer.js.map +1 -0
  187. package/dist/react/core/Icon.d.ts +32 -0
  188. package/dist/react/core/Icon.js +142 -0
  189. package/dist/react/core/Icon.js.map +1 -0
  190. package/dist/react/core/ImageGallery.d.ts +41 -0
  191. package/dist/react/core/ImageGallery.js +320 -0
  192. package/dist/react/core/ImageGallery.js.map +1 -0
  193. package/dist/react/core/Input.d.ts +38 -0
  194. package/dist/react/core/Input.js +288 -0
  195. package/dist/react/core/Input.js.map +1 -0
  196. package/dist/react/core/LimitsBar.d.ts +51 -0
  197. package/dist/react/core/LimitsBar.js +200 -0
  198. package/dist/react/core/LimitsBar.js.map +1 -0
  199. package/dist/react/core/LogViewer.d.ts +61 -0
  200. package/dist/react/core/LogViewer.js +599 -0
  201. package/dist/react/core/LogViewer.js.map +1 -0
  202. package/dist/react/core/MessageStream.d.ts +58 -0
  203. package/dist/react/core/MessageStream.js +455 -0
  204. package/dist/react/core/MessageStream.js.map +1 -0
  205. package/dist/react/core/MissionCalendar.d.ts +81 -0
  206. package/dist/react/core/MissionCalendar.js +1049 -0
  207. package/dist/react/core/MissionCalendar.js.map +1 -0
  208. package/dist/react/core/NumberInput.d.ts +85 -0
  209. package/dist/react/core/NumberInput.js +507 -0
  210. package/dist/react/core/NumberInput.js.map +1 -0
  211. package/dist/react/core/PacketViewer.d.ts +73 -0
  212. package/dist/react/core/PacketViewer.js +431 -0
  213. package/dist/react/core/PacketViewer.js.map +1 -0
  214. package/dist/react/core/Pagination.d.ts +30 -0
  215. package/dist/react/core/Pagination.js +190 -0
  216. package/dist/react/core/Pagination.js.map +1 -0
  217. package/dist/react/core/PinInput.d.ts +41 -0
  218. package/dist/react/core/PinInput.js +210 -0
  219. package/dist/react/core/PinInput.js.map +1 -0
  220. package/dist/react/core/Popover.d.ts +55 -0
  221. package/dist/react/core/Popover.js +288 -0
  222. package/dist/react/core/Popover.js.map +1 -0
  223. package/dist/react/core/Select.d.ts +42 -0
  224. package/dist/react/core/Select.js +303 -0
  225. package/dist/react/core/Select.js.map +1 -0
  226. package/dist/react/core/SideNav.d.ts +103 -0
  227. package/dist/react/core/SideNav.js +551 -0
  228. package/dist/react/core/SideNav.js.map +1 -0
  229. package/dist/react/core/SidePanel.d.ts +33 -0
  230. package/dist/react/core/SidePanel.js +199 -0
  231. package/dist/react/core/SidePanel.js.map +1 -0
  232. package/dist/react/core/Tabs.d.ts +47 -0
  233. package/dist/react/core/Tabs.js +129 -0
  234. package/dist/react/core/Tabs.js.map +1 -0
  235. package/dist/react/core/Toast.d.ts +56 -0
  236. package/dist/react/core/Toast.js +229 -0
  237. package/dist/react/core/Toast.js.map +1 -0
  238. package/dist/react/core/Toggle.d.ts +22 -0
  239. package/dist/react/core/Toggle.js +151 -0
  240. package/dist/react/core/Toggle.js.map +1 -0
  241. package/dist/react/core/Tooltip.d.ts +19 -0
  242. package/dist/react/core/Tooltip.js +179 -0
  243. package/dist/react/core/Tooltip.js.map +1 -0
  244. package/dist/react/core/Typography.d.ts +127 -0
  245. package/dist/react/core/Typography.js +187 -0
  246. package/dist/react/core/Typography.js.map +1 -0
  247. package/dist/react/core/index.d.ts +108 -0
  248. package/dist/react/core/layout/Box.d.ts +77 -0
  249. package/dist/react/core/layout/Box.js +126 -0
  250. package/dist/react/core/layout/Box.js.map +1 -0
  251. package/dist/react/core/layout/Center.d.ts +20 -0
  252. package/dist/react/core/layout/Center.js +34 -0
  253. package/dist/react/core/layout/Center.js.map +1 -0
  254. package/dist/react/core/layout/Divider.d.ts +16 -0
  255. package/dist/react/core/layout/Divider.js +108 -0
  256. package/dist/react/core/layout/Divider.js.map +1 -0
  257. package/dist/react/core/layout/Flex.d.ts +30 -0
  258. package/dist/react/core/layout/Flex.js +128 -0
  259. package/dist/react/core/layout/Flex.js.map +1 -0
  260. package/dist/react/core/layout/Grid.d.ts +36 -0
  261. package/dist/react/core/layout/Grid.js +142 -0
  262. package/dist/react/core/layout/Grid.js.map +1 -0
  263. package/dist/react/core/layout/Spacer.d.ts +8 -0
  264. package/dist/react/core/layout/Spacer.js +31 -0
  265. package/dist/react/core/layout/Spacer.js.map +1 -0
  266. package/dist/react/core/layout/Stack.d.ts +54 -0
  267. package/dist/react/core/layout/Stack.js +74 -0
  268. package/dist/react/core/layout/Stack.js.map +1 -0
  269. package/dist/react/core/layout/index.d.ts +38 -0
  270. package/dist/react/core/layout/responsive.d.ts +23 -0
  271. package/dist/react/core/layout/responsive.js +26 -0
  272. package/dist/react/core/layout/responsive.js.map +1 -0
  273. package/dist/react/core/layout/useBreakpoint.d.ts +77 -0
  274. package/dist/react/core/layout/useBreakpoint.js +73 -0
  275. package/dist/react/core/layout/useBreakpoint.js.map +1 -0
  276. package/dist/react/core/propertyConfig.d.ts +443 -0
  277. package/dist/react/core/propertyConfig.js +399 -0
  278. package/dist/react/core/propertyConfig.js.map +1 -0
  279. package/dist/react/hooks/index.d.ts +21 -0
  280. package/dist/react/hooks/useAccessWindows.d.ts +66 -0
  281. package/dist/react/hooks/useCompactMode.d.ts +82 -0
  282. package/dist/react/hooks/useCompactMode.js +62 -0
  283. package/dist/react/hooks/useCompactMode.js.map +1 -0
  284. package/dist/react/hooks/useLiveSelection.d.ts +57 -0
  285. package/dist/react/hooks/useSimulationPlayback.d.ts +97 -0
  286. package/dist/react/hooks/useSimulationTime.d.ts +61 -0
  287. package/dist/react/hooks/useSpacecraftPosition.d.ts +50 -0
  288. package/dist/react/hooks/useSpacecraftPosition.js +89 -0
  289. package/dist/react/hooks/useSpacecraftPosition.js.map +1 -0
  290. package/dist/react/hooks/useTelemetry.d.ts +55 -0
  291. package/dist/react/hooks/useTelemetry.js +73 -0
  292. package/dist/react/hooks/useTelemetry.js.map +1 -0
  293. package/dist/react/hooks/useZendirSession.d.ts +109 -0
  294. package/dist/react/hooks/useZendirSession.js +148 -0
  295. package/dist/react/hooks/useZendirSession.js.map +1 -0
  296. package/dist/react/index.d.ts +74 -0
  297. package/dist/react/shared/ErrorBoundary.d.ts +63 -0
  298. package/dist/react/shared/ErrorBoundary.js +142 -0
  299. package/dist/react/shared/ErrorBoundary.js.map +1 -0
  300. package/dist/react/shared/Skeleton.d.ts +110 -0
  301. package/dist/react/shared/Skeleton.js +324 -0
  302. package/dist/react/shared/Skeleton.js.map +1 -0
  303. package/dist/react/shared/index.d.ts +12 -0
  304. package/dist/react/theme/ThemeProvider.d.ts +385 -0
  305. package/dist/react/theme/ThemeProvider.js +1096 -0
  306. package/dist/react/theme/ThemeProvider.js.map +1 -0
  307. package/dist/react/theme/astro-tokens.d.ts +153 -0
  308. package/dist/react/theme/cardAccent.d.ts +75 -0
  309. package/dist/react/theme/cardAccent.js +137 -0
  310. package/dist/react/theme/cardAccent.js.map +1 -0
  311. package/dist/react/theme/config.d.ts +39 -0
  312. package/dist/react/theme/index.d.ts +9 -0
  313. package/dist/react/types.d.ts +360 -0
  314. package/dist/react/types.js +58 -0
  315. package/dist/react/types.js.map +1 -0
  316. package/dist/react/utils/index.d.ts +247 -0
  317. package/dist/react/utils/index.js +423 -0
  318. package/dist/react/utils/index.js.map +1 -0
  319. package/dist/react/visualizations/EclipseTimerCard.d.ts +17 -0
  320. package/dist/react/visualizations/EclipseTimerCard.js +250 -0
  321. package/dist/react/visualizations/EclipseTimerCard.js.map +1 -0
  322. package/dist/react/visualizations/LinkBudgetCard.d.ts +50 -0
  323. package/dist/react/visualizations/LinkBudgetCard.js +444 -0
  324. package/dist/react/visualizations/LinkBudgetCard.js.map +1 -0
  325. package/dist/react/visualizations/NavBallCard.d.ts +17 -0
  326. package/dist/react/visualizations/NavBallCard.js +243 -0
  327. package/dist/react/visualizations/NavBallCard.js.map +1 -0
  328. package/dist/react/visualizations/PropulsionCard.d.ts +37 -0
  329. package/dist/react/visualizations/PropulsionCard.js +298 -0
  330. package/dist/react/visualizations/PropulsionCard.js.map +1 -0
  331. package/dist/react/visualizations/SensorFootprintCard.d.ts +33 -0
  332. package/dist/react/visualizations/SensorFootprintCard.js +326 -0
  333. package/dist/react/visualizations/SensorFootprintCard.js.map +1 -0
  334. package/dist/react/visualizations/ThermalHeatmapCard.d.ts +38 -0
  335. package/dist/react/visualizations/ThermalHeatmapCard.js +372 -0
  336. package/dist/react/visualizations/ThermalHeatmapCard.js.map +1 -0
  337. package/dist/react/visualizations/index.d.ts +17 -0
  338. package/dist/react.d.ts +1 -0
  339. package/dist/react.js +421 -0
  340. package/dist/react.js.map +1 -0
  341. package/dist/shaders/atmosphere.frag.js +5 -0
  342. package/dist/shaders/atmosphere.frag.js.map +1 -0
  343. package/dist/shaders/atmosphere.vert.js +5 -0
  344. package/dist/shaders/atmosphere.vert.js.map +1 -0
  345. package/dist/shaders/stars.frag.js +5 -0
  346. package/dist/shaders/stars.frag.js.map +1 -0
  347. package/dist/shaders/stars.vert.js +5 -0
  348. package/dist/shaders/stars.vert.js.map +1 -0
  349. package/dist/style.css +143 -0
  350. package/dist/tokens/index.d.ts +296 -0
  351. package/dist/tokens/index.js +263 -0
  352. package/dist/tokens/index.js.map +1 -0
  353. package/dist/tokens/tokens.css +155 -0
  354. package/dist/types/index.d.ts +23 -0
  355. package/dist/types.d.ts +1 -0
  356. package/dist/types.js +2 -0
  357. package/dist/types.js.map +1 -0
  358. package/package.json +220 -0
  359. package/sdk-stub.js +22 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatPanel.js","sources":["../../../src/react/core/ChatPanel.tsx"],"sourcesContent":["/**\n * @zendir/ui - ChatPanel Component\n * \n * Status-aware chat interface for operator dashboards with AI/command assistance.\n * Supports structured message blocks (alerts, telemetry, status cards, data tables)\n * alongside plain text, markdown, and code.\n * \n * Astro UX Compliance:\n * - 6-level status system with dual-coded shapes (color + shape)\n * - Glass-morphism for message bubbles\n * - Monospace for code/command content\n * - Focus management and keyboard shortcuts\n * \n * AI Integration:\n * - Messages can include structured `blocks` that the AI emits\n * - Four integration strategies: Tool/Function Calling, YAML, JSON, and MCP\n * - Tool/Function calling schemas for OpenAI, Anthropic, Gemini, and MCP servers\n * - `parseChatResponse()` — universal parser for JSON, YAML, and plain text\n * - `parseMcpToolResult()` — bridge MCP tool results to ChatPanel blocks\n * - `CHAT_RESPONSE_TOOL_SCHEMA` — drop-in function schema for LLM API calls\n * - `CHAT_RESPONSE_MCP_TOOL` — MCP server tool definition for structured responses\n * - `CHAT_RESPONSE_YAML_PROMPT` — system prompt snippet for YAML mode\n * \n * @example\n * ```tsx\n * <ChatPanel\n * messages={messages}\n * onSend={(text) => handleSend(text)}\n * loading={isStreaming}\n * placeholder=\"Ask about telemetry...\"\n * title=\"AI Assistant\"\n * />\n * ```\n */\n\nimport React, { memo, useState, useCallback, useEffect, useRef } from 'react';\nimport { useTheme } from '../theme';\nimport { safeAccentText } from '../utils';\nimport type { StatusLevel } from '../utils';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/** Status alert block — renders as a colored banner with icon shape */\nexport interface ChatBlockAlert {\n type: 'alert';\n status: StatusLevel;\n title: string;\n detail?: string;\n}\n\n/** Telemetry readout block — key/value pairs with optional status per row */\nexport interface ChatBlockTelemetry {\n type: 'telemetry';\n title?: string;\n items: Array<{\n label: string;\n value: string | number;\n unit?: string;\n status?: StatusLevel;\n }>;\n}\n\n/** Progress block — inline progress bar */\nexport interface ChatBlockProgress {\n type: 'progress';\n label: string;\n value: number;\n max?: number;\n status?: StatusLevel;\n}\n\n/** Data table block */\nexport interface ChatBlockTable {\n type: 'table';\n title?: string;\n columns: string[];\n rows: (string | number)[][];\n}\n\n/** Action buttons block */\nexport interface ChatBlockActions {\n type: 'actions';\n buttons: Array<{ label: string; variant?: 'primary' | 'secondary' | 'critical'; onClick: () => void }>;\n}\n\n/** Choice/option selector — AI presents options, user picks one (or multiple) */\nexport interface ChatBlockChoice {\n type: 'choice';\n /** Unique ID for this choice block (used in onBlockEvent callback) */\n id: string;\n title?: string;\n /** Allow multiple selections */\n multiple?: boolean;\n options: Array<{\n id: string;\n label: string;\n description?: string;\n status?: StatusLevel;\n disabled?: boolean;\n }>;\n /** Pre-selected option IDs */\n selected?: string[];\n /** Has the user already submitted their choice? */\n submitted?: boolean;\n}\n\n/** Confirmation gate — requires explicit operator acknowledgment before proceeding */\nexport interface ChatBlockConfirm {\n type: 'confirm';\n /** Unique ID for this confirm block (used in onBlockEvent callback) */\n id: string;\n status?: StatusLevel;\n title: string;\n detail?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n /** Has the operator already responded? */\n resolved?: 'confirmed' | 'cancelled';\n}\n\n/** Command block — displays a command with copy-to-clipboard and optional execute */\nexport interface ChatBlockCommand {\n type: 'command';\n /** Unique ID for this command block (used in onBlockEvent callback) */\n id?: string;\n language?: string;\n command: string;\n label?: string;\n /** Show an execute button (fires onBlockEvent with action:'execute') */\n executable?: boolean;\n}\n\n/** Key-value metadata block — compact pairs for context/metadata */\nexport interface ChatBlockKV {\n type: 'kv';\n title?: string;\n pairs: Array<{ key: string; value: string | number; mono?: boolean }>;\n}\n\nexport type ChatBlock =\n | ChatBlockAlert\n | ChatBlockTelemetry\n | ChatBlockProgress\n | ChatBlockTable\n | ChatBlockActions\n | ChatBlockChoice\n | ChatBlockConfirm\n | ChatBlockCommand\n | ChatBlockKV;\n\n/** Event emitted by interactive blocks (choice, confirm, command) */\nexport interface ChatBlockEvent {\n /** The block ID */\n blockId: string;\n /** The message ID containing this block */\n messageId: string;\n /** Action type */\n action: 'select' | 'confirm' | 'cancel' | 'execute' | 'copy';\n /** Payload (selected option IDs for choice, command string for execute/copy) */\n value?: string | string[];\n}\n\nexport interface ChatMessage {\n /** Unique message ID */\n id: string;\n /** Message content (supports markdown-like formatting) */\n content: string;\n /** Sender role */\n role: 'user' | 'assistant' | 'system';\n /** Timestamp (ms) */\n timestamp?: number;\n /** Message delivery status */\n status?: 'sending' | 'sent' | 'error';\n /** Astro UX severity — colors the message accent (system messages default to this) */\n severity?: StatusLevel;\n /** Structured blocks rendered below the text content */\n blocks?: ChatBlock[];\n /** Legacy: action buttons (prefer blocks with type:'actions') */\n actions?: Array<{ label: string; onClick: () => void }>;\n}\n\nexport interface ChatPanelProps {\n /** Array of messages */\n messages: ChatMessage[];\n /** Send handler */\n onSend: (text: string) => void;\n /** Is assistant currently generating */\n loading?: boolean;\n /** Input placeholder */\n placeholder?: string;\n /** Panel title */\n title?: string;\n /** Subtitle (e.g. model name) */\n subtitle?: string;\n /** Disable input */\n disabled?: boolean;\n /** Show timestamps */\n showTimestamps?: boolean;\n /** Height of the panel (default: 100%) */\n height?: string | number;\n /** Clear handler (shows clear button when provided) */\n onClear?: () => void;\n /** Handler for interactive block events (choice selection, confirm/cancel, command execute) */\n onBlockEvent?: (event: ChatBlockEvent) => void;\n /** Custom style */\n style?: React.CSSProperties;\n}\n\n// ─── Response format & parser ────────────────────────────────────────────────\n\n/**\n * Supported response formats from the AI backend.\n * - 'json': Standard JSON (default). Most compatible.\n * - 'yaml': YAML compact format. ~30-40% fewer tokens than JSON for identical data.\n * - 'auto': Auto-detect (tries JSON first, then YAML, then plain text).\n */\nexport type ChatResponseFormat = 'json' | 'yaml' | 'auto';\n\n/** Shape of a parsed AI response (content + optional blocks + severity). */\nexport interface ChatResponsePayload {\n content: string;\n severity?: StatusLevel;\n blocks?: ChatBlock[];\n}\n\n/** Options for creating a customised response parser. */\nexport interface ChatResponseParserOptions {\n /**\n * Custom YAML parser function. Receives raw YAML text, returns a parsed object.\n * If not provided, uses the built-in lightweight parser.\n *\n * For production, plug in `js-yaml` or `yaml`:\n * ```ts\n * import yaml from 'js-yaml';\n * const parse = createChatResponseParser({ yamlParser: (s) => yaml.load(s) });\n * ```\n */\n yamlParser?: (text: string) => unknown;\n /** Default format when not specified per-call. Defaults to `'auto'`. */\n defaultFormat?: ChatResponseFormat;\n /** Custom message ID generator. Defaults to `crypto.randomUUID()`. */\n idGenerator?: () => string;\n}\n\n// ─── Built-in YAML parser (recursive descent) ───────────────────────────────\n\n/**\n * Lightweight recursive-descent YAML parser for AI response structures.\n *\n * Handles: mappings, sequences, nested structures, scalars (string, number,\n * boolean, null), quoted strings, inline JSON arrays/objects, comments.\n *\n * Does NOT handle: multi-line strings, anchors/aliases, tags, flow collections\n * across lines, merge keys, or other advanced YAML features.\n *\n * For production with complex YAML, plug in `js-yaml` or `yaml` via\n * `createChatResponseParser({ yamlParser })`.\n */\nfunction parseYamlLite(text: string): unknown {\n type Line = { indent: number; text: string };\n const lines: Line[] = [];\n for (const raw of text.split('\\n')) {\n const content = raw.trimEnd();\n if (content.trim() === '' || content.trim().startsWith('#')) continue;\n lines.push({ indent: content.search(/\\S/), text: content.trim() });\n }\n\n let pos = 0;\n const peek = (): Line | null => (pos < lines.length ? lines[pos] : null);\n const advance = (): Line => lines[pos++];\n\n function scalar(s: string): unknown {\n const v = s.trim();\n if (v === '' || v === 'null' || v === '~') return null;\n if (v === 'true') return true;\n if (v === 'false') return false;\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(v)) return Number(v);\n if ((v.startsWith('\"') && v.endsWith('\"')) || (v.startsWith(\"'\") && v.endsWith(\"'\")))\n return v.slice(1, -1);\n if ((v.startsWith('[') && v.endsWith(']')) || (v.startsWith('{') && v.endsWith('}'))) {\n try { return JSON.parse(v); } catch { /* fall through */ }\n }\n return v;\n }\n\n function parseValue(minIndent: number): unknown {\n const line = peek();\n if (!line || line.indent < minIndent) return undefined;\n const actualIndent = line.indent;\n if (line.text.startsWith('- ')) return parseSequence(actualIndent);\n return parseMapping(actualIndent);\n }\n\n function parseSequence(level: number): unknown[] {\n const arr: unknown[] = [];\n while (peek() && peek()!.indent === level && peek()!.text.startsWith('- ')) {\n const line = advance();\n const after = line.text.slice(2).trim();\n\n if (!after) {\n // Bare `- ` → nested value on next lines\n const val = parseValue(level + 1);\n arr.push(val ?? null);\n continue;\n }\n\n const colonIdx = after.indexOf(':');\n if (colonIdx > 0 && !/^['\"]/.test(after)) {\n // Inline mapping start: `- key: value`\n const obj: Record<string, unknown> = {};\n const k = after.slice(0, colonIdx).trim();\n const v = after.slice(colonIdx + 1).trim();\n obj[k] = v ? scalar(v) : (parseValue(level + 3) ?? null);\n\n // Read sibling keys at `level + 2` (aligned with content after `- `)\n const siblingIndent = level + 2;\n while (peek() && peek()!.indent >= siblingIndent) {\n if (peek()!.indent === siblingIndent && !peek()!.text.startsWith('- ')) {\n const next = advance();\n const ci = next.text.indexOf(':');\n if (ci > 0) {\n const nk = next.text.slice(0, ci).trim();\n const nv = next.text.slice(ci + 1).trim();\n obj[nk] = nv ? scalar(nv) : (parseValue(siblingIndent + 1) ?? null);\n }\n } else if (peek()!.indent > siblingIndent) {\n // Deeper content should have been consumed by parseValue above;\n // if not, skip it to avoid infinite loops\n advance();\n } else {\n break;\n }\n }\n arr.push(obj);\n } else {\n // Simple scalar: `- value`\n arr.push(scalar(after));\n }\n }\n return arr;\n }\n\n function parseMapping(level: number): Record<string, unknown> {\n const obj: Record<string, unknown> = {};\n while (peek() && peek()!.indent === level && !peek()!.text.startsWith('- ')) {\n const line = advance();\n const colonIdx = line.text.indexOf(':');\n if (colonIdx <= 0) continue;\n const k = line.text.slice(0, colonIdx).trim();\n const v = line.text.slice(colonIdx + 1).trim();\n obj[k] = v ? scalar(v) : (parseValue(level + 1) ?? null);\n }\n return obj;\n }\n\n try {\n return parseValue(0) ?? {};\n } catch {\n return {};\n }\n}\n\n// ─── Sanitize parsed blocks ─────────────────────────────────────────────────\n\n/** Ensure parsed blocks have the correct array shapes so renderers never crash. */\nfunction sanitizeBlocks(blocks: unknown): ChatBlock[] | undefined {\n if (!Array.isArray(blocks)) return undefined;\n return blocks\n .filter((b): b is Record<string, unknown> => b != null && typeof b === 'object' && typeof (b as Record<string, unknown>).type === 'string')\n .map((b) => {\n const block = { ...b } as Record<string, unknown>;\n // Ensure required arrays exist for each block type\n switch (block.type) {\n case 'telemetry':\n if (!Array.isArray(block.items)) block.items = [];\n break;\n case 'table':\n if (!Array.isArray(block.columns)) block.columns = [];\n if (!Array.isArray(block.rows)) block.rows = [];\n break;\n case 'actions':\n if (!Array.isArray(block.buttons)) block.buttons = [];\n break;\n case 'choice':\n if (!Array.isArray(block.options)) block.options = [];\n if (typeof block.id !== 'string') block.id = `choice-${Date.now()}`;\n break;\n case 'confirm':\n if (typeof block.id !== 'string') block.id = `confirm-${Date.now()}`;\n if (typeof block.title !== 'string') block.title = '';\n break;\n case 'command':\n if (typeof block.command !== 'string') block.command = '';\n break;\n case 'kv':\n if (!Array.isArray(block.pairs)) block.pairs = [];\n break;\n case 'alert':\n if (typeof block.title !== 'string') block.title = '';\n if (typeof block.status !== 'string') block.status = 'normal';\n break;\n case 'progress':\n if (typeof block.label !== 'string') block.label = '';\n if (typeof block.value !== 'number') block.value = 0;\n break;\n }\n return block as unknown as ChatBlock;\n });\n}\n\n// ─── Generate message ID ────────────────────────────────────────────────────\n\nfunction generateId(custom?: () => string): string {\n if (custom) return custom();\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n return `msg-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n// ─── Core parse logic ───────────────────────────────────────────────────────\n\nfunction parseRaw(\n raw: string,\n format: ChatResponseFormat,\n yamlParser?: (text: string) => unknown,\n): ChatResponsePayload | null {\n const tryJSON = (s: string): ChatResponsePayload | null => {\n try {\n const parsed = JSON.parse(s);\n if (parsed && typeof parsed === 'object' && typeof parsed.content === 'string') return parsed;\n return null;\n } catch { return null; }\n };\n\n const tryYAML = (s: string): ChatResponsePayload | null => {\n try {\n const parser = yamlParser ?? parseYamlLite;\n const parsed = parser(s);\n if (parsed && typeof parsed === 'object' && typeof (parsed as Record<string, unknown>).content === 'string')\n return parsed as unknown as ChatResponsePayload;\n return null;\n } catch { return null; }\n };\n\n if (format === 'json') return tryJSON(raw);\n if (format === 'yaml') return tryYAML(raw);\n // auto: try JSON first, then YAML\n return tryJSON(raw) ?? tryYAML(raw);\n}\n\n/**\n * Parse an AI response string into a `ChatMessage`.\n *\n * Supports three strategies (controlled by `format`):\n * - **json**: Parse as JSON. Falls back to plain text on failure.\n * - **yaml**: Parse as YAML (built-in lightweight parser). ~30-40% fewer tokens.\n * - **auto** (default): Try JSON → YAML → plain text.\n *\n * All parsed blocks are sanitized to ensure required arrays exist, preventing\n * runtime crashes from malformed AI output.\n *\n * ## Why YAML?\n * For the same structured response, YAML uses ~30-40% fewer tokens:\n * ```\n * JSON (~180 tokens): {\"content\":\"Battery low.\",\"blocks\":[{\"type\":\"alert\",...}]}\n * YAML (~120 tokens): content: Battery low.\\nblocks:\\n - type: alert\\n ...\n * ```\n *\n * ## Tool/Function Calling (recommended for production)\n * Pass `CHAT_RESPONSE_TOOL_SCHEMA` in your API call. The model is constrained\n * at the decoding level — zero prompt tokens for the schema.\n *\n * ## Custom YAML parser\n * Use `createChatResponseParser({ yamlParser })` to plug in `js-yaml` or `yaml`.\n *\n * @example\n * ```ts\n * const msg = parseChatResponse(aiOutput); // auto-detect\n * const msg = parseChatResponse(aiOutput, 'yaml'); // force YAML\n * const msg = parseChatResponse(toolCallArgs, 'json'); // from function call\n * ```\n */\nexport function parseChatResponse(\n raw: string,\n format: ChatResponseFormat = 'auto',\n options?: ChatResponseParserOptions,\n): ChatMessage {\n const id = generateId(options?.idGenerator);\n const base: Pick<ChatMessage, 'id' | 'role' | 'timestamp'> = {\n id, role: 'assistant', timestamp: Date.now(),\n };\n\n const payload = parseRaw(raw, format, options?.yamlParser);\n if (payload) {\n return {\n ...base,\n content: payload.content ?? '',\n severity: payload.severity as StatusLevel | undefined,\n blocks: sanitizeBlocks(payload.blocks),\n };\n }\n return { ...base, content: raw };\n}\n\n/**\n * Create a pre-configured response parser.\n *\n * Use this to set global defaults (format, YAML parser, ID generator) so you\n * don't have to pass options on every call.\n *\n * @example\n * ```ts\n * import yaml from 'js-yaml';\n * import { createChatResponseParser } from '@zendir/ui';\n *\n * // Create once at app init\n * export const parseAI = createChatResponseParser({\n * yamlParser: (s) => yaml.load(s),\n * defaultFormat: 'yaml',\n * });\n *\n * // Use everywhere\n * const msg = parseAI(aiOutput);\n * ```\n */\nexport function createChatResponseParser(options: ChatResponseParserOptions = {}) {\n return (raw: string, format?: ChatResponseFormat): ChatMessage => {\n return parseChatResponse(raw, format ?? options.defaultFormat ?? 'auto', options);\n };\n}\n\n// ─── MCP (Model Context Protocol) Integration ───────────────────────────────\n\n/**\n * Lightweight types for MCP tool results.\n * These mirror the MCP specification without requiring the full SDK as a dependency.\n * @see https://modelcontextprotocol.io/specification/2025-11-25\n */\n\n/** A single content block in an MCP tool result. */\nexport interface McpToolContent {\n type: 'text' | 'image' | 'resource';\n text?: string;\n data?: string;\n mimeType?: string;\n resource?: { uri: string; text?: string; mimeType?: string };\n}\n\n/** MCP tool call result (matches `CallToolResult` from the spec). */\nexport interface McpToolResult {\n content: McpToolContent[];\n isError?: boolean;\n _meta?: Record<string, unknown>;\n}\n\n/**\n * Convert an MCP tool call result into a `ChatMessage` with structured blocks.\n *\n * Handles three patterns automatically:\n * 1. **Structured JSON/YAML** — Tool returns text matching `ChatResponsePayload` → parsed into typed blocks\n * 2. **Plain text** — Rendered as a simple assistant message with tool metadata\n * 3. **Error** — Rendered as a critical alert block\n *\n * This bridges the MCP protocol with ChatPanel's block rendering system, so any\n * MCP server tool can produce rich operator UIs without custom rendering code.\n *\n * @example\n * ```ts\n * import { parseMcpToolResult } from '@zendir/ui/react';\n *\n * // With use-mcp hook\n * const { callTool } = useMcp({ url: 'https://ops-server.example.com/mcp' });\n * const result = await callTool('get_satellite_health', { id: 'SAT-001' });\n * const msg = parseMcpToolResult('get_satellite_health', result);\n * setMessages(prev => [...prev, msg]);\n *\n * // With @modelcontextprotocol/sdk\n * const result = await mcpClient.callTool({ name: 'get_satellite_health', arguments: { id: 'SAT-001' } });\n * const msg = parseMcpToolResult('get_satellite_health', result);\n * ```\n */\nexport function parseMcpToolResult(\n toolName: string,\n result: McpToolResult,\n options?: { idGenerator?: () => string },\n): ChatMessage {\n const id = generateId(options?.idGenerator);\n const timestamp = Date.now();\n\n // Handle MCP errors\n if (result.isError) {\n const errorText = result.content\n ?.filter(c => c.type === 'text')\n .map(c => c.text)\n .join('\\n') || `Tool \"${toolName}\" failed`;\n return {\n id, role: 'assistant', timestamp,\n severity: 'critical' as StatusLevel,\n content: errorText,\n blocks: [{ type: 'alert' as const, status: 'critical' as StatusLevel, title: `MCP Tool Error: ${toolName}`, detail: errorText }],\n };\n }\n\n // Extract text content from MCP result\n const textParts = result.content?.filter(c => c.type === 'text').map(c => c.text ?? '') ?? [];\n const rawText = textParts.join('\\n');\n\n // Try parsing as structured ChatResponsePayload (JSON → YAML → plain)\n if (rawText.trim()) {\n const payload = parseRaw(rawText, 'auto');\n if (payload && payload.content) {\n return {\n id, role: 'assistant', timestamp,\n content: payload.content,\n severity: payload.severity as StatusLevel | undefined,\n blocks: sanitizeBlocks(payload.blocks),\n };\n }\n }\n\n // Plain text fallback with tool context\n return {\n id, role: 'assistant', timestamp,\n content: rawText || `Tool \\`${toolName}\\` completed successfully.`,\n blocks: [{\n type: 'kv' as const,\n title: 'MCP Tool Call',\n pairs: [\n { key: 'Tool', value: toolName, mono: true },\n ...(result._meta ? [{ key: 'Meta', value: JSON.stringify(result._meta), mono: true }] : []),\n ],\n }],\n };\n}\n\n/**\n * MCP server tool definition for the `respond_to_operator` tool.\n *\n * Register this on your MCP server to enable structured ChatPanel responses.\n * The schema is identical to `CHAT_RESPONSE_TOOL_SCHEMA` but formatted for the\n * MCP `server.tool()` registration API.\n *\n * Compatible with: `@modelcontextprotocol/sdk`, any MCP server implementation.\n *\n * @example\n * ```ts\n * import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n * import { CHAT_RESPONSE_MCP_TOOL } from '@zendir/ui';\n *\n * const server = new McpServer({ name: 'ops-assistant', version: '1.0.0' });\n *\n * server.tool(\n * CHAT_RESPONSE_MCP_TOOL.name,\n * CHAT_RESPONSE_MCP_TOOL.description,\n * CHAT_RESPONSE_MCP_TOOL.inputSchema,\n * async ({ content, severity, blocks }) => ({\n * content: [{ type: 'text', text: JSON.stringify({ content, severity, blocks }) }],\n * })\n * );\n * ```\n */\nexport const CHAT_RESPONSE_MCP_TOOL = {\n name: 'respond_to_operator',\n description:\n 'Respond to the spacecraft operator with text content and optional structured UI blocks (alerts, telemetry, progress, tables, choices, confirmations, commands, key-value metadata). Use the Astro UX 6-level status system: normal, standby, caution, serious, critical, off.',\n inputSchema: {\n type: 'object' as const,\n required: ['content'],\n properties: {\n content: { type: 'string', description: 'Plain-text or markdown response shown to the operator.' },\n severity: { type: 'string', enum: ['normal', 'standby', 'caution', 'serious', 'critical', 'off'] },\n blocks: {\n type: 'array',\n description: 'Structured UI blocks rendered below the text content.',\n items: {\n type: 'object',\n required: ['type'],\n properties: {\n type: { type: 'string', enum: ['alert', 'telemetry', 'progress', 'table', 'choice', 'confirm', 'command', 'kv'] },\n status: { type: 'string', enum: ['normal', 'standby', 'caution', 'serious', 'critical', 'off'] },\n title: { type: 'string' },\n detail: { type: 'string' },\n label: { type: 'string' },\n value: { type: 'number' },\n id: { type: 'string' },\n command: { type: 'string' },\n executable: { type: 'boolean' },\n items: { type: 'array', items: { type: 'object', properties: { label: { type: 'string' }, value: {}, unit: { type: 'string' }, status: { type: 'string' } } } },\n columns: { type: 'array', items: { type: 'string' } },\n rows: { type: 'array', items: { type: 'array' } },\n options: { type: 'array', items: { type: 'object', properties: { id: { type: 'string' }, label: { type: 'string' }, description: { type: 'string' }, status: { type: 'string' } } } },\n pairs: { type: 'array', items: { type: 'object', properties: { key: { type: 'string' }, value: {}, mono: { type: 'boolean' } } } },\n },\n },\n },\n },\n },\n} as const;\n\n// ─── Tool / Function calling schema ─────────────────────────────────────────\n\n/**\n * OpenAI-compatible function/tool schema for structured chat responses.\n *\n * Pass this as a tool definition in your API call. The model is constrained\n * to emit valid JSON matching this schema — no prompt engineering required.\n *\n * Works with: OpenAI (Structured Outputs / function calling), Anthropic (Tool Use),\n * Google Gemini (Function Calling), Mistral, Cohere, and any OpenAI-compatible API.\n *\n * @example\n * ```ts\n * // OpenAI\n * tools: [{ type: 'function', function: CHAT_RESPONSE_TOOL_SCHEMA }]\n *\n * // Anthropic\n * tools: [{ name: CHAT_RESPONSE_TOOL_SCHEMA.name,\n * description: CHAT_RESPONSE_TOOL_SCHEMA.description,\n * input_schema: CHAT_RESPONSE_TOOL_SCHEMA.parameters }]\n *\n * // Google Gemini\n * tools: [{ functionDeclarations: [CHAT_RESPONSE_TOOL_SCHEMA] }]\n * ```\n */\nexport const CHAT_RESPONSE_TOOL_SCHEMA = {\n name: 'respond_to_operator',\n description:\n 'Respond to the spacecraft operator with text content and optional structured UI blocks (alerts, telemetry, progress, tables, choices, confirmations, commands, key-value metadata). Use the Astro UX 6-level status system: normal, standby, caution, serious, critical, off.',\n parameters: {\n type: 'object' as const,\n required: ['content'],\n properties: {\n content: {\n type: 'string',\n description: 'Plain-text or markdown response shown to the operator.',\n },\n severity: {\n type: 'string',\n enum: ['normal', 'standby', 'caution', 'serious', 'critical', 'off'],\n description: 'Overall message severity. Drives the accent color and icon.',\n },\n blocks: {\n type: 'array',\n description: 'Structured UI blocks rendered below the text content.',\n items: {\n type: 'object',\n required: ['type'],\n properties: {\n type: {\n type: 'string',\n enum: ['alert', 'telemetry', 'progress', 'table', 'choice', 'confirm', 'command', 'kv'],\n },\n status: { type: 'string', enum: ['normal', 'standby', 'caution', 'serious', 'critical', 'off'] },\n title: { type: 'string' },\n detail: { type: 'string' },\n items: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n label: { type: 'string' },\n value: {},\n unit: { type: 'string' },\n status: { type: 'string', enum: ['normal', 'standby', 'caution', 'serious', 'critical', 'off'] },\n },\n },\n },\n label: { type: 'string' },\n value: { type: 'number' },\n max: { type: 'number' },\n columns: { type: 'array', items: { type: 'string' } },\n rows: { type: 'array', items: { type: 'array' } },\n id: { type: 'string' },\n multiple: { type: 'boolean' },\n options: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n label: { type: 'string' },\n description: { type: 'string' },\n status: { type: 'string', enum: ['normal', 'standby', 'caution', 'serious', 'critical', 'off'] },\n disabled: { type: 'boolean' },\n },\n },\n },\n confirmLabel: { type: 'string' },\n cancelLabel: { type: 'string' },\n language: { type: 'string' },\n command: { type: 'string' },\n executable: { type: 'boolean' },\n pairs: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n key: { type: 'string' },\n value: {},\n mono: { type: 'boolean' },\n },\n },\n },\n },\n },\n },\n },\n },\n} as const;\n\n/**\n * JSON system prompt snippet — instructs the LLM to respond with JSON.\n * Include in your system prompt for the simplest integration path.\n */\nexport const CHAT_RESPONSE_JSON_PROMPT = `When reporting telemetry, status, or alerts, respond with a JSON object:\n\n{\n \"content\": \"Plain text explanation (supports **markdown**).\",\n \"severity\": \"normal\" | \"standby\" | \"caution\" | \"serious\" | \"critical\" | \"off\",\n \"blocks\": [\n { \"type\": \"alert\", \"status\": \"caution\", \"title\": \"Alert Title\", \"detail\": \"Description\" },\n { \"type\": \"telemetry\", \"title\": \"Subsystem\", \"items\": [{ \"label\": \"Temp\", \"value\": 72, \"unit\": \"°C\", \"status\": \"normal\" }] },\n { \"type\": \"progress\", \"label\": \"Operation\", \"value\": 75, \"max\": 100, \"status\": \"normal\" },\n { \"type\": \"table\", \"title\": \"Data\", \"columns\": [\"Col1\", \"Col2\"], \"rows\": [[\"val1\", \"val2\"]] },\n { \"type\": \"choice\", \"id\": \"unique-id\", \"title\": \"Pick one\", \"options\": [{ \"id\": \"opt1\", \"label\": \"Option 1\" }] },\n { \"type\": \"confirm\", \"id\": \"unique-id\", \"status\": \"caution\", \"title\": \"Confirm action\" },\n { \"type\": \"command\", \"id\": \"cmd-id\", \"command\": \"CMD SAT-001 EXECUTE\", \"executable\": true },\n { \"type\": \"kv\", \"title\": \"Context\", \"pairs\": [{ \"key\": \"Spacecraft\", \"value\": \"SAT-001\" }] }\n ]\n}\n\nStatus levels (Astro UX): normal (nominal), standby (idle), caution (approaching limit), serious (at limit), critical (exceeding limit), off (no data).\nAlways include \"content\". Only include \"blocks\" when structured data helps the operator.` as const;\n\n/**\n * YAML system prompt snippet — instructs the LLM to respond in compact YAML\n * instead of JSON. ~30-40% fewer output tokens for the same data.\n */\nexport const CHAT_RESPONSE_YAML_PROMPT = `Respond in YAML format (not JSON). Use this structure:\n\ncontent: Your plain-text or markdown response here.\nseverity: normal\nblocks:\n - type: alert\n status: caution\n title: Alert Title\n detail: Optional detail\n - type: telemetry\n title: Subsystem\n items:\n - label: Parameter\n value: 42.5\n unit: \"°C\"\n status: normal\n - type: progress\n label: Operation\n value: 75\n max: 100\n status: normal\n - type: choice\n id: unique-id\n title: Pick one\n options:\n - id: opt1\n label: Option 1\n status: normal\n - type: command\n id: cmd-id\n language: CCSDS-TC\n command: CMD SAT-001 EXECUTE\n executable: true\n - type: kv\n title: Context\n pairs:\n - key: Spacecraft\n value: SAT-001\n\nStatus levels (Astro UX): normal, standby, caution, serious, critical, off.\nAlways include \"content\". Only include \"blocks\" when structured data helps the operator.` as const;\n\n/**\n * Astro UX status rules snippet — append to any system prompt (JSON or YAML).\n * Gives the LLM concrete thresholds for assigning status levels.\n */\nexport const CHAT_STATUS_RULES_PROMPT = `Assign status levels using these thresholds:\n- Battery: normal >50%, standby 30-50%, caution 20-30%, serious 10-20%, critical <10%\n- Temperature: normal <70°C, caution 70-80°C, serious 80-85°C, critical >85°C\n- Signal: normal >-80 dBm, caution -80 to -90, serious -90 to -95, critical <-95 dBm\n- Memory/Storage: normal <70%, caution 70-85%, serious 85-95%, critical >95%\n\nGeneral rules:\n- \"normal\" → Operating within nominal parameters\n- \"standby\" → Idle, waiting, or scheduled\n- \"caution\" → Approaching a limit\n- \"serious\" → At or exceeding a soft limit\n- \"critical\" → Exceeding hard limit, loss of signal, or failure\n- \"off\" → Powered down, no data` as const;\n\n// ─── Status shape helper ─────────────────────────────────────────────────────\n\nfunction StatusShape({ status, size = 10, color }: { status: StatusLevel; size?: number; color: string }) {\n const glow = `${color}50`;\n switch (status) {\n case 'caution':\n return <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ filter: `drop-shadow(0 0 3px ${glow})` }}><rect x=\"1\" y=\"1\" width=\"10\" height=\"10\" fill={color} /></svg>;\n case 'serious':\n return <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ filter: `drop-shadow(0 0 3px ${glow})` }}><polygon points=\"6,1 11,6 6,11 1,6\" fill={color} /></svg>;\n case 'critical':\n return <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ filter: `drop-shadow(0 0 3px ${glow})` }}><polygon points=\"6,11 1,2 11,2\" fill={color} /></svg>;\n case 'standby':\n return <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ filter: `drop-shadow(0 0 3px ${glow})` }}><circle cx=\"6\" cy=\"6\" r=\"3.5\" fill=\"none\" stroke={color} strokeWidth=\"2\" /></svg>;\n case 'off':\n return <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ filter: `drop-shadow(0 0 3px ${glow})` }}><circle cx=\"6\" cy=\"6\" r=\"3\" fill={color} /></svg>;\n default:\n return <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ filter: `drop-shadow(0 0 3px ${glow})` }}><circle cx=\"6\" cy=\"6\" r=\"5\" fill={color} /></svg>;\n }\n}\n\n// ─── Block renderers ─────────────────────────────────────────────────────────\n\nfunction AlertBlock({ block }: { block: ChatBlockAlert }) {\n const { tokens } = useTheme();\n const color = tokens.colors.status[block.status];\n return (\n <div style={{\n display: 'flex', alignItems: 'flex-start', gap: 10,\n padding: '10px 14px',\n backgroundColor: `${color}12`,\n border: `1px solid ${color}30`,\n borderLeft: `3px solid ${color}`,\n borderRadius: tokens.borderRadius.md,\n marginTop: 8,\n }}>\n <div style={{ marginTop: 2, flexShrink: 0 }}>\n <StatusShape status={block.status} size={12} color={color} />\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: tokens.typography.fontSize.sm, fontWeight: 600, color: tokens.colors.text.primary }}>\n {block.title}\n </div>\n {block.detail && (\n <div style={{ fontSize: tokens.typography.fontSize.xs, color: tokens.colors.text.secondary, marginTop: 2, lineHeight: 1.5 }}>\n {block.detail}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction TelemetryBlock({ block }: { block: ChatBlockTelemetry }) {\n const { tokens } = useTheme();\n return (\n <div style={{\n marginTop: 8,\n border: `1px solid ${tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.md,\n overflow: 'hidden',\n }}>\n {block.title && (\n <div style={{\n padding: '6px 12px',\n fontSize: tokens.typography.fontSize.xxs,\n fontWeight: 600,\n color: tokens.colors.text.secondary,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n backgroundColor: `${tokens.colors.background.elevated}80`,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n }}>\n {block.title}\n </div>\n )}\n <div style={{ padding: '8px 12px', display: 'flex', flexDirection: 'column', gap: 6 }}>\n {(block.items ?? []).map((item, i) => {\n const itemColor = item.status ? tokens.colors.status[item.status] : tokens.colors.text.secondary;\n return (\n <div key={i} style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8, fontSize: tokens.typography.fontSize.sm }}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 6, color: tokens.colors.text.secondary }}>\n {item.status && <StatusShape status={item.status} size={8} color={tokens.colors.status[item.status]} />}\n {item.label}\n </span>\n <span style={{\n fontFamily: tokens.typography.fontFamily.mono,\n fontVariantNumeric: 'tabular-nums',\n color: itemColor,\n fontWeight: 500,\n }}>\n {item.value}{item.unit ? ` ${item.unit}` : ''}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction ProgressBlock({ block }: { block: ChatBlockProgress }) {\n const { tokens } = useTheme();\n const max = block.max ?? 100;\n const pct = Math.min(100, Math.max(0, (block.value / max) * 100));\n const effectiveStatus: StatusLevel = block.status ?? (\n pct >= 75 ? 'normal' : pct >= 50 ? 'standby' : pct >= 25 ? 'caution' : pct > 0 ? 'serious' : 'off'\n );\n const color = tokens.colors.status[effectiveStatus];\n return (\n <div style={{ marginTop: 8 }}>\n <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 4, fontSize: tokens.typography.fontSize.xs, color: tokens.colors.text.secondary }}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n <StatusShape status={effectiveStatus} size={8} color={color} />\n {block.label}\n </span>\n <span style={{ fontFamily: tokens.typography.fontFamily.mono, color: tokens.colors.text.primary }}>{pct.toFixed(0)}%</span>\n </div>\n <div style={{ height: 6, backgroundColor: tokens.colors.border.muted, borderRadius: 3, overflow: 'hidden' }}>\n <div style={{ height: '100%', width: `${pct}%`, backgroundColor: color, borderRadius: 3, transition: 'width 300ms', boxShadow: `0 0 6px ${color}40` }} />\n </div>\n </div>\n );\n}\n\nfunction TableBlock({ block }: { block: ChatBlockTable }) {\n const { tokens } = useTheme();\n return (\n <div style={{ marginTop: 8, border: `1px solid ${tokens.colors.border.muted}`, borderRadius: tokens.borderRadius.md, overflow: 'hidden' }}>\n {block.title && (\n <div style={{\n padding: '6px 12px',\n fontSize: tokens.typography.fontSize.xxs,\n fontWeight: 600,\n color: tokens.colors.text.secondary,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n backgroundColor: `${tokens.colors.background.elevated}80`,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n }}>\n {block.title}\n </div>\n )}\n <div style={{ overflowX: 'auto' }}>\n <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: tokens.typography.fontSize.xs }}>\n <thead>\n <tr>\n {(block.columns ?? []).map((col, i) => (\n <th key={i} style={{\n padding: '6px 12px', textAlign: 'left', fontWeight: 600,\n color: tokens.colors.text.secondary,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n whiteSpace: 'nowrap',\n }}>\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {(block.rows ?? []).map((row, ri) => (\n <tr key={ri}>\n {(row ?? []).map((cell, ci) => (\n <td key={ci} style={{\n padding: '5px 12px',\n color: tokens.colors.text.primary,\n fontFamily: typeof cell === 'number' ? tokens.typography.fontFamily.mono : undefined,\n fontVariantNumeric: typeof cell === 'number' ? 'tabular-nums' : undefined,\n borderBottom: ri < (block.rows ?? []).length - 1 ? `1px solid ${tokens.colors.border.muted}30` : 'none',\n whiteSpace: 'nowrap',\n }}>\n {cell}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\nfunction ActionsBlock({ block }: { block: ChatBlockActions }) {\n const { tokens } = useTheme();\n return (\n <div style={{ display: 'flex', gap: 8, marginTop: 8, flexWrap: 'wrap' }}>\n {(block.buttons ?? []).map((btn, i) => {\n const isCritical = btn.variant === 'critical';\n const isPrimary = btn.variant === 'primary' || (!btn.variant && i === 0);\n const baseColor = isCritical ? tokens.colors.status.critical : tokens.colors.accent.primary;\n const textColor = isCritical ? tokens.colors.status.critical : safeAccentText(tokens.colors.accent.primary);\n return (\n <button key={i} onClick={btn.onClick} style={{\n fontSize: tokens.typography.fontSize.xxs, padding: '4px 14px',\n borderRadius: tokens.borderRadius.sm,\n border: `1px solid ${baseColor}${isPrimary ? '' : '40'}`,\n backgroundColor: isPrimary ? `${baseColor}20` : 'transparent',\n color: textColor, cursor: 'pointer',\n fontFamily: tokens.typography.fontFamily.primary,\n fontWeight: 500, transition: 'all 150ms',\n }}>\n {btn.label}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction ChoiceBlock({ block, messageId, onEvent }: { block: ChatBlockChoice; messageId: string; onEvent?: (e: ChatBlockEvent) => void }) {\n const { tokens } = useTheme();\n const [localSelected, setLocalSelected] = useState<Set<string>>(new Set(block.selected ?? []));\n const isSubmitted = block.submitted;\n\n const toggle = (optId: string) => {\n if (isSubmitted) return;\n setLocalSelected(prev => {\n const next = new Set(prev);\n if (block.multiple) {\n next.has(optId) ? next.delete(optId) : next.add(optId);\n } else {\n next.clear();\n next.add(optId);\n }\n return next;\n });\n };\n\n const submit = () => {\n if (localSelected.size === 0 || isSubmitted) return;\n onEvent?.({ blockId: block.id, messageId, action: 'select', value: Array.from(localSelected) });\n };\n\n return (\n <div style={{ marginTop: 8 }}>\n {block.title && (\n <div style={{ fontSize: tokens.typography.fontSize.xs, fontWeight: 600, color: tokens.colors.text.secondary, marginBottom: 6 }}>\n {block.title}{block.multiple ? ' (select multiple)' : ''}\n </div>\n )}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n {(block.options ?? []).map(opt => {\n const isSelected = localSelected.has(opt.id);\n const optColor = opt.status ? tokens.colors.status[opt.status] : tokens.colors.accent.primary;\n const isDisabled = opt.disabled || isSubmitted;\n return (\n <button key={opt.id} type=\"button\" onClick={() => toggle(opt.id)} disabled={isDisabled} style={{\n display: 'flex', alignItems: 'center', gap: 10, padding: '8px 12px',\n borderRadius: tokens.borderRadius.md, cursor: isDisabled ? 'default' : 'pointer',\n border: `1px solid ${isSelected ? optColor : tokens.colors.border.muted}`,\n backgroundColor: isSelected ? `${optColor}15` : 'transparent',\n transition: 'all 150ms', textAlign: 'left',\n fontFamily: tokens.typography.fontFamily.primary,\n opacity: isDisabled && !isSelected ? 0.5 : 1,\n }}>\n {/* Radio / checkbox indicator */}\n <div style={{\n width: 16, height: 16, flexShrink: 0,\n borderRadius: block.multiple ? 3 : '50%',\n border: `2px solid ${isSelected ? optColor : tokens.colors.border.muted}`,\n backgroundColor: isSelected ? optColor : 'transparent',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n transition: 'all 150ms',\n }}>\n {isSelected && (\n <svg viewBox=\"0 0 12 12\" width={10} height={10} fill=\"none\" stroke={tokens.colors.text.inverse} strokeWidth={2}>\n <polyline points=\"2,6 5,9 10,3\" />\n </svg>\n )}\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n {opt.status && <StatusShape status={opt.status} size={8} color={tokens.colors.status[opt.status]} />}\n <span style={{ fontSize: tokens.typography.fontSize.sm, color: tokens.colors.text.primary, fontWeight: 500 }}>{opt.label}</span>\n </div>\n {opt.description && (\n <div style={{ fontSize: tokens.typography.fontSize.xs, color: tokens.colors.text.tertiary, marginTop: 1 }}>{opt.description}</div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n {!isSubmitted && onEvent && (\n <button type=\"button\" onClick={submit} disabled={localSelected.size === 0} style={{\n marginTop: 8, padding: '5px 18px', fontSize: tokens.typography.fontSize.xs,\n fontWeight: 600, borderRadius: tokens.borderRadius.sm,\n border: `1px solid ${tokens.colors.accent.primary}`,\n backgroundColor: localSelected.size > 0 ? `${tokens.colors.accent.primary}20` : 'transparent',\n color: localSelected.size > 0 ? safeAccentText(tokens.colors.accent.primary) : tokens.colors.text.tertiary,\n cursor: localSelected.size > 0 ? 'pointer' : 'not-allowed',\n fontFamily: tokens.typography.fontFamily.primary, transition: 'all 150ms',\n }}>\n Confirm Selection\n </button>\n )}\n {isSubmitted && (\n <div style={{ marginTop: 6, fontSize: tokens.typography.fontSize.xs, color: tokens.colors.text.tertiary, fontStyle: 'italic' }}>\n Selection submitted\n </div>\n )}\n </div>\n );\n}\n\nfunction ConfirmBlock({ block, messageId, onEvent }: { block: ChatBlockConfirm; messageId: string; onEvent?: (e: ChatBlockEvent) => void }) {\n const { tokens } = useTheme();\n const status = block.status ?? 'caution';\n const color = tokens.colors.status[status];\n const resolved = block.resolved;\n\n return (\n <div style={{\n marginTop: 8, padding: '12px 14px',\n backgroundColor: `${color}10`,\n border: `1px solid ${color}30`,\n borderLeft: `3px solid ${color}`,\n borderRadius: tokens.borderRadius.md,\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 4 }}>\n <StatusShape status={status} size={12} color={color} />\n <span style={{ fontSize: tokens.typography.fontSize.sm, fontWeight: 600, color: tokens.colors.text.primary }}>{block.title}</span>\n </div>\n {block.detail && (\n <div style={{ fontSize: tokens.typography.fontSize.xs, color: tokens.colors.text.secondary, marginBottom: 8, lineHeight: 1.5 }}>{block.detail}</div>\n )}\n {!resolved && onEvent ? (\n <div style={{ display: 'flex', gap: 8 }}>\n <button type=\"button\" onClick={() => onEvent({ blockId: block.id, messageId, action: 'confirm' })} style={{\n padding: '5px 16px', fontSize: tokens.typography.fontSize.xs, fontWeight: 600,\n borderRadius: tokens.borderRadius.sm, cursor: 'pointer',\n border: `1px solid ${color}`, backgroundColor: `${color}20`, color,\n fontFamily: tokens.typography.fontFamily.primary, transition: 'all 150ms',\n }}>\n {block.confirmLabel ?? 'Confirm'}\n </button>\n <button type=\"button\" onClick={() => onEvent({ blockId: block.id, messageId, action: 'cancel' })} style={{\n padding: '5px 16px', fontSize: tokens.typography.fontSize.xs, fontWeight: 500,\n borderRadius: tokens.borderRadius.sm, cursor: 'pointer',\n border: `1px solid ${tokens.colors.border.muted}`, backgroundColor: 'transparent',\n color: tokens.colors.text.secondary,\n fontFamily: tokens.typography.fontFamily.primary, transition: 'all 150ms',\n }}>\n {block.cancelLabel ?? 'Cancel'}\n </button>\n </div>\n ) : resolved ? (\n <div style={{\n fontSize: tokens.typography.fontSize.xs, fontWeight: 500,\n color: resolved === 'confirmed' ? tokens.colors.status.normal : tokens.colors.text.tertiary,\n fontStyle: 'italic',\n }}>\n {resolved === 'confirmed' ? '✓ Confirmed' : '✗ Cancelled'}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction CommandBlock({ block, messageId, onEvent }: { block: ChatBlockCommand; messageId: string; onEvent?: (e: ChatBlockEvent) => void }) {\n const { tokens } = useTheme();\n const [copied, setCopied] = useState(false);\n\n const handleCopy = () => {\n navigator.clipboard?.writeText(block.command).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n if (block.id) onEvent?.({ blockId: block.id, messageId, action: 'copy', value: block.command });\n };\n\n const handleExecute = () => {\n if (block.id) onEvent?.({ blockId: block.id, messageId, action: 'execute', value: block.command });\n };\n\n return (\n <div style={{ marginTop: 8, borderRadius: tokens.borderRadius.md, overflow: 'hidden', border: `1px solid ${tokens.colors.border.muted}` }}>\n {block.label && (\n <div style={{\n padding: '5px 12px', fontSize: tokens.typography.fontSize.xxs, fontWeight: 600,\n color: tokens.colors.text.tertiary, textTransform: 'uppercase', letterSpacing: '0.05em',\n backgroundColor: `${tokens.colors.background.elevated}80`,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n display: 'flex', alignItems: 'center', justifyContent: 'space-between',\n }}>\n <span>{block.label}{block.language ? ` · ${block.language}` : ''}</span>\n </div>\n )}\n <div style={{ position: 'relative' }}>\n <pre style={{\n margin: 0, padding: '10px 12px', paddingRight: 80,\n fontSize: tokens.typography.fontSize.xs, fontFamily: tokens.typography.fontFamily.mono,\n backgroundColor: `${tokens.colors.background.base}80`, color: tokens.colors.text.primary,\n overflowX: 'auto', lineHeight: 1.5,\n }}>\n {block.command}\n </pre>\n <div style={{ position: 'absolute', top: 6, right: 8, display: 'flex', gap: 4 }}>\n <button type=\"button\" onClick={handleCopy} style={{\n padding: '2px 8px', fontSize: tokens.typography.fontSize.micro, borderRadius: tokens.borderRadius.sm,\n border: `1px solid ${tokens.colors.border.muted}`, backgroundColor: tokens.colors.background.elevated,\n color: copied ? tokens.colors.status.normal : tokens.colors.text.tertiary,\n cursor: 'pointer', fontFamily: tokens.typography.fontFamily.primary, fontWeight: 500,\n }}>\n {copied ? '✓ Copied' : 'Copy'}\n </button>\n {block.executable && onEvent && block.id && (\n <button type=\"button\" onClick={handleExecute} style={{\n padding: '2px 8px', fontSize: tokens.typography.fontSize.micro, borderRadius: tokens.borderRadius.sm,\n border: `1px solid ${tokens.colors.accent.primary}60`,\n backgroundColor: `${tokens.colors.accent.primary}15`,\n color: safeAccentText(tokens.colors.accent.primary),\n cursor: 'pointer', fontFamily: tokens.typography.fontFamily.primary, fontWeight: 600,\n }}>\n Run\n </button>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction KVBlock({ block }: { block: ChatBlockKV }) {\n const { tokens } = useTheme();\n return (\n <div style={{\n marginTop: 8, padding: '8px 12px',\n backgroundColor: `${tokens.colors.background.elevated}40`,\n borderRadius: tokens.borderRadius.md,\n border: `1px solid ${tokens.colors.border.muted}`,\n }}>\n {block.title && (\n <div style={{\n fontSize: tokens.typography.fontSize.xxs, fontWeight: 600, color: tokens.colors.text.tertiary,\n textTransform: 'uppercase', letterSpacing: '0.05em', marginBottom: 6,\n }}>\n {block.title}\n </div>\n )}\n <div style={{ display: 'grid', gridTemplateColumns: 'auto 1fr', gap: '3px 16px', fontSize: tokens.typography.fontSize.xs }}>\n {(block.pairs ?? []).map((p, i) => (\n <React.Fragment key={i}>\n <span style={{ color: tokens.colors.text.tertiary, whiteSpace: 'nowrap' }}>{p.key}</span>\n <span style={{\n color: tokens.colors.text.primary,\n fontFamily: p.mono ? tokens.typography.fontFamily.mono : undefined,\n fontVariantNumeric: p.mono ? 'tabular-nums' : undefined,\n }}>\n {p.value}\n </span>\n </React.Fragment>\n ))}\n </div>\n </div>\n );\n}\n\nfunction renderBlock(block: ChatBlock, index: number, messageId: string, onEvent?: (e: ChatBlockEvent) => void) {\n switch (block.type) {\n case 'alert': return <AlertBlock key={index} block={block} />;\n case 'telemetry': return <TelemetryBlock key={index} block={block} />;\n case 'progress': return <ProgressBlock key={index} block={block} />;\n case 'table': return <TableBlock key={index} block={block} />;\n case 'actions': return <ActionsBlock key={index} block={block} />;\n case 'choice': return <ChoiceBlock key={index} block={block} messageId={messageId} onEvent={onEvent} />;\n case 'confirm': return <ConfirmBlock key={index} block={block} messageId={messageId} onEvent={onEvent} />;\n case 'command': return <CommandBlock key={index} block={block} messageId={messageId} onEvent={onEvent} />;\n case 'kv': return <KVBlock key={index} block={block} />;\n default: return null;\n }\n}\n\n// ─── Main component ──────────────────────────────────────────────────────────\n\nexport const ChatPanel = memo(function ChatPanel({\n messages = [],\n onSend,\n loading = false,\n placeholder = 'Type a message...',\n title,\n subtitle,\n disabled = false,\n showTimestamps = true,\n height = '100%',\n onClear,\n onBlockEvent,\n style,\n}: ChatPanelProps): React.ReactElement {\n const { tokens } = useTheme();\n const [input, setInput] = useState('');\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLTextAreaElement>(null);\n \n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages, loading]);\n \n const handleSend = useCallback(() => {\n const text = input.trim();\n if (!text || disabled) return;\n onSend(text);\n setInput('');\n if (inputRef.current) inputRef.current.style.height = 'auto';\n }, [input, onSend, disabled]);\n \n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSend(); }\n }, [handleSend]);\n \n const handleInput = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInput(e.target.value);\n const el = e.target;\n el.style.height = 'auto';\n el.style.height = `${Math.min(el.scrollHeight, 120)}px`;\n }, []);\n \n const formatTime = (ts?: number) => {\n if (!ts) return '';\n return new Date(ts).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n };\n \n // Markdown-ish rendering: **bold**, `code`, ```code blocks```, - lists\n const renderContent = (text: string) => {\n const parts: React.ReactNode[] = [];\n const lines = text.split('\\n');\n let inCode = false;\n let codeBlock: string[] = [];\n \n lines.forEach((line, i) => {\n if (line.startsWith('```')) {\n if (inCode) {\n parts.push(\n <pre key={`code-${i}`} style={{\n backgroundColor: `${tokens.colors.background.base}80`,\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n borderRadius: tokens.borderRadius.sm,\n fontSize: tokens.typography.fontSize.xs,\n fontFamily: tokens.typography.fontFamily.mono,\n overflowX: 'auto',\n margin: `${tokens.spacing.xs} 0`,\n border: `1px solid ${tokens.colors.border.muted}`,\n }}>\n {codeBlock.join('\\n')}\n </pre>\n );\n codeBlock = [];\n inCode = false;\n } else {\n inCode = true;\n }\n return;\n }\n if (inCode) { codeBlock.push(line); return; }\n \n let processed: React.ReactNode = line;\n if (line.includes('**')) {\n const segments = line.split(/\\*\\*(.*?)\\*\\*/g);\n processed = segments.map((seg, j) => j % 2 === 1 ? <strong key={j}>{seg}</strong> : seg);\n }\n if (typeof processed === 'string' && processed.includes('`')) {\n const segments = processed.split(/`(.*?)`/g);\n processed = segments.map((seg, j) =>\n j % 2 === 1\n ? <code key={j} style={{\n backgroundColor: `${tokens.colors.background.base}80`, padding: '1px 4px',\n borderRadius: '3px', fontSize: '0.9em', fontFamily: tokens.typography.fontFamily.mono,\n }}>{seg}</code>\n : seg\n );\n }\n parts.push(<React.Fragment key={`line-${i}`}>{processed}{i < lines.length - 1 && <br />}</React.Fragment>);\n });\n return parts;\n };\n \n const TypingDots = () => (\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', padding: tokens.spacing.xs }}>\n {[0, 1, 2].map(i => (\n <div key={i} style={{\n width: 6, height: 6, borderRadius: '50%',\n backgroundColor: tokens.colors.accent.primary, opacity: 0.6,\n animation: `zendir-typing 1.2s ease-in-out ${i * 0.2}s infinite`,\n }} />\n ))}\n <style>{`@keyframes zendir-typing { 0%,60%,100%{opacity:.3;transform:translateY(0)} 30%{opacity:1;transform:translateY(-3px)} }`}</style>\n </div>\n );\n \n return (\n <div style={{\n display: 'flex', flexDirection: 'column',\n height: typeof height === 'number' ? `${height}px` : height,\n fontFamily: tokens.typography.fontFamily.primary,\n backgroundColor: tokens.colors.background.base,\n borderRadius: tokens.borderRadius.lg,\n border: `1px solid ${tokens.colors.border.muted}`,\n overflow: 'hidden', ...style,\n }}>\n {/* Header */}\n {(title || onClear) && (\n <div style={{\n display: 'flex', alignItems: 'center', justifyContent: 'space-between',\n padding: `${tokens.spacing.sm} ${tokens.spacing.md}`,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n backgroundColor: tokens.colors.background.surface,\n }}>\n <div>\n {title && <div style={{ fontSize: tokens.typography.fontSize.sm, fontWeight: 600, color: tokens.colors.text.primary }}>{title}</div>}\n {subtitle && <div style={{ fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.text.tertiary }}>{subtitle}</div>}\n </div>\n {onClear && messages.length > 0 && (\n <button onClick={onClear} style={{\n fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.text.tertiary,\n backgroundColor: 'transparent', border: 'none', cursor: 'pointer',\n padding: '4px 8px', borderRadius: tokens.borderRadius.sm, fontFamily: tokens.typography.fontFamily.primary,\n }}>Clear</button>\n )}\n </div>\n )}\n \n {/* Messages — aria-live so screen readers announce new messages */}\n <div\n role=\"log\"\n aria-live=\"polite\"\n aria-label=\"Chat messages\"\n style={{\n flex: 1, overflow: 'auto', padding: tokens.spacing.md,\n display: 'flex', flexDirection: 'column', gap: tokens.spacing.sm,\n }}\n >\n {messages.length === 0 && (\n <div style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n flex: 1, color: tokens.colors.text.tertiary, fontSize: tokens.typography.fontSize.sm,\n }}>No messages yet</div>\n )}\n \n {messages.map(msg => {\n const isUser = msg.role === 'user';\n const isSystem = msg.role === 'system';\n const severity = msg.severity;\n const severityColor = severity ? tokens.colors.status[severity] : undefined;\n \n // System message accent: uses severity if set, otherwise default caution tint\n const systemBg = severityColor ? `${severityColor}12` : `${tokens.colors.status.caution}10`;\n const systemBorder = severityColor ? `${severityColor}30` : `${tokens.colors.status.caution}20`;\n const systemAccent = severityColor || undefined;\n \n return (\n <div key={msg.id} style={{\n display: 'flex', flexDirection: 'column',\n alignItems: isUser ? 'flex-end' : 'flex-start',\n maxWidth: isSystem ? '100%' : '85%',\n alignSelf: isUser ? 'flex-end' : 'flex-start',\n }}>\n <div style={{\n padding: `${tokens.spacing.sm} ${tokens.spacing.md}`,\n borderRadius: tokens.borderRadius.md,\n backgroundColor: isUser\n ? `${tokens.colors.accent.primary}20`\n : isSystem ? systemBg : tokens.colors.background.surface,\n border: `1px solid ${isUser\n ? `${tokens.colors.accent.primary}30`\n : isSystem ? systemBorder : tokens.colors.border.muted}`,\n borderLeft: isSystem && systemAccent ? `3px solid ${systemAccent}` : undefined,\n fontSize: tokens.typography.fontSize.sm,\n color: tokens.colors.text.primary,\n lineHeight: 1.6,\n width: isSystem ? '100%' : 'auto',\n opacity: msg.status === 'sending' ? 0.7 : 1,\n }}>\n {/* Severity indicator for system messages */}\n {isSystem && severity && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 4 }}>\n <StatusShape status={severity} size={10} color={severityColor!} />\n <span style={{\n fontSize: tokens.typography.fontSize.xxs, fontWeight: 600,\n color: severityColor, textTransform: 'uppercase', letterSpacing: '0.04em',\n }}>\n {severity}\n </span>\n </div>\n )}\n \n {renderContent(msg.content)}\n \n {/* Structured blocks */}\n {Array.isArray(msg.blocks) && msg.blocks.map((block, i) => block ? renderBlock(block, i, msg.id, onBlockEvent) : null)}\n \n {/* Legacy action buttons */}\n {msg.actions && msg.actions.length > 0 && (\n <div style={{\n display: 'flex', gap: tokens.spacing.xs, marginTop: tokens.spacing.xs,\n paddingTop: tokens.spacing.xs, borderTop: `1px solid ${tokens.colors.border.muted}`,\n }}>\n {msg.actions.map((action, i) => (\n <button key={i} onClick={action.onClick} style={{\n fontSize: tokens.typography.fontSize.xxs, padding: '2px 10px',\n borderRadius: tokens.borderRadius.sm,\n border: `1px solid ${tokens.colors.accent.primary}40`,\n backgroundColor: `${tokens.colors.accent.primary}10`,\n color: safeAccentText(tokens.colors.accent.primary), cursor: 'pointer',\n fontFamily: tokens.typography.fontFamily.primary,\n }}>{action.label}</button>\n ))}\n </div>\n )}\n </div>\n \n {showTimestamps && msg.timestamp && (\n <div style={{\n fontSize: tokens.typography.fontSize.micro, color: tokens.colors.text.tertiary,\n marginTop: '2px', paddingLeft: tokens.spacing.xs, paddingRight: tokens.spacing.xs,\n display: 'flex', alignItems: 'center', gap: '4px',\n }}>\n {formatTime(msg.timestamp)}\n {msg.status === 'error' && <span style={{ color: tokens.colors.status.critical }}>• Failed</span>}\n </div>\n )}\n </div>\n );\n })}\n \n {loading && (\n <div style={{\n alignSelf: 'flex-start',\n padding: `${tokens.spacing.xs} ${tokens.spacing.md}`,\n borderRadius: tokens.borderRadius.md,\n backgroundColor: tokens.colors.background.surface,\n border: `1px solid ${tokens.colors.border.muted}`,\n }}>\n <TypingDots />\n </div>\n )}\n <div ref={messagesEndRef} />\n </div>\n \n {/* Input */}\n <div style={{\n display: 'flex', alignItems: 'flex-end', gap: tokens.spacing.sm,\n padding: tokens.spacing.md,\n borderTop: `1px solid ${tokens.colors.border.muted}`,\n backgroundColor: tokens.colors.background.surface,\n }}>\n <textarea\n ref={inputRef} value={input} onChange={handleInput} onKeyDown={handleKeyDown}\n placeholder={placeholder} disabled={disabled} aria-label=\"Message input\" rows={1}\n style={{\n flex: 1, resize: 'none',\n border: `1px solid ${tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.md,\n padding: `${tokens.spacing.sm} ${tokens.spacing.md}`,\n fontSize: tokens.typography.fontSize.sm,\n fontFamily: tokens.typography.fontFamily.primary,\n color: tokens.colors.text.primary,\n backgroundColor: tokens.colors.background.base,\n outline: 'none', transition: tokens.animation.fast,\n maxHeight: 120, lineHeight: 1.5,\n }}\n />\n <button onClick={handleSend} disabled={disabled || !input.trim()} aria-label=\"Send message\" style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: 44, height: 44, borderRadius: tokens.borderRadius.md, border: 'none',\n backgroundColor: input.trim() ? tokens.colors.accent.primary : `${tokens.colors.accent.primary}20`,\n color: input.trim() ? tokens.colors.text.inverse : tokens.colors.text.tertiary,\n cursor: input.trim() && !disabled ? 'pointer' : 'not-allowed',\n transition: tokens.animation.fast, flexShrink: 0,\n }}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" /></svg>\n </button>\n </div>\n </div>\n );\n});\n\nexport default ChatPanel;\n"],"names":["ChatPanel"],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { default as React } from 'react';
2
+
3
+ export interface CheckboxProps {
4
+ /** Checkbox or radio */
5
+ type?: 'checkbox' | 'radio';
6
+ /** Checked state */
7
+ checked?: boolean;
8
+ /** Change handler */
9
+ onChange?: (checked: boolean) => void;
10
+ /** Label text */
11
+ label?: string;
12
+ /** Value (for radio groups) */
13
+ value?: string;
14
+ /** Name (for radio groups) */
15
+ name?: string;
16
+ /** Disabled state */
17
+ disabled?: boolean;
18
+ /** Indeterminate state (checkbox only) */
19
+ indeterminate?: boolean;
20
+ /** Size variant */
21
+ size?: 'small' | 'medium';
22
+ /** Custom className */
23
+ className?: string;
24
+ }
25
+ export declare const Checkbox: React.MemoExoticComponent<React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLInputElement>>>;
26
+ export default Checkbox;
@@ -0,0 +1,130 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { memo, forwardRef, useState, useId } from "react";
3
+ import { classNames } from "../utils/index.js";
4
+ import { useTheme } from "../theme/ThemeProvider.js";
5
+ const Checkbox = memo(forwardRef(function Checkbox2({
6
+ type = "checkbox",
7
+ checked = false,
8
+ onChange,
9
+ label,
10
+ value,
11
+ name,
12
+ disabled = false,
13
+ indeterminate = false,
14
+ size = "medium",
15
+ className = ""
16
+ }, ref) {
17
+ const { tokens, theme } = useTheme();
18
+ const isTransparentTheme = theme === "transparent" || theme === "transparent-bold" || theme === "transparent-minimal";
19
+ const transparentDefault = tokens.colors.interactive.transparentDefault;
20
+ const [focused, setFocused] = useState(false);
21
+ const [hovered, setHovered] = useState(false);
22
+ const id = useId();
23
+ const sizeConfig = {
24
+ small: { boxSize: 18, iconSize: 12, targetSize: 24 },
25
+ medium: { boxSize: 20, iconSize: 14, targetSize: 24 }
26
+ };
27
+ const config = sizeConfig[size];
28
+ const isRadio = type === "radio";
29
+ const borderRadius = isRadio ? "50%" : tokens.borderRadius.md;
30
+ const boxStyle = {
31
+ width: config.boxSize,
32
+ height: config.boxSize,
33
+ border: `${tokens.borders.width.thick} solid ${checked ? tokens.colors.accent.primary : hovered && !disabled ? `${tokens.colors.accent.primary}60` : tokens.colors.border.muted}`,
34
+ borderRadius,
35
+ backgroundColor: checked ? tokens.colors.accent.primary : isTransparentTheme && transparentDefault ? transparentDefault : "transparent",
36
+ display: "flex",
37
+ alignItems: "center",
38
+ justifyContent: "center",
39
+ transition: `${tokens.animation.normal}, opacity ${tokens.animation.duration.normal}ms ${tokens.animation.easing.default}`,
40
+ flexShrink: 0,
41
+ boxShadow: checked ? `0 0 12px ${tokens.colors.accent.primary}40` : focused ? tokens.borders.focusRing.subtle : "none",
42
+ transform: checked ? "scale(1)" : hovered && !disabled ? "scale(1.05)" : "scale(1)"
43
+ };
44
+ const checkIcon = /* @__PURE__ */ jsx(
45
+ "svg",
46
+ {
47
+ width: config.iconSize,
48
+ height: config.iconSize,
49
+ viewBox: "0 0 24 24",
50
+ fill: "none",
51
+ stroke: "#ffffff",
52
+ strokeWidth: "3",
53
+ strokeLinecap: "round",
54
+ strokeLinejoin: "round",
55
+ children: indeterminate ? /* @__PURE__ */ jsx("line", { x1: "5", y1: "12", x2: "19", y2: "12" }) : /* @__PURE__ */ jsx("polyline", { points: "20 6 9 17 4 12" })
56
+ }
57
+ );
58
+ const radioIcon = /* @__PURE__ */ jsx(
59
+ "div",
60
+ {
61
+ style: {
62
+ width: config.iconSize - 4,
63
+ height: config.iconSize - 4,
64
+ borderRadius: "50%",
65
+ backgroundColor: "#ffffff"
66
+ }
67
+ }
68
+ );
69
+ return /* @__PURE__ */ jsxs(
70
+ "label",
71
+ {
72
+ htmlFor: id,
73
+ className: classNames("zendir-checkbox", className),
74
+ onMouseEnter: () => setHovered(true),
75
+ onMouseLeave: () => setHovered(false),
76
+ style: {
77
+ display: "inline-flex",
78
+ alignItems: "center",
79
+ gap: tokens.spacing.sm,
80
+ cursor: disabled ? "not-allowed" : "pointer",
81
+ opacity: disabled ? 0.5 : 1
82
+ },
83
+ children: [
84
+ /* @__PURE__ */ jsx("div", { style: {
85
+ display: "flex",
86
+ alignItems: "center",
87
+ justifyContent: "center",
88
+ minWidth: config.targetSize,
89
+ minHeight: config.targetSize
90
+ }, children: /* @__PURE__ */ jsx("div", { style: boxStyle, children: checked && (isRadio ? radioIcon : checkIcon) }) }),
91
+ /* @__PURE__ */ jsx(
92
+ "input",
93
+ {
94
+ ref,
95
+ type,
96
+ id,
97
+ name,
98
+ value,
99
+ checked,
100
+ disabled,
101
+ onChange: (e) => onChange == null ? void 0 : onChange(e.target.checked),
102
+ onFocus: () => setFocused(true),
103
+ onBlur: () => setFocused(false),
104
+ style: {
105
+ position: "absolute",
106
+ opacity: 0,
107
+ width: 0,
108
+ height: 0
109
+ }
110
+ }
111
+ ),
112
+ label && /* @__PURE__ */ jsx(
113
+ "span",
114
+ {
115
+ style: {
116
+ fontSize: "0.875rem",
117
+ color: tokens.colors.text.primary,
118
+ transition: tokens.animation.fast
119
+ },
120
+ children: label
121
+ }
122
+ )
123
+ ]
124
+ }
125
+ );
126
+ }));
127
+ export {
128
+ Checkbox
129
+ };
130
+ //# sourceMappingURL=Checkbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Checkbox.js","sources":["../../../src/react/core/Checkbox.tsx"],"sourcesContent":["/**\n * @zendir/ui - Checkbox Component\n * \n * Checkbox and Radio button following Astro UX Design System with Zendir purple accents.\n * \n * Astro UX Compliance:\n * - Clear visual states\n * - Accessible keyboard support\n * - Indeterminate state for checkbox\n * \n * Zendir Enhancements:\n * - Purple accent when checked\n * - Glow effect on focus\n * - Smooth spring animation\n * \n * @example\n * ```tsx\n * <Checkbox checked={agreed} onChange={setAgreed} label=\"I agree to terms\" />\n * <Checkbox type=\"radio\" name=\"priority\" value=\"high\" label=\"High Priority\" />\n * ```\n */\n\nimport React, { memo, forwardRef, useId, useState } from 'react';\nimport { useTheme } from '../theme';\nimport { classNames } from '../utils';\n\nexport interface CheckboxProps {\n /** Checkbox or radio */\n type?: 'checkbox' | 'radio';\n /** Checked state */\n checked?: boolean;\n /** Change handler */\n onChange?: (checked: boolean) => void;\n /** Label text */\n label?: string;\n /** Value (for radio groups) */\n value?: string;\n /** Name (for radio groups) */\n name?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Indeterminate state (checkbox only) */\n indeterminate?: boolean;\n /** Size variant */\n size?: 'small' | 'medium';\n /** Custom className */\n className?: string;\n}\n\nexport const Checkbox = memo(forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(\n {\n type = 'checkbox',\n checked = false,\n onChange,\n label,\n value,\n name,\n disabled = false,\n indeterminate = false,\n size = 'medium',\n className = '',\n },\n ref\n): React.ReactElement {\n const { tokens, theme } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n const transparentDefault = tokens.colors.interactive.transparentDefault;\n const [focused, setFocused] = useState(false);\n const [hovered, setHovered] = useState(false);\n const id = useId();\n \n // WCAG 2.5.8: minimum 24×24 CSS px target size\n const sizeConfig = {\n small: { boxSize: 18, iconSize: 12, targetSize: 24 },\n medium: { boxSize: 20, iconSize: 14, targetSize: 24 },\n };\n const config = sizeConfig[size];\n \n const isRadio = type === 'radio';\n const borderRadius = isRadio ? '50%' : tokens.borderRadius.md;\n \n const boxStyle: React.CSSProperties = {\n width: config.boxSize,\n height: config.boxSize,\n border: `${tokens.borders.width.thick} solid ${checked ? tokens.colors.accent.primary : hovered && !disabled ? `${tokens.colors.accent.primary}60` : tokens.colors.border.muted}`,\n borderRadius,\n backgroundColor: checked ? tokens.colors.accent.primary : (isTransparentTheme && transparentDefault ? transparentDefault : 'transparent'),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: `${tokens.animation.normal}, opacity ${tokens.animation.duration.normal}ms ${tokens.animation.easing.default}`,\n flexShrink: 0,\n boxShadow: checked \n ? `0 0 12px ${tokens.colors.accent.primary}40` \n : focused \n ? tokens.borders.focusRing.subtle\n : 'none',\n transform: checked ? 'scale(1)' : hovered && !disabled ? 'scale(1.05)' : 'scale(1)',\n };\n \n // Check mark for checkbox\n const checkIcon = (\n <svg\n width={config.iconSize}\n height={config.iconSize}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"#ffffff\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {indeterminate ? (\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n ) : (\n <polyline points=\"20 6 9 17 4 12\" />\n )}\n </svg>\n );\n \n // Dot for radio\n const radioIcon = (\n <div\n style={{\n width: config.iconSize - 4,\n height: config.iconSize - 4,\n borderRadius: '50%',\n backgroundColor: '#ffffff',\n }}\n />\n );\n \n return (\n <label\n htmlFor={id}\n className={classNames('zendir-checkbox', className)}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: tokens.spacing.sm,\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.5 : 1,\n }}\n >\n {/* Touch target wrapper — ensures WCAG 2.5.8 24px minimum */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: config.targetSize,\n minHeight: config.targetSize,\n }}>\n <div style={boxStyle}>\n {checked && (isRadio ? radioIcon : checkIcon)}\n </div>\n </div>\n \n <input\n ref={ref}\n type={type}\n id={id}\n name={name}\n value={value}\n checked={checked}\n disabled={disabled}\n onChange={(e) => onChange?.(e.target.checked)}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n style={{\n position: 'absolute',\n opacity: 0,\n width: 0,\n height: 0,\n }}\n />\n \n {label && (\n <span\n style={{\n fontSize: '0.875rem',\n color: tokens.colors.text.primary,\n transition: tokens.animation.fast,\n }}\n >\n {label}\n </span>\n )}\n </label>\n );\n}));\n\nexport default Checkbox;\n"],"names":["Checkbox"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { default as React } from 'react';
2
+ import { ColorTarget } from '../context/DisplaySettingsContext';
3
+
4
+ export interface ColorPickerPanelProps {
5
+ /** Current accent color */
6
+ accentColor: string;
7
+ /** Current glass tint color */
8
+ glassTint: string;
9
+ /** Which color to affect: both, accent, or glass */
10
+ colorTarget: ColorTarget;
11
+ /** Callback when accent color changes */
12
+ onAccentChange: (color: string) => void;
13
+ /** Callback when glass tint changes */
14
+ onGlassTintChange: (color: string) => void;
15
+ /** Callback when target changes */
16
+ onTargetChange: (target: ColorTarget) => void;
17
+ /** Callback when any color is selected (respects target) */
18
+ onColorSelect?: (color: string) => void;
19
+ /** Compact mode - show only trigger button */
20
+ compact?: boolean;
21
+ /** Custom className */
22
+ className?: string;
23
+ }
24
+ export declare const ColorPickerPanel: React.NamedExoticComponent<ColorPickerPanelProps>;
25
+ export default ColorPickerPanel;