@signalflare-ai/ui 1.0.0 → 1.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 (300) hide show
  1. package/CHANGELOG.md +37 -4
  2. package/README.md +1 -1
  3. package/ai/component-registry.json +1047 -183
  4. package/ai/component-registry.md +4241 -50
  5. package/ai/schemas.ts +99 -502
  6. package/dist/.build-complete +1 -1
  7. package/dist/ai/schemas.d.ts +76 -58
  8. package/dist/ai/schemas.d.ts.map +1 -1
  9. package/dist/{ai-actions-DSVeQn4e.js → ai-actions-BdUZI3Gk.js} +3 -3
  10. package/dist/{ai-actions-DSVeQn4e.js.map → ai-actions-BdUZI3Gk.js.map} +1 -1
  11. package/dist/{ai-agent-card-BXHwhWAU.js → ai-agent-card-BR2NIYhi.js} +1 -1
  12. package/dist/{ai-agent-card-BXHwhWAU.js.map → ai-agent-card-BR2NIYhi.js.map} +1 -1
  13. package/dist/{ai-approval-aa0qvjFN.js → ai-approval-Ba7mrKba.js} +2 -2
  14. package/dist/{ai-approval-aa0qvjFN.js.map → ai-approval-Ba7mrKba.js.map} +1 -1
  15. package/dist/{ai-code-block-BgtIxtZZ.js → ai-code-block-CZtoL73R.js} +3 -3
  16. package/dist/{ai-code-block-BgtIxtZZ.js.map → ai-code-block-CZtoL73R.js.map} +1 -1
  17. package/dist/ai-conversation-Cc7WlaBg.js +242 -0
  18. package/dist/ai-conversation-Cc7WlaBg.js.map +1 -0
  19. package/dist/{ai-info-banner-uFxHHwBA.js → ai-info-banner-C7EWPBj7.js} +7 -3
  20. package/dist/ai-info-banner-C7EWPBj7.js.map +1 -0
  21. package/dist/{ai-message-BjnFznXy.js → ai-message-Bp7L68U_.js} +27 -8
  22. package/dist/ai-message-Bp7L68U_.js.map +1 -0
  23. package/dist/{ai-mission-header-08__gULL.js → ai-mission-header-TiCJfTNt.js} +1 -1
  24. package/dist/{ai-mission-header-08__gULL.js.map → ai-mission-header-TiCJfTNt.js.map} +1 -1
  25. package/dist/{ai-part-group-DBtgTgAn.js → ai-part-group-DNb9I446.js} +3 -3
  26. package/dist/{ai-part-group-DBtgTgAn.js.map → ai-part-group-DNb9I446.js.map} +1 -1
  27. package/dist/{ai-prompt-input-Dy1LfxPk.js → ai-prompt-input-BVvov_KF.js} +467 -25
  28. package/dist/ai-prompt-input-BVvov_KF.js.map +1 -0
  29. package/dist/{ai-question-CHHoDJMg.js → ai-question-GPPMk7YM.js} +2 -2
  30. package/dist/{ai-question-CHHoDJMg.js.map → ai-question-GPPMk7YM.js.map} +1 -1
  31. package/dist/{ai-reasoning-CnL6ZSr5.js → ai-reasoning-_feFjk56.js} +2 -2
  32. package/dist/{ai-reasoning-CnL6ZSr5.js.map → ai-reasoning-_feFjk56.js.map} +1 -1
  33. package/dist/{ai-response-BEUg3xvd.js → ai-response-CvjV3WhV.js} +8 -3
  34. package/dist/ai-response-CvjV3WhV.js.map +1 -0
  35. package/dist/{ai-shimmer-By5_L05p.js → ai-shimmer-j6lKIrjj.js} +1 -1
  36. package/dist/{ai-shimmer-By5_L05p.js.map → ai-shimmer-j6lKIrjj.js.map} +1 -1
  37. package/dist/{ai-status-badge-BGYGWYF6.js → ai-status-badge-CSU_QOdz.js} +1 -1
  38. package/dist/{ai-status-badge-BGYGWYF6.js.map → ai-status-badge-CSU_QOdz.js.map} +1 -1
  39. package/dist/{ai-streaming-text-CMfoThV0.js → ai-streaming-text-IWW1BhvZ.js} +44 -16
  40. package/dist/ai-streaming-text-IWW1BhvZ.js.map +1 -0
  41. package/dist/{ai-subagent-DcPRqkAA.js → ai-subagent-JA4iIMW3.js} +13 -5
  42. package/dist/ai-subagent-JA4iIMW3.js.map +1 -0
  43. package/dist/{ai-suggestion-MgeCg5Ar.js → ai-suggestion-BdO6MBuH.js} +2 -2
  44. package/dist/{ai-suggestion-MgeCg5Ar.js.map → ai-suggestion-BdO6MBuH.js.map} +1 -1
  45. package/dist/{ai-task-list-Da9zIm00.js → ai-task-list-DYw4R1FA.js} +12 -5
  46. package/dist/ai-task-list-DYw4R1FA.js.map +1 -0
  47. package/dist/{ai-timeline-Cwu045IR.js → ai-timeline-C42tOUT8.js} +1 -1
  48. package/dist/{ai-timeline-Cwu045IR.js.map → ai-timeline-C42tOUT8.js.map} +1 -1
  49. package/dist/{ai-tool-Cn1O4xjP.js → ai-tool-03jOTwUI.js} +23 -10
  50. package/dist/ai-tool-03jOTwUI.js.map +1 -0
  51. package/dist/{ai-usage-bar-DjS12DMp.js → ai-usage-bar-BRf5LC_b.js} +1 -1
  52. package/dist/{ai-usage-bar-DjS12DMp.js.map → ai-usage-bar-BRf5LC_b.js.map} +1 -1
  53. package/dist/{badge-D_eaA6wv.js → badge-BheXjMc8.js} +2 -2
  54. package/dist/{badge-D_eaA6wv.js.map → badge-BheXjMc8.js.map} +1 -1
  55. package/dist/{banner-B_6oBrsu.js → banner-CcsjunJg.js} +7 -2
  56. package/dist/banner-CcsjunJg.js.map +1 -0
  57. package/dist/{breadcrumbs-BlmeYfgq.js → breadcrumbs-CouSyy3H.js} +3 -3
  58. package/dist/{breadcrumbs-BlmeYfgq.js.map → breadcrumbs-CouSyy3H.js.map} +1 -1
  59. package/dist/{button-De0267YU.js → button-CO6-qPax.js} +1 -1
  60. package/dist/{button-De0267YU.js.map → button-CO6-qPax.js.map} +1 -1
  61. package/dist/catalog.js +1 -1
  62. package/dist/{chart-BK3sVPnD.js → chart-Dg0qUeSc.js} +2 -2
  63. package/dist/{chart-BK3sVPnD.js.map → chart-Dg0qUeSc.js.map} +1 -1
  64. package/dist/{checkbox-DYhUmZNw.js → checkbox-D7p4QKsC.js} +2 -2
  65. package/dist/{checkbox-DYhUmZNw.js.map → checkbox-D7p4QKsC.js.map} +1 -1
  66. package/dist/{clipboard-text-ssybngLw.js → clipboard-text-kLaMogs3.js} +3 -3
  67. package/dist/{clipboard-text-ssybngLw.js.map → clipboard-text-kLaMogs3.js.map} +1 -1
  68. package/dist/{code-Cx-QSoOT.js → code-BN8InC0G.js} +2 -2
  69. package/dist/{code-Cx-QSoOT.js.map → code-BN8InC0G.js.map} +1 -1
  70. package/dist/{collapsible-DWsXeXmS.js → collapsible-D_ueZ0jz.js} +1 -1
  71. package/dist/{collapsible-DWsXeXmS.js.map → collapsible-D_ueZ0jz.js.map} +1 -1
  72. package/dist/{combobox-C0iW6a0r.js → combobox-B7TOK0U2.js} +3 -3
  73. package/dist/{combobox-C0iW6a0r.js.map → combobox-B7TOK0U2.js.map} +1 -1
  74. package/dist/{command-palette-DGzioeki.js → command-palette-CuNUyJca.js} +2 -2
  75. package/dist/{command-palette-DGzioeki.js.map → command-palette-CuNUyJca.js.map} +1 -1
  76. package/dist/components/ai-actions.js +1 -1
  77. package/dist/components/ai-agent-card.js +1 -1
  78. package/dist/components/ai-approval.js +1 -1
  79. package/dist/components/ai-code-block.js +1 -1
  80. package/dist/components/ai-conversation.js +2 -2
  81. package/dist/components/ai-info-banner.js +1 -1
  82. package/dist/components/ai-message.js +1 -1
  83. package/dist/components/ai-mission-header.js +1 -1
  84. package/dist/components/ai-part-group.js +1 -1
  85. package/dist/components/ai-prompt-input.js +2 -2
  86. package/dist/components/ai-question.js +1 -1
  87. package/dist/components/ai-reasoning.js +1 -1
  88. package/dist/components/ai-response.js +1 -1
  89. package/dist/components/ai-shimmer.js +1 -1
  90. package/dist/components/ai-status-badge.js +1 -1
  91. package/dist/components/ai-streaming-text.js +2 -2
  92. package/dist/components/ai-subagent.js +1 -1
  93. package/dist/components/ai-suggestion.js +1 -1
  94. package/dist/components/ai-task-list.js +1 -1
  95. package/dist/components/ai-timeline.js +1 -1
  96. package/dist/components/ai-tool.js +1 -1
  97. package/dist/components/ai-usage-bar.js +1 -1
  98. package/dist/components/badge.js +1 -1
  99. package/dist/components/banner.js +1 -1
  100. package/dist/components/breadcrumbs.js +1 -1
  101. package/dist/components/button.js +1 -1
  102. package/dist/components/chart.js +2 -2
  103. package/dist/components/checkbox.js +1 -1
  104. package/dist/components/clipboard-text.js +1 -1
  105. package/dist/components/code.js +1 -1
  106. package/dist/components/collapsible.js +1 -1
  107. package/dist/components/combobox.js +1 -1
  108. package/dist/components/command-palette.js +1 -1
  109. package/dist/components/data-grid.js +1 -1
  110. package/dist/components/date-picker.js +1 -1
  111. package/dist/components/date-range-picker.js +1 -1
  112. package/dist/components/dialog.js +1 -1
  113. package/dist/components/dropdown.js +1 -1
  114. package/dist/components/empty.js +1 -1
  115. package/dist/components/field.js +1 -1
  116. package/dist/components/filters.js +1 -1
  117. package/dist/components/flow.js +1 -1
  118. package/dist/components/grid.js +1 -1
  119. package/dist/components/input.js +2 -2
  120. package/dist/components/label.js +1 -1
  121. package/dist/components/layer-card.js +1 -1
  122. package/dist/components/loader.js +1 -1
  123. package/dist/components/menubar.js +1 -1
  124. package/dist/components/meter.js +1 -1
  125. package/dist/components/pagination.js +1 -1
  126. package/dist/components/popover.js +1 -1
  127. package/dist/components/radio.js +1 -1
  128. package/dist/components/select.js +1 -1
  129. package/dist/components/sensitive-input.js +1 -1
  130. package/dist/components/sidebar.js +1 -1
  131. package/dist/components/signalflare-ai-logo.js +1 -1
  132. package/dist/components/sparkline.js +1 -1
  133. package/dist/components/stat-card.js +1 -1
  134. package/dist/components/surface.js +1 -1
  135. package/dist/components/switch.js +1 -1
  136. package/dist/components/table.js +1 -1
  137. package/dist/components/tabs.js +1 -1
  138. package/dist/components/text-roll.js +1 -1
  139. package/dist/components/text.js +1 -1
  140. package/dist/components/theme-toggle.js +1 -1
  141. package/dist/components/toast.js +1 -1
  142. package/dist/components/tooltip.js +1 -1
  143. package/dist/components/use-agent-harness.js +1 -1
  144. package/dist/{data-grid-CG76N_hK.js → data-grid-DGHmU0w3.js} +8 -8
  145. package/dist/{data-grid-CG76N_hK.js.map → data-grid-DGHmU0w3.js.map} +1 -1
  146. package/dist/{date-picker-Dqg9L4xu.js → date-picker--ox89RBy.js} +1 -1
  147. package/dist/{date-picker-Dqg9L4xu.js.map → date-picker--ox89RBy.js.map} +1 -1
  148. package/dist/{date-range-picker-D75LLINc.js → date-range-picker-DVa7QBqE.js} +1 -1
  149. package/dist/{date-range-picker-D75LLINc.js.map → date-range-picker-DVa7QBqE.js.map} +1 -1
  150. package/dist/{dialog-CyHEQXEY.js → dialog-Bv1oSFOd.js} +2 -2
  151. package/dist/{dialog-CyHEQXEY.js.map → dialog-Bv1oSFOd.js.map} +1 -1
  152. package/dist/{dist-1-gcEL2L.js → dist-B6iWiWwp.js} +25 -25
  153. package/dist/{dist-1-gcEL2L.js.map → dist-B6iWiWwp.js.map} +1 -1
  154. package/dist/{dropdown-qnEYRFXZ.js → dropdown-B_nrGXjV.js} +2 -2
  155. package/dist/{dropdown-qnEYRFXZ.js.map → dropdown-B_nrGXjV.js.map} +1 -1
  156. package/dist/{echart-DURZEyai.js → echart-CdOUaT-r.js} +1 -1
  157. package/dist/{echart-DURZEyai.js.map → echart-CdOUaT-r.js.map} +1 -1
  158. package/dist/{empty-D2TypIId.js → empty-DZnN0zKX.js} +11 -6
  159. package/dist/empty-DZnN0zKX.js.map +1 -0
  160. package/dist/{field-Y_UK1_Cg.js → field-B_yVof52.js} +2 -2
  161. package/dist/{field-Y_UK1_Cg.js.map → field-B_yVof52.js.map} +1 -1
  162. package/dist/{filters-Bw_U6ZTx.js → filters-cpJCY21R.js} +7 -7
  163. package/dist/{filters-Bw_U6ZTx.js.map → filters-cpJCY21R.js.map} +1 -1
  164. package/dist/{flow-BRsYUCJa.js → flow-B4v198ot.js} +1 -1
  165. package/dist/{flow-BRsYUCJa.js.map → flow-B4v198ot.js.map} +1 -1
  166. package/dist/genui.js +1 -1
  167. package/dist/{grid-qUAN9hFx.js → grid-CEd64Lnh.js} +1 -1
  168. package/dist/{grid-qUAN9hFx.js.map → grid-CEd64Lnh.js.map} +1 -1
  169. package/dist/{highlight-to-react-ClEfL81q.js → highlight-to-react-D0Yav4jk.js} +1 -1
  170. package/dist/{highlight-to-react-ClEfL81q.js.map → highlight-to-react-D0Yav4jk.js.map} +1 -1
  171. package/dist/index.js +69 -69
  172. package/dist/{input-DXYUjGgD.js → input-B2bbijRh.js} +2 -2
  173. package/dist/{input-DXYUjGgD.js.map → input-B2bbijRh.js.map} +1 -1
  174. package/dist/{input-DddtBN-g.js → input-ClB_E4Lb.js} +4 -4
  175. package/dist/{input-DddtBN-g.js.map → input-ClB_E4Lb.js.map} +1 -1
  176. package/dist/{label-QtJxtJ4u.js → label-DUv_urO1.js} +2 -2
  177. package/dist/{label-QtJxtJ4u.js.map → label-DUv_urO1.js.map} +1 -1
  178. package/dist/{layer-card-BME0eljh.js → layer-card-BK7eYfwn.js} +1 -1
  179. package/dist/{layer-card-BME0eljh.js.map → layer-card-BK7eYfwn.js.map} +1 -1
  180. package/dist/layout-DJHMMap2.js +6103 -0
  181. package/dist/layout-DJHMMap2.js.map +1 -0
  182. package/dist/measured-text-BI3dTJmH.js +290 -0
  183. package/dist/measured-text-BI3dTJmH.js.map +1 -0
  184. package/dist/{menubar-C8NzAjfd.js → menubar-Cxf3xeAt.js} +2 -2
  185. package/dist/{menubar-C8NzAjfd.js.map → menubar-Cxf3xeAt.js.map} +1 -1
  186. package/dist/{meter-CpmTenEr.js → meter-BFFe9l5b.js} +1 -1
  187. package/dist/{meter-CpmTenEr.js.map → meter-BFFe9l5b.js.map} +1 -1
  188. package/dist/{pagination-BVqdlONY.js → pagination-yS372Tr4.js} +2 -2
  189. package/dist/{pagination-BVqdlONY.js.map → pagination-yS372Tr4.js.map} +1 -1
  190. package/dist/{popover-BRQZ2b6z.js → popover-SRoJaCZr.js} +1 -1
  191. package/dist/{popover-BRQZ2b6z.js.map → popover-SRoJaCZr.js.map} +1 -1
  192. package/dist/{radio-BNSwOt3B.js → radio-BcwhwYNB.js} +1 -1
  193. package/dist/{radio-BNSwOt3B.js.map → radio-BcwhwYNB.js.map} +1 -1
  194. package/dist/{select-1w2aebGQ.js → select-DMhdoHMa.js} +4 -4
  195. package/dist/{select-1w2aebGQ.js.map → select-DMhdoHMa.js.map} +1 -1
  196. package/dist/{sensitive-input-82Cez3vj.js → sensitive-input-CJUpIRal.js} +3 -3
  197. package/dist/{sensitive-input-82Cez3vj.js.map → sensitive-input-CJUpIRal.js.map} +1 -1
  198. package/dist/{sidebar-CAsCmSpM.js → sidebar-D4zrlYpn.js} +2 -2
  199. package/dist/{sidebar-CAsCmSpM.js.map → sidebar-D4zrlYpn.js.map} +1 -1
  200. package/dist/{signalflare-ai-logo-DDhxMJD6.js → signalflare-ai-logo-Bipogceq.js} +1 -1
  201. package/dist/{signalflare-ai-logo-DDhxMJD6.js.map → signalflare-ai-logo-Bipogceq.js.map} +1 -1
  202. package/dist/{skeleton-line-Do3UmGk9.js → skeleton-line-CH1-h6e2.js} +1 -1
  203. package/dist/{skeleton-line-Do3UmGk9.js.map → skeleton-line-CH1-h6e2.js.map} +1 -1
  204. package/dist/{sparkline-DdbeM4Ai.js → sparkline-DHmgj1d0.js} +2 -2
  205. package/dist/{sparkline-DdbeM4Ai.js.map → sparkline-DHmgj1d0.js.map} +1 -1
  206. package/dist/src/blocks/agent-harness/agent-harness.d.ts.map +1 -1
  207. package/dist/src/blocks/agent-harness/agent-harness.tsx +29 -5
  208. package/dist/src/components/ai-conversation/ai-conversation.d.ts +69 -37
  209. package/dist/src/components/ai-conversation/ai-conversation.d.ts.map +1 -1
  210. package/dist/src/components/ai-conversation/index.d.ts +2 -1
  211. package/dist/src/components/ai-conversation/index.d.ts.map +1 -1
  212. package/dist/src/components/ai-conversation/measurement-constants.d.ts +30 -0
  213. package/dist/src/components/ai-conversation/measurement-constants.d.ts.map +1 -0
  214. package/dist/src/components/ai-info-banner/ai-info-banner.d.ts.map +1 -1
  215. package/dist/src/components/ai-message/ai-message.d.ts +3 -0
  216. package/dist/src/components/ai-message/ai-message.d.ts.map +1 -1
  217. package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts +58 -4
  218. package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -1
  219. package/dist/src/components/ai-prompt-input/controller.d.ts +10 -2
  220. package/dist/src/components/ai-prompt-input/controller.d.ts.map +1 -1
  221. package/dist/src/components/ai-prompt-input/index.d.ts +2 -2
  222. package/dist/src/components/ai-prompt-input/index.d.ts.map +1 -1
  223. package/dist/src/components/ai-prompt-input/types.d.ts +16 -0
  224. package/dist/src/components/ai-prompt-input/types.d.ts.map +1 -1
  225. package/dist/src/components/ai-response/ai-response.d.ts +12 -1
  226. package/dist/src/components/ai-response/ai-response.d.ts.map +1 -1
  227. package/dist/src/components/ai-streaming-text/ai-streaming-text.d.ts +27 -0
  228. package/dist/src/components/ai-streaming-text/ai-streaming-text.d.ts.map +1 -1
  229. package/dist/src/components/ai-streaming-text/index.d.ts +1 -1
  230. package/dist/src/components/ai-streaming-text/index.d.ts.map +1 -1
  231. package/dist/src/components/ai-subagent/ai-subagent.d.ts.map +1 -1
  232. package/dist/src/components/ai-task-list/ai-task-list.d.ts.map +1 -1
  233. package/dist/src/components/ai-tool/ai-tool.d.ts.map +1 -1
  234. package/dist/src/components/banner/banner.d.ts.map +1 -1
  235. package/dist/src/components/empty/empty.d.ts.map +1 -1
  236. package/dist/src/components/stat-card/stat-card.d.ts +5 -0
  237. package/dist/src/components/stat-card/stat-card.d.ts.map +1 -1
  238. package/dist/src/components/text/text.d.ts +35 -1
  239. package/dist/src/components/text/text.d.ts.map +1 -1
  240. package/dist/src/components/tooltip/tooltip.d.ts.map +1 -1
  241. package/dist/src/index.d.ts +3 -3
  242. package/dist/src/index.d.ts.map +1 -1
  243. package/dist/src/utils/index.d.ts +2 -0
  244. package/dist/src/utils/index.d.ts.map +1 -1
  245. package/dist/src/utils/measured-text.d.ts +40 -0
  246. package/dist/src/utils/measured-text.d.ts.map +1 -0
  247. package/dist/src/utils/use-measured-text.d.ts +59 -0
  248. package/dist/src/utils/use-measured-text.d.ts.map +1 -0
  249. package/dist/{stat-card-CEZscNh8.js → stat-card-Ew-ofzEm.js} +28 -10
  250. package/dist/stat-card-Ew-ofzEm.js.map +1 -0
  251. package/dist/styles/sf-binding.css +9 -1
  252. package/dist/styles/sf-standalone.css +2 -2
  253. package/dist/styles/shadcn.css +1 -1
  254. package/dist/styles/theme-fedramp.css +12 -3
  255. package/dist/styles/theme-minimal.css +104 -26
  256. package/dist/styles/theme-sf.css +138 -39
  257. package/dist/styles/theme-vesper.css +91 -0
  258. package/dist/{surface-BduI7Ehl.js → surface-DGwRlC0o.js} +1 -1
  259. package/dist/{surface-BduI7Ehl.js.map → surface-DGwRlC0o.js.map} +1 -1
  260. package/dist/{switch-CzZBRBL7.js → switch-BxAMfHdt.js} +2 -2
  261. package/dist/{switch-CzZBRBL7.js.map → switch-BxAMfHdt.js.map} +1 -1
  262. package/dist/{table-Rv4JMy0B.js → table-BBeAtYVZ.js} +2 -2
  263. package/dist/{table-Rv4JMy0B.js.map → table-BBeAtYVZ.js.map} +1 -1
  264. package/dist/{tabs-1cHrYoel.js → tabs-CeHu7Scn.js} +1 -1
  265. package/dist/{tabs-1cHrYoel.js.map → tabs-CeHu7Scn.js.map} +1 -1
  266. package/dist/{text-KJmGkwnf.js → text-Cqryz7rk.js} +27 -5
  267. package/dist/text-Cqryz7rk.js.map +1 -0
  268. package/dist/{text-roll-BZ3I1umc.js → text-roll-Ch52hcQj.js} +1 -1
  269. package/dist/{text-roll-BZ3I1umc.js.map → text-roll-Ch52hcQj.js.map} +1 -1
  270. package/dist/{theme-toggle-Bhu681D7.js → theme-toggle-LDfIKEqx.js} +3 -3
  271. package/dist/{theme-toggle-Bhu681D7.js.map → theme-toggle-LDfIKEqx.js.map} +1 -1
  272. package/dist/{toast-Nw28a5Cx.js → toast-CaFQNYng.js} +2 -2
  273. package/dist/{toast-Nw28a5Cx.js.map → toast-CaFQNYng.js.map} +1 -1
  274. package/dist/{tooltip-Cb7QW-7H.js → tooltip-g9lFsvcT.js} +8 -2
  275. package/dist/tooltip-g9lFsvcT.js.map +1 -0
  276. package/dist/{use-agent-harness-BMyF8pTq.js → use-agent-harness-BTcNJdw4.js} +1 -1
  277. package/dist/{use-agent-harness-BMyF8pTq.js.map → use-agent-harness-BTcNJdw4.js.map} +1 -1
  278. package/dist/utils.js +2 -1
  279. package/package.json +2 -1
  280. package/scripts/component-registry/index.ts +2 -2
  281. package/scripts/css-build.ts +1 -1
  282. package/scripts/theme-generator/config.ts +27 -141
  283. package/scripts/theme-generator/generate-css.ts +0 -1
  284. package/scripts/theme-generator/index.ts +0 -1
  285. package/dist/ai-conversation-CArP7C8K.js +0 -184
  286. package/dist/ai-conversation-CArP7C8K.js.map +0 -1
  287. package/dist/ai-info-banner-uFxHHwBA.js.map +0 -1
  288. package/dist/ai-message-BjnFznXy.js.map +0 -1
  289. package/dist/ai-prompt-input-Dy1LfxPk.js.map +0 -1
  290. package/dist/ai-response-BEUg3xvd.js.map +0 -1
  291. package/dist/ai-streaming-text-CMfoThV0.js.map +0 -1
  292. package/dist/ai-subagent-DcPRqkAA.js.map +0 -1
  293. package/dist/ai-task-list-Da9zIm00.js.map +0 -1
  294. package/dist/ai-tool-Cn1O4xjP.js.map +0 -1
  295. package/dist/banner-B_6oBrsu.js.map +0 -1
  296. package/dist/empty-D2TypIId.js.map +0 -1
  297. package/dist/stat-card-CEZscNh8.js.map +0 -1
  298. package/dist/styles/theme-blue-tint.css +0 -98
  299. package/dist/text-KJmGkwnf.js.map +0 -1
  300. package/dist/tooltip-Cb7QW-7H.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { t as cn } from "./cn-YROP2_ox.js";
3
- import { t as Tooltip } from "./tooltip-Cb7QW-7H.js";
4
- import { t as Button } from "./button-De0267YU.js";
5
- import { t as InputGroup } from "./input-DddtBN-g.js";
3
+ import { n as layoutWithLines, o as prepareWithSegments } from "./layout-DJHMMap2.js";
4
+ import { t as Tooltip } from "./tooltip-g9lFsvcT.js";
5
+ import { t as Button } from "./button-CO6-qPax.js";
6
6
  import { Fragment, createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
7
7
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
8
8
  import { ArrowUpIcon, ArrowsClockwiseIcon, CaretDownIcon, CheckIcon, FileIcon, FileTextIcon, ImageIcon, MicrophoneIcon, PaperclipIcon, PlusIcon, SpinnerGapIcon, SquareIcon, XIcon } from "@phosphor-icons/react";
@@ -442,7 +442,8 @@ var useStore = (source, selector = (s) => s, compare) => useSelector(source, sel
442
442
  */
443
443
  var DEFAULT_REQUEST = {
444
444
  text: "",
445
- files: []
445
+ files: [],
446
+ tags: []
446
447
  };
447
448
  var DEFAULT_DISPLAY = { sendStatus: "idle" };
448
449
  function createPromptInputRequestController(options = {}) {
@@ -494,13 +495,60 @@ function createPromptInputRequestController(options = {}) {
494
495
  };
495
496
  });
496
497
  },
498
+ addTags(tags) {
499
+ request.setState((prev) => {
500
+ const existing = prev.tags ?? [];
501
+ const incoming = tags.filter((tag) => !existing.some((item) => item.id === tag.id));
502
+ return {
503
+ ...prev,
504
+ tags: [...existing, ...incoming]
505
+ };
506
+ });
507
+ },
508
+ insertTag(tag, range) {
509
+ request.setState((prev) => {
510
+ const mention = tag.mention ?? `@${tag.label.replace(/\s+/g, "-").toLowerCase()}`;
511
+ const text = prev.text ?? "";
512
+ const start = range?.start ?? text.length;
513
+ const end = range?.end ?? text.length;
514
+ const prefix = text.slice(0, start);
515
+ const suffix = text.slice(end);
516
+ const needsPrefixSpace = prefix.length > 0 && !/\s$/.test(prefix);
517
+ const needsSuffixSpace = suffix.length > 0 && !/^\s/.test(suffix);
518
+ const nextText = `${prefix}${needsPrefixSpace ? " " : ""}${mention}${needsSuffixSpace ? " " : ""}${suffix}`;
519
+ const nextTag = {
520
+ ...tag,
521
+ mention
522
+ };
523
+ const existing = prev.tags ?? [];
524
+ const nextTags = existing.some((item) => item.id === tag.id) ? existing.map((item) => item.id === tag.id ? nextTag : item) : [...existing, nextTag];
525
+ return {
526
+ ...prev,
527
+ text: nextText,
528
+ tags: nextTags
529
+ };
530
+ });
531
+ },
532
+ removeTag(id) {
533
+ request.setState((prev) => ({
534
+ ...prev,
535
+ tags: (prev.tags ?? []).filter((tag) => tag.id !== id)
536
+ }));
537
+ },
538
+ clearTags() {
539
+ request.setState((prev) => ({
540
+ ...prev,
541
+ tags: []
542
+ }));
543
+ },
497
544
  resetRequest() {
498
545
  request.setState((prev) => {
499
546
  for (const f of prev.files) if (f.url.startsWith("blob:")) URL.revokeObjectURL(f.url);
500
547
  return {
501
548
  ...prev,
502
549
  text: "",
503
- files: []
550
+ files: [],
551
+ tags: []
504
552
  };
505
553
  });
506
554
  },
@@ -698,9 +746,10 @@ function makeAttachmentId() {
698
746
  * </PromptInput>
699
747
  * ```
700
748
  */
701
- var PromptInput = ({ className, accept, multiple, globalDrop, maxFiles, maxFileSize, onError, onSubmit, children, backLayer, backLayerTitle = "Context", backLayerOpen, onBackLayerOpenChange, autoOpenBackLayerWhen, ...props }) => {
749
+ function PromptInput({ className, accept, multiple, globalDrop, maxFiles, maxFileSize, onError, onSubmit, children, backLayer, backLayerTitle = "Context", backLayerStatus = "idle", backLayerOpen, onBackLayerOpenChange, autoOpenBackLayerWhen, ...props }) {
702
750
  const hasBackLayer = backLayer !== void 0;
703
751
  const controller = useOptionalPromptInputController();
752
+ const requestCtrl = useOptionalPromptInputRequestController();
704
753
  const usingProvider = !!controller;
705
754
  const inputRef = useRef(null);
706
755
  const anchorRef = useRef(null);
@@ -714,6 +763,7 @@ var PromptInput = ({ className, accept, multiple, globalDrop, maxFiles, maxFileS
714
763
  }, [autoOpenBackLayerWhen, onBackLayerOpenChange]);
715
764
  const [items, setItems] = useState([]);
716
765
  const files = usingProvider ? controller.attachments.files : items;
766
+ const tags = useStore(requestCtrl?.request ?? FALLBACK_REQUEST_STORE, (state) => state.tags ?? []);
717
767
  const openFileDialogLocal = useCallback(() => {
718
768
  inputRef.current?.click();
719
769
  }, []);
@@ -837,7 +887,7 @@ var PromptInput = ({ className, accept, multiple, globalDrop, maxFiles, maxFileS
837
887
  const handleSubmit = (event) => {
838
888
  event.preventDefault();
839
889
  const form = event.currentTarget;
840
- const text = usingProvider ? controller.textInput.value : new FormData(form).get("message") || "";
890
+ const text = requestCtrl ? requestCtrl.request.state.text : usingProvider ? controller.textInput.value : new FormData(form).get("message") || "";
841
891
  if (!usingProvider) form.reset();
842
892
  const doSubmit = async () => {
843
893
  const convertedFiles = await Promise.all(files.map(async (item) => {
@@ -850,10 +900,14 @@ var PromptInput = ({ className, accept, multiple, globalDrop, maxFiles, maxFileS
850
900
  try {
851
901
  await onSubmit({
852
902
  text,
853
- files: convertedFiles
903
+ files: convertedFiles,
904
+ tags
854
905
  }, event);
855
- clear();
856
- if (usingProvider) controller.textInput.clear();
906
+ if (requestCtrl) requestCtrl.resetRequest();
907
+ else {
908
+ clear();
909
+ if (usingProvider) controller.textInput.clear();
910
+ }
857
911
  } catch {}
858
912
  };
859
913
  doSubmit().catch(() => {});
@@ -868,9 +922,19 @@ var PromptInput = ({ className, accept, multiple, globalDrop, maxFiles, maxFileS
868
922
  className: "flex w-full items-center justify-between gap-2 px-3 py-2 text-left",
869
923
  onClick: () => onBackLayerOpenChange?.(!isBackLayerOpen),
870
924
  type: "button",
871
- children: [/* @__PURE__ */ jsx("span", {
872
- className: "text-sm font-medium text-sf-subtle uppercase tracking-wide select-none",
873
- children: backLayerTitle
925
+ children: [/* @__PURE__ */ jsxs("span", {
926
+ className: "flex items-center gap-1.5 text-sm font-medium text-sf-subtle uppercase tracking-wide select-none",
927
+ children: [
928
+ backLayerStatus === "running" ? /* @__PURE__ */ jsx(SpinnerGapIcon, {
929
+ className: "size-3.5 animate-spin",
930
+ "aria-hidden": "true"
931
+ }) : null,
932
+ backLayerStatus === "error" ? /* @__PURE__ */ jsx(XIcon, {
933
+ className: "size-3.5 text-sf-danger",
934
+ "aria-hidden": "true"
935
+ }) : null,
936
+ backLayerTitle
937
+ ]
874
938
  }), /* @__PURE__ */ jsx(CaretDownIcon, { className: cn("size-3.5 text-sf-subtle transition-transform duration-200", isBackLayerOpen && "rotate-180") })]
875
939
  }),
876
940
  /* @__PURE__ */ jsx(PromptInputBackLayerPanel, {
@@ -878,11 +942,14 @@ var PromptInput = ({ className, accept, multiple, globalDrop, maxFiles, maxFileS
878
942
  children: backLayer
879
943
  }),
880
944
  /* @__PURE__ */ jsx("div", {
881
- className: "flex flex-col overflow-hidden rounded-xl bg-sf-base ring ring-sf-line/50 focus-within:ring-sf-ring",
945
+ className: "flex flex-col overflow-visible rounded-xl bg-sf-base ring ring-sf-line/50 focus-within:ring-sf-ring",
882
946
  children
883
947
  })
884
948
  ]
885
- }) : /* @__PURE__ */ jsx(InputGroup, { children });
949
+ }) : /* @__PURE__ */ jsx("div", {
950
+ className: "flex w-full flex-col items-stretch overflow-visible rounded-xl border-0 bg-sf-base shadow-xs ring ring-sf-line focus-within:ring-sf-ring",
951
+ children
952
+ });
886
953
  const inner = /* @__PURE__ */ jsxs(Fragment$1, { children: [
887
954
  /* @__PURE__ */ jsx("span", {
888
955
  "aria-hidden": "true",
@@ -909,7 +976,7 @@ var PromptInput = ({ className, accept, multiple, globalDrop, maxFiles, maxFileS
909
976
  value: ctx,
910
977
  children: inner
911
978
  });
912
- };
979
+ }
913
980
  var PromptInputBody = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
914
981
  className: cn("contents", className),
915
982
  ...props
@@ -970,6 +1037,8 @@ var handleTextareaKeyDown = (e) => {
970
1037
  */
971
1038
  var PromptInputTextarea = ({ onChange, className, placeholder = "What would you like to know?", ...props }) => {
972
1039
  const controller = useOptionalPromptInputController();
1040
+ const requestCtrl = useOptionalPromptInputRequestController();
1041
+ const requestText = useStore(requestCtrl?.request ?? FALLBACK_REQUEST_STORE, (state) => typeof state.text === "string" ? state.text : "");
973
1042
  const attachments = usePromptInputAttachments();
974
1043
  const handlePaste = (event) => {
975
1044
  const items = event.clipboardData?.items;
@@ -984,7 +1053,13 @@ var PromptInputTextarea = ({ onChange, className, placeholder = "What would you
984
1053
  attachments.add(pastedFiles);
985
1054
  }
986
1055
  };
987
- const controlledProps = controller ? {
1056
+ const controlledProps = requestCtrl ? {
1057
+ value: requestText,
1058
+ onChange: (e) => {
1059
+ requestCtrl.setRequestField("text", e.currentTarget.value);
1060
+ onChange?.(e);
1061
+ }
1062
+ } : controller ? {
988
1063
  value: controller.textInput.value,
989
1064
  onChange: (e) => {
990
1065
  controller.textInput.setInput(e.currentTarget.value);
@@ -992,7 +1067,7 @@ var PromptInputTextarea = ({ onChange, className, placeholder = "What would you
992
1067
  }
993
1068
  } : { onChange };
994
1069
  return /* @__PURE__ */ jsx("textarea", {
995
- className: cn("field-sizing-content max-h-48 min-h-16 w-full resize-none border-0 bg-transparent px-3 py-2 text-sm text-sf-default outline-none placeholder:text-sf-inactive", className),
1070
+ className: cn("field-sizing-content max-h-48 min-h-16 w-full resize-none border-0 bg-transparent px-3 pt-3 pb-1 text-sm text-sf-default outline-none placeholder:text-sf-inactive", className),
996
1071
  name: "message",
997
1072
  onKeyDown: handleTextareaKeyDown,
998
1073
  onPaste: handlePaste,
@@ -1002,12 +1077,276 @@ var PromptInputTextarea = ({ onChange, className, placeholder = "What would you
1002
1077
  ...controlledProps
1003
1078
  });
1004
1079
  };
1080
+ var getTagMention = (tag) => tag.mention ?? `@${tag.label.replace(/\s+/g, "-").toLowerCase()}`;
1081
+ var findMentionAtCursor = (text, cursor) => {
1082
+ const beforeCursor = text.slice(0, cursor);
1083
+ const match = /(^|\s)@([\w-]*)$/.exec(beforeCursor);
1084
+ if (!match) return null;
1085
+ return {
1086
+ start: cursor - match[0].trimStart().length,
1087
+ end: cursor,
1088
+ query: match[2] ?? ""
1089
+ };
1090
+ };
1091
+ var renderInlineReferenceText = (text, tags) => {
1092
+ if (text.length === 0) return null;
1093
+ const mentions = tags.map((tag) => ({
1094
+ tag,
1095
+ mention: getTagMention(tag)
1096
+ })).filter((item) => item.mention.length > 0).sort((a, b) => b.mention.length - a.mention.length);
1097
+ const parts = [];
1098
+ let index = 0;
1099
+ while (index < text.length) {
1100
+ let match;
1101
+ for (const mention of mentions) if (text.startsWith(mention.mention, index)) {
1102
+ match = mention;
1103
+ break;
1104
+ }
1105
+ if (match) {
1106
+ parts.push(/* @__PURE__ */ jsx("span", {
1107
+ className: "rounded-md bg-sf-tint font-medium text-sf-strong ring-1 ring-sf-line",
1108
+ children: match.mention
1109
+ }, `${match.tag.id}-${index}`));
1110
+ index += match.mention.length;
1111
+ continue;
1112
+ }
1113
+ parts.push(text[index]);
1114
+ index += 1;
1115
+ }
1116
+ return parts;
1117
+ };
1118
+ var getTextareaCursorPosition = (textarea, wrapper) => {
1119
+ if (!wrapper) return {
1120
+ left: 12,
1121
+ top: 0
1122
+ };
1123
+ const computed = window.getComputedStyle(textarea);
1124
+ const wrapperRect = wrapper.getBoundingClientRect();
1125
+ const paddingLeft = parseFloat(computed.paddingLeft) || 0;
1126
+ const paddingTop = parseFloat(computed.paddingTop) || 0;
1127
+ const contentWidth = Math.max(1, textarea.clientWidth - paddingLeft - (parseFloat(computed.paddingRight) || 0));
1128
+ const lineHeightPx = parseFloat(computed.lineHeight) || 20;
1129
+ const font = computed.font || `${computed.fontStyle} ${computed.fontWeight} ${computed.fontSize} ${computed.fontFamily}`;
1130
+ const result = layoutWithLines(prepareWithSegments(textarea.value.slice(0, textarea.selectionStart), font, { whiteSpace: "pre-wrap" }), contentWidth, lineHeightPx);
1131
+ const lineCount = result.lines.length || 1;
1132
+ const lastLine = result.lines[result.lines.length - 1];
1133
+ const lastLineWidth = lastLine ? lastLine.width : 0;
1134
+ const top = (lineCount - 1) * lineHeightPx + paddingTop + textarea.offsetTop - 6;
1135
+ return {
1136
+ left: Math.min(Math.max(lastLineWidth + paddingLeft + textarea.offsetLeft, 12), Math.max(wrapperRect.width - 300, 12)),
1137
+ top
1138
+ };
1139
+ };
1140
+ var PromptInputReferencePicker = ({ activeIndex, onSelect, options, style }) => /* @__PURE__ */ jsxs("div", {
1141
+ className: "absolute z-50 w-72 -translate-y-full overflow-hidden rounded-lg bg-sf-elevated p-1 shadow-lg ring ring-sf-line",
1142
+ style,
1143
+ children: [/* @__PURE__ */ jsx("div", {
1144
+ className: "px-2 py-1.5 text-xs font-medium text-sf-subtle",
1145
+ children: "References"
1146
+ }), /* @__PURE__ */ jsx("div", {
1147
+ className: "max-h-56 overflow-y-auto",
1148
+ children: options.map((tag, index) => /* @__PURE__ */ jsxs("button", {
1149
+ "aria-selected": index === activeIndex,
1150
+ className: cn("flex w-full items-start gap-2 rounded-md px-2 py-2 text-left text-sm text-sf-default hover:bg-sf-tint aria-selected:bg-sf-tint", index === activeIndex && "bg-sf-tint"),
1151
+ onMouseDown: (event) => {
1152
+ event.preventDefault();
1153
+ onSelect(tag);
1154
+ },
1155
+ role: "option",
1156
+ type: "button",
1157
+ children: [
1158
+ tag.icon && /* @__PURE__ */ jsx("span", {
1159
+ className: "mt-0.5 shrink-0",
1160
+ children: tag.icon
1161
+ }),
1162
+ /* @__PURE__ */ jsxs("span", {
1163
+ className: "min-w-0 flex-1",
1164
+ children: [/* @__PURE__ */ jsx("span", {
1165
+ className: "block truncate font-medium",
1166
+ children: tag.label
1167
+ }), tag.description && /* @__PURE__ */ jsx("span", {
1168
+ className: "block truncate text-xs text-sf-subtle",
1169
+ children: tag.description
1170
+ })]
1171
+ }),
1172
+ /* @__PURE__ */ jsx("span", {
1173
+ className: "shrink-0 text-xs text-sf-subtle",
1174
+ children: getTagMention(tag)
1175
+ })
1176
+ ]
1177
+ }, tag.id))
1178
+ })]
1179
+ });
1180
+ var PromptInputEditor = ({ className, placeholder = "What would you like to know?", onReferenceSearch, references, onChange, onKeyDown, style, ...props }) => {
1181
+ const controller = useOptionalPromptInputController();
1182
+ const requestCtrl = useOptionalPromptInputRequestController();
1183
+ const textareaRef = useRef(null);
1184
+ const wrapperRef = useRef(null);
1185
+ const [mention, setMention] = useState(null);
1186
+ const [options, setOptions] = useState([]);
1187
+ const [activeIndex, setActiveIndex] = useState(0);
1188
+ const [pickerPosition, setPickerPosition] = useState({
1189
+ left: 12,
1190
+ top: 0
1191
+ });
1192
+ const requestText = useStore(requestCtrl?.request ?? FALLBACK_REQUEST_STORE, (state) => typeof state.text === "string" ? state.text : "");
1193
+ const tags = useStore(requestCtrl?.request ?? FALLBACK_REQUEST_STORE, (state) => Array.isArray(state.tags) ? state.tags : []);
1194
+ const attachments = usePromptInputAttachments();
1195
+ const value = requestCtrl ? requestText : controller?.textInput.value ?? "";
1196
+ const updateMention = useCallback((textarea) => {
1197
+ const nextMention = findMentionAtCursor(textarea.value, textarea.selectionStart);
1198
+ if (nextMention) setPickerPosition(getTextareaCursorPosition(textarea, wrapperRef.current));
1199
+ setMention((current) => {
1200
+ if (!(current || nextMention)) return current;
1201
+ if (current && nextMention && current.start === nextMention.start && current.end === nextMention.end && current.query === nextMention.query) return current;
1202
+ return nextMention;
1203
+ });
1204
+ }, []);
1205
+ useEffect(() => {
1206
+ let cancelled = false;
1207
+ if (!mention) {
1208
+ setOptions([]);
1209
+ return;
1210
+ }
1211
+ const load = async () => {
1212
+ const result = onReferenceSearch ? await onReferenceSearch({
1213
+ trigger: "@",
1214
+ query: mention.query
1215
+ }) : (references ?? []).filter((tag) => tag.label.toLowerCase().includes(mention.query.toLowerCase()));
1216
+ if (!cancelled) {
1217
+ setOptions(result);
1218
+ setActiveIndex((index) => index < result.length ? index : 0);
1219
+ }
1220
+ };
1221
+ load().catch(() => {
1222
+ if (!cancelled) setOptions([]);
1223
+ });
1224
+ return () => {
1225
+ cancelled = true;
1226
+ };
1227
+ }, [
1228
+ mention,
1229
+ onReferenceSearch,
1230
+ references
1231
+ ]);
1232
+ const insertReference = useCallback((tag) => {
1233
+ if (!(requestCtrl && mention)) return;
1234
+ const mentionText = getTagMention(tag);
1235
+ requestCtrl.insertTag({
1236
+ ...tag,
1237
+ mention: mentionText
1238
+ }, mention);
1239
+ setMention(null);
1240
+ setOptions([]);
1241
+ requestAnimationFrame(() => {
1242
+ const textarea = textareaRef.current;
1243
+ if (!textarea) return;
1244
+ const cursor = mention.start + mentionText.length + 1;
1245
+ textarea.focus();
1246
+ textarea.setSelectionRange(cursor, cursor);
1247
+ });
1248
+ }, [mention, requestCtrl]);
1249
+ const handlePaste = (event) => {
1250
+ const items = event.clipboardData?.items;
1251
+ if (!items) return;
1252
+ const pastedFiles = [];
1253
+ for (const item of items) if (item.kind === "file") {
1254
+ const file = item.getAsFile();
1255
+ if (file) pastedFiles.push(file);
1256
+ }
1257
+ if (pastedFiles.length > 0) {
1258
+ event.preventDefault();
1259
+ attachments.add(pastedFiles);
1260
+ }
1261
+ };
1262
+ const handleKeyDown = (event) => {
1263
+ if (mention && options.length > 0) {
1264
+ if (event.key === "ArrowDown") {
1265
+ event.preventDefault();
1266
+ setActiveIndex((index) => (index + 1) % options.length);
1267
+ return;
1268
+ }
1269
+ if (event.key === "ArrowUp") {
1270
+ event.preventDefault();
1271
+ setActiveIndex((index) => (index - 1 + options.length) % options.length);
1272
+ return;
1273
+ }
1274
+ if (event.key === "Enter" || event.key === "Tab") {
1275
+ event.preventDefault();
1276
+ insertReference(options[activeIndex]);
1277
+ return;
1278
+ }
1279
+ if (event.key === "Escape") {
1280
+ event.preventDefault();
1281
+ setMention(null);
1282
+ setOptions([]);
1283
+ return;
1284
+ }
1285
+ }
1286
+ handleTextareaKeyDown(event);
1287
+ onKeyDown?.(event);
1288
+ };
1289
+ const handleChange = (event) => {
1290
+ if (requestCtrl) requestCtrl.setRequestField("text", event.currentTarget.value);
1291
+ else if (controller) controller.textInput.setInput(event.currentTarget.value);
1292
+ updateMention(event.currentTarget);
1293
+ onChange?.(event);
1294
+ };
1295
+ const showPicker = mention && options.length > 0;
1296
+ return /* @__PURE__ */ jsxs("div", {
1297
+ className: "relative",
1298
+ ref: wrapperRef,
1299
+ children: [
1300
+ /* @__PURE__ */ jsx("div", {
1301
+ "aria-hidden": "true",
1302
+ className: cn("pointer-events-none field-sizing-content max-h-48 min-h-16 w-full overflow-hidden whitespace-pre-wrap break-words px-3 pt-3 pb-1 text-sm text-sf-default", value.length === 0 && "text-transparent"),
1303
+ children: renderInlineReferenceText(value, tags)
1304
+ }),
1305
+ /* @__PURE__ */ jsx("textarea", {
1306
+ className: cn("absolute inset-0 field-sizing-content max-h-48 min-h-16 w-full resize-none border-0 bg-transparent px-3 pt-3 pb-1 text-sm text-transparent outline-none placeholder:text-sf-inactive", className),
1307
+ name: "message",
1308
+ onChange: handleChange,
1309
+ onClick: (event) => updateMention(event.currentTarget),
1310
+ onKeyDown: handleKeyDown,
1311
+ onKeyUp: (event) => {
1312
+ if ([
1313
+ "ArrowDown",
1314
+ "ArrowUp",
1315
+ "Enter",
1316
+ "Tab",
1317
+ "Escape"
1318
+ ].includes(event.key)) return;
1319
+ updateMention(event.currentTarget);
1320
+ },
1321
+ onPaste: handlePaste,
1322
+ placeholder,
1323
+ ref: textareaRef,
1324
+ rows: 1,
1325
+ style: {
1326
+ caretColor: "var(--text-color-sf-default)",
1327
+ ...style
1328
+ },
1329
+ value,
1330
+ ...props
1331
+ }),
1332
+ showPicker && /* @__PURE__ */ jsx(PromptInputReferencePicker, {
1333
+ activeIndex,
1334
+ onSelect: insertReference,
1335
+ options,
1336
+ style: {
1337
+ left: pickerPosition.left,
1338
+ top: pickerPosition.top
1339
+ }
1340
+ })
1341
+ ]
1342
+ });
1343
+ };
1005
1344
  var PromptInputToolbar = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
1006
- className: cn("flex min-w-0 items-center justify-between gap-1 px-2 py-1.5", className),
1345
+ className: cn("grid grid-cols-[minmax(0,1fr)_auto] items-end gap-2 px-2.5 pt-1 pb-2", className),
1007
1346
  ...props
1008
1347
  });
1009
1348
  var PromptInputTools = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
1010
- className: cn("flex min-w-0 items-center gap-1", className),
1349
+ className: cn("flex min-w-0 flex-wrap items-center gap-1", className),
1011
1350
  ...props
1012
1351
  });
1013
1352
  var PromptInputButton = ({ variant = "ghost", size = "sm", className, ...props }) => /* @__PURE__ */ jsx(Button, {
@@ -1032,7 +1371,7 @@ var PromptInputSubmit = ({ className, variant = "primary", size = "sm", status =
1032
1371
  else Icon = /* @__PURE__ */ jsx(ArrowUpIcon, { className: "size-4" });
1033
1372
  return /* @__PURE__ */ jsx(Button, {
1034
1373
  "aria-label": "Submit",
1035
- className: cn(className),
1374
+ className: cn("size-8 shrink-0 justify-center rounded-lg p-0", className),
1036
1375
  size,
1037
1376
  type: "submit",
1038
1377
  variant,
@@ -1435,17 +1774,107 @@ function PromptInputAttachments({ className, children, ...props }) {
1435
1774
  if (attachments.files.length === 0) return null;
1436
1775
  return /* @__PURE__ */ jsx("div", {
1437
1776
  "aria-live": "polite",
1438
- className: cn("overflow-hidden px-2 transition-[height] duration-200 ease-out", className),
1777
+ className: cn("overflow-hidden px-2.5 transition-[height] duration-200 ease-out", className),
1439
1778
  style: { height: attachments.files.length ? height : 0 },
1440
1779
  ...props,
1441
1780
  children: /* @__PURE__ */ jsx("div", {
1442
- className: "flex flex-wrap gap-2 py-1",
1781
+ className: "flex flex-wrap gap-2 pt-2 pb-1",
1443
1782
  ref: contentRef,
1444
1783
  children: attachments.files.map((file) => /* @__PURE__ */ jsx(Fragment, { children: children(file) }, file.id))
1445
1784
  })
1446
1785
  });
1447
1786
  }
1448
1787
  /**
1788
+ * Single reference chip for prompt tags. Includes a remove button when mounted
1789
+ * inside a PromptInputRequestControllerProvider.
1790
+ */
1791
+ function PromptInputTag({ data, className, ...props }) {
1792
+ const requestCtrl = useOptionalPromptInputRequestController();
1793
+ const handleRemove = useCallback(() => {
1794
+ requestCtrl?.removeTag(data.id);
1795
+ }, [requestCtrl, data.id]);
1796
+ const chip = /* @__PURE__ */ jsxs("div", {
1797
+ className: cn("group inline-flex h-8 items-center gap-2 rounded-md border border-sf-info/30 bg-sf-info-tint px-2 text-sm text-sf-default", className),
1798
+ ...props,
1799
+ children: [
1800
+ data.icon && /* @__PURE__ */ jsx("div", {
1801
+ className: "flex size-4 shrink-0 items-center justify-center",
1802
+ children: data.icon
1803
+ }),
1804
+ /* @__PURE__ */ jsx("span", {
1805
+ className: "max-w-[180px] truncate font-medium",
1806
+ children: data.label
1807
+ }),
1808
+ requestCtrl && /* @__PURE__ */ jsx(Button, {
1809
+ "aria-label": "Remove tag",
1810
+ className: "ml-0.5 size-4 shrink-0 rounded-full p-0 opacity-0 transition-opacity group-hover:opacity-100",
1811
+ onClick: handleRemove,
1812
+ size: "sm",
1813
+ type: "button",
1814
+ variant: "ghost",
1815
+ children: /* @__PURE__ */ jsx(XIcon, { className: "size-3" })
1816
+ })
1817
+ ]
1818
+ });
1819
+ if (!data.description) return chip;
1820
+ return /* @__PURE__ */ jsx(Tooltip, {
1821
+ content: data.description,
1822
+ children: chip
1823
+ });
1824
+ }
1825
+ /**
1826
+ * Renders all prompt tags using a render prop. Hidden when no tags.
1827
+ * Animates height as tags are added/removed.
1828
+ */
1829
+ function PromptInputTags({ className, children, ...props }) {
1830
+ const tags = useStore(useOptionalPromptInputRequestController()?.request ?? FALLBACK_REQUEST_STORE, (state) => state.tags ?? []);
1831
+ const [height, setHeight] = useState(0);
1832
+ const contentRef = useRef(null);
1833
+ useLayoutEffect(() => {
1834
+ const el = contentRef.current;
1835
+ if (!el) return;
1836
+ const ro = new ResizeObserver(() => {
1837
+ setHeight(el.getBoundingClientRect().height);
1838
+ });
1839
+ ro.observe(el);
1840
+ setHeight(el.getBoundingClientRect().height);
1841
+ return () => ro.disconnect();
1842
+ }, []);
1843
+ useLayoutEffect(() => {
1844
+ const el = contentRef.current;
1845
+ if (el) setHeight(el.getBoundingClientRect().height);
1846
+ }, [tags.length]);
1847
+ if (tags.length === 0) return null;
1848
+ return /* @__PURE__ */ jsx("div", {
1849
+ "aria-live": "polite",
1850
+ className: cn("overflow-hidden px-2.5 transition-[height] duration-200 ease-out", className),
1851
+ style: { height: tags.length ? height : 0 },
1852
+ ...props,
1853
+ children: /* @__PURE__ */ jsx("div", {
1854
+ className: "flex flex-wrap gap-2 pt-2 pb-1",
1855
+ ref: contentRef,
1856
+ children: tags.map((tag) => /* @__PURE__ */ jsx(Fragment, { children: children(tag) }, tag.id))
1857
+ })
1858
+ });
1859
+ }
1860
+ /**
1861
+ * Toolbar trigger for opening a consumer-owned tag picker.
1862
+ */
1863
+ function PromptInputAddTagButton({ children, onClick, onOpenPicker, ...props }) {
1864
+ return /* @__PURE__ */ jsx(Button, {
1865
+ "aria-label": "Add tag",
1866
+ onClick: (event) => {
1867
+ onOpenPicker?.();
1868
+ onClick?.(event);
1869
+ },
1870
+ size: "sm",
1871
+ type: "button",
1872
+ variant: "ghost",
1873
+ ...props,
1874
+ children: children ?? /* @__PURE__ */ jsx(PlusIcon, { className: "size-4" })
1875
+ });
1876
+ }
1877
+ /**
1449
1878
  * Voice input button. Uses the Web Speech API (Chrome/Edge). Hidden on unsupported browsers.
1450
1879
  * Pulses while listening.
1451
1880
  */
@@ -1535,7 +1964,20 @@ var PromptInputAttachButton = ({ "aria-label": ariaLabel = "Attach file", classN
1535
1964
  })
1536
1965
  });
1537
1966
  };
1967
+ PromptInput.BackLayer = PromptInputBackLayer;
1968
+ PromptInput.Textarea = PromptInputTextarea;
1969
+ PromptInput.Editor = PromptInputEditor;
1970
+ PromptInput.Toolbar = PromptInputToolbar;
1971
+ PromptInput.Tools = PromptInputTools;
1972
+ PromptInput.Submit = PromptInputSubmit;
1973
+ PromptInput.ModeSelector = PromptInputModeSelector;
1974
+ PromptInput.AddTagButton = PromptInputAddTagButton;
1975
+ PromptInput.Tags = PromptInputTags;
1976
+ PromptInput.Tag = PromptInputTag;
1977
+ PromptInput.AttachButton = PromptInputAttachButton;
1978
+ PromptInput.Attachments = PromptInputAttachments;
1979
+ PromptInput.Attachment = PromptInputAttachment;
1538
1980
  //#endregion
1539
- export { useProviderAttachments as A, PromptInputTextarea as C, SF_AI_PROMPT_INPUT_VARIANTS as D, SF_AI_PROMPT_INPUT_DEFAULT_VARIANTS as E, usePromptInputRequestController as F, useRequestField as I, useSetRequestField as L, createPromptInputRequestController as M, useDisplayField as N, usePromptInputAttachments as O, useOptionalPromptInputRequestController as P, PromptInputSubmit as S, PromptInputTools as T, PromptInputModeSelector as _, PromptInputActionMenuItem as a, PromptInputProvider as b, PromptInputAttachment as c, PromptInputBody as d, PromptInputButton as f, PromptInputModeSelect as g, PromptInputModeCycle as h, PromptInputActionMenuContent as i, PromptInputRequestControllerProvider as j, usePromptInputController as k, PromptInputAttachments as l, PromptInputCompactSelect as m, PromptInputActionAddAttachments as n, PromptInputActionMenuTrigger as o, PromptInputCompactCycle as p, PromptInputActionMenu as r, PromptInputAttachButton as s, PromptInput as t, PromptInputBackLayer as u, PromptInputModelCycle as v, PromptInputToolbar as w, PromptInputSpeechButton as x, PromptInputModelSelect as y };
1981
+ export { SF_AI_PROMPT_INPUT_DEFAULT_VARIANTS as A, useRequestField as B, PromptInputSpeechButton as C, PromptInputTextarea as D, PromptInputTags as E, PromptInputRequestControllerProvider as F, createPromptInputRequestController as I, useDisplayField as L, usePromptInputAttachments as M, usePromptInputController as N, PromptInputToolbar as O, useProviderAttachments as P, useOptionalPromptInputRequestController as R, PromptInputProvider as S, PromptInputTag as T, useSetRequestField as V, PromptInputModeCycle as _, PromptInputActionMenuItem as a, PromptInputModelCycle as b, PromptInputAttachButton as c, PromptInputBackLayer as d, PromptInputBody as f, PromptInputEditor as g, PromptInputCompactSelect as h, PromptInputActionMenuContent as i, SF_AI_PROMPT_INPUT_VARIANTS as j, PromptInputTools as k, PromptInputAttachment as l, PromptInputCompactCycle as m, PromptInputActionAddAttachments as n, PromptInputActionMenuTrigger as o, PromptInputButton as p, PromptInputActionMenu as r, PromptInputAddTagButton as s, PromptInput as t, PromptInputAttachments as u, PromptInputModeSelect as v, PromptInputSubmit as w, PromptInputModelSelect as x, PromptInputModeSelector as y, usePromptInputRequestController as z };
1540
1982
 
1541
- //# sourceMappingURL=ai-prompt-input-Dy1LfxPk.js.map
1983
+ //# sourceMappingURL=ai-prompt-input-BVvov_KF.js.map