@baishuyun/chat-sdk 0.0.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (469) hide show
  1. package/.storybook/main.ts +21 -0
  2. package/.storybook/preview-head.html +1 -0
  3. package/.storybook/preview.ts +16 -0
  4. package/.turbo/turbo-build.log +82 -0
  5. package/components.json +22 -0
  6. package/dist/chat-sdk.js +55613 -0
  7. package/dist/chat-sdk.js.map +1 -0
  8. package/dist/chat-sdk.umd.cjs +661 -0
  9. package/dist/chat-sdk.umd.cjs.map +1 -0
  10. package/dist/chat.d.ts +5 -0
  11. package/dist/chat.d.ts.map +1 -0
  12. package/dist/components/biz-comp/FakeBotMsg.d.ts +7 -0
  13. package/dist/components/biz-comp/FakeBotMsg.d.ts.map +1 -0
  14. package/dist/components/biz-comp/FieldChecker.d.ts +16 -0
  15. package/dist/components/biz-comp/FieldChecker.d.ts.map +1 -0
  16. package/dist/components/biz-comp/FieldCheckerListMsg.d.ts +12 -0
  17. package/dist/components/biz-comp/FieldCheckerListMsg.d.ts.map +1 -0
  18. package/dist/components/biz-comp/FieldValueChecker.d.ts +14 -0
  19. package/dist/components/biz-comp/FieldValueChecker.d.ts.map +1 -0
  20. package/dist/components/biz-comp/SubformFieldsValueChecker.d.ts +20 -0
  21. package/dist/components/biz-comp/SubformFieldsValueChecker.d.ts.map +1 -0
  22. package/dist/components/biz-comp/chat-client.d.ts +13 -0
  23. package/dist/components/biz-comp/chat-client.d.ts.map +1 -0
  24. package/dist/components/biz-comp/chat-frame.d.ts +6 -0
  25. package/dist/components/biz-comp/chat-frame.d.ts.map +1 -0
  26. package/dist/components/biz-comp/conversation.d.ts +10 -0
  27. package/dist/components/biz-comp/conversation.d.ts.map +1 -0
  28. package/dist/components/biz-comp/dock-btn.d.ts +2 -0
  29. package/dist/components/biz-comp/dock-btn.d.ts.map +1 -0
  30. package/dist/components/biz-comp/field-icon.d.ts +5 -0
  31. package/dist/components/biz-comp/field-icon.d.ts.map +1 -0
  32. package/dist/components/biz-comp/markdown-part.d.ts +5 -0
  33. package/dist/components/biz-comp/markdown-part.d.ts.map +1 -0
  34. package/dist/components/biz-comp/markdown.d.ts +5 -0
  35. package/dist/components/biz-comp/markdown.d.ts.map +1 -0
  36. package/dist/components/biz-comp/message-content.d.ts +6 -0
  37. package/dist/components/biz-comp/message-content.d.ts.map +1 -0
  38. package/dist/components/biz-comp/messages.d.ts +3 -0
  39. package/dist/components/biz-comp/messages.d.ts.map +1 -0
  40. package/dist/components/biz-comp/multi-modal-input/attachment-btn.d.ts +9 -0
  41. package/dist/components/biz-comp/multi-modal-input/attachment-btn.d.ts.map +1 -0
  42. package/dist/components/biz-comp/multi-modal-input/clear-btn.d.ts +7 -0
  43. package/dist/components/biz-comp/multi-modal-input/clear-btn.d.ts.map +1 -0
  44. package/dist/components/biz-comp/multi-modal-input/index.d.ts +21 -0
  45. package/dist/components/biz-comp/multi-modal-input/index.d.ts.map +1 -0
  46. package/dist/components/biz-comp/multi-modal-input/preview-attachment.d.ts +12 -0
  47. package/dist/components/biz-comp/multi-modal-input/preview-attachment.d.ts.map +1 -0
  48. package/dist/components/biz-comp/multi-modal-input/prompt-input.d.ts +35 -0
  49. package/dist/components/biz-comp/multi-modal-input/prompt-input.d.ts.map +1 -0
  50. package/dist/components/biz-comp/opening-lines.d.ts +3 -0
  51. package/dist/components/biz-comp/opening-lines.d.ts.map +1 -0
  52. package/dist/components/biz-comp/preview-message-wrapper.d.ts +9 -0
  53. package/dist/components/biz-comp/preview-message-wrapper.d.ts.map +1 -0
  54. package/dist/components/biz-comp/preview-message.d.ts +11 -0
  55. package/dist/components/biz-comp/preview-message.d.ts.map +1 -0
  56. package/dist/components/biz-comp/response.d.ts +6 -0
  57. package/dist/components/biz-comp/response.d.ts.map +1 -0
  58. package/dist/components/biz-comp/suggestions.d.ts +7 -0
  59. package/dist/components/biz-comp/suggestions.d.ts.map +1 -0
  60. package/dist/components/bs-ui/abs-fullscreen-gradient-bg.d.ts +9 -0
  61. package/dist/components/bs-ui/abs-fullscreen-gradient-bg.d.ts.map +1 -0
  62. package/dist/components/bs-ui/attachments-previewer.d.ts +15 -0
  63. package/dist/components/bs-ui/attachments-previewer.d.ts.map +1 -0
  64. package/dist/components/bs-ui/border-color-animation.d.ts +9 -0
  65. package/dist/components/bs-ui/border-color-animation.d.ts.map +1 -0
  66. package/dist/components/bs-ui/bot-avatar-name.d.ts +6 -0
  67. package/dist/components/bs-ui/bot-avatar-name.d.ts.map +1 -0
  68. package/dist/components/bs-ui/bot-icon.d.ts +5 -0
  69. package/dist/components/bs-ui/bot-icon.d.ts.map +1 -0
  70. package/dist/components/bs-ui/bs-icons.d.ts +39 -0
  71. package/dist/components/bs-ui/bs-icons.d.ts.map +1 -0
  72. package/dist/components/bs-ui/card.d.ts +10 -0
  73. package/dist/components/bs-ui/card.d.ts.map +1 -0
  74. package/dist/components/bs-ui/chat-area-header.d.ts +9 -0
  75. package/dist/components/bs-ui/chat-area-header.d.ts.map +1 -0
  76. package/dist/components/bs-ui/collapsible-txt-msg.d.ts +10 -0
  77. package/dist/components/bs-ui/collapsible-txt-msg.d.ts.map +1 -0
  78. package/dist/components/bs-ui/confirm-dialog.d.ts +26 -0
  79. package/dist/components/bs-ui/confirm-dialog.d.ts.map +1 -0
  80. package/dist/components/bs-ui/fields-generating-indicator.d.ts +2 -0
  81. package/dist/components/bs-ui/fields-generating-indicator.d.ts.map +1 -0
  82. package/dist/components/bs-ui/fields-portal.d.ts +8 -0
  83. package/dist/components/bs-ui/fields-portal.d.ts.map +1 -0
  84. package/dist/components/bs-ui/fields-previewer.d.ts +12 -0
  85. package/dist/components/bs-ui/fields-previewer.d.ts.map +1 -0
  86. package/dist/components/bs-ui/font-icon.d.ts +6 -0
  87. package/dist/components/bs-ui/font-icon.d.ts.map +1 -0
  88. package/dist/components/bs-ui/form-info-editor.d.ts +37 -0
  89. package/dist/components/bs-ui/form-info-editor.d.ts.map +1 -0
  90. package/dist/components/bs-ui/generate-animation.d.ts +4 -0
  91. package/dist/components/bs-ui/generate-animation.d.ts.map +1 -0
  92. package/dist/components/bs-ui/icon-btn.d.ts +7 -0
  93. package/dist/components/bs-ui/icon-btn.d.ts.map +1 -0
  94. package/dist/components/bs-ui/line-checker.d.ts +15 -0
  95. package/dist/components/bs-ui/line-checker.d.ts.map +1 -0
  96. package/dist/components/bs-ui/linear-gradient-border-btn.d.ts +10 -0
  97. package/dist/components/bs-ui/linear-gradient-border-btn.d.ts.map +1 -0
  98. package/dist/components/bs-ui/linear-gradient-color-bg-animation.d.ts +8 -0
  99. package/dist/components/bs-ui/linear-gradient-color-bg-animation.d.ts.map +1 -0
  100. package/dist/components/bs-ui/option-item.d.ts +9 -0
  101. package/dist/components/bs-ui/option-item.d.ts.map +1 -0
  102. package/dist/components/bs-ui/previewer-header.d.ts +13 -0
  103. package/dist/components/bs-ui/previewer-header.d.ts.map +1 -0
  104. package/dist/components/bs-ui/primary-confirm-btn.d.ts +7 -0
  105. package/dist/components/bs-ui/primary-confirm-btn.d.ts.map +1 -0
  106. package/dist/components/bs-ui/primary-entry-btn.d.ts +9 -0
  107. package/dist/components/bs-ui/primary-entry-btn.d.ts.map +1 -0
  108. package/dist/components/bs-ui/tab-radio-group.d.ts +16 -0
  109. package/dist/components/bs-ui/tab-radio-group.d.ts.map +1 -0
  110. package/dist/components/bs-ui/tooltip.d.ts +5 -0
  111. package/dist/components/bs-ui/tooltip.d.ts.map +1 -0
  112. package/dist/components/bs-ui/user-txt-msg-bubble.d.ts +6 -0
  113. package/dist/components/bs-ui/user-txt-msg-bubble.d.ts.map +1 -0
  114. package/dist/components/ui/badge.d.ts +10 -0
  115. package/dist/components/ui/badge.d.ts.map +1 -0
  116. package/dist/components/ui/button.d.ts +12 -0
  117. package/dist/components/ui/button.d.ts.map +1 -0
  118. package/dist/components/ui/card.d.ts +9 -0
  119. package/dist/components/ui/card.d.ts.map +1 -0
  120. package/dist/components/ui/checkbox.d.ts +5 -0
  121. package/dist/components/ui/checkbox.d.ts.map +1 -0
  122. package/dist/components/ui/collapsible.d.ts +6 -0
  123. package/dist/components/ui/collapsible.d.ts.map +1 -0
  124. package/dist/components/ui/dialog.d.ts +24 -0
  125. package/dist/components/ui/dialog.d.ts.map +1 -0
  126. package/dist/components/ui/dropdown-menu.d.ts +28 -0
  127. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  128. package/dist/components/ui/icons.d.ts +176 -0
  129. package/dist/components/ui/icons.d.ts.map +1 -0
  130. package/dist/components/ui/input-group.d.ts +17 -0
  131. package/dist/components/ui/input-group.d.ts.map +1 -0
  132. package/dist/components/ui/input.d.ts +4 -0
  133. package/dist/components/ui/input.d.ts.map +1 -0
  134. package/dist/components/ui/label.d.ts +6 -0
  135. package/dist/components/ui/label.d.ts.map +1 -0
  136. package/dist/components/ui/one-time-click-btn.d.ts +4 -0
  137. package/dist/components/ui/one-time-click-btn.d.ts.map +1 -0
  138. package/dist/components/ui/select.d.ts +14 -0
  139. package/dist/components/ui/select.d.ts.map +1 -0
  140. package/dist/components/ui/spinner.d.ts +3 -0
  141. package/dist/components/ui/spinner.d.ts.map +1 -0
  142. package/dist/components/ui/tabs.d.ts +8 -0
  143. package/dist/components/ui/tabs.d.ts.map +1 -0
  144. package/dist/components/ui/textarea.d.ts +4 -0
  145. package/dist/components/ui/textarea.d.ts.map +1 -0
  146. package/dist/components/ui/tooltip.d.ts +8 -0
  147. package/dist/components/ui/tooltip.d.ts.map +1 -0
  148. package/dist/components/web-comp/fields-previewer-web-component.d.ts +61 -0
  149. package/dist/components/web-comp/fields-previewer-web-component.d.ts.map +1 -0
  150. package/dist/const/index.d.ts +4 -0
  151. package/dist/const/index.d.ts.map +1 -0
  152. package/dist/const/ui.d.ts +4 -0
  153. package/dist/const/ui.d.ts.map +1 -0
  154. package/dist/hooks/use-evt-bus.d.ts +2 -0
  155. package/dist/hooks/use-evt-bus.d.ts.map +1 -0
  156. package/dist/hooks/use-evt.d.ts +3 -0
  157. package/dist/hooks/use-evt.d.ts.map +1 -0
  158. package/dist/hooks/use-frame-mode.d.ts +5 -0
  159. package/dist/hooks/use-frame-mode.d.ts.map +1 -0
  160. package/dist/hooks/use-plugin-component.d.ts +5 -0
  161. package/dist/hooks/use-plugin-component.d.ts.map +1 -0
  162. package/dist/hooks/use-plugin-ctx.d.ts +3 -0
  163. package/dist/hooks/use-plugin-ctx.d.ts.map +1 -0
  164. package/dist/hooks/use-plugin-custom-components.d.ts +4 -0
  165. package/dist/hooks/use-plugin-custom-components.d.ts.map +1 -0
  166. package/dist/hooks/use-plugin-life-cycle-chain-runner.d.ts +5 -0
  167. package/dist/hooks/use-plugin-life-cycle-chain-runner.d.ts.map +1 -0
  168. package/dist/hooks/use-plugin-list.d.ts +2 -0
  169. package/dist/hooks/use-plugin-list.d.ts.map +1 -0
  170. package/dist/hooks/use-plugin.d.ts +2 -0
  171. package/dist/hooks/use-plugin.d.ts.map +1 -0
  172. package/dist/hooks/use-shadow.d.ts +25 -0
  173. package/dist/hooks/use-shadow.d.ts.map +1 -0
  174. package/dist/index.css +1 -0
  175. package/dist/index.d.ts +6 -0
  176. package/dist/index.d.ts.map +1 -0
  177. package/dist/lib/event-emitter.d.ts +39 -0
  178. package/dist/lib/event-emitter.d.ts.map +1 -0
  179. package/dist/lib/utils.d.ts +30 -0
  180. package/dist/lib/utils.d.ts.map +1 -0
  181. package/dist/plugins/form-builder-base-plugin/const.d.ts +3 -0
  182. package/dist/plugins/form-builder-base-plugin/const.d.ts.map +1 -0
  183. package/dist/plugins/form-builder-base-plugin/index.d.ts +7 -0
  184. package/dist/plugins/form-builder-base-plugin/index.d.ts.map +1 -0
  185. package/dist/plugins/form-builder-base-plugin/types.d.ts +12 -0
  186. package/dist/plugins/form-builder-base-plugin/types.d.ts.map +1 -0
  187. package/dist/plugins/form-filling-plugin/components/FormFillingOpeningLines.d.ts +2 -0
  188. package/dist/plugins/form-filling-plugin/components/FormFillingOpeningLines.d.ts.map +1 -0
  189. package/dist/plugins/form-filling-plugin/components/avatar.d.ts +5 -0
  190. package/dist/plugins/form-filling-plugin/components/avatar.d.ts.map +1 -0
  191. package/dist/plugins/form-filling-plugin/components/entry-btn.d.ts +3 -0
  192. package/dist/plugins/form-filling-plugin/components/entry-btn.d.ts.map +1 -0
  193. package/dist/plugins/form-filling-plugin/components/msg-part.d.ts +3 -0
  194. package/dist/plugins/form-filling-plugin/components/msg-part.d.ts.map +1 -0
  195. package/dist/plugins/form-filling-plugin/const.d.ts +612 -0
  196. package/dist/plugins/form-filling-plugin/const.d.ts.map +1 -0
  197. package/dist/plugins/form-filling-plugin/index.d.ts +13 -0
  198. package/dist/plugins/form-filling-plugin/index.d.ts.map +1 -0
  199. package/dist/plugins/form-filling-plugin/types.d.ts +8 -0
  200. package/dist/plugins/form-filling-plugin/types.d.ts.map +1 -0
  201. package/dist/plugins/form-filling-plugin/utils.d.ts +4 -0
  202. package/dist/plugins/form-filling-plugin/utils.d.ts.map +1 -0
  203. package/dist/plugins/general-model-form-builder-plugin/components/confirmer.d.ts +9 -0
  204. package/dist/plugins/general-model-form-builder-plugin/components/confirmer.d.ts.map +1 -0
  205. package/dist/plugins/general-model-form-builder-plugin/components/ghost-evt-dispatcher.d.ts +10 -0
  206. package/dist/plugins/general-model-form-builder-plugin/components/ghost-evt-dispatcher.d.ts.map +1 -0
  207. package/dist/plugins/general-model-form-builder-plugin/components/msg-part.d.ts +3 -0
  208. package/dist/plugins/general-model-form-builder-plugin/components/msg-part.d.ts.map +1 -0
  209. package/dist/plugins/general-model-form-builder-plugin/components/new-confirmer.d.ts +10 -0
  210. package/dist/plugins/general-model-form-builder-plugin/components/new-confirmer.d.ts.map +1 -0
  211. package/dist/plugins/general-model-form-builder-plugin/const.d.ts +3 -0
  212. package/dist/plugins/general-model-form-builder-plugin/const.d.ts.map +1 -0
  213. package/dist/plugins/general-model-form-builder-plugin/index.d.ts +9 -0
  214. package/dist/plugins/general-model-form-builder-plugin/index.d.ts.map +1 -0
  215. package/dist/plugins/general-model-form-builder-plugin/types.d.ts +3 -0
  216. package/dist/plugins/general-model-form-builder-plugin/types.d.ts.map +1 -0
  217. package/dist/plugins/mcp-form-builder-plugin/components/create-form-confirm.d.ts +7 -0
  218. package/dist/plugins/mcp-form-builder-plugin/components/create-form-confirm.d.ts.map +1 -0
  219. package/dist/plugins/mcp-form-builder-plugin/components/entry-btn.d.ts +3 -0
  220. package/dist/plugins/mcp-form-builder-plugin/components/entry-btn.d.ts.map +1 -0
  221. package/dist/plugins/mcp-form-builder-plugin/components/follow-up.d.ts +3 -0
  222. package/dist/plugins/mcp-form-builder-plugin/components/follow-up.d.ts.map +1 -0
  223. package/dist/plugins/mcp-form-builder-plugin/components/msg-part.d.ts +3 -0
  224. package/dist/plugins/mcp-form-builder-plugin/components/msg-part.d.ts.map +1 -0
  225. package/dist/plugins/mcp-form-builder-plugin/const/index.d.ts +12 -0
  226. package/dist/plugins/mcp-form-builder-plugin/const/index.d.ts.map +1 -0
  227. package/dist/plugins/mcp-form-builder-plugin/hooks/index.d.ts +1 -0
  228. package/dist/plugins/mcp-form-builder-plugin/hooks/index.d.ts.map +1 -0
  229. package/dist/plugins/mcp-form-builder-plugin/hooks/use-fields-confirmed.d.ts +2 -0
  230. package/dist/plugins/mcp-form-builder-plugin/hooks/use-fields-confirmed.d.ts.map +1 -0
  231. package/dist/plugins/mcp-form-builder-plugin/index.d.ts +23 -0
  232. package/dist/plugins/mcp-form-builder-plugin/index.d.ts.map +1 -0
  233. package/dist/plugins/mcp-form-builder-plugin/types.d.ts +17 -0
  234. package/dist/plugins/mcp-form-builder-plugin/types.d.ts.map +1 -0
  235. package/dist/plugins/mcp-form-builder-plugin/utils/index.d.ts +51 -0
  236. package/dist/plugins/mcp-form-builder-plugin/utils/index.d.ts.map +1 -0
  237. package/dist/sdk.impl.d.ts +21 -0
  238. package/dist/sdk.impl.d.ts.map +1 -0
  239. package/dist/store/context.d.ts +12 -0
  240. package/dist/store/context.d.ts.map +1 -0
  241. package/dist/store/index.d.ts +13 -0
  242. package/dist/store/index.d.ts.map +1 -0
  243. package/dist/stories/AbsFullscreenGradientBg.stories.d.ts +17 -0
  244. package/dist/stories/AbsFullscreenGradientBg.stories.d.ts.map +1 -0
  245. package/dist/stories/AttachmentsPreviewer.stories.d.ts +16 -0
  246. package/dist/stories/AttachmentsPreviewer.stories.d.ts.map +1 -0
  247. package/dist/stories/BorderColorAnimation.stories.d.ts +24 -0
  248. package/dist/stories/BorderColorAnimation.stories.d.ts.map +1 -0
  249. package/dist/stories/BotAvatarAndName.stories.d.ts +18 -0
  250. package/dist/stories/BotAvatarAndName.stories.d.ts.map +1 -0
  251. package/dist/stories/BotIcon.stories.d.ts +17 -0
  252. package/dist/stories/BotIcon.stories.d.ts.map +1 -0
  253. package/dist/stories/BsTooltip.stories.d.ts +7 -0
  254. package/dist/stories/BsTooltip.stories.d.ts.map +1 -0
  255. package/dist/stories/Card.stories.d.ts +14 -0
  256. package/dist/stories/Card.stories.d.ts.map +1 -0
  257. package/dist/stories/ChatAreaHeader.stories.d.ts +14 -0
  258. package/dist/stories/ChatAreaHeader.stories.d.ts.map +1 -0
  259. package/dist/stories/CollapsibleTextMsg.stories.d.ts +16 -0
  260. package/dist/stories/CollapsibleTextMsg.stories.d.ts.map +1 -0
  261. package/dist/stories/ConfirmDialog.stories.d.ts +61 -0
  262. package/dist/stories/ConfirmDialog.stories.d.ts.map +1 -0
  263. package/dist/stories/FormInfoEditor.stories.d.ts +15 -0
  264. package/dist/stories/FormInfoEditor.stories.d.ts.map +1 -0
  265. package/dist/stories/GenerateAnimation.stories.d.ts +16 -0
  266. package/dist/stories/GenerateAnimation.stories.d.ts.map +1 -0
  267. package/dist/stories/IconBtn.stories.d.ts +14 -0
  268. package/dist/stories/IconBtn.stories.d.ts.map +1 -0
  269. package/dist/stories/IconLib.d.ts +12 -0
  270. package/dist/stories/IconLib.d.ts.map +1 -0
  271. package/dist/stories/Icons.stories.d.ts +24 -0
  272. package/dist/stories/Icons.stories.d.ts.map +1 -0
  273. package/dist/stories/LineChecker.stories.d.ts +23 -0
  274. package/dist/stories/LineChecker.stories.d.ts.map +1 -0
  275. package/dist/stories/LinearGradientBorderBtn.stories.d.ts +22 -0
  276. package/dist/stories/LinearGradientBorderBtn.stories.d.ts.map +1 -0
  277. package/dist/stories/LinearGradientColorBgAnimation.stories.d.ts +23 -0
  278. package/dist/stories/LinearGradientColorBgAnimation.stories.d.ts.map +1 -0
  279. package/dist/stories/OptionItem.stories.d.ts +20 -0
  280. package/dist/stories/OptionItem.stories.d.ts.map +1 -0
  281. package/dist/stories/PreviewerHeader.stories.d.ts +9 -0
  282. package/dist/stories/PreviewerHeader.stories.d.ts.map +1 -0
  283. package/dist/stories/PrimaryConfirmBtn.stories.d.ts +16 -0
  284. package/dist/stories/PrimaryConfirmBtn.stories.d.ts.map +1 -0
  285. package/dist/stories/PrimaryEntryBtn.stories.d.ts +26 -0
  286. package/dist/stories/PrimaryEntryBtn.stories.d.ts.map +1 -0
  287. package/dist/stories/TabRadioGroup.stories.d.ts +18 -0
  288. package/dist/stories/TabRadioGroup.stories.d.ts.map +1 -0
  289. package/dist/stories/UserTextMsgBubble.stories.d.ts +14 -0
  290. package/dist/stories/UserTextMsgBubble.stories.d.ts.map +1 -0
  291. package/dist/stories/fields-generating.stories.d.ts +14 -0
  292. package/dist/stories/fields-generating.stories.d.ts.map +1 -0
  293. package/dist/stories/fields-previewer.stories.d.ts +18 -0
  294. package/dist/stories/fields-previewer.stories.d.ts.map +1 -0
  295. package/package.json +76 -0
  296. package/scripts/inline-style-inject.ts +36 -0
  297. package/src/chat.tsx +56 -0
  298. package/src/components/biz-comp/FakeBotMsg.tsx +52 -0
  299. package/src/components/biz-comp/FieldChecker.tsx +114 -0
  300. package/src/components/biz-comp/FieldCheckerListMsg.tsx +34 -0
  301. package/src/components/biz-comp/FieldValueChecker.tsx +98 -0
  302. package/src/components/biz-comp/SubformFieldsValueChecker.tsx +166 -0
  303. package/src/components/biz-comp/chat-client.tsx +206 -0
  304. package/src/components/biz-comp/chat-frame.tsx +25 -0
  305. package/src/components/biz-comp/conversation.tsx +70 -0
  306. package/src/components/biz-comp/dock-btn.tsx +52 -0
  307. package/src/components/biz-comp/field-icon.tsx +8 -0
  308. package/src/components/biz-comp/markdown-part.tsx +48 -0
  309. package/src/components/biz-comp/markdown.tsx +36 -0
  310. package/src/components/biz-comp/message-content.tsx +21 -0
  311. package/src/components/biz-comp/messages.tsx +42 -0
  312. package/src/components/biz-comp/multi-modal-input/attachment-btn.tsx +30 -0
  313. package/src/components/biz-comp/multi-modal-input/clear-btn.tsx +42 -0
  314. package/src/components/biz-comp/multi-modal-input/index.tsx +422 -0
  315. package/src/components/biz-comp/multi-modal-input/preview-attachment.tsx +72 -0
  316. package/src/components/biz-comp/multi-modal-input/prompt-input.tsx +260 -0
  317. package/src/components/biz-comp/opening-lines.tsx +34 -0
  318. package/src/components/biz-comp/preview-message-wrapper.tsx +55 -0
  319. package/src/components/biz-comp/preview-message.tsx +91 -0
  320. package/src/components/biz-comp/response.tsx +23 -0
  321. package/src/components/biz-comp/suggestions.tsx +78 -0
  322. package/src/components/bs-ui/abs-fullscreen-gradient-bg.tsx +34 -0
  323. package/src/components/bs-ui/attachments-previewer.tsx +229 -0
  324. package/src/components/bs-ui/border-color-animation.tsx +58 -0
  325. package/src/components/bs-ui/bot-avatar-name.tsx +25 -0
  326. package/src/components/bs-ui/bot-icon.tsx +23 -0
  327. package/src/components/bs-ui/bs-icons.tsx +801 -0
  328. package/src/components/bs-ui/card.tsx +37 -0
  329. package/src/components/bs-ui/chat-area-header.tsx +41 -0
  330. package/src/components/bs-ui/collapsible-txt-msg.tsx +50 -0
  331. package/src/components/bs-ui/confirm-dialog.tsx +128 -0
  332. package/src/components/bs-ui/fields-generating-indicator.tsx +50 -0
  333. package/src/components/bs-ui/fields-portal.tsx +18 -0
  334. package/src/components/bs-ui/fields-previewer.tsx +109 -0
  335. package/src/components/bs-ui/font-icon.tsx +17 -0
  336. package/src/components/bs-ui/form-info-editor.tsx +286 -0
  337. package/src/components/bs-ui/generate-animation.tsx +54 -0
  338. package/src/components/bs-ui/icon-btn.tsx +31 -0
  339. package/src/components/bs-ui/line-checker.tsx +129 -0
  340. package/src/components/bs-ui/linear-gradient-border-btn.tsx +48 -0
  341. package/src/components/bs-ui/linear-gradient-color-bg-animation.tsx +103 -0
  342. package/src/components/bs-ui/option-item.tsx +28 -0
  343. package/src/components/bs-ui/previewer-header.tsx +134 -0
  344. package/src/components/bs-ui/primary-confirm-btn.tsx +46 -0
  345. package/src/components/bs-ui/primary-entry-btn.tsx +37 -0
  346. package/src/components/bs-ui/tab-radio-group.tsx +73 -0
  347. package/src/components/bs-ui/tooltip.tsx +18 -0
  348. package/src/components/bs-ui/user-txt-msg-bubble.tsx +19 -0
  349. package/src/components/ui/badge.tsx +36 -0
  350. package/src/components/ui/button.tsx +51 -0
  351. package/src/components/ui/card.tsx +76 -0
  352. package/src/components/ui/checkbox.tsx +29 -0
  353. package/src/components/ui/collapsible.tsx +9 -0
  354. package/src/components/ui/dialog.tsx +104 -0
  355. package/src/components/ui/dropdown-menu.tsx +199 -0
  356. package/src/components/ui/icons.tsx +1288 -0
  357. package/src/components/ui/input-group.tsx +172 -0
  358. package/src/components/ui/input.tsx +22 -0
  359. package/src/components/ui/label.tsx +24 -0
  360. package/src/components/ui/one-time-click-btn.tsx +32 -0
  361. package/src/components/ui/select.tsx +157 -0
  362. package/src/components/ui/spinner.tsx +17 -0
  363. package/src/components/ui/tabs.tsx +53 -0
  364. package/src/components/ui/textarea.tsx +22 -0
  365. package/src/components/ui/tooltip.tsx +34 -0
  366. package/src/components/web-comp/fields-previewer-web-component.ts +259 -0
  367. package/src/const/index.ts +61 -0
  368. package/src/const/ui.ts +7 -0
  369. package/src/global.d.ts +1 -0
  370. package/src/hooks/use-evt-bus.ts +11 -0
  371. package/src/hooks/use-evt.ts +17 -0
  372. package/src/hooks/use-frame-mode.ts +13 -0
  373. package/src/hooks/use-plugin-component.ts +12 -0
  374. package/src/hooks/use-plugin-ctx.ts +12 -0
  375. package/src/hooks/use-plugin-custom-components.ts +31 -0
  376. package/src/hooks/use-plugin-life-cycle-chain-runner.ts +26 -0
  377. package/src/hooks/use-plugin-list.ts +11 -0
  378. package/src/hooks/use-plugin.ts +11 -0
  379. package/src/hooks/use-shadow.ts +128 -0
  380. package/src/index.tsx +10 -0
  381. package/src/lib/event-emitter.ts +93 -0
  382. package/src/lib/utils.ts +222 -0
  383. package/src/plugins/form-builder-base-plugin/const.ts +27 -0
  384. package/src/plugins/form-builder-base-plugin/index.ts +45 -0
  385. package/src/plugins/form-builder-base-plugin/types.ts +13 -0
  386. package/src/plugins/form-filling-plugin/components/FormFillingOpeningLines.tsx +3 -0
  387. package/src/plugins/form-filling-plugin/components/avatar.tsx +14 -0
  388. package/src/plugins/form-filling-plugin/components/entry-btn.tsx +15 -0
  389. package/src/plugins/form-filling-plugin/components/msg-part.tsx +90 -0
  390. package/src/plugins/form-filling-plugin/const.ts +595 -0
  391. package/src/plugins/form-filling-plugin/index.ts +135 -0
  392. package/src/plugins/form-filling-plugin/types.ts +11 -0
  393. package/src/plugins/form-filling-plugin/utils.ts +63 -0
  394. package/src/plugins/general-model-form-builder-plugin/components/confirmer.tsx +90 -0
  395. package/src/plugins/general-model-form-builder-plugin/components/ghost-evt-dispatcher.tsx +69 -0
  396. package/src/plugins/general-model-form-builder-plugin/components/msg-part.tsx +147 -0
  397. package/src/plugins/general-model-form-builder-plugin/components/new-confirmer.tsx +191 -0
  398. package/src/plugins/general-model-form-builder-plugin/const.ts +3 -0
  399. package/src/plugins/general-model-form-builder-plugin/index.ts +20 -0
  400. package/src/plugins/general-model-form-builder-plugin/types.ts +1 -0
  401. package/src/plugins/mcp-form-builder-plugin/components/create-form-confirm.tsx +126 -0
  402. package/src/plugins/mcp-form-builder-plugin/components/entry-btn.tsx +9 -0
  403. package/src/plugins/mcp-form-builder-plugin/components/follow-up.tsx +15 -0
  404. package/src/plugins/mcp-form-builder-plugin/components/msg-part.tsx +135 -0
  405. package/src/plugins/mcp-form-builder-plugin/const/index.ts +13 -0
  406. package/src/plugins/mcp-form-builder-plugin/hooks/index.ts +0 -0
  407. package/src/plugins/mcp-form-builder-plugin/hooks/use-fields-confirmed.ts +12 -0
  408. package/src/plugins/mcp-form-builder-plugin/index.ts +225 -0
  409. package/src/plugins/mcp-form-builder-plugin/types.ts +21 -0
  410. package/src/plugins/mcp-form-builder-plugin/utils/index.ts +450 -0
  411. package/src/sdk.impl.tsx +108 -0
  412. package/src/store/context.tsx +22 -0
  413. package/src/store/index.ts +53 -0
  414. package/src/stories/AbsFullscreenGradientBg.stories.tsx +36 -0
  415. package/src/stories/AttachmentsPreviewer.stories.tsx +188 -0
  416. package/src/stories/BorderColorAnimation.stories.tsx +60 -0
  417. package/src/stories/BotAvatarAndName.stories.ts +24 -0
  418. package/src/stories/BotIcon.stories.ts +22 -0
  419. package/src/stories/BsTooltip.stories.tsx +32 -0
  420. package/src/stories/Card.stories.tsx +28 -0
  421. package/src/stories/ChatAreaHeader.stories.ts +26 -0
  422. package/src/stories/CollapsibleTextMsg.stories.ts +44 -0
  423. package/src/stories/ConfirmDialog.stories.tsx +123 -0
  424. package/src/stories/FormInfoEditor.stories.tsx +183 -0
  425. package/src/stories/GenerateAnimation.stories.ts +20 -0
  426. package/src/stories/IconBtn.stories.tsx +26 -0
  427. package/src/stories/IconLib.tsx +47 -0
  428. package/src/stories/Icons.stories.ts +22 -0
  429. package/src/stories/LineChecker.stories.tsx +134 -0
  430. package/src/stories/LinearGradientBorderBtn.stories.tsx +86 -0
  431. package/src/stories/LinearGradientColorBgAnimation.stories.tsx +60 -0
  432. package/src/stories/OptionItem.stories.tsx +77 -0
  433. package/src/stories/PreviewerHeader.stories.tsx +45 -0
  434. package/src/stories/PrimaryConfirmBtn.stories.ts +37 -0
  435. package/src/stories/PrimaryEntryBtn.stories.tsx +74 -0
  436. package/src/stories/TabRadioGroup.stories.tsx +84 -0
  437. package/src/stories/UserTextMsgBubble.stories.ts +24 -0
  438. package/src/stories/assets/accessibility.png +0 -0
  439. package/src/stories/assets/accessibility.svg +1 -0
  440. package/src/stories/assets/addon-library.png +0 -0
  441. package/src/stories/assets/assets.png +0 -0
  442. package/src/stories/assets/avif-test-image.avif +0 -0
  443. package/src/stories/assets/context.png +0 -0
  444. package/src/stories/assets/demo.css +539 -0
  445. package/src/stories/assets/demo_index.html +7988 -0
  446. package/src/stories/assets/discord.svg +1 -0
  447. package/src/stories/assets/docs.png +0 -0
  448. package/src/stories/assets/figma-plugin.png +0 -0
  449. package/src/stories/assets/github.svg +1 -0
  450. package/src/stories/assets/iconfont.css +1377 -0
  451. package/src/stories/assets/iconfont.eot +0 -0
  452. package/src/stories/assets/iconfont.json +2382 -0
  453. package/src/stories/assets/iconfont.svg +697 -0
  454. package/src/stories/assets/iconfont.ttf +0 -0
  455. package/src/stories/assets/iconfont.woff +0 -0
  456. package/src/stories/assets/iconfont.woff2 +0 -0
  457. package/src/stories/assets/share.png +0 -0
  458. package/src/stories/assets/styling.png +0 -0
  459. package/src/stories/assets/testing.png +0 -0
  460. package/src/stories/assets/theming.png +0 -0
  461. package/src/stories/assets/tutorials.svg +1 -0
  462. package/src/stories/assets/youtube.svg +1 -0
  463. package/src/stories/fields-generating.stories.tsx +22 -0
  464. package/src/stories/fields-previewer.stories.tsx +67 -0
  465. package/src/style.css +172 -0
  466. package/stats.html +4949 -0
  467. package/tailwind.config.js +49 -0
  468. package/tsconfig.json +13 -0
  469. package/vite.config.ts +38 -0
@@ -0,0 +1,48 @@
1
+ import { MsgPartCompProps } from "@baishuyun/types";
2
+ import { MessageContent } from "./message-content";
3
+ import { cn, sanitizeText } from "@/lib/utils";
4
+ import { MemoizedMarkdown } from "./markdown";
5
+ import { UserTextMsgBubble } from "../bs-ui/user-txt-msg-bubble";
6
+ import { CollapsibleTxtMsg } from "../bs-ui/collapsible-txt-msg";
7
+ import { AnalysisIcon } from "../bs-ui/bs-icons";
8
+ import { UIDataTypes, UIMessagePart, UITools } from "ai";
9
+
10
+ export const MarkdownMsgpart = (
11
+ props: MsgPartCompProps & { children?: React.ReactNode },
12
+ ) => {
13
+ const { part: p, role, id } = props;
14
+
15
+ const part = p as UIMessagePart<UIDataTypes, UITools>;
16
+
17
+ if (part.type !== "text" || !part.text) {
18
+ return null;
19
+ }
20
+
21
+ const typoCls = cn({
22
+ prose: role === "assistant",
23
+ });
24
+
25
+ if (role === "user") {
26
+ return <UserTextMsgBubble>{part.text}</UserTextMsgBubble>
27
+ }
28
+
29
+ return (
30
+ <div>
31
+ <MessageContent
32
+ className={cn({
33
+ // "w-fit wrap-break-words rounded-2 px-3 py-2 text-right text-white":
34
+ // role === "user",
35
+ "bg-transparent px-0 py-0 text-left": role === "assistant",
36
+ })}
37
+ data-testid="message-content"
38
+ >
39
+ <CollapsibleTxtMsg title="表单设计" icon={<AnalysisIcon />} defaultOpen>
40
+ <article className={typoCls}>
41
+ <MemoizedMarkdown id={id} content={sanitizeText(part.text)} />
42
+ </article>
43
+ </CollapsibleTxtMsg>
44
+ {props.children}
45
+ </MessageContent>
46
+ </div>
47
+ );
48
+ };
@@ -0,0 +1,36 @@
1
+ import { marked } from "marked";
2
+ import { memo, useMemo } from "react";
3
+ import ReactMarkdown from "react-markdown";
4
+
5
+ function parseMarkdownIntoBlocks(markdown: string): string[] {
6
+ const tokens = marked.lexer(markdown);
7
+ return tokens.map((token) => token.raw);
8
+ }
9
+
10
+ const MemoizedMarkdownBlock = memo(
11
+ ({ content }: { content: string }) => {
12
+ return <ReactMarkdown>{content}</ReactMarkdown>;
13
+ },
14
+ (prevProps, nextProps) => {
15
+ if (prevProps.content !== nextProps.content) return false;
16
+ return true;
17
+ },
18
+ );
19
+
20
+ MemoizedMarkdownBlock.displayName = "MemoizedMarkdownBlock";
21
+
22
+ export const MemoizedMarkdown = memo(
23
+ ({ content, id }: { content: string; id: string }) => {
24
+ // 【确认搭建】
25
+
26
+ // content = content.replace(/【确?认?搭?建?.*】?/g, "");
27
+
28
+ const blocks = useMemo(() => parseMarkdownIntoBlocks(content), [content]);
29
+
30
+ return blocks.map((block, index) => (
31
+ <MemoizedMarkdownBlock content={block} key={`${id}-block_${index}`} />
32
+ ));
33
+ },
34
+ );
35
+
36
+ MemoizedMarkdown.displayName = "MemoizedMarkdown";
@@ -0,0 +1,21 @@
1
+ import cn from 'classnames';
2
+ import { HTMLAttributes } from 'react';
3
+
4
+ export type MessageContentProps = HTMLAttributes<HTMLDivElement> & {
5
+ compact?: boolean;
6
+ };
7
+
8
+ export const MessageContent = ({ children, className, ...props }: MessageContentProps) => (
9
+ <div
10
+ className={cn(
11
+ 'flex flex-col gap-[10px] overflow-hidden p-0 text-foreground text-sm',
12
+ 'group-[.is-user]:bg-primary group-[.is-user]:text-primary-foreground',
13
+ 'group-[.is-assistant]:bg-secondary group-[.is-assistant]:text-foreground',
14
+ 'is-user:dark overflow-visible',
15
+ className
16
+ )}
17
+ {...props}
18
+ >
19
+ {children}
20
+ </div>
21
+ );
@@ -0,0 +1,42 @@
1
+ import { useRef } from "react";
2
+ import { MessagesProps } from "@baishuyun/types";
3
+ import { Conversation, ConversationContent } from "./conversation";
4
+ import { PreviewMessage } from "./preview-message";
5
+ import { FakeBotMessage } from "./FakeBotMsg";
6
+ import { OpeningLines } from "./opening-lines";
7
+
8
+ export const Messages = (props: MessagesProps) => {
9
+ const messagesContainerRef = useRef<HTMLDivElement>(null);
10
+
11
+ const { messages, setMessages, addToolOutput, sendMessage } = props;
12
+
13
+ return (
14
+ <div
15
+ className="overscroll-behavior-contain -webkit-overflow-scrolling-touch flex-1 touch-pan-y overflow-y-scroll m-h-0 h-full"
16
+ ref={messagesContainerRef}
17
+ style={{ overflowAnchor: "none", overscrollBehavior: "contain" }}
18
+ >
19
+ <Conversation className="mx-auto flex min-w-0 max-w-4xl flex-col">
20
+ <ConversationContent className="flex flex-col px-2 py-4 md:px-4 gap-[40px]">
21
+ {messages.length === 0 && (
22
+ <FakeBotMessage>
23
+ <OpeningLines sendMessage={sendMessage} />
24
+ </FakeBotMessage>
25
+ )}
26
+ {messages.map((message, index) => (
27
+ <PreviewMessage
28
+ isLoading={
29
+ props.status === "streaming" && messages.length - 1 === index
30
+ }
31
+ key={message.id}
32
+ addToolOutput={addToolOutput}
33
+ sendMessage={props.sendMessage}
34
+ message={message}
35
+ setMessages={setMessages}
36
+ />
37
+ ))}
38
+ </ConversationContent>
39
+ </Conversation>
40
+ </div>
41
+ );
42
+ };
@@ -0,0 +1,30 @@
1
+ import { UseChatHelpers } from '@ai-sdk/react';
2
+ import { ChatMessage } from '@baishuyun/types';
3
+ import { Button } from '../../ui/button';
4
+ import { PaperclipIcon } from '../../ui/icons';
5
+ import { memo } from 'react';
6
+
7
+ function PureAttachmentsButton({
8
+ fileInputRef,
9
+ status,
10
+ }: {
11
+ fileInputRef: React.MutableRefObject<HTMLInputElement | null>;
12
+ status: UseChatHelpers<ChatMessage>['status'];
13
+ }) {
14
+ return (
15
+ <Button
16
+ className="aspect-square h-8 rounded-lg p-1 transition-colors hover:bg-accent"
17
+ data-testid="attachments-button"
18
+ disabled={status !== 'ready'}
19
+ onClick={(event) => {
20
+ event.preventDefault();
21
+ fileInputRef.current?.click();
22
+ }}
23
+ variant="ghost"
24
+ >
25
+ <PaperclipIcon size={14} />
26
+ </Button>
27
+ );
28
+ }
29
+
30
+ export const AttachmentsButton = memo(PureAttachmentsButton);
@@ -0,0 +1,42 @@
1
+ import { TrashIcon } from '@/components/bs-ui/bs-icons';
2
+ import type { UseChatHelpers } from '@ai-sdk/react';
3
+ import { usePluginLifeCycleChainRunner } from '@/hooks/use-plugin-life-cycle-chain-runner';
4
+ import { ChatMessage } from '@baishuyun/types';
5
+ import { useCallback, useEffect } from 'react';
6
+ import { useChatStore } from '@/store/context';
7
+ import { IconBtn } from '@/components/bs-ui/icon-btn';
8
+
9
+ export const ClearBtn = ({
10
+ setMessages,
11
+ status,
12
+ }: {
13
+ setMessages: UseChatHelpers<ChatMessage>['setMessages'];
14
+ status: UseChatHelpers<ChatMessage>['status'];
15
+ }) => {
16
+ const { exec: onBeforeClearMsg = () => {} } =
17
+ usePluginLifeCycleChainRunner('onBeforeMessagesClear');
18
+
19
+ const clearMsg = useCallback(() => {
20
+ onBeforeClearMsg(null);
21
+ setMessages(() => []);
22
+ }, [onBeforeClearMsg, setMessages]);
23
+
24
+ const { clearTimestamp } = useChatStore((store) => ({
25
+ clearTimestamp: store.msgClearTimestamp,
26
+ }));
27
+
28
+ useEffect(() => {
29
+ clearTimestamp && clearMsg();
30
+ }, [clearTimestamp]);
31
+
32
+ return (
33
+ <IconBtn
34
+ icon={<TrashIcon />}
35
+ disabled={status !== 'ready'}
36
+ onClick={(event: any) => {
37
+ event.preventDefault();
38
+ clearMsg();
39
+ }}
40
+ />
41
+ );
42
+ };
@@ -0,0 +1,422 @@
1
+ import type { UseChatHelpers } from '@ai-sdk/react';
2
+ import type { UIMessage } from 'ai';
3
+ import equal from 'fast-deep-equal';
4
+ import {
5
+ type ChangeEvent,
6
+ type Dispatch,
7
+ memo,
8
+ type SetStateAction,
9
+ useCallback,
10
+ useEffect,
11
+ useRef,
12
+ useState,
13
+ } from 'react';
14
+ import { cn } from '@/lib/utils';
15
+ import {
16
+ PromptInput,
17
+ PromptInputSubmit,
18
+ PromptInputTextarea,
19
+ PromptInputToolbar,
20
+ PromptInputTools,
21
+ } from './prompt-input';
22
+ import { PreviewAttachment } from './preview-attachment';
23
+ // import { SuggestedActions } from "./suggested-actions";
24
+ import { ChatMessage, Attachment } from '@baishuyun/types';
25
+ import { ArrowUpIcon, PaperclipIcon, StopIcon } from '@/components/ui/icons';
26
+ import { Button } from '@/components/ui/button';
27
+ import { usePluginLifeCycleChainRunner } from '@/hooks/use-plugin-life-cycle-chain-runner';
28
+ import { ClearBtn } from './clear-btn';
29
+ import { IconBtn } from '@/components/bs-ui/icon-btn';
30
+ import { DividerIcon, PlaneIcon, UploadIcon } from '@/components/bs-ui/bs-icons';
31
+
32
+ function setCookie(name: string, value: string) {
33
+ const maxAge = 60 * 60 * 24 * 365; // 1 year
34
+ // biome-ignore lint/suspicious/noDocumentCookie: needed for client-side cookie setting
35
+ document.cookie = `${name}=${encodeURIComponent(value)}; path=/; max-age=${maxAge}`;
36
+ }
37
+
38
+ function PureMultimodalInput({
39
+ chatId,
40
+ input,
41
+ setInput,
42
+ status,
43
+ stop,
44
+ attachments,
45
+ setAttachments,
46
+ messages,
47
+ fileUploadEndpoint,
48
+ setMessages,
49
+ sendMessage,
50
+ className,
51
+ }: {
52
+ chatId: string;
53
+ input: string;
54
+ setInput: Dispatch<SetStateAction<string>>;
55
+ status: UseChatHelpers<ChatMessage>['status'];
56
+ stop: () => void;
57
+ attachments: Attachment[];
58
+ fileUploadEndpoint: string;
59
+ setAttachments: Dispatch<SetStateAction<Attachment[]>>;
60
+ messages: UIMessage[];
61
+ setMessages: UseChatHelpers<ChatMessage>['setMessages'];
62
+ sendMessage: UseChatHelpers<ChatMessage>['sendMessage'];
63
+ className?: string;
64
+ }) {
65
+ const textareaRef = useRef<HTMLTextAreaElement>(null);
66
+ const adjustHeight = useCallback(() => {
67
+ if (textareaRef.current) {
68
+ textareaRef.current.style.height = '44px';
69
+ }
70
+ }, []);
71
+
72
+ useEffect(() => {
73
+ if (textareaRef.current) {
74
+ adjustHeight();
75
+ }
76
+ }, [adjustHeight]);
77
+
78
+ const hasAutoFocused = useRef(false);
79
+ // useEffect(() => {
80
+ // if (!hasAutoFocused.current && width) {
81
+ // const timer = setTimeout(() => {
82
+ // textareaRef.current?.focus();
83
+ // hasAutoFocused.current = true;
84
+ // }, 100);
85
+ // return () => clearTimeout(timer);
86
+ // }
87
+ // }, [width]);
88
+
89
+ const resetHeight = useCallback(() => {
90
+ if (textareaRef.current) {
91
+ textareaRef.current.style.height = '44px';
92
+ }
93
+ }, []);
94
+
95
+ // const [localStorageInput, setLocalStorageInput] = useLocalStorage(
96
+ // "input",
97
+ // "",
98
+ // );
99
+
100
+ useEffect(() => {
101
+ if (textareaRef.current) {
102
+ const domValue = textareaRef.current.value;
103
+ // Prefer DOM value over localStorage to handle hydration
104
+ const finalValue = domValue || '';
105
+ setInput(finalValue);
106
+ adjustHeight();
107
+ }
108
+ // Only run once after hydration
109
+ // eslint-disable-next-line react-hooks/exhaustive-deps
110
+ }, [adjustHeight, setInput]);
111
+
112
+ const handleInput = (event: React.ChangeEvent<HTMLTextAreaElement>) => {
113
+ setInput(event.target.value);
114
+ };
115
+
116
+ const fileInputRef = useRef<HTMLInputElement>(null);
117
+ const [uploadQueue, setUploadQueue] = useState<string[]>([]);
118
+
119
+ const { exec: onBeforeSendMsg } = usePluginLifeCycleChainRunner('onBeforeMessageSend');
120
+
121
+ const submitForm = useCallback(() => {
122
+ // window.history.pushState({}, "", `/chat/${chatId}`);
123
+
124
+ const finalMsg = onBeforeSendMsg({
125
+ text: input,
126
+ options: {
127
+ body: { stage: 'design', name: input },
128
+ },
129
+ });
130
+
131
+ sendMessage(
132
+ {
133
+ role: 'user',
134
+ parts: [
135
+ ...attachments.map((attachment) => ({
136
+ type: 'file' as const,
137
+ url: attachment.url,
138
+ name: attachment.name,
139
+ mediaType: attachment.contentType,
140
+ providerMetadata: {
141
+ uploadMetadata: attachment,
142
+ },
143
+ })),
144
+ {
145
+ type: 'text',
146
+ text: input,
147
+ },
148
+ ],
149
+ },
150
+ finalMsg.options
151
+ );
152
+
153
+ setAttachments([]);
154
+ resetHeight();
155
+ setInput('');
156
+ }, [input, setInput, attachments, sendMessage, setAttachments, chatId, resetHeight]);
157
+
158
+ const uploadFile = useCallback(async (file: File) => {
159
+ const formData = new FormData();
160
+ formData.append('file', file);
161
+
162
+ try {
163
+ const response = await fetch(fileUploadEndpoint, {
164
+ method: 'POST',
165
+ body: formData,
166
+ });
167
+
168
+ if (response.ok) {
169
+ const data = await response.json();
170
+
171
+ console.log(data);
172
+
173
+ return data;
174
+ }
175
+ const { error } = await response.json();
176
+ console.error('upload error', error);
177
+ } catch (_error) {}
178
+ }, []);
179
+
180
+ const handleFileChange = useCallback(
181
+ async (event: ChangeEvent<HTMLInputElement>) => {
182
+ const files = Array.from(event.target.files || []);
183
+
184
+ setUploadQueue(files.map((file) => file.name));
185
+
186
+ try {
187
+ const uploadPromises = files.map((file) => uploadFile(file));
188
+ const uploadedAttachments = await Promise.all(uploadPromises);
189
+ const successfullyUploadedAttachments = uploadedAttachments.filter(
190
+ (attachment) => attachment !== undefined
191
+ );
192
+
193
+ console.log('uploaded attachements', uploadedAttachments);
194
+
195
+ setAttachments((currentAttachments) => [
196
+ ...currentAttachments,
197
+ ...successfullyUploadedAttachments,
198
+ ]);
199
+ } catch (error) {
200
+ console.error('Error uploading files!', error);
201
+ } finally {
202
+ setUploadQueue([]);
203
+ }
204
+ },
205
+ [setAttachments, uploadFile]
206
+ );
207
+
208
+ const handlePaste = useCallback(
209
+ async (event: ClipboardEvent) => {
210
+ const items = event.clipboardData?.items;
211
+ if (!items) {
212
+ return;
213
+ }
214
+
215
+ const imageItems = Array.from(items).filter((item) => item.type.startsWith('image/'));
216
+
217
+ if (imageItems.length === 0) {
218
+ return;
219
+ }
220
+
221
+ // Prevent default paste behavior for images
222
+ event.preventDefault();
223
+
224
+ setUploadQueue((prev) => [...prev, 'Pasted image']);
225
+
226
+ try {
227
+ const uploadPromises = imageItems
228
+ .map((item) => item.getAsFile())
229
+ .filter((file): file is File => file !== null)
230
+ .map((file) => uploadFile(file));
231
+
232
+ const uploadedAttachments = await Promise.all(uploadPromises);
233
+ const successfullyUploadedAttachments = uploadedAttachments.filter(
234
+ (attachment) =>
235
+ attachment !== undefined &&
236
+ attachment.url !== undefined &&
237
+ attachment.contentType !== undefined
238
+ );
239
+
240
+ setAttachments((curr) => [...curr, ...(successfullyUploadedAttachments as Attachment[])]);
241
+ } catch (error) {
242
+ console.error('Error uploading pasted images:', error);
243
+ } finally {
244
+ setUploadQueue([]);
245
+ }
246
+ },
247
+ [setAttachments, uploadFile]
248
+ );
249
+
250
+ // Add paste event listener to textarea
251
+ useEffect(() => {
252
+ const textarea = textareaRef.current;
253
+ if (!textarea) {
254
+ return;
255
+ }
256
+
257
+ textarea.addEventListener('paste', handlePaste);
258
+ return () => textarea.removeEventListener('paste', handlePaste);
259
+ }, [handlePaste]);
260
+
261
+ return (
262
+ <div className={cn('relative flex w-full flex-col gap-4', className)}>
263
+ {/*{messages.length === 0 &&
264
+ attachments.length === 0 &&
265
+ uploadQueue.length === 0 && (
266
+ <SuggestedActions
267
+ chatId={chatId}
268
+ selectedVisibilityType={selectedVisibilityType}
269
+ sendMessage={sendMessage}
270
+ />
271
+ )}*/}
272
+
273
+ <input
274
+ className="-top-4 -left-4 pointer-events-none fixed size-0.5 opacity-0"
275
+ multiple
276
+ onChange={handleFileChange}
277
+ ref={fileInputRef}
278
+ tabIndex={-1}
279
+ type="file"
280
+ // accept=".csv,text/csv,text/plain,.txt"
281
+ />
282
+
283
+ <PromptInput
284
+ className="border border-[#e0e0e0] bg-background p-[10px] shadow-xs transition-all duration-200 focus-within:border-border hover:border-[#0265ff]"
285
+ onSubmit={(event) => {
286
+ event.preventDefault();
287
+ if (status !== 'ready') {
288
+ // toast.error("Please wait for the model to finish its response!");
289
+ } else {
290
+ submitForm();
291
+ }
292
+ }}
293
+ >
294
+ {(attachments.length > 0 || uploadQueue.length > 0) && (
295
+ <div
296
+ className="flex flex-row items-end gap-2 overflow-x-scroll"
297
+ data-testid="attachments-preview"
298
+ >
299
+ {attachments.map((attachment) => (
300
+ <PreviewAttachment
301
+ attachment={attachment}
302
+ key={attachment.url}
303
+ onRemove={() => {
304
+ setAttachments((currentAttachments) =>
305
+ currentAttachments.filter((a) => a.url !== attachment.url)
306
+ );
307
+ if (fileInputRef.current) {
308
+ fileInputRef.current.value = '';
309
+ }
310
+ }}
311
+ />
312
+ ))}
313
+
314
+ {uploadQueue.map((filename) => (
315
+ <PreviewAttachment
316
+ attachment={{
317
+ url: '',
318
+ name: filename,
319
+ contentType: '',
320
+ }}
321
+ isUploading={true}
322
+ key={filename}
323
+ />
324
+ ))}
325
+ </div>
326
+ )}
327
+ <div className="flex flex-row items-start gap-1 sm:gap-2">
328
+ <PromptInputTextarea
329
+ className="grow resize-none border-0! border-none! bg-transparent p-0 text-base outline-none ring-0 [-ms-overflow-style:none] [scrollbar-width:none] placeholder:text-[#999] focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0 [&::-webkit-scrollbar]:hidden text-[#12111]"
330
+ data-testid="multimodal-input"
331
+ disableAutoResize={true}
332
+ maxHeight={200}
333
+ minHeight={44}
334
+ onChange={handleInput}
335
+ placeholder="Send a message..."
336
+ ref={textareaRef}
337
+ rows={1}
338
+ value={input}
339
+ />
340
+ </div>
341
+ <PromptInputToolbar className="border-top-0! border-t-0! p-0 shadow-none dark:border-0 dark:border-transparent!">
342
+ <div></div>
343
+ <PromptInputTools className="gap-2.5">
344
+ <AttachmentsButton fileInputRef={fileInputRef} status={status} />
345
+ <ClearBtn setMessages={setMessages} status={status} />
346
+ <DividerIcon />
347
+ {status === 'submitted' ? (
348
+ <StopButton setMessages={setMessages} stop={stop} />
349
+ ) : (
350
+ <PromptInputSubmit
351
+ className="cursor-pointer rounded-full bg-[#0265FF] text-primary-foreground transition-colors duration-200 hover:bg-[#0265FF]/90 disabled:bg-[#E5E6EB] disabled:text-white h-[26px] w-[26px]"
352
+ data-testid="send-button"
353
+ disabled={!input.trim() || uploadQueue.length > 0}
354
+ status={status}
355
+ >
356
+ <PlaneIcon />
357
+ </PromptInputSubmit>
358
+ )}
359
+ </PromptInputTools>
360
+ </PromptInputToolbar>
361
+ </PromptInput>
362
+ </div>
363
+ );
364
+ }
365
+
366
+ export const MultimodalInput = memo(PureMultimodalInput, (prevProps, nextProps) => {
367
+ if (prevProps.input !== nextProps.input) {
368
+ return false;
369
+ }
370
+ if (prevProps.status !== nextProps.status) {
371
+ return false;
372
+ }
373
+ if (!equal(prevProps.attachments, nextProps.attachments)) {
374
+ return false;
375
+ }
376
+
377
+ return true;
378
+ });
379
+
380
+ function PureAttachmentsButton({
381
+ fileInputRef,
382
+ status,
383
+ }: {
384
+ fileInputRef: React.MutableRefObject<HTMLInputElement | null>;
385
+ status: UseChatHelpers<ChatMessage>['status'];
386
+ }) {
387
+ return (
388
+ <IconBtn
389
+ icon={<UploadIcon />}
390
+ disabled={status !== 'ready'}
391
+ onClick={(event: any) => {
392
+ event.preventDefault();
393
+ fileInputRef.current?.click();
394
+ }}
395
+ />
396
+ );
397
+ }
398
+
399
+ const AttachmentsButton = memo(PureAttachmentsButton);
400
+
401
+ function PureStopButton({
402
+ stop,
403
+ setMessages,
404
+ }: {
405
+ stop: () => void;
406
+ setMessages: UseChatHelpers<ChatMessage>['setMessages'];
407
+ }) {
408
+ return (
409
+ <Button
410
+ className="cursor-pointer rounded-full bg-[#0265FF] text-primary-foreground transition-colors duration-200 hover:bg-[#0265FF]/90 disabled:bg-[#E5E6EB] disabled:text-white h-[26px] w-[26px] flex items-center justify-center aspect-square p-0"
411
+ onClick={(event: any) => {
412
+ event.preventDefault();
413
+ stop();
414
+ setMessages((messages) => messages);
415
+ }}
416
+ >
417
+ <div className="rounded-[2px] w-[8px] h-[8px] bg-white flex-shrink-0" />
418
+ </Button>
419
+ );
420
+ }
421
+
422
+ const StopButton = memo(PureStopButton);