@ciridae/ui 0.2.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 (339) hide show
  1. package/README.md +31 -0
  2. package/dist/components/agentic/agent-card.d.ts +28 -0
  3. package/dist/components/agentic/agent-card.js +27 -0
  4. package/dist/components/agentic/agent-composer.d.ts +44 -0
  5. package/dist/components/agentic/agent-composer.js +104 -0
  6. package/dist/components/agentic/agent-context.d.ts +28 -0
  7. package/dist/components/agentic/agent-context.js +102 -0
  8. package/dist/components/agentic/agent-plan.d.ts +27 -0
  9. package/dist/components/agentic/agent-plan.js +43 -0
  10. package/dist/components/agentic/agent-queue.d.ts +46 -0
  11. package/dist/components/agentic/agent-queue.js +53 -0
  12. package/dist/components/agentic/agent-task.d.ts +16 -0
  13. package/dist/components/agentic/agent-task.js +20 -0
  14. package/dist/components/agentic/approval-request.d.ts +24 -0
  15. package/dist/components/agentic/approval-request.js +57 -0
  16. package/dist/components/agentic/artifact.d.ts +24 -0
  17. package/dist/components/agentic/artifact.js +72 -0
  18. package/dist/components/agentic/attachments.d.ts +124 -0
  19. package/dist/components/agentic/attachments.js +595 -0
  20. package/dist/components/agentic/audio-player.d.ts +16 -0
  21. package/dist/components/agentic/audio-player.js +21 -0
  22. package/dist/components/agentic/canvas.d.ts +10 -0
  23. package/dist/components/agentic/canvas.js +22 -0
  24. package/dist/components/agentic/clipboard.d.ts +2 -0
  25. package/dist/components/agentic/clipboard.js +12 -0
  26. package/dist/components/agentic/code-block.d.ts +43 -0
  27. package/dist/components/agentic/code-block.js +92 -0
  28. package/dist/components/agentic/commit.d.ts +57 -0
  29. package/dist/components/agentic/commit.js +85 -0
  30. package/dist/components/agentic/connection.d.ts +3 -0
  31. package/dist/components/agentic/connection.js +8 -0
  32. package/dist/components/agentic/controls.d.ts +6 -0
  33. package/dist/components/agentic/controls.js +7 -0
  34. package/dist/components/agentic/conversation.d.ts +25 -0
  35. package/dist/components/agentic/conversation.js +56 -0
  36. package/dist/components/agentic/edge.d.ts +8 -0
  37. package/dist/components/agentic/edge.js +65 -0
  38. package/dist/components/agentic/effort-selector.d.ts +43 -0
  39. package/dist/components/agentic/effort-selector.js +47 -0
  40. package/dist/components/agentic/environment-variables.d.ts +32 -0
  41. package/dist/components/agentic/environment-variables.js +66 -0
  42. package/dist/components/agentic/file-tree.d.ts +24 -0
  43. package/dist/components/agentic/file-tree.js +56 -0
  44. package/dist/components/agentic/image.d.ts +9 -0
  45. package/dist/components/agentic/image.js +11 -0
  46. package/dist/components/agentic/inline-citation.d.ts +40 -0
  47. package/dist/components/agentic/inline-citation.js +111 -0
  48. package/dist/components/agentic/jsx-preview.d.ts +19 -0
  49. package/dist/components/agentic/jsx-preview.js +34 -0
  50. package/dist/components/agentic/message-branch.d.ts +20 -0
  51. package/dist/components/agentic/message-branch.js +83 -0
  52. package/dist/components/agentic/message-response.css +265 -0
  53. package/dist/components/agentic/message-response.css.d.ts +2 -0
  54. package/dist/components/agentic/message.d.ts +27 -0
  55. package/dist/components/agentic/message.js +57 -0
  56. package/dist/components/agentic/mic-selector.d.ts +58 -0
  57. package/dist/components/agentic/mic-selector.js +173 -0
  58. package/dist/components/agentic/model-selector.d.ts +39 -0
  59. package/dist/components/agentic/model-selector.js +47 -0
  60. package/dist/components/agentic/node.d.ts +26 -0
  61. package/dist/components/agentic/node.js +29 -0
  62. package/dist/components/agentic/open-in-chat.d.ts +9 -0
  63. package/dist/components/agentic/open-in-chat.js +8 -0
  64. package/dist/components/agentic/package-info.d.ts +30 -0
  65. package/dist/components/agentic/package-info.js +44 -0
  66. package/dist/components/agentic/panel.d.ts +6 -0
  67. package/dist/components/agentic/panel.js +7 -0
  68. package/dist/components/agentic/persona.d.ts +16 -0
  69. package/dist/components/agentic/persona.js +116 -0
  70. package/dist/components/agentic/prompt-input-action-menu.d.ts +16 -0
  71. package/dist/components/agentic/prompt-input-action-menu.js +22 -0
  72. package/dist/components/agentic/prompt-input-command.d.ts +18 -0
  73. package/dist/components/agentic/prompt-input-command.js +25 -0
  74. package/dist/components/agentic/prompt-input-hover-card.d.ts +10 -0
  75. package/dist/components/agentic/prompt-input-hover-card.js +13 -0
  76. package/dist/components/agentic/prompt-input-select.d.ts +14 -0
  77. package/dist/components/agentic/prompt-input-select.js +19 -0
  78. package/dist/components/agentic/prompt-input-tabs.d.ts +17 -0
  79. package/dist/components/agentic/prompt-input-tabs.js +45 -0
  80. package/dist/components/agentic/prompt-input.d.ts +79 -0
  81. package/dist/components/agentic/prompt-input.js +206 -0
  82. package/dist/components/agentic/reasoning.d.ts +21 -0
  83. package/dist/components/agentic/reasoning.js +106 -0
  84. package/dist/components/agentic/run-checkpoint.d.ts +13 -0
  85. package/dist/components/agentic/run-checkpoint.js +19 -0
  86. package/dist/components/agentic/run-trace.d.ts +30 -0
  87. package/dist/components/agentic/run-trace.js +56 -0
  88. package/dist/components/agentic/sandbox.d.ts +24 -0
  89. package/dist/components/agentic/sandbox.js +33 -0
  90. package/dist/components/agentic/schema-display.d.ts +39 -0
  91. package/dist/components/agentic/schema-display.js +56 -0
  92. package/dist/components/agentic/shimmer.d.ts +11 -0
  93. package/dist/components/agentic/shimmer.js +16 -0
  94. package/dist/components/agentic/snippet.d.ts +18 -0
  95. package/dist/components/agentic/snippet.js +35 -0
  96. package/dist/components/agentic/sources.d.ts +16 -0
  97. package/dist/components/agentic/sources.js +17 -0
  98. package/dist/components/agentic/speech-input.d.ts +24 -0
  99. package/dist/components/agentic/speech-input.js +30 -0
  100. package/dist/components/agentic/stack-trace.d.ts +27 -0
  101. package/dist/components/agentic/stack-trace.js +76 -0
  102. package/dist/components/agentic/suggestion.d.ts +12 -0
  103. package/dist/components/agentic/suggestion.js +15 -0
  104. package/dist/components/agentic/terminal.d.ts +24 -0
  105. package/dist/components/agentic/terminal.js +47 -0
  106. package/dist/components/agentic/test-results.d.ts +51 -0
  107. package/dist/components/agentic/test-results.js +83 -0
  108. package/dist/components/agentic/theme.d.ts +5 -0
  109. package/dist/components/agentic/theme.js +31 -0
  110. package/dist/components/agentic/tool.d.ts +25 -0
  111. package/dist/components/agentic/tool.js +73 -0
  112. package/dist/components/agentic/toolbar.d.ts +6 -0
  113. package/dist/components/agentic/toolbar.js +7 -0
  114. package/dist/components/agentic/transcription.d.ts +20 -0
  115. package/dist/components/agentic/transcription.js +32 -0
  116. package/dist/components/agentic/types.d.ts +172 -0
  117. package/dist/components/agentic/types.js +1 -0
  118. package/dist/components/agentic/use-controllable-state.d.ts +6 -0
  119. package/dist/components/agentic/use-controllable-state.js +13 -0
  120. package/dist/components/agentic/voice-selector.d.ts +69 -0
  121. package/dist/components/agentic/voice-selector.js +122 -0
  122. package/dist/components/agentic/web-preview.d.ts +25 -0
  123. package/dist/components/agentic/web-preview.js +33 -0
  124. package/dist/components/ui/accordion.d.ts +7 -0
  125. package/dist/components/ui/accordion.js +17 -0
  126. package/dist/components/ui/alert-dialog.d.ts +22 -0
  127. package/dist/components/ui/alert-dialog.js +51 -0
  128. package/dist/components/ui/alert.d.ts +9 -0
  129. package/dist/components/ui/alert.js +24 -0
  130. package/dist/components/ui/aspect-ratio.d.ts +3 -0
  131. package/dist/components/ui/aspect-ratio.js +7 -0
  132. package/dist/components/ui/avatar.d.ts +11 -0
  133. package/dist/components/ui/avatar.js +22 -0
  134. package/dist/components/ui/badge-variants.d.ts +100 -0
  135. package/dist/components/ui/badge-variants.js +140 -0
  136. package/dist/components/ui/badge.d.ts +6 -0
  137. package/dist/components/ui/badge.js +9 -0
  138. package/dist/components/ui/breadcrumb.d.ts +11 -0
  139. package/dist/components/ui/breadcrumb.js +27 -0
  140. package/dist/components/ui/button-group-variants.d.ts +6 -0
  141. package/dist/components/ui/button-group-variants.js +13 -0
  142. package/dist/components/ui/button-group.d.ts +8 -0
  143. package/dist/components/ui/button-group.js +16 -0
  144. package/dist/components/ui/button-variants.d.ts +133 -0
  145. package/dist/components/ui/button-variants.js +170 -0
  146. package/dist/components/ui/button.d.ts +8 -0
  147. package/dist/components/ui/button.js +67 -0
  148. package/dist/components/ui/calendar.d.ts +9 -0
  149. package/dist/components/ui/calendar.js +99 -0
  150. package/dist/components/ui/card.d.ts +14 -0
  151. package/dist/components/ui/card.js +28 -0
  152. package/dist/components/ui/carousel.d.ts +19 -0
  153. package/dist/components/ui/carousel.js +104 -0
  154. package/dist/components/ui/chart-context.d.ts +33 -0
  155. package/dist/components/ui/chart-context.js +36 -0
  156. package/dist/components/ui/chart-panel.d.ts +11 -0
  157. package/dist/components/ui/chart-panel.js +6 -0
  158. package/dist/components/ui/chart-tooltip.d.ts +13 -0
  159. package/dist/components/ui/chart-tooltip.js +84 -0
  160. package/dist/components/ui/chart.d.ts +23 -0
  161. package/dist/components/ui/chart.js +52 -0
  162. package/dist/components/ui/checkbox.d.ts +4 -0
  163. package/dist/components/ui/checkbox.js +9 -0
  164. package/dist/components/ui/collapsible.d.ts +5 -0
  165. package/dist/components/ui/collapsible.js +12 -0
  166. package/dist/components/ui/combobox-anchor.d.ts +3 -0
  167. package/dist/components/ui/combobox-anchor.js +5 -0
  168. package/dist/components/ui/combobox.d.ts +23 -0
  169. package/dist/components/ui/combobox.js +54 -0
  170. package/dist/components/ui/command.d.ts +19 -0
  171. package/dist/components/ui/command.js +38 -0
  172. package/dist/components/ui/context-menu.d.ts +30 -0
  173. package/dist/components/ui/context-menu.js +63 -0
  174. package/dist/components/ui/data-table.d.ts +17 -0
  175. package/dist/components/ui/data-table.js +26 -0
  176. package/dist/components/ui/dialog.d.ts +22 -0
  177. package/dist/components/ui/dialog.js +48 -0
  178. package/dist/components/ui/direction-context.d.ts +3 -0
  179. package/dist/components/ui/direction-context.js +3 -0
  180. package/dist/components/ui/direction.d.ts +6 -0
  181. package/dist/components/ui/direction.js +7 -0
  182. package/dist/components/ui/drawer.d.ts +18 -0
  183. package/dist/components/ui/drawer.js +47 -0
  184. package/dist/components/ui/dropdown-menu.d.ts +30 -0
  185. package/dist/components/ui/dropdown-menu.js +63 -0
  186. package/dist/components/ui/empty.d.ts +11 -0
  187. package/dist/components/ui/empty.js +33 -0
  188. package/dist/components/ui/expandable-data-table.d.ts +24 -0
  189. package/dist/components/ui/expandable-data-table.js +62 -0
  190. package/dist/components/ui/field.d.ts +26 -0
  191. package/dist/components/ui/field.js +74 -0
  192. package/dist/components/ui/file-upload-field-parts.d.ts +21 -0
  193. package/dist/components/ui/file-upload-field-parts.js +55 -0
  194. package/dist/components/ui/file-upload-field.d.ts +15 -0
  195. package/dist/components/ui/file-upload-field.js +85 -0
  196. package/dist/components/ui/form-context.d.ts +23 -0
  197. package/dist/components/ui/form-context.js +35 -0
  198. package/dist/components/ui/form.d.ts +12 -0
  199. package/dist/components/ui/form.js +38 -0
  200. package/dist/components/ui/hover-card.d.ts +10 -0
  201. package/dist/components/ui/hover-card.js +22 -0
  202. package/dist/components/ui/input-group.d.ts +16 -0
  203. package/dist/components/ui/input-group.js +62 -0
  204. package/dist/components/ui/input-otp.d.ts +11 -0
  205. package/dist/components/ui/input-otp.js +21 -0
  206. package/dist/components/ui/input.d.ts +3 -0
  207. package/dist/components/ui/input.js +6 -0
  208. package/dist/components/ui/item.d.ts +23 -0
  209. package/dist/components/ui/item.js +66 -0
  210. package/dist/components/ui/kbd.d.ts +3 -0
  211. package/dist/components/ui/kbd.js +9 -0
  212. package/dist/components/ui/label.d.ts +4 -0
  213. package/dist/components/ui/label.js +7 -0
  214. package/dist/components/ui/loading-state.d.ts +27 -0
  215. package/dist/components/ui/loading-state.js +44 -0
  216. package/dist/components/ui/menubar.d.ts +30 -0
  217. package/dist/components/ui/menubar.js +63 -0
  218. package/dist/components/ui/metrics-strip.d.ts +7 -0
  219. package/dist/components/ui/metrics-strip.js +18 -0
  220. package/dist/components/ui/native-select.d.ts +7 -0
  221. package/dist/components/ui/native-select.js +13 -0
  222. package/dist/components/ui/navigation-menu-variants.d.ts +2 -0
  223. package/dist/components/ui/navigation-menu-variants.js +3 -0
  224. package/dist/components/ui/navigation-menu.d.ts +13 -0
  225. package/dist/components/ui/navigation-menu.js +30 -0
  226. package/dist/components/ui/page-header.d.ts +19 -0
  227. package/dist/components/ui/page-header.js +36 -0
  228. package/dist/components/ui/pagination.d.ts +13 -0
  229. package/dist/components/ui/pagination.js +29 -0
  230. package/dist/components/ui/popover.d.ts +14 -0
  231. package/dist/components/ui/popover.js +34 -0
  232. package/dist/components/ui/progress.d.ts +4 -0
  233. package/dist/components/ui/progress.js +8 -0
  234. package/dist/components/ui/property-list.d.ts +6 -0
  235. package/dist/components/ui/property-list.js +15 -0
  236. package/dist/components/ui/radio-group.d.ts +5 -0
  237. package/dist/components/ui/radio-group.js +11 -0
  238. package/dist/components/ui/registry-docs-api.d.ts +11 -0
  239. package/dist/components/ui/registry-docs-api.js +9 -0
  240. package/dist/components/ui/registry-docs-code.d.ts +19 -0
  241. package/dist/components/ui/registry-docs-code.js +78 -0
  242. package/dist/components/ui/registry-docs-showcase.d.ts +11 -0
  243. package/dist/components/ui/registry-docs-showcase.js +27 -0
  244. package/dist/components/ui/registry-docs.d.ts +27 -0
  245. package/dist/components/ui/registry-docs.js +32 -0
  246. package/dist/components/ui/resizable.d.ts +7 -0
  247. package/dist/components/ui/resizable.js +15 -0
  248. package/dist/components/ui/scroll-area.d.ts +7 -0
  249. package/dist/components/ui/scroll-area.js +10 -0
  250. package/dist/components/ui/select.d.ts +15 -0
  251. package/dist/components/ui/select.js +38 -0
  252. package/dist/components/ui/separator.d.ts +4 -0
  253. package/dist/components/ui/separator.js +7 -0
  254. package/dist/components/ui/sheet.d.ts +21 -0
  255. package/dist/components/ui/sheet.js +62 -0
  256. package/dist/components/ui/sidebar/context.d.ts +21 -0
  257. package/dist/components/ui/sidebar/context.js +15 -0
  258. package/dist/components/ui/sidebar/group.d.ts +10 -0
  259. package/dist/components/ui/sidebar/group.js +18 -0
  260. package/dist/components/ui/sidebar/layout.d.ts +17 -0
  261. package/dist/components/ui/sidebar/layout.js +73 -0
  262. package/dist/components/ui/sidebar/menu.d.ts +30 -0
  263. package/dist/components/ui/sidebar/menu.js +64 -0
  264. package/dist/components/ui/sidebar/provider.d.ts +7 -0
  265. package/dist/components/ui/sidebar/provider.js +53 -0
  266. package/dist/components/ui/sidebar/rail.d.ts +3 -0
  267. package/dist/components/ui/sidebar/rail.js +12 -0
  268. package/dist/components/ui/sidebar/trigger.d.ts +4 -0
  269. package/dist/components/ui/sidebar/trigger.js +16 -0
  270. package/dist/components/ui/sidebar-account-menu-theme.d.ts +7 -0
  271. package/dist/components/ui/sidebar-account-menu-theme.js +32 -0
  272. package/dist/components/ui/sidebar-account-menu.d.ts +14 -0
  273. package/dist/components/ui/sidebar-account-menu.js +51 -0
  274. package/dist/components/ui/sidebar.d.ts +7 -0
  275. package/dist/components/ui/sidebar.js +7 -0
  276. package/dist/components/ui/skeleton.d.ts +2 -0
  277. package/dist/components/ui/skeleton.js +15 -0
  278. package/dist/components/ui/slider.d.ts +4 -0
  279. package/dist/components/ui/slider.js +9 -0
  280. package/dist/components/ui/sonner.d.ts +3 -0
  281. package/dist/components/ui/sonner.js +33 -0
  282. package/dist/components/ui/spinner.d.ts +2 -0
  283. package/dist/components/ui/spinner.js +16 -0
  284. package/dist/components/ui/switch.d.ts +6 -0
  285. package/dist/components/ui/switch.js +7 -0
  286. package/dist/components/ui/table.d.ts +10 -0
  287. package/dist/components/ui/table.js +28 -0
  288. package/dist/components/ui/tabs-variants.d.ts +6 -0
  289. package/dist/components/ui/tabs-variants.js +13 -0
  290. package/dist/components/ui/tabs.d.ts +8 -0
  291. package/dist/components/ui/tabs.js +17 -0
  292. package/dist/components/ui/textarea.d.ts +3 -0
  293. package/dist/components/ui/textarea.js +6 -0
  294. package/dist/components/ui/toggle-group.d.ts +9 -0
  295. package/dist/components/ui/toggle-group.js +24 -0
  296. package/dist/components/ui/toggle-variants.d.ts +7 -0
  297. package/dist/components/ui/toggle-variants.js +19 -0
  298. package/dist/components/ui/toggle.d.ts +5 -0
  299. package/dist/components/ui/toggle.js +9 -0
  300. package/dist/components/ui/tooltip.d.ts +11 -0
  301. package/dist/components/ui/tooltip.js +25 -0
  302. package/dist/components/ui/workflow-timeline.d.ts +20 -0
  303. package/dist/components/ui/workflow-timeline.js +92 -0
  304. package/dist/hooks/use-mobile.d.ts +1 -0
  305. package/dist/hooks/use-mobile.js +15 -0
  306. package/dist/lib/utils.d.ts +5 -0
  307. package/dist/lib/utils.js +8 -0
  308. package/dist/styled-system/css/conditions.mjs +36 -0
  309. package/dist/styled-system/css/css.mjs +45 -0
  310. package/dist/styled-system/css/cva.mjs +87 -0
  311. package/dist/styled-system/css/cx.mjs +15 -0
  312. package/dist/styled-system/css/index.mjs +4 -0
  313. package/dist/styled-system/css/sva.mjs +46 -0
  314. package/dist/styled-system/helpers.mjs +316 -0
  315. package/dist/styled-system/patterns/aspect-ratio.mjs +38 -0
  316. package/dist/styled-system/patterns/bleed.mjs +24 -0
  317. package/dist/styled-system/patterns/box.mjs +15 -0
  318. package/dist/styled-system/patterns/center.mjs +21 -0
  319. package/dist/styled-system/patterns/circle.mjs +25 -0
  320. package/dist/styled-system/patterns/container.mjs +21 -0
  321. package/dist/styled-system/patterns/cq.mjs +21 -0
  322. package/dist/styled-system/patterns/divider.mjs +25 -0
  323. package/dist/styled-system/patterns/flex.mjs +26 -0
  324. package/dist/styled-system/patterns/float.mjs +52 -0
  325. package/dist/styled-system/patterns/grid-item.mjs +25 -0
  326. package/dist/styled-system/patterns/grid.mjs +27 -0
  327. package/dist/styled-system/patterns/hstack.mjs +24 -0
  328. package/dist/styled-system/patterns/index.mjs +20 -0
  329. package/dist/styled-system/patterns/link-overlay.mjs +24 -0
  330. package/dist/styled-system/patterns/spacer.mjs +25 -0
  331. package/dist/styled-system/patterns/square.mjs +24 -0
  332. package/dist/styled-system/patterns/stack.mjs +24 -0
  333. package/dist/styled-system/patterns/visually-hidden.mjs +18 -0
  334. package/dist/styled-system/patterns/vstack.mjs +24 -0
  335. package/dist/styled-system/patterns/wrap.mjs +25 -0
  336. package/dist/styled-system/styles.css +1089 -0
  337. package/dist/styled-system/styles.css.d.ts +2 -0
  338. package/dist/styled-system/tokens/index.mjs +2304 -0
  339. package/package.json +688 -0
@@ -0,0 +1,79 @@
1
+ import * as React from "react";
2
+ export { AttachmentActionAddFiles as PromptInputActionAddAttachments, AttachmentActionAddScreenshot as PromptInputActionAddScreenshot, } from "@ciridae/ui/attachments";
3
+ export type { AttachmentActionAddFilesProps as PromptInputActionAddAttachmentsProps, AttachmentActionAddScreenshotProps as PromptInputActionAddScreenshotProps, } from "@ciridae/ui/attachments";
4
+ export * from "@ciridae/ui/prompt-input-action-menu";
5
+ export * from "@ciridae/ui/prompt-input-command";
6
+ export * from "@ciridae/ui/prompt-input-hover-card";
7
+ export * from "@ciridae/ui/prompt-input-select";
8
+ export * from "@ciridae/ui/prompt-input-tabs";
9
+ import { type AgenticAttachment, type AttachmentProviderProps } from "@ciridae/ui/attachments";
10
+ import type { AgenticChatStatus } from "@ciridae/ui/types";
11
+ import { Button } from "@ciridae/ui/button";
12
+ import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupTextarea } from "@ciridae/ui/input-group";
13
+ type PromptInputMessage = {
14
+ attachments: AgenticAttachment[];
15
+ text: string;
16
+ };
17
+ type PromptInputTextContextValue = {
18
+ clear: () => void;
19
+ setValue: (value: string) => void;
20
+ value: string;
21
+ };
22
+ type PromptInputProviderContextValue = {
23
+ text: PromptInputTextContextValue;
24
+ };
25
+ type PromptInputProviderProps = AttachmentProviderProps & {
26
+ defaultValue?: string;
27
+ onValueChange?: (value: string) => void;
28
+ value?: string;
29
+ };
30
+ type PromptInputDensity = "comfortable" | "compact";
31
+ type PromptInputSurface = "glass" | "solid";
32
+ type PromptInputProps = Omit<React.ComponentProps<"form">, "onError" | "onSubmit"> & Pick<AttachmentProviderProps, "accept" | "maxAttachmentSizeMb" | "maxAttachments" | "multiple" | "onAttachmentError" | "onCaptureScreenshot"> & {
33
+ density?: PromptInputDensity;
34
+ disabled?: boolean;
35
+ globalDrop?: boolean;
36
+ onSubmit?: (message: PromptInputMessage) => void | Promise<void>;
37
+ status?: AgenticChatStatus;
38
+ surface?: PromptInputSurface;
39
+ };
40
+ type PromptInputBodyProps = React.ComponentProps<typeof InputGroup>;
41
+ type PromptInputTextareaProps = Omit<React.ComponentProps<typeof InputGroupTextarea>, "onChange"> & {
42
+ onValueChange?: (value: string) => void;
43
+ value?: string;
44
+ };
45
+ type PromptInputHeaderProps = React.ComponentProps<"div">;
46
+ type PromptInputFooterProps = React.ComponentProps<"div">;
47
+ type PromptInputToolsProps = React.ComponentProps<typeof InputGroupAddon>;
48
+ type PromptInputButtonProps = React.ComponentProps<typeof InputGroupButton> & {
49
+ label?: string;
50
+ tooltip?: string;
51
+ };
52
+ type PromptInputSubmitProps = React.ComponentProps<typeof Button> & {
53
+ label?: string;
54
+ onStop?: () => void;
55
+ status?: AgenticChatStatus;
56
+ stopLabel?: string;
57
+ };
58
+ type PromptInputFocusHintProps = React.ComponentProps<"div"> & {
59
+ visible?: boolean;
60
+ };
61
+ type PromptInputDropOverlayProps = React.ComponentProps<"div"> & {
62
+ icon?: React.ReactNode;
63
+ visible?: boolean;
64
+ };
65
+ declare function PromptInputProvider({ children, defaultValue, onValueChange, value, ...attachmentProviderProps }: PromptInputProviderProps): import("react/jsx-runtime").JSX.Element;
66
+ declare function usePromptInputProvider(): PromptInputProviderContextValue;
67
+ declare function useOptionalPromptInputProvider(): PromptInputProviderContextValue | null;
68
+ declare function PromptInput(props: PromptInputProps): import("react/jsx-runtime").JSX.Element;
69
+ declare function PromptInputBody({ className, ...props }: PromptInputBodyProps): import("react/jsx-runtime").JSX.Element;
70
+ declare function PromptInputTextarea({ className, disabled, onKeyDown, onPaste, onValueChange, value, ...props }: PromptInputTextareaProps): import("react/jsx-runtime").JSX.Element;
71
+ declare function PromptInputFocusHint({ children, className, visible, ...props }: PromptInputFocusHintProps): import("react/jsx-runtime").JSX.Element | null;
72
+ declare function PromptInputDropOverlay({ children, className, icon, visible, ...props }: PromptInputDropOverlayProps): import("react/jsx-runtime").JSX.Element | null;
73
+ declare function PromptInputHeader({ className, ...props }: PromptInputHeaderProps): import("react/jsx-runtime").JSX.Element;
74
+ declare function PromptInputFooter({ className, ...props }: PromptInputFooterProps): import("react/jsx-runtime").JSX.Element;
75
+ declare function PromptInputTools({ align, className, ...props }: PromptInputToolsProps): import("react/jsx-runtime").JSX.Element;
76
+ declare function PromptInputButton({ children, className, label, size, tooltip, variant, ...props }: PromptInputButtonProps): import("react/jsx-runtime").JSX.Element;
77
+ declare function PromptInputSubmit({ children, className, disabled, label, onClick, onStop, size, status, stopLabel, type, variant, ...props }: PromptInputSubmitProps): import("react/jsx-runtime").JSX.Element;
78
+ export { PromptInput, PromptInputBody, PromptInputButton, PromptInputDropOverlay, PromptInputFooter, PromptInputFocusHint, PromptInputHeader, PromptInputProvider, PromptInputSubmit, PromptInputTextarea, PromptInputTools, useOptionalPromptInputProvider, usePromptInputProvider, };
79
+ export type { PromptInputBodyProps, PromptInputButtonProps, PromptInputDensity, PromptInputDropOverlayProps, PromptInputFooterProps, PromptInputFocusHintProps, PromptInputHeaderProps, PromptInputMessage, PromptInputProps, PromptInputProviderContextValue, PromptInputProviderProps, PromptInputSubmitProps, PromptInputSurface, PromptInputTextareaProps, PromptInputTextContextValue, PromptInputToolsProps, };
@@ -0,0 +1,206 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /* eslint-disable max-lines, react-refresh/only-export-components */
3
+ import { ArrowUpIcon, SquareIcon, UploadIcon } from "lucide-react";
4
+ import * as React from "react";
5
+ export { AttachmentActionAddFiles as PromptInputActionAddAttachments, AttachmentActionAddScreenshot as PromptInputActionAddScreenshot, } from "@ciridae/ui/attachments";
6
+ export * from "@ciridae/ui/prompt-input-action-menu";
7
+ export * from "@ciridae/ui/prompt-input-command";
8
+ export * from "@ciridae/ui/prompt-input-hover-card";
9
+ export * from "@ciridae/ui/prompt-input-select";
10
+ export * from "@ciridae/ui/prompt-input-tabs";
11
+ import { AttachmentProvider, prepareAttachmentsForSubmit, useAttachmentDropTarget, useAttachments, useOptionalAttachments, } from "@ciridae/ui/attachments";
12
+ import { Button } from "@ciridae/ui/button";
13
+ import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupTextarea, } from "@ciridae/ui/input-group";
14
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@ciridae/ui/tooltip";
15
+ import { cn, glassSurface, glassSurfaceFocus } from "@ciridae/ui/utils";
16
+ const PromptInputProviderContext = React.createContext(null);
17
+ const PromptInputContext = React.createContext({
18
+ density: "comfortable",
19
+ surface: "solid",
20
+ status: "idle",
21
+ });
22
+ function PromptInputProvider({ children, defaultValue = "", onValueChange, value, ...attachmentProviderProps }) {
23
+ const [localValue, setLocalValue] = React.useState(defaultValue);
24
+ const resolvedValue = value ?? localValue;
25
+ const setValue = React.useCallback((nextValue) => {
26
+ if (value === undefined)
27
+ setLocalValue(nextValue);
28
+ onValueChange?.(nextValue);
29
+ }, [onValueChange, value]);
30
+ const clear = React.useCallback(() => setValue(""), [setValue]);
31
+ const contextValue = React.useMemo(() => ({
32
+ text: {
33
+ clear,
34
+ setValue,
35
+ value: resolvedValue,
36
+ },
37
+ }), [clear, resolvedValue, setValue]);
38
+ return (_jsx(AttachmentProvider, { ...attachmentProviderProps, children: _jsx(PromptInputProviderContext.Provider, { value: contextValue, children: children }) }));
39
+ }
40
+ function usePromptInputProvider() {
41
+ const context = React.useContext(PromptInputProviderContext);
42
+ if (!context) {
43
+ throw new Error("usePromptInputProvider must be used within PromptInputProvider.");
44
+ }
45
+ return context;
46
+ }
47
+ function useOptionalPromptInputProvider() {
48
+ return React.useContext(PromptInputProviderContext);
49
+ }
50
+ function PromptInput(props) {
51
+ const { accept, children, maxAttachmentSizeMb, maxAttachments, multiple, onAttachmentError, onCaptureScreenshot, ...innerProps } = props;
52
+ const existingAttachments = useOptionalAttachments();
53
+ if (existingAttachments)
54
+ return _jsx(PromptInputInner, { ...innerProps, children: children });
55
+ return (_jsx(AttachmentProvider, { accept: accept, maxAttachmentSizeMb: maxAttachmentSizeMb, maxAttachments: maxAttachments, multiple: multiple, onAttachmentError: onAttachmentError, onCaptureScreenshot: onCaptureScreenshot, children: _jsx(PromptInputInner, { ...innerProps, children: children }) }));
56
+ }
57
+ function PromptInputInner({ children, className, density = "comfortable", disabled, globalDrop, onSubmit, status = "idle", surface = "solid", ...props }) {
58
+ const contextValue = React.useMemo(() => ({ density, disabled, status, surface }), [density, disabled, status, surface]);
59
+ const formRef = React.useRef(null);
60
+ const attachments = useAttachments();
61
+ const provider = useOptionalPromptInputProvider();
62
+ useAttachmentDropTarget({ global: globalDrop, ref: formRef });
63
+ const handleSubmit = React.useCallback(async (event) => {
64
+ event.preventDefault();
65
+ if (!onSubmit)
66
+ return;
67
+ const form = event.currentTarget;
68
+ const text = getPromptInputFormText(form, provider?.text.value);
69
+ const submitAttachments = await prepareAttachmentsForSubmit(attachments.files);
70
+ try {
71
+ await onSubmit({ attachments: submitAttachments, text });
72
+ attachments.clear();
73
+ if (provider)
74
+ provider.text.clear();
75
+ else
76
+ form.reset();
77
+ }
78
+ catch {
79
+ // Keep composer state intact so hosts can show retry affordances.
80
+ }
81
+ }, [attachments, onSubmit, provider]);
82
+ return (_jsx(PromptInputContext.Provider, { value: contextValue, children: _jsx("form", { "data-disabled": disabled ? "true" : undefined, "data-density": density, "data-slot": "prompt-input", "data-status": status, "data-surface": surface, onSubmit: handleSubmit, ref: formRef, className: cn("group/prompt-input motion-standard relative grid w-full gap-2 overflow-hidden rounded-lg border transition-all outline-none data-[disabled=true]:opacity-60", density === "comfortable" ? "p-2" : "p-1.5", surface === "glass"
83
+ ? [glassSurface, glassSurfaceFocus]
84
+ : [
85
+ "border-border/80 bg-background/96 shadow-md",
86
+ "focus-within:border-ring focus-within:ring-[var(--focus-ring-width)] focus-within:ring-ring/35",
87
+ ], className), ...props, children: children }) }));
88
+ }
89
+ function getPromptInputFormText(form, fallback = "") {
90
+ const textarea = form.querySelector('[data-slot="prompt-input-textarea"]');
91
+ if (textarea)
92
+ return textarea.value;
93
+ const formData = new FormData(form);
94
+ const message = formData.get("message");
95
+ return typeof message === "string" ? message : fallback;
96
+ }
97
+ function PromptInputBody({ className, ...props }) {
98
+ const { density } = React.useContext(PromptInputContext);
99
+ return (_jsx(InputGroup, { "data-slot": "prompt-input-body", className: cn("items-stretch border-0 bg-transparent shadow-none dark:bg-transparent", density === "comfortable" ? "min-h-24" : "min-h-[4.25rem]", className), ...props }));
100
+ }
101
+ function PromptInputTextarea({ className, disabled, onKeyDown, onPaste, onValueChange, value, ...props }) {
102
+ const context = React.useContext(PromptInputContext);
103
+ const provider = useOptionalPromptInputProvider();
104
+ const attachments = useAttachments();
105
+ const isDisabled = disabled ?? context.disabled;
106
+ const resolvedValue = value ?? provider?.text.value;
107
+ const handleKeyDown = React.useCallback((event) => {
108
+ onKeyDown?.(event);
109
+ if (event.defaultPrevented)
110
+ return;
111
+ if (event.key === "Backspace" &&
112
+ event.currentTarget.value === "" &&
113
+ attachments.files.length > 0) {
114
+ event.preventDefault();
115
+ const lastAttachment = attachments.files[attachments.files.length - 1];
116
+ if (lastAttachment)
117
+ attachments.remove(lastAttachment.id);
118
+ return;
119
+ }
120
+ if (event.key !== "Enter" || event.shiftKey)
121
+ return;
122
+ if (event.nativeEvent.isComposing)
123
+ return;
124
+ if (isStopStatus(context.status))
125
+ return;
126
+ event.preventDefault();
127
+ event.currentTarget.form?.requestSubmit();
128
+ }, [attachments, context.status, onKeyDown]);
129
+ const handlePaste = React.useCallback((event) => {
130
+ onPaste?.(event);
131
+ if (event.defaultPrevented)
132
+ return;
133
+ const files = Array.from(event.clipboardData.files);
134
+ if (files.length === 0)
135
+ return;
136
+ event.preventDefault();
137
+ attachments.add(files);
138
+ }, [attachments, onPaste]);
139
+ const handleChange = React.useCallback((event) => {
140
+ onValueChange?.(event.target.value);
141
+ if (value === undefined)
142
+ provider?.text.setValue(event.target.value);
143
+ }, [onValueChange, provider, value]);
144
+ return (_jsx(InputGroupTextarea, { ...props, "data-slot": "prompt-input-textarea", disabled: isDisabled, name: props.name ?? "message", value: resolvedValue, onChange: handleChange, onKeyDown: handleKeyDown, onPaste: handlePaste, className: cn("px-2 py-2 text-sm leading-relaxed placeholder:text-muted-foreground/70", context.density === "comfortable"
145
+ ? "min-h-24"
146
+ : "min-h-6 max-h-40 resize-none overflow-y-auto", className) }));
147
+ }
148
+ function PromptInputFocusHint({ children, className, visible = true, ...props }) {
149
+ const { density } = React.useContext(PromptInputContext);
150
+ if (!visible)
151
+ return null;
152
+ return (_jsx("div", { "aria-hidden": "true", "data-slot": "prompt-input-focus-hint", className: cn("pointer-events-none absolute right-2.5 z-10 flex items-center gap-1 px-1.5 py-0.5 text-xs text-muted-foreground/70 transition-opacity group-focus-within/prompt-input:opacity-0", density === "comfortable" ? "top-2.5" : "top-1.5", className), ...props, children: children ?? (_jsxs(_Fragment, { children: [_jsx("kbd", { className: "font-sans", children: "\u2318L" }), _jsx("span", { children: "to focus" })] })) }));
153
+ }
154
+ function PromptInputDropOverlay({ children, className, icon, visible = false, ...props }) {
155
+ if (!visible)
156
+ return null;
157
+ return (_jsx("div", { "aria-hidden": "true", "data-slot": "prompt-input-drop-overlay", className: cn("pointer-events-none absolute inset-0 z-20 grid place-items-center bg-muted/55 text-foreground dark:bg-muted/40", className), ...props, children: children ?? icon ?? _jsx(UploadIcon, { className: "size-7 text-foreground/65" }) }));
158
+ }
159
+ function PromptInputHeader({ className, ...props }) {
160
+ return (_jsx("div", { "data-slot": "prompt-input-header", className: cn("flex min-w-0 items-center justify-between gap-2 px-1", className), ...props }));
161
+ }
162
+ function PromptInputFooter({ className, ...props }) {
163
+ return (_jsx("div", { "data-slot": "prompt-input-footer", className: cn("flex min-w-0 items-center justify-between gap-2 px-1", className), ...props }));
164
+ }
165
+ function PromptInputTools({ align = "block-end", className, ...props }) {
166
+ return (_jsx(InputGroupAddon, { align: align, "data-slot": "prompt-input-tools", className: cn("min-w-0 justify-between gap-2 px-0 pb-0", className), ...props }));
167
+ }
168
+ function PromptInputButton({ children, className, label, size = "icon-sm", tooltip, variant = "ghost", ...props }) {
169
+ const button = (_jsx(InputGroupButton, { "aria-label": label ?? tooltip, "data-slot": "prompt-input-button", size: size, variant: variant, className: cn("shrink-0 text-muted-foreground", className), ...props, children: children }));
170
+ if (!tooltip)
171
+ return button;
172
+ return (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: button }), _jsx(TooltipContent, { children: tooltip })] }) }));
173
+ }
174
+ function PromptInputSubmit({ children, className, disabled, label = "Send message", onClick, onStop, size = "icon-sm", status, stopLabel = "Stop response", type, variant = "default", ...props }) {
175
+ const context = React.useContext(PromptInputContext);
176
+ const resolvedStatus = status ?? context.status;
177
+ const isStopping = isStopStatus(resolvedStatus);
178
+ const resolvedDisabled = disabled ?? context.disabled;
179
+ const handleClick = React.useCallback((event) => {
180
+ onClick?.(event);
181
+ if (event.defaultPrevented || !isStopping)
182
+ return;
183
+ event.preventDefault();
184
+ onStop?.();
185
+ }, [isStopping, onClick, onStop]);
186
+ return (_jsx(Button, { "aria-label": isStopping ? stopLabel : label, "data-slot": "prompt-input-submit", "data-status": resolvedStatus, disabled: resolvedDisabled, onClick: handleClick, size: size, type: getSubmitType(isStopping, type), variant: getSubmitVariant(isStopping, variant), className: cn("shrink-0", className), ...props, children: children ?? getSubmitIcon(isStopping) }));
187
+ }
188
+ function isStopStatus(status) {
189
+ return status === "submitted" || status === "streaming";
190
+ }
191
+ function getSubmitType(isStopping, type) {
192
+ if (isStopping)
193
+ return "button";
194
+ return type ?? "submit";
195
+ }
196
+ function getSubmitVariant(isStopping, variant) {
197
+ if (isStopping)
198
+ return "outline";
199
+ return variant;
200
+ }
201
+ function getSubmitIcon(isStopping) {
202
+ if (isStopping)
203
+ return _jsx(SquareIcon, {});
204
+ return _jsx(ArrowUpIcon, {});
205
+ }
206
+ export { PromptInput, PromptInputBody, PromptInputButton, PromptInputDropOverlay, PromptInputFooter, PromptInputFocusHint, PromptInputHeader, PromptInputProvider, PromptInputSubmit, PromptInputTextarea, PromptInputTools, useOptionalPromptInputProvider, usePromptInputProvider, };
@@ -0,0 +1,21 @@
1
+ import type * as React from "react";
2
+ import "@ciridae/ui/message-response.css";
3
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@ciridae/ui/collapsible";
4
+ type ReasoningProps = React.ComponentProps<typeof Collapsible> & {
5
+ defaultOpen?: boolean;
6
+ duration?: number;
7
+ isStreaming?: boolean;
8
+ onOpenChange?: (open: boolean) => void;
9
+ open?: boolean;
10
+ };
11
+ type ReasoningTriggerProps = React.ComponentProps<typeof CollapsibleTrigger> & {
12
+ getThinkingMessage?: (isStreaming: boolean, duration?: number) => React.ReactNode;
13
+ };
14
+ type ReasoningContentProps = React.ComponentProps<typeof CollapsibleContent> & {
15
+ children: string;
16
+ };
17
+ declare const Reasoning: React.MemoExoticComponent<({ children, className, defaultOpen, duration: durationProp, isStreaming, onOpenChange, open, ...props }: ReasoningProps) => import("react/jsx-runtime").JSX.Element>;
18
+ declare const ReasoningTrigger: React.MemoExoticComponent<({ children, className, getThinkingMessage, ...props }: ReasoningTriggerProps) => import("react/jsx-runtime").JSX.Element>;
19
+ declare const ReasoningContent: React.MemoExoticComponent<({ children, className, ...props }: ReasoningContentProps) => import("react/jsx-runtime").JSX.Element>;
20
+ export { Reasoning, ReasoningContent, ReasoningTrigger };
21
+ export type { ReasoningContentProps, ReasoningProps, ReasoningTriggerProps };
@@ -0,0 +1,106 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cjk } from "@streamdown/cjk";
3
+ import { code } from "@streamdown/code";
4
+ import { math } from "@streamdown/math";
5
+ import { mermaid } from "@streamdown/mermaid";
6
+ import { BrainIcon, ChevronDownIcon } from "lucide-react";
7
+ import { createContext, memo, useCallback, useContext, useEffect, useMemo, useRef, useState, } from "react";
8
+ import { Streamdown } from "streamdown";
9
+ import { Shimmer } from "@ciridae/ui/shimmer";
10
+ import "@ciridae/ui/message-response.css";
11
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@ciridae/ui/collapsible";
12
+ import { cn } from "@ciridae/ui/utils";
13
+ const ReasoningContext = createContext(null);
14
+ const AUTO_CLOSE_DELAY = 1000;
15
+ const MS_IN_SECOND = 1000;
16
+ const streamdownPlugins = { cjk, code, math, mermaid };
17
+ function useReasoningContext() {
18
+ const context = useContext(ReasoningContext);
19
+ if (!context)
20
+ throw new Error("Reasoning components must be used within Reasoning");
21
+ return context;
22
+ }
23
+ const Reasoning = memo(function Reasoning({ children, className, defaultOpen, duration: durationProp, isStreaming = false, onOpenChange, open, ...props }) {
24
+ const { duration, handleOpenChange, isOpen, setIsOpen } = useReasoningState({
25
+ defaultOpen,
26
+ durationProp,
27
+ isStreaming,
28
+ onOpenChange,
29
+ open,
30
+ });
31
+ const contextValue = useMemo(() => ({ duration, isOpen, isStreaming, setIsOpen }), [duration, isOpen, isStreaming, setIsOpen]);
32
+ return (_jsx(ReasoningContext.Provider, { value: contextValue, children: _jsx(Collapsible, { "data-slot": "reasoning", className: cn("rounded-lg border bg-card text-card-foreground", className), onOpenChange: handleOpenChange, open: isOpen, ...props, children: children }) }));
33
+ });
34
+ function useReasoningState({ defaultOpen, durationProp, isStreaming, onOpenChange, open, }) {
35
+ const [internalOpen, setInternalOpen] = useState(defaultOpen ?? isStreaming);
36
+ const [internalDuration, setInternalDuration] = useState(durationProp);
37
+ const hasAutoClosedRef = useRef(false);
38
+ const hasEverStreamedRef = useRef(isStreaming);
39
+ const userClosedDuringStreamingRef = useRef(false);
40
+ const wasStreamingRef = useRef(isStreaming);
41
+ const startTimeRef = useRef(isStreaming ? Date.now() : null);
42
+ const isControlled = open !== undefined;
43
+ const isOpen = open ?? internalOpen;
44
+ const duration = durationProp ?? internalDuration;
45
+ const isExplicitlyClosed = defaultOpen === false;
46
+ const setIsOpen = useCallback((nextOpen) => {
47
+ if (!isControlled)
48
+ setInternalOpen(nextOpen);
49
+ onOpenChange?.(nextOpen);
50
+ }, [isControlled, onOpenChange]);
51
+ const handleOpenChange = useCallback((nextOpen) => {
52
+ if (isStreaming)
53
+ userClosedDuringStreamingRef.current = !nextOpen;
54
+ setIsOpen(nextOpen);
55
+ }, [isStreaming, setIsOpen]);
56
+ useEffect(() => {
57
+ if (durationProp !== undefined)
58
+ setInternalDuration(durationProp);
59
+ }, [durationProp]);
60
+ useEffect(() => {
61
+ const streamStarted = isStreaming && !wasStreamingRef.current;
62
+ wasStreamingRef.current = isStreaming;
63
+ if (isStreaming) {
64
+ hasEverStreamedRef.current = true;
65
+ hasAutoClosedRef.current = false;
66
+ if (streamStarted)
67
+ userClosedDuringStreamingRef.current = false;
68
+ startTimeRef.current ?? (startTimeRef.current = Date.now());
69
+ return;
70
+ }
71
+ if (startTimeRef.current !== null) {
72
+ setInternalDuration(Math.max(1, Math.ceil((Date.now() - startTimeRef.current) / MS_IN_SECOND)));
73
+ startTimeRef.current = null;
74
+ }
75
+ }, [isStreaming]);
76
+ useEffect(() => {
77
+ if (isStreaming && !isOpen && !isExplicitlyClosed && !userClosedDuringStreamingRef.current) {
78
+ setIsOpen(true);
79
+ }
80
+ }, [isExplicitlyClosed, isOpen, isStreaming, setIsOpen]);
81
+ useEffect(() => {
82
+ if (!hasEverStreamedRef.current || isStreaming || !isOpen || hasAutoClosedRef.current)
83
+ return;
84
+ const timer = window.setTimeout(() => {
85
+ hasAutoClosedRef.current = true;
86
+ setIsOpen(false);
87
+ }, AUTO_CLOSE_DELAY);
88
+ return () => window.clearTimeout(timer);
89
+ }, [isOpen, isStreaming, setIsOpen]);
90
+ return { duration, handleOpenChange, isOpen, setIsOpen };
91
+ }
92
+ const ReasoningTrigger = memo(function ReasoningTrigger({ children, className, getThinkingMessage = defaultGetThinkingMessage, ...props }) {
93
+ const { duration, isOpen, isStreaming } = useReasoningContext();
94
+ return (_jsxs(CollapsibleTrigger, { "data-slot": "reasoning-trigger", className: cn("group flex w-full items-center justify-between gap-3 px-3 py-2 text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:ring-[var(--focus-ring-width)] focus-visible:ring-ring focus-visible:outline-none", className), ...props, children: [_jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [_jsx(BrainIcon, { "aria-hidden": "true", className: "size-4 shrink-0 text-muted-foreground" }), _jsx("span", { className: "min-w-0 truncate", children: children ?? getThinkingMessage(isStreaming, duration) })] }), _jsx(ChevronDownIcon, { "aria-hidden": "true", className: cn("size-4 shrink-0 text-muted-foreground transition-transform", isOpen ? "rotate-180" : undefined) })] }));
95
+ });
96
+ const ReasoningContent = memo(function ReasoningContent({ children, className, ...props }) {
97
+ return (_jsx(CollapsibleContent, { "data-slot": "reasoning-content", className: cn("border-t px-3 py-3 text-sm", className), ...props, children: _jsx(Streamdown, { className: cn("agentic-message-response text-muted-foreground"), plugins: streamdownPlugins, children: children }) }));
98
+ });
99
+ function defaultGetThinkingMessage(isStreaming, duration) {
100
+ if (isStreaming || duration === 0)
101
+ return _jsx(Shimmer, { as: "span", children: "Thinking..." });
102
+ if (duration === undefined)
103
+ return "Thought for a few seconds";
104
+ return `Thought for ${duration} ${duration === 1 ? "second" : "seconds"}`;
105
+ }
106
+ export { Reasoning, ReasoningContent, ReasoningTrigger };
@@ -0,0 +1,13 @@
1
+ import { BookmarkIcon } from "lucide-react";
2
+ import type * as React from "react";
3
+ import { Button } from "@ciridae/ui/button";
4
+ type RunCheckpointProps = React.ComponentProps<"div">;
5
+ type RunCheckpointIconProps = React.ComponentProps<typeof BookmarkIcon>;
6
+ type RunCheckpointTriggerProps = React.ComponentProps<typeof Button> & {
7
+ tooltip?: string;
8
+ };
9
+ declare function RunCheckpoint({ children, className, ...props }: RunCheckpointProps): import("react/jsx-runtime").JSX.Element;
10
+ declare function RunCheckpointIcon({ children, className, ...props }: RunCheckpointIconProps): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | import("react/jsx-runtime").JSX.Element;
11
+ declare function RunCheckpointTrigger({ children, size, tooltip, type, variant, ...props }: RunCheckpointTriggerProps): import("react/jsx-runtime").JSX.Element;
12
+ export { RunCheckpoint, RunCheckpointIcon, RunCheckpointTrigger };
13
+ export type { RunCheckpointIconProps, RunCheckpointProps, RunCheckpointTriggerProps };
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { BookmarkIcon } from "lucide-react";
3
+ import { Button } from "@ciridae/ui/button";
4
+ import { Separator } from "@ciridae/ui/separator";
5
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@ciridae/ui/tooltip";
6
+ import { cn } from "@ciridae/ui/utils";
7
+ function RunCheckpoint({ children, className, ...props }) {
8
+ return (_jsxs("div", { "data-slot": "run-checkpoint", className: cn("flex items-center gap-1 overflow-hidden text-muted-foreground", className), ...props, children: [children, _jsx(Separator, { className: "min-w-6 flex-1" })] }));
9
+ }
10
+ function RunCheckpointIcon({ children, className, ...props }) {
11
+ return (children ?? (_jsx(BookmarkIcon, { "aria-hidden": "true", className: cn("size-4 shrink-0", className), ...props })));
12
+ }
13
+ function RunCheckpointTrigger({ children, size = "sm", tooltip, type = "button", variant = "ghost", ...props }) {
14
+ const button = (_jsx(Button, { "data-slot": "run-checkpoint-trigger", size: size, type: type, variant: variant, ...props, children: children }));
15
+ if (!tooltip)
16
+ return button;
17
+ return (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: button }), _jsx(TooltipContent, { align: "start", side: "bottom", children: tooltip })] }) }));
18
+ }
19
+ export { RunCheckpoint, RunCheckpointIcon, RunCheckpointTrigger };
@@ -0,0 +1,30 @@
1
+ import type { LucideIcon } from "lucide-react";
2
+ import type * as React from "react";
3
+ import { Badge } from "@ciridae/ui/badge";
4
+ type RunTraceProps = React.ComponentProps<"div"> & {
5
+ defaultOpen?: boolean;
6
+ onOpenChange?: (open: boolean) => void;
7
+ open?: boolean;
8
+ };
9
+ type RunTraceHeaderProps = React.ComponentProps<"button">;
10
+ type RunTraceContentProps = React.ComponentProps<"div">;
11
+ type RunTraceStepProps = React.ComponentProps<"div"> & {
12
+ description?: React.ReactNode;
13
+ icon?: LucideIcon;
14
+ label: React.ReactNode;
15
+ status?: "active" | "complete" | "pending";
16
+ };
17
+ type RunTraceSearchResultsProps = React.ComponentProps<"div">;
18
+ type RunTraceSearchResultProps = React.ComponentProps<typeof Badge>;
19
+ type RunTraceImageProps = React.ComponentProps<"div"> & {
20
+ caption?: string;
21
+ };
22
+ declare const RunTrace: React.MemoExoticComponent<({ children, className, defaultOpen, onOpenChange, open, ...props }: RunTraceProps) => import("react/jsx-runtime").JSX.Element>;
23
+ declare const RunTraceHeader: React.MemoExoticComponent<({ children, className, onClick, type, ...props }: RunTraceHeaderProps) => import("react/jsx-runtime").JSX.Element>;
24
+ declare const RunTraceContent: React.MemoExoticComponent<({ children, className, ...props }: RunTraceContentProps) => import("react/jsx-runtime").JSX.Element | null>;
25
+ declare const RunTraceStep: React.MemoExoticComponent<({ children, className, description, icon: Icon, label, status, ...props }: RunTraceStepProps) => import("react/jsx-runtime").JSX.Element>;
26
+ declare function RunTraceSearchResults({ className, ...props }: RunTraceSearchResultsProps): import("react/jsx-runtime").JSX.Element;
27
+ declare function RunTraceSearchResult({ className, variant, ...props }: RunTraceSearchResultProps): import("react/jsx-runtime").JSX.Element;
28
+ declare function RunTraceImage({ caption, children, className, ...props }: RunTraceImageProps): import("react/jsx-runtime").JSX.Element;
29
+ export { RunTrace, RunTraceContent, RunTraceHeader, RunTraceImage, RunTraceSearchResult, RunTraceSearchResults, RunTraceStep, };
30
+ export type { RunTraceContentProps, RunTraceHeaderProps, RunTraceImageProps, RunTraceProps, RunTraceSearchResultProps, RunTraceSearchResultsProps, RunTraceStepProps, };
@@ -0,0 +1,56 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { BrainIcon, ChevronDownIcon, DotIcon } from "lucide-react";
3
+ import { createContext, memo, useCallback, useContext, useMemo, useState } from "react";
4
+ import { Badge } from "@ciridae/ui/badge";
5
+ import { cn } from "@ciridae/ui/utils";
6
+ const RunTraceContext = createContext(null);
7
+ const stepStatusClasses = {
8
+ active: "text-foreground",
9
+ complete: "text-muted-foreground",
10
+ pending: "text-muted-foreground/50",
11
+ };
12
+ function useRunTrace() {
13
+ const context = useContext(RunTraceContext);
14
+ if (!context)
15
+ throw new Error("RunTrace components must be used within RunTrace");
16
+ return context;
17
+ }
18
+ const RunTrace = memo(function RunTrace({ children, className, defaultOpen = false, onOpenChange, open, ...props }) {
19
+ const [internalOpen, setInternalOpen] = useState(defaultOpen);
20
+ const isControlled = open !== undefined;
21
+ const isOpen = open ?? internalOpen;
22
+ const setIsOpen = useCallback((nextOpen) => {
23
+ if (!isControlled)
24
+ setInternalOpen(nextOpen);
25
+ onOpenChange?.(nextOpen);
26
+ }, [isControlled, onOpenChange]);
27
+ const contextValue = useMemo(() => ({ isOpen, setIsOpen }), [isOpen, setIsOpen]);
28
+ return (_jsx(RunTraceContext.Provider, { value: contextValue, children: _jsx("div", { "data-slot": "run-trace", className: cn("grid w-full gap-3", className), ...props, children: children }) }));
29
+ });
30
+ const RunTraceHeader = memo(function RunTraceHeader({ children, className, onClick, type = "button", ...props }) {
31
+ const { isOpen, setIsOpen } = useRunTrace();
32
+ return (_jsxs("button", { "data-slot": "run-trace-header", "aria-expanded": isOpen, className: cn("flex w-full items-center gap-2 rounded-md text-left text-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:ring-[var(--focus-ring-width)] focus-visible:ring-ring focus-visible:outline-none", className), ...props, onClick: (event) => {
33
+ onClick?.(event);
34
+ if (!event.defaultPrevented)
35
+ setIsOpen(!isOpen);
36
+ }, type: type, children: [_jsx(BrainIcon, { "aria-hidden": "true", className: "size-4 shrink-0" }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: children ?? "Run trace" }), _jsx(ChevronDownIcon, { "aria-hidden": "true", className: cn("size-4 shrink-0 transition-transform", isOpen ? "rotate-180" : undefined) })] }));
37
+ });
38
+ const RunTraceContent = memo(function RunTraceContent({ children, className, ...props }) {
39
+ const { isOpen } = useRunTrace();
40
+ if (!isOpen)
41
+ return null;
42
+ return (_jsx("div", { "data-slot": "run-trace-content", className: cn("grid gap-3", className), ...props, children: children }));
43
+ });
44
+ const RunTraceStep = memo(function RunTraceStep({ children, className, description, icon: Icon = DotIcon, label, status = "complete", ...props }) {
45
+ return (_jsxs("div", { "data-slot": "run-trace-step", className: cn("flex gap-2 text-sm", stepStatusClasses[status], className), ...props, children: [_jsxs("div", { className: "relative mt-0.5", children: [_jsx(Icon, { "aria-hidden": "true", className: "size-4" }), _jsx("div", { className: "absolute top-7 bottom-0 left-1/2 -mx-px w-px bg-border" })] }), _jsxs("div", { className: "min-w-0 flex-1 space-y-2", children: [_jsx("div", { children: label }), description ? _jsx("div", { className: "text-xs text-muted-foreground", children: description }) : null, children] })] }));
46
+ });
47
+ function RunTraceSearchResults({ className, ...props }) {
48
+ return (_jsx("div", { "data-slot": "run-trace-search-results", className: cn("flex flex-wrap items-center gap-2", className), ...props }));
49
+ }
50
+ function RunTraceSearchResult({ className, variant = "secondary", ...props }) {
51
+ return (_jsx(Badge, { "data-slot": "run-trace-search-result", className: cn("font-normal", className), variant: variant, ...props }));
52
+ }
53
+ function RunTraceImage({ caption, children, className, ...props }) {
54
+ return (_jsxs("div", { "data-slot": "run-trace-image", className: cn("grid gap-2", className), ...props, children: [_jsx("div", { className: "flex max-h-80 items-center justify-center overflow-hidden rounded-lg border bg-muted/40 p-3", children: children }), caption ? _jsx("p", { className: "text-xs text-muted-foreground", children: caption }) : null] }));
55
+ }
56
+ export { RunTrace, RunTraceContent, RunTraceHeader, RunTraceImage, RunTraceSearchResult, RunTraceSearchResults, RunTraceStep, };
@@ -0,0 +1,24 @@
1
+ import type * as React from "react";
2
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@ciridae/ui/collapsible";
3
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@ciridae/ui/tabs";
4
+ type SandboxProps = React.ComponentProps<typeof Collapsible>;
5
+ type SandboxHeaderProps = React.ComponentProps<typeof CollapsibleTrigger> & {
6
+ description?: React.ReactNode;
7
+ title?: React.ReactNode;
8
+ };
9
+ type SandboxContentProps = React.ComponentProps<typeof CollapsibleContent>;
10
+ type SandboxTabsProps = React.ComponentProps<typeof Tabs>;
11
+ type SandboxTabsBarProps = React.ComponentProps<"div">;
12
+ type SandboxTabsListProps = React.ComponentProps<typeof TabsList>;
13
+ type SandboxTabsTriggerProps = React.ComponentProps<typeof TabsTrigger>;
14
+ type SandboxTabContentProps = React.ComponentProps<typeof TabsContent>;
15
+ declare function Sandbox({ className, defaultOpen, ...props }: SandboxProps): import("react/jsx-runtime").JSX.Element;
16
+ declare function SandboxHeader({ children, className, description, title, ...props }: SandboxHeaderProps): import("react/jsx-runtime").JSX.Element;
17
+ declare function SandboxContent({ className, ...props }: SandboxContentProps): import("react/jsx-runtime").JSX.Element;
18
+ declare function SandboxTabs({ className, ...props }: SandboxTabsProps): import("react/jsx-runtime").JSX.Element;
19
+ declare function SandboxTabsBar({ className, ...props }: SandboxTabsBarProps): import("react/jsx-runtime").JSX.Element;
20
+ declare function SandboxTabsList(props: SandboxTabsListProps): import("react/jsx-runtime").JSX.Element;
21
+ declare function SandboxTabsTrigger(props: SandboxTabsTriggerProps): import("react/jsx-runtime").JSX.Element;
22
+ declare function SandboxTabContent({ className, ...props }: SandboxTabContentProps): import("react/jsx-runtime").JSX.Element;
23
+ export { Sandbox, SandboxContent, SandboxHeader, SandboxTabContent, SandboxTabs, SandboxTabsBar, SandboxTabsList, SandboxTabsTrigger, };
24
+ export type { SandboxContentProps, SandboxHeaderProps, SandboxProps, SandboxTabContentProps, SandboxTabsBarProps, SandboxTabsListProps, SandboxTabsProps, SandboxTabsTriggerProps, };
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ChevronDownIcon } from "lucide-react";
3
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@ciridae/ui/collapsible";
4
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@ciridae/ui/tabs";
5
+ import { cn } from "@ciridae/ui/utils";
6
+ function Sandbox({ className, defaultOpen = true, ...props }) {
7
+ return (_jsx(Collapsible, { "data-slot": "sandbox", className: cn("w-full overflow-hidden rounded-lg border bg-card", className), defaultOpen: defaultOpen, ...props }));
8
+ }
9
+ function SandboxHeader({ children, className, description, title = "Sandbox", ...props }) {
10
+ return (_jsxs(CollapsibleTrigger, { "data-slot": "sandbox-header", className: cn("group flex w-full items-start justify-between gap-3 border-b px-4 py-3 text-left", className), ...props, children: [children ?? _jsx(SandboxHeaderText, { description: description, title: title }), _jsx(ChevronDownIcon, { "aria-hidden": "true", className: "size-4 shrink-0 transition-transform group-data-[state=open]:rotate-180" })] }));
11
+ }
12
+ function SandboxHeaderText({ description, title, }) {
13
+ return (_jsxs("div", { className: "min-w-0 space-y-1", children: [_jsx("div", { className: "truncate text-sm font-medium", children: title }), description ? _jsx("div", { className: "text-sm text-muted-foreground", children: description }) : null] }));
14
+ }
15
+ function SandboxContent({ className, ...props }) {
16
+ return (_jsx(CollapsibleContent, { "data-slot": "sandbox-content", className: cn("min-h-0", className), ...props }));
17
+ }
18
+ function SandboxTabs({ className, ...props }) {
19
+ return (_jsx(Tabs, { "data-slot": "sandbox-tabs", className: cn("flex min-h-0 flex-col", className), ...props }));
20
+ }
21
+ function SandboxTabsBar({ className, ...props }) {
22
+ return (_jsx("div", { "data-slot": "sandbox-tabs-bar", className: cn("flex items-center justify-between gap-3 border-b p-2", className), ...props }));
23
+ }
24
+ function SandboxTabsList(props) {
25
+ return _jsx(TabsList, { "data-slot": "sandbox-tabs-list", ...props });
26
+ }
27
+ function SandboxTabsTrigger(props) {
28
+ return _jsx(TabsTrigger, { "data-slot": "sandbox-tabs-trigger", ...props });
29
+ }
30
+ function SandboxTabContent({ className, ...props }) {
31
+ return (_jsx(TabsContent, { "data-slot": "sandbox-tab-content", className: cn("m-0 min-h-0 p-4", className), ...props }));
32
+ }
33
+ export { Sandbox, SandboxContent, SandboxHeader, SandboxTabContent, SandboxTabs, SandboxTabsBar, SandboxTabsList, SandboxTabsTrigger, };