@sveda-ai/vue 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/dist/appearance.d.ts +52 -0
  4. package/dist/appearance.d.ts.map +1 -0
  5. package/dist/components/chat/AnimatedStreamBlock.vue.d.ts +16 -0
  6. package/dist/components/chat/AnimatedStreamBlock.vue.d.ts.map +1 -0
  7. package/dist/components/chat/ChatHistoryDropdown.vue.d.ts +17 -0
  8. package/dist/components/chat/ChatHistoryDropdown.vue.d.ts.map +1 -0
  9. package/dist/components/chat/ChatInput.vue.d.ts +30 -0
  10. package/dist/components/chat/ChatInput.vue.d.ts.map +1 -0
  11. package/dist/components/chat/ChatMessageActivityBlock.vue.d.ts +13 -0
  12. package/dist/components/chat/ChatMessageActivityBlock.vue.d.ts.map +1 -0
  13. package/dist/components/chat/ChatMessageItem.vue.d.ts +15 -0
  14. package/dist/components/chat/ChatMessageItem.vue.d.ts.map +1 -0
  15. package/dist/components/chat/ChatMessageList.vue.d.ts +31 -0
  16. package/dist/components/chat/ChatMessageList.vue.d.ts.map +1 -0
  17. package/dist/components/chat/ChatPendingIndicator.vue.d.ts +12 -0
  18. package/dist/components/chat/ChatPendingIndicator.vue.d.ts.map +1 -0
  19. package/dist/components/chat/ReasoningStream.vue.d.ts +11 -0
  20. package/dist/components/chat/ReasoningStream.vue.d.ts.map +1 -0
  21. package/dist/components/chat/index.d.ts +9 -0
  22. package/dist/components/chat/index.d.ts.map +1 -0
  23. package/dist/components/shell/SvedaAgentCompletedNotice.vue.d.ts +9 -0
  24. package/dist/components/shell/SvedaAgentCompletedNotice.vue.d.ts.map +1 -0
  25. package/dist/components/shell/SvedaAgentTasksPanel.vue.d.ts +12 -0
  26. package/dist/components/shell/SvedaAgentTasksPanel.vue.d.ts.map +1 -0
  27. package/dist/components/shell/SvedaChat.vue.d.ts +22 -0
  28. package/dist/components/shell/SvedaChat.vue.d.ts.map +1 -0
  29. package/dist/components/shell/SvedaContextUsageBar.vue.d.ts +10 -0
  30. package/dist/components/shell/SvedaContextUsageBar.vue.d.ts.map +1 -0
  31. package/dist/components/shell/SvedaHistorySheet.vue.d.ts +15 -0
  32. package/dist/components/shell/SvedaHistorySheet.vue.d.ts.map +1 -0
  33. package/dist/components/shell/SvedaHistorySidebar.vue.d.ts +15 -0
  34. package/dist/components/shell/SvedaHistorySidebar.vue.d.ts.map +1 -0
  35. package/dist/components/shell/SvedaInputSection.vue.d.ts +25 -0
  36. package/dist/components/shell/SvedaInputSection.vue.d.ts.map +1 -0
  37. package/dist/components/shell/SvedaLandingView.vue.d.ts +40 -0
  38. package/dist/components/shell/SvedaLandingView.vue.d.ts.map +1 -0
  39. package/dist/components/shell/SvedaMaxStepsNotice.vue.d.ts +13 -0
  40. package/dist/components/shell/SvedaMaxStepsNotice.vue.d.ts.map +1 -0
  41. package/dist/components/shell/SvedaMinimizedTrigger.vue.d.ts +15 -0
  42. package/dist/components/shell/SvedaMinimizedTrigger.vue.d.ts.map +1 -0
  43. package/dist/components/shell/SvedaModelControls.vue.d.ts +12 -0
  44. package/dist/components/shell/SvedaModelControls.vue.d.ts.map +1 -0
  45. package/dist/components/shell/SvedaModelSelect.vue.d.ts +10 -0
  46. package/dist/components/shell/SvedaModelSelect.vue.d.ts.map +1 -0
  47. package/dist/components/shell/SvedaQuickPrompts.vue.d.ts +13 -0
  48. package/dist/components/shell/SvedaQuickPrompts.vue.d.ts.map +1 -0
  49. package/dist/components/shell/SvedaResizeHandles.vue.d.ts +11 -0
  50. package/dist/components/shell/SvedaResizeHandles.vue.d.ts.map +1 -0
  51. package/dist/components/shell/SvedaTabs.vue.d.ts +17 -0
  52. package/dist/components/shell/SvedaTabs.vue.d.ts.map +1 -0
  53. package/dist/components/shell/SvedaToolbar.vue.d.ts +33 -0
  54. package/dist/components/shell/SvedaToolbar.vue.d.ts.map +1 -0
  55. package/dist/composables/useSvedaAgentTasks.d.ts +57 -0
  56. package/dist/composables/useSvedaAgentTasks.d.ts.map +1 -0
  57. package/dist/composables/useSvedaBootstrap.d.ts +18 -0
  58. package/dist/composables/useSvedaBootstrap.d.ts.map +1 -0
  59. package/dist/composables/useSvedaChat.d.ts +264 -0
  60. package/dist/composables/useSvedaChat.d.ts.map +1 -0
  61. package/dist/composables/useSvedaChatLayout.d.ts +39 -0
  62. package/dist/composables/useSvedaChatLayout.d.ts.map +1 -0
  63. package/dist/composables/useSvedaChatPage.d.ts +309 -0
  64. package/dist/composables/useSvedaChatPage.d.ts.map +1 -0
  65. package/dist/composables/useSvedaContextWindow.d.ts +10 -0
  66. package/dist/composables/useSvedaContextWindow.d.ts.map +1 -0
  67. package/dist/composables/useSvedaDocuments.d.ts +20 -0
  68. package/dist/composables/useSvedaDocuments.d.ts.map +1 -0
  69. package/dist/composables/useSvedaMaxStepsContinue.d.ts +12 -0
  70. package/dist/composables/useSvedaMaxStepsContinue.d.ts.map +1 -0
  71. package/dist/composables/useSvedaMessaging.d.ts +55 -0
  72. package/dist/composables/useSvedaMessaging.d.ts.map +1 -0
  73. package/dist/composables/useSvedaModel.d.ts +16 -0
  74. package/dist/composables/useSvedaModel.d.ts.map +1 -0
  75. package/dist/composables/useSvedaPrompts.d.ts +18 -0
  76. package/dist/composables/useSvedaPrompts.d.ts.map +1 -0
  77. package/dist/composables/useSvedaReadable.d.ts +3 -0
  78. package/dist/composables/useSvedaReadable.d.ts.map +1 -0
  79. package/dist/composables/useSvedaScroll.d.ts +19 -0
  80. package/dist/composables/useSvedaScroll.d.ts.map +1 -0
  81. package/dist/composables/useSvedaShell.d.ts +29 -0
  82. package/dist/composables/useSvedaShell.d.ts.map +1 -0
  83. package/dist/composables/useSvedaStreaming.d.ts +46 -0
  84. package/dist/composables/useSvedaStreaming.d.ts.map +1 -0
  85. package/dist/composables/useSvedaTool.d.ts +4 -0
  86. package/dist/composables/useSvedaTool.d.ts.map +1 -0
  87. package/dist/i18n/index.d.ts +18 -0
  88. package/dist/i18n/index.d.ts.map +1 -0
  89. package/dist/i18n/locales/en.d.ts +4 -0
  90. package/dist/i18n/locales/en.d.ts.map +1 -0
  91. package/dist/i18n/locales/ru.d.ts +4 -0
  92. package/dist/i18n/locales/ru.d.ts.map +1 -0
  93. package/dist/index.d.ts +64 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +6612 -0
  96. package/dist/launcherIcons.d.ts +5 -0
  97. package/dist/launcherIcons.d.ts.map +1 -0
  98. package/dist/lib/assistantMessage.d.ts +89 -0
  99. package/dist/lib/assistantMessage.d.ts.map +1 -0
  100. package/dist/lib/chatHistoryMerge.d.ts +20 -0
  101. package/dist/lib/chatHistoryMerge.d.ts.map +1 -0
  102. package/dist/lib/chatI18nKeys.d.ts +2 -0
  103. package/dist/lib/chatI18nKeys.d.ts.map +1 -0
  104. package/dist/lib/chatMessageVisibility.d.ts +4 -0
  105. package/dist/lib/chatMessageVisibility.d.ts.map +1 -0
  106. package/dist/lib/chatTabs.d.ts +9 -0
  107. package/dist/lib/chatTabs.d.ts.map +1 -0
  108. package/dist/lib/chatTitle.d.ts +3 -0
  109. package/dist/lib/chatTitle.d.ts.map +1 -0
  110. package/dist/lib/chatUiStorage.d.ts +4 -0
  111. package/dist/lib/chatUiStorage.d.ts.map +1 -0
  112. package/dist/lib/finalizeMessages.d.ts +21 -0
  113. package/dist/lib/finalizeMessages.d.ts.map +1 -0
  114. package/dist/lib/markdown.d.ts +8 -0
  115. package/dist/lib/markdown.d.ts.map +1 -0
  116. package/dist/lib/modelLabels.d.ts +3 -0
  117. package/dist/lib/modelLabels.d.ts.map +1 -0
  118. package/dist/lib/pendingStatusRotation.d.ts +3 -0
  119. package/dist/lib/pendingStatusRotation.d.ts.map +1 -0
  120. package/dist/lib/useAnimatedText.d.ts +8 -0
  121. package/dist/lib/useAnimatedText.d.ts.map +1 -0
  122. package/dist/lib/userMessage.d.ts +17 -0
  123. package/dist/lib/userMessage.d.ts.map +1 -0
  124. package/dist/lib/utils.d.ts +3 -0
  125. package/dist/lib/utils.d.ts.map +1 -0
  126. package/dist/plugin.d.ts +64 -0
  127. package/dist/plugin.d.ts.map +1 -0
  128. package/dist/styles.css +5 -0
  129. package/dist/ui/alert-dialog/AlertDialog.vue.d.ts +18 -0
  130. package/dist/ui/alert-dialog/AlertDialog.vue.d.ts.map +1 -0
  131. package/dist/ui/alert-dialog/AlertDialogAction.vue.d.ts +18 -0
  132. package/dist/ui/alert-dialog/AlertDialogAction.vue.d.ts.map +1 -0
  133. package/dist/ui/alert-dialog/AlertDialogCancel.vue.d.ts +18 -0
  134. package/dist/ui/alert-dialog/AlertDialogCancel.vue.d.ts.map +1 -0
  135. package/dist/ui/alert-dialog/AlertDialogContent.vue.d.ts +32 -0
  136. package/dist/ui/alert-dialog/AlertDialogContent.vue.d.ts.map +1 -0
  137. package/dist/ui/alert-dialog/AlertDialogDescription.vue.d.ts +18 -0
  138. package/dist/ui/alert-dialog/AlertDialogDescription.vue.d.ts.map +1 -0
  139. package/dist/ui/alert-dialog/AlertDialogFooter.vue.d.ts +17 -0
  140. package/dist/ui/alert-dialog/AlertDialogFooter.vue.d.ts.map +1 -0
  141. package/dist/ui/alert-dialog/AlertDialogHeader.vue.d.ts +17 -0
  142. package/dist/ui/alert-dialog/AlertDialogHeader.vue.d.ts.map +1 -0
  143. package/dist/ui/alert-dialog/AlertDialogTitle.vue.d.ts +18 -0
  144. package/dist/ui/alert-dialog/AlertDialogTitle.vue.d.ts.map +1 -0
  145. package/dist/ui/alert-dialog/AlertDialogTrigger.vue.d.ts +14 -0
  146. package/dist/ui/alert-dialog/AlertDialogTrigger.vue.d.ts.map +1 -0
  147. package/dist/ui/alert-dialog/index.d.ts +10 -0
  148. package/dist/ui/alert-dialog/index.d.ts.map +1 -0
  149. package/dist/ui/badge/Badge.vue.d.ts +19 -0
  150. package/dist/ui/badge/Badge.vue.d.ts.map +1 -0
  151. package/dist/ui/badge/index.d.ts +7 -0
  152. package/dist/ui/badge/index.d.ts.map +1 -0
  153. package/dist/ui/button/Button.vue.d.ts +23 -0
  154. package/dist/ui/button/Button.vue.d.ts.map +1 -0
  155. package/dist/ui/button/index.d.ts +9 -0
  156. package/dist/ui/button/index.d.ts.map +1 -0
  157. package/dist/ui/card/Card.vue.d.ts +17 -0
  158. package/dist/ui/card/Card.vue.d.ts.map +1 -0
  159. package/dist/ui/card/CardContent.vue.d.ts +17 -0
  160. package/dist/ui/card/CardContent.vue.d.ts.map +1 -0
  161. package/dist/ui/card/CardDescription.vue.d.ts +17 -0
  162. package/dist/ui/card/CardDescription.vue.d.ts.map +1 -0
  163. package/dist/ui/card/CardFooter.vue.d.ts +17 -0
  164. package/dist/ui/card/CardFooter.vue.d.ts.map +1 -0
  165. package/dist/ui/card/CardHeader.vue.d.ts +17 -0
  166. package/dist/ui/card/CardHeader.vue.d.ts.map +1 -0
  167. package/dist/ui/card/CardTitle.vue.d.ts +17 -0
  168. package/dist/ui/card/CardTitle.vue.d.ts.map +1 -0
  169. package/dist/ui/card/index.d.ts +7 -0
  170. package/dist/ui/card/index.d.ts.map +1 -0
  171. package/dist/ui/checkbox/Checkbox.vue.d.ts +30 -0
  172. package/dist/ui/checkbox/Checkbox.vue.d.ts.map +1 -0
  173. package/dist/ui/checkbox/index.d.ts +2 -0
  174. package/dist/ui/checkbox/index.d.ts.map +1 -0
  175. package/dist/ui/dialog/Dialog.vue.d.ts +18 -0
  176. package/dist/ui/dialog/Dialog.vue.d.ts.map +1 -0
  177. package/dist/ui/dialog/DialogClose.vue.d.ts +14 -0
  178. package/dist/ui/dialog/DialogClose.vue.d.ts.map +1 -0
  179. package/dist/ui/dialog/DialogContent.vue.d.ts +32 -0
  180. package/dist/ui/dialog/DialogContent.vue.d.ts.map +1 -0
  181. package/dist/ui/dialog/DialogDescription.vue.d.ts +18 -0
  182. package/dist/ui/dialog/DialogDescription.vue.d.ts.map +1 -0
  183. package/dist/ui/dialog/DialogFooter.vue.d.ts +17 -0
  184. package/dist/ui/dialog/DialogFooter.vue.d.ts.map +1 -0
  185. package/dist/ui/dialog/DialogHeader.vue.d.ts +17 -0
  186. package/dist/ui/dialog/DialogHeader.vue.d.ts.map +1 -0
  187. package/dist/ui/dialog/DialogScrollContent.vue.d.ts +32 -0
  188. package/dist/ui/dialog/DialogScrollContent.vue.d.ts.map +1 -0
  189. package/dist/ui/dialog/DialogTitle.vue.d.ts +18 -0
  190. package/dist/ui/dialog/DialogTitle.vue.d.ts.map +1 -0
  191. package/dist/ui/dialog/DialogTrigger.vue.d.ts +14 -0
  192. package/dist/ui/dialog/DialogTrigger.vue.d.ts.map +1 -0
  193. package/dist/ui/dialog/index.d.ts +10 -0
  194. package/dist/ui/dialog/index.d.ts.map +1 -0
  195. package/dist/ui/dropdown-menu/DropdownMenu.vue.d.ts +18 -0
  196. package/dist/ui/dropdown-menu/DropdownMenu.vue.d.ts.map +1 -0
  197. package/dist/ui/dropdown-menu/DropdownMenuCheckboxItem.vue.d.ts +24 -0
  198. package/dist/ui/dropdown-menu/DropdownMenuCheckboxItem.vue.d.ts.map +1 -0
  199. package/dist/ui/dropdown-menu/DropdownMenuContent.vue.d.ts +32 -0
  200. package/dist/ui/dropdown-menu/DropdownMenuContent.vue.d.ts.map +1 -0
  201. package/dist/ui/dropdown-menu/DropdownMenuGroup.vue.d.ts +14 -0
  202. package/dist/ui/dropdown-menu/DropdownMenuGroup.vue.d.ts.map +1 -0
  203. package/dist/ui/dropdown-menu/DropdownMenuItem.vue.d.ts +19 -0
  204. package/dist/ui/dropdown-menu/DropdownMenuItem.vue.d.ts.map +1 -0
  205. package/dist/ui/dropdown-menu/DropdownMenuLabel.vue.d.ts +19 -0
  206. package/dist/ui/dropdown-menu/DropdownMenuLabel.vue.d.ts.map +1 -0
  207. package/dist/ui/dropdown-menu/DropdownMenuRadioGroup.vue.d.ts +18 -0
  208. package/dist/ui/dropdown-menu/DropdownMenuRadioGroup.vue.d.ts.map +1 -0
  209. package/dist/ui/dropdown-menu/DropdownMenuRadioItem.vue.d.ts +22 -0
  210. package/dist/ui/dropdown-menu/DropdownMenuRadioItem.vue.d.ts.map +1 -0
  211. package/dist/ui/dropdown-menu/DropdownMenuSeparator.vue.d.ts +8 -0
  212. package/dist/ui/dropdown-menu/DropdownMenuSeparator.vue.d.ts.map +1 -0
  213. package/dist/ui/dropdown-menu/DropdownMenuShortcut.vue.d.ts +17 -0
  214. package/dist/ui/dropdown-menu/DropdownMenuShortcut.vue.d.ts.map +1 -0
  215. package/dist/ui/dropdown-menu/DropdownMenuSub.vue.d.ts +18 -0
  216. package/dist/ui/dropdown-menu/DropdownMenuSub.vue.d.ts.map +1 -0
  217. package/dist/ui/dropdown-menu/DropdownMenuSubContent.vue.d.ts +34 -0
  218. package/dist/ui/dropdown-menu/DropdownMenuSubContent.vue.d.ts.map +1 -0
  219. package/dist/ui/dropdown-menu/DropdownMenuSubTrigger.vue.d.ts +18 -0
  220. package/dist/ui/dropdown-menu/DropdownMenuSubTrigger.vue.d.ts.map +1 -0
  221. package/dist/ui/dropdown-menu/DropdownMenuTrigger.vue.d.ts +14 -0
  222. package/dist/ui/dropdown-menu/DropdownMenuTrigger.vue.d.ts.map +1 -0
  223. package/dist/ui/dropdown-menu/index.d.ts +16 -0
  224. package/dist/ui/dropdown-menu/index.d.ts.map +1 -0
  225. package/dist/ui/input/Input.vue.d.ts +13 -0
  226. package/dist/ui/input/Input.vue.d.ts.map +1 -0
  227. package/dist/ui/input/index.d.ts +2 -0
  228. package/dist/ui/input/index.d.ts.map +1 -0
  229. package/dist/ui/label/Label.vue.d.ts +18 -0
  230. package/dist/ui/label/Label.vue.d.ts.map +1 -0
  231. package/dist/ui/label/index.d.ts +2 -0
  232. package/dist/ui/label/index.d.ts.map +1 -0
  233. package/dist/ui/responsive-dialog/ResponsiveDialog.vue.d.ts +32 -0
  234. package/dist/ui/responsive-dialog/ResponsiveDialog.vue.d.ts.map +1 -0
  235. package/dist/ui/responsive-dialog/index.d.ts +2 -0
  236. package/dist/ui/responsive-dialog/index.d.ts.map +1 -0
  237. package/dist/ui/scroll-area/ScrollArea.vue.d.ts +18 -0
  238. package/dist/ui/scroll-area/ScrollArea.vue.d.ts.map +1 -0
  239. package/dist/ui/scroll-area/ScrollBar.vue.d.ts +10 -0
  240. package/dist/ui/scroll-area/ScrollBar.vue.d.ts.map +1 -0
  241. package/dist/ui/scroll-area/index.d.ts +3 -0
  242. package/dist/ui/scroll-area/index.d.ts.map +1 -0
  243. package/dist/ui/select/Select.vue.d.ts +21 -0
  244. package/dist/ui/select/Select.vue.d.ts.map +1 -0
  245. package/dist/ui/select/SelectContent.vue.d.ts +28 -0
  246. package/dist/ui/select/SelectContent.vue.d.ts.map +1 -0
  247. package/dist/ui/select/SelectGroup.vue.d.ts +18 -0
  248. package/dist/ui/select/SelectGroup.vue.d.ts.map +1 -0
  249. package/dist/ui/select/SelectItem.vue.d.ts +18 -0
  250. package/dist/ui/select/SelectItem.vue.d.ts.map +1 -0
  251. package/dist/ui/select/SelectItemText.vue.d.ts +14 -0
  252. package/dist/ui/select/SelectItemText.vue.d.ts.map +1 -0
  253. package/dist/ui/select/SelectLabel.vue.d.ts +18 -0
  254. package/dist/ui/select/SelectLabel.vue.d.ts.map +1 -0
  255. package/dist/ui/select/SelectScrollDownButton.vue.d.ts +18 -0
  256. package/dist/ui/select/SelectScrollDownButton.vue.d.ts.map +1 -0
  257. package/dist/ui/select/SelectScrollUpButton.vue.d.ts +18 -0
  258. package/dist/ui/select/SelectScrollUpButton.vue.d.ts.map +1 -0
  259. package/dist/ui/select/SelectSeparator.vue.d.ts +8 -0
  260. package/dist/ui/select/SelectSeparator.vue.d.ts.map +1 -0
  261. package/dist/ui/select/SelectTrigger.vue.d.ts +18 -0
  262. package/dist/ui/select/SelectTrigger.vue.d.ts.map +1 -0
  263. package/dist/ui/select/SelectValue.vue.d.ts +14 -0
  264. package/dist/ui/select/SelectValue.vue.d.ts.map +1 -0
  265. package/dist/ui/select/index.d.ts +12 -0
  266. package/dist/ui/select/index.d.ts.map +1 -0
  267. package/dist/ui/sheet/Sheet.vue.d.ts +18 -0
  268. package/dist/ui/sheet/Sheet.vue.d.ts.map +1 -0
  269. package/dist/ui/sheet/SheetClose.vue.d.ts +14 -0
  270. package/dist/ui/sheet/SheetClose.vue.d.ts.map +1 -0
  271. package/dist/ui/sheet/SheetContent.vue.d.ts +34 -0
  272. package/dist/ui/sheet/SheetContent.vue.d.ts.map +1 -0
  273. package/dist/ui/sheet/SheetDescription.vue.d.ts +18 -0
  274. package/dist/ui/sheet/SheetDescription.vue.d.ts.map +1 -0
  275. package/dist/ui/sheet/SheetFooter.vue.d.ts +17 -0
  276. package/dist/ui/sheet/SheetFooter.vue.d.ts.map +1 -0
  277. package/dist/ui/sheet/SheetHeader.vue.d.ts +17 -0
  278. package/dist/ui/sheet/SheetHeader.vue.d.ts.map +1 -0
  279. package/dist/ui/sheet/SheetTitle.vue.d.ts +18 -0
  280. package/dist/ui/sheet/SheetTitle.vue.d.ts.map +1 -0
  281. package/dist/ui/sheet/SheetTrigger.vue.d.ts +14 -0
  282. package/dist/ui/sheet/SheetTrigger.vue.d.ts.map +1 -0
  283. package/dist/ui/sheet/index.d.ts +14 -0
  284. package/dist/ui/sheet/index.d.ts.map +1 -0
  285. package/dist/ui/switch/Switch.vue.d.ts +23 -0
  286. package/dist/ui/switch/Switch.vue.d.ts.map +1 -0
  287. package/dist/ui/switch/index.d.ts +2 -0
  288. package/dist/ui/switch/index.d.ts.map +1 -0
  289. package/dist/ui/textarea/Textarea.vue.d.ts +13 -0
  290. package/dist/ui/textarea/Textarea.vue.d.ts.map +1 -0
  291. package/dist/ui/textarea/index.d.ts +2 -0
  292. package/dist/ui/textarea/index.d.ts.map +1 -0
  293. package/dist/ui/toast/Toast.vue.d.ts +96 -0
  294. package/dist/ui/toast/Toast.vue.d.ts.map +1 -0
  295. package/dist/ui/toast/ToastAction.vue.d.ts +18 -0
  296. package/dist/ui/toast/ToastAction.vue.d.ts.map +1 -0
  297. package/dist/ui/toast/ToastClose.vue.d.ts +8 -0
  298. package/dist/ui/toast/ToastClose.vue.d.ts.map +1 -0
  299. package/dist/ui/toast/ToastDescription.vue.d.ts +18 -0
  300. package/dist/ui/toast/ToastDescription.vue.d.ts.map +1 -0
  301. package/dist/ui/toast/ToastProvider.vue.d.ts +14 -0
  302. package/dist/ui/toast/ToastProvider.vue.d.ts.map +1 -0
  303. package/dist/ui/toast/ToastTitle.vue.d.ts +18 -0
  304. package/dist/ui/toast/ToastTitle.vue.d.ts.map +1 -0
  305. package/dist/ui/toast/ToastViewport.vue.d.ts +8 -0
  306. package/dist/ui/toast/ToastViewport.vue.d.ts.map +1 -0
  307. package/dist/ui/toast/Toaster.vue.d.ts +3 -0
  308. package/dist/ui/toast/Toaster.vue.d.ts.map +1 -0
  309. package/dist/ui/toast/index.d.ts +23 -0
  310. package/dist/ui/toast/index.d.ts.map +1 -0
  311. package/dist/ui/toast/use-toast.d.ts +23 -0
  312. package/dist/ui/toast/use-toast.d.ts.map +1 -0
  313. package/dist/ui/tooltip/Tooltip.vue.d.ts +18 -0
  314. package/dist/ui/tooltip/Tooltip.vue.d.ts.map +1 -0
  315. package/dist/ui/tooltip/TooltipContent.vue.d.ts +26 -0
  316. package/dist/ui/tooltip/TooltipContent.vue.d.ts.map +1 -0
  317. package/dist/ui/tooltip/TooltipProvider.vue.d.ts +14 -0
  318. package/dist/ui/tooltip/TooltipProvider.vue.d.ts.map +1 -0
  319. package/dist/ui/tooltip/TooltipTrigger.vue.d.ts +14 -0
  320. package/dist/ui/tooltip/TooltipTrigger.vue.d.ts.map +1 -0
  321. package/dist/ui/tooltip/index.d.ts +5 -0
  322. package/dist/ui/tooltip/index.d.ts.map +1 -0
  323. package/dist/ui/utils.d.ts +2 -0
  324. package/dist/ui/utils.d.ts.map +1 -0
  325. package/dist/vue.css +1 -0
  326. package/package.json +64 -0
  327. package/src/appearance.ts +568 -0
  328. package/src/components/chat/AnimatedStreamBlock.vue +94 -0
  329. package/src/components/chat/ChatHistoryDropdown.vue +226 -0
  330. package/src/components/chat/ChatInput.vue +571 -0
  331. package/src/components/chat/ChatMessageActivityBlock.vue +447 -0
  332. package/src/components/chat/ChatMessageItem.vue +357 -0
  333. package/src/components/chat/ChatMessageList.vue +178 -0
  334. package/src/components/chat/ChatPendingIndicator.vue +163 -0
  335. package/src/components/chat/ReasoningStream.vue +112 -0
  336. package/src/components/chat/index.ts +8 -0
  337. package/src/components/shell/SvedaAgentCompletedNotice.vue +25 -0
  338. package/src/components/shell/SvedaAgentTasksPanel.vue +146 -0
  339. package/src/components/shell/SvedaChat.vue +514 -0
  340. package/src/components/shell/SvedaContextUsageBar.vue +33 -0
  341. package/src/components/shell/SvedaHistorySheet.vue +52 -0
  342. package/src/components/shell/SvedaHistorySidebar.vue +41 -0
  343. package/src/components/shell/SvedaInputSection.vue +53 -0
  344. package/src/components/shell/SvedaLandingView.vue +93 -0
  345. package/src/components/shell/SvedaMaxStepsNotice.vue +33 -0
  346. package/src/components/shell/SvedaMinimizedTrigger.vue +43 -0
  347. package/src/components/shell/SvedaModelControls.vue +47 -0
  348. package/src/components/shell/SvedaModelSelect.vue +32 -0
  349. package/src/components/shell/SvedaQuickPrompts.vue +44 -0
  350. package/src/components/shell/SvedaResizeHandles.vue +31 -0
  351. package/src/components/shell/SvedaTabs.vue +123 -0
  352. package/src/components/shell/SvedaToolbar.vue +171 -0
  353. package/src/composables/useSvedaAgentTasks.ts +93 -0
  354. package/src/composables/useSvedaBootstrap.ts +36 -0
  355. package/src/composables/useSvedaChat.ts +593 -0
  356. package/src/composables/useSvedaChatLayout.ts +539 -0
  357. package/src/composables/useSvedaChatPage.ts +339 -0
  358. package/src/composables/useSvedaContextWindow.ts +31 -0
  359. package/src/composables/useSvedaDocuments.ts +115 -0
  360. package/src/composables/useSvedaMaxStepsContinue.ts +68 -0
  361. package/src/composables/useSvedaMessaging.ts +99 -0
  362. package/src/composables/useSvedaModel.ts +85 -0
  363. package/src/composables/useSvedaPrompts.ts +59 -0
  364. package/src/composables/useSvedaReadable.ts +33 -0
  365. package/src/composables/useSvedaScroll.ts +93 -0
  366. package/src/composables/useSvedaShell.ts +91 -0
  367. package/src/composables/useSvedaStreaming.ts +408 -0
  368. package/src/composables/useSvedaTool.ts +18 -0
  369. package/src/i18n/index.ts +72 -0
  370. package/src/i18n/locales/en.ts +58 -0
  371. package/src/i18n/locales/ru.ts +59 -0
  372. package/src/index.ts +141 -0
  373. package/src/launcherIcons.ts +39 -0
  374. package/src/lib/assistantMessage.ts +437 -0
  375. package/src/lib/chatHistoryMerge.ts +93 -0
  376. package/src/lib/chatI18nKeys.ts +62 -0
  377. package/src/lib/chatMessageVisibility.ts +50 -0
  378. package/src/lib/chatTabs.ts +54 -0
  379. package/src/lib/chatTitle.ts +30 -0
  380. package/src/lib/chatUiStorage.ts +33 -0
  381. package/src/lib/finalizeMessages.ts +81 -0
  382. package/src/lib/markdown.ts +90 -0
  383. package/src/lib/modelLabels.ts +24 -0
  384. package/src/lib/pendingStatusRotation.ts +26 -0
  385. package/src/lib/shims-vue.d.ts +6 -0
  386. package/src/lib/useAnimatedText.ts +78 -0
  387. package/src/lib/userMessage.ts +55 -0
  388. package/src/lib/utils.ts +6 -0
  389. package/src/plugin.ts +164 -0
  390. package/src/styles.css +5 -0
  391. package/src/theme.css +95 -0
  392. package/src/theme.test.mjs +80 -0
  393. package/src/ui/alert-dialog/AlertDialog.vue +14 -0
  394. package/src/ui/alert-dialog/AlertDialogAction.vue +17 -0
  395. package/src/ui/alert-dialog/AlertDialogCancel.vue +24 -0
  396. package/src/ui/alert-dialog/AlertDialogContent.vue +39 -0
  397. package/src/ui/alert-dialog/AlertDialogDescription.vue +22 -0
  398. package/src/ui/alert-dialog/AlertDialogFooter.vue +21 -0
  399. package/src/ui/alert-dialog/AlertDialogHeader.vue +16 -0
  400. package/src/ui/alert-dialog/AlertDialogTitle.vue +19 -0
  401. package/src/ui/alert-dialog/AlertDialogTrigger.vue +11 -0
  402. package/src/ui/alert-dialog/index.ts +9 -0
  403. package/src/ui/badge/Badge.vue +16 -0
  404. package/src/ui/badge/index.ts +27 -0
  405. package/src/ui/button/Button.vue +56 -0
  406. package/src/ui/button/index.ts +50 -0
  407. package/src/ui/card/Card.vue +14 -0
  408. package/src/ui/card/CardContent.vue +14 -0
  409. package/src/ui/card/CardDescription.vue +14 -0
  410. package/src/ui/card/CardFooter.vue +14 -0
  411. package/src/ui/card/CardHeader.vue +14 -0
  412. package/src/ui/card/CardTitle.vue +14 -0
  413. package/src/ui/card/index.ts +6 -0
  414. package/src/ui/checkbox/Checkbox.vue +41 -0
  415. package/src/ui/checkbox/index.ts +1 -0
  416. package/src/ui/dialog/Dialog.vue +14 -0
  417. package/src/ui/dialog/DialogClose.vue +11 -0
  418. package/src/ui/dialog/DialogContent.vue +50 -0
  419. package/src/ui/dialog/DialogDescription.vue +24 -0
  420. package/src/ui/dialog/DialogFooter.vue +19 -0
  421. package/src/ui/dialog/DialogHeader.vue +16 -0
  422. package/src/ui/dialog/DialogScrollContent.vue +59 -0
  423. package/src/ui/dialog/DialogTitle.vue +29 -0
  424. package/src/ui/dialog/DialogTrigger.vue +11 -0
  425. package/src/ui/dialog/index.ts +9 -0
  426. package/src/ui/dropdown-menu/DropdownMenu.vue +14 -0
  427. package/src/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +42 -0
  428. package/src/ui/dropdown-menu/DropdownMenuContent.vue +40 -0
  429. package/src/ui/dropdown-menu/DropdownMenuGroup.vue +11 -0
  430. package/src/ui/dropdown-menu/DropdownMenuItem.vue +30 -0
  431. package/src/ui/dropdown-menu/DropdownMenuLabel.vue +21 -0
  432. package/src/ui/dropdown-menu/DropdownMenuRadioGroup.vue +14 -0
  433. package/src/ui/dropdown-menu/DropdownMenuRadioItem.vue +43 -0
  434. package/src/ui/dropdown-menu/DropdownMenuSeparator.vue +21 -0
  435. package/src/ui/dropdown-menu/DropdownMenuShortcut.vue +14 -0
  436. package/src/ui/dropdown-menu/DropdownMenuSub.vue +14 -0
  437. package/src/ui/dropdown-menu/DropdownMenuSubContent.vue +30 -0
  438. package/src/ui/dropdown-menu/DropdownMenuSubTrigger.vue +31 -0
  439. package/src/ui/dropdown-menu/DropdownMenuTrigger.vue +13 -0
  440. package/src/ui/dropdown-menu/index.ts +16 -0
  441. package/src/ui/input/Input.vue +32 -0
  442. package/src/ui/input/index.ts +1 -0
  443. package/src/ui/label/Label.vue +22 -0
  444. package/src/ui/label/index.ts +1 -0
  445. package/src/ui/responsive-dialog/ResponsiveDialog.vue +55 -0
  446. package/src/ui/responsive-dialog/index.ts +1 -0
  447. package/src/ui/scroll-area/ScrollArea.vue +29 -0
  448. package/src/ui/scroll-area/ScrollBar.vue +30 -0
  449. package/src/ui/scroll-area/index.ts +2 -0
  450. package/src/ui/select/Select.vue +15 -0
  451. package/src/ui/select/SelectContent.vue +53 -0
  452. package/src/ui/select/SelectGroup.vue +19 -0
  453. package/src/ui/select/SelectItem.vue +44 -0
  454. package/src/ui/select/SelectItemText.vue +11 -0
  455. package/src/ui/select/SelectLabel.vue +13 -0
  456. package/src/ui/select/SelectScrollDownButton.vue +24 -0
  457. package/src/ui/select/SelectScrollUpButton.vue +24 -0
  458. package/src/ui/select/SelectSeparator.vue +17 -0
  459. package/src/ui/select/SelectTrigger.vue +31 -0
  460. package/src/ui/select/SelectValue.vue +11 -0
  461. package/src/ui/select/index.ts +11 -0
  462. package/src/ui/sheet/Sheet.vue +14 -0
  463. package/src/ui/sheet/SheetClose.vue +11 -0
  464. package/src/ui/sheet/SheetContent.vue +53 -0
  465. package/src/ui/sheet/SheetDescription.vue +19 -0
  466. package/src/ui/sheet/SheetFooter.vue +12 -0
  467. package/src/ui/sheet/SheetHeader.vue +12 -0
  468. package/src/ui/sheet/SheetTitle.vue +19 -0
  469. package/src/ui/sheet/SheetTrigger.vue +11 -0
  470. package/src/ui/sheet/index.ts +29 -0
  471. package/src/ui/switch/Switch.vue +55 -0
  472. package/src/ui/switch/index.ts +1 -0
  473. package/src/ui/textarea/Textarea.vue +24 -0
  474. package/src/ui/textarea/index.ts +1 -0
  475. package/src/ui/toast/Toast.vue +28 -0
  476. package/src/ui/toast/ToastAction.vue +19 -0
  477. package/src/ui/toast/ToastClose.vue +22 -0
  478. package/src/ui/toast/ToastDescription.vue +19 -0
  479. package/src/ui/toast/ToastProvider.vue +11 -0
  480. package/src/ui/toast/ToastTitle.vue +19 -0
  481. package/src/ui/toast/ToastViewport.vue +17 -0
  482. package/src/ui/toast/Toaster.vue +48 -0
  483. package/src/ui/toast/index.ts +39 -0
  484. package/src/ui/toast/use-toast.ts +109 -0
  485. package/src/ui/tooltip/Tooltip.vue +14 -0
  486. package/src/ui/tooltip/TooltipContent.vue +39 -0
  487. package/src/ui/tooltip/TooltipProvider.vue +11 -0
  488. package/src/ui/tooltip/TooltipTrigger.vue +11 -0
  489. package/src/ui/tooltip/index.ts +4 -0
  490. package/src/ui/utils.ts +1 -0
@@ -0,0 +1,571 @@
1
+ <script setup>
2
+ import {
3
+ AlertDialog,
4
+ AlertDialogAction,
5
+ AlertDialogCancel,
6
+ AlertDialogContent,
7
+ AlertDialogDescription,
8
+ AlertDialogFooter,
9
+ AlertDialogHeader,
10
+ AlertDialogTitle,
11
+ } from '../../ui/alert-dialog/index.js';
12
+ import { Badge } from '../../ui/badge/index.js';
13
+ import { Button } from '../../ui/button/index.js';
14
+ import { Textarea } from '../../ui/textarea/index.js';
15
+ import { useToast } from '../../ui/toast/index.js';
16
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip/index.js';
17
+ import { SvedaI18nKey, useSvedaT } from '../../i18n/index.js';
18
+ import { Loader2, Mic, Paperclip, Send, Square, X } from 'lucide-vue-next';
19
+ import { computed, inject, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';
20
+
21
+ const t = useSvedaT();
22
+ const svedaI18n = inject(SvedaI18nKey, null);
23
+ const locale = computed(() => svedaI18n?.locale ?? '');
24
+ const { toast } = useToast();
25
+
26
+ const inputMessage = defineModel('modelValue', {
27
+ type: String,
28
+ default: '',
29
+ });
30
+
31
+ const pendingFiles = defineModel('pendingFiles', {
32
+ type: Array,
33
+ default: () => [],
34
+ });
35
+
36
+ const props = defineProps({
37
+ isLoading: {
38
+ type: Boolean,
39
+ default: false,
40
+ },
41
+ hasCurrentChat: {
42
+ type: Boolean,
43
+ default: false,
44
+ },
45
+ isStreaming: {
46
+ type: Boolean,
47
+ default: false,
48
+ },
49
+ noBorder: {
50
+ type: Boolean,
51
+ default: false,
52
+ },
53
+ statusBanner: {
54
+ type: String,
55
+ default: '',
56
+ },
57
+ acceptFiles: {
58
+ type: String,
59
+ default: '.pdf,.doc,.docx,.xls,.xlsx,.xlsm,.ods,.ppt,.pptx,.pps,.ppsx,.txt,.csv,.jpg,.jpeg,.png,.gif,.webp,.bmp,.tif,.tiff',
60
+ },
61
+ maxFiles: {
62
+ type: Number,
63
+ default: 5,
64
+ },
65
+ });
66
+
67
+ const emit = defineEmits(['send', 'stop']);
68
+
69
+ const textareaRef = ref(null);
70
+ const fileInputRef = ref(null);
71
+ const isDragActive = ref(false);
72
+ let dragDepth = 0;
73
+ const MIN_HEIGHT = 60;
74
+ const MAX_HEIGHT = 250;
75
+
76
+ const speechSupported = computed(() => {
77
+ if (typeof window === 'undefined') return false;
78
+ return Boolean(window.SpeechRecognition || window.webkitSpeechRecognition);
79
+ });
80
+
81
+ const isVoiceInputPreferredBrowser = computed(() => {
82
+ if (typeof navigator === 'undefined') return true;
83
+ const ua = navigator.userAgent || '';
84
+ if (/Edg\//.test(ua) || /EdgiOS/.test(ua)) return true;
85
+ if (/CriOS/.test(ua)) return true;
86
+ if (/Chrome\//.test(ua) && !/Edg\//.test(ua) && !/OPR\//.test(ua) && !/SamsungBrowser/i.test(ua)) {
87
+ return true;
88
+ }
89
+ if (/Safari\//.test(ua) && !/Chrome\//.test(ua) && !/CriOS/.test(ua) && !/Android/.test(ua)) {
90
+ return true;
91
+ }
92
+ return false;
93
+ });
94
+
95
+ const speechLang = computed(() => {
96
+ const l = String(locale.value || '');
97
+ if (l.startsWith('ru')) return 'ru-RU';
98
+ if (l.startsWith('en')) return 'en-US';
99
+ if (typeof navigator !== 'undefined' && navigator.language) return navigator.language;
100
+ return 'en-US';
101
+ });
102
+
103
+ const recognitionRef = ref(null);
104
+ const isListening = ref(false);
105
+ const browserWarningOpen = ref(false);
106
+ const voiceSessionBase = ref('');
107
+
108
+ const joinSpeechParts = (left, right) => {
109
+ if (!right) return left || '';
110
+ if (!left) return right;
111
+ if (/\s$/.test(left) || /^\s/.test(right)) return left + right;
112
+ return `${left} ${right}`;
113
+ };
114
+
115
+ const applyVoiceResults = event => {
116
+ let fullFinal = '';
117
+ let interim = '';
118
+ for (let i = 0; i < event.results.length; i++) {
119
+ const res = event.results[i];
120
+ const text = res[0].transcript;
121
+ if (res.isFinal) {
122
+ fullFinal = joinSpeechParts(fullFinal, text);
123
+ } else {
124
+ interim = joinSpeechParts(interim, text);
125
+ }
126
+ }
127
+ inputMessage.value = joinSpeechParts(joinSpeechParts(voiceSessionBase.value, fullFinal), interim);
128
+ };
129
+
130
+ const resetVoiceSessionState = () => {
131
+ voiceSessionBase.value = '';
132
+ };
133
+
134
+ const ensureRecognition = () => {
135
+ const Ctor = typeof window !== 'undefined' && (window.SpeechRecognition || window.webkitSpeechRecognition);
136
+ if (!Ctor) return null;
137
+ if (recognitionRef.value) return recognitionRef.value;
138
+ const recognition = new Ctor();
139
+ recognition.continuous = true;
140
+ recognition.interimResults = true;
141
+
142
+ recognition.onresult = event => {
143
+ applyVoiceResults(event);
144
+ };
145
+
146
+ recognition.onerror = event => {
147
+ if (event.error === 'aborted' || event.error === 'no-speech') return;
148
+ isListening.value = false;
149
+ if (event.error === 'not-allowed') {
150
+ toast({
151
+ title: t('voiceInputError'),
152
+ description: t('voiceInputPermissionDenied'),
153
+ variant: 'destructive',
154
+ });
155
+ } else {
156
+ toast({
157
+ title: t('voiceInputError'),
158
+ description: t('voiceInputErrorGeneric'),
159
+ variant: 'destructive',
160
+ });
161
+ }
162
+ };
163
+
164
+ recognition.onend = () => {
165
+ if (isListening.value) {
166
+ try {
167
+ recognition.start();
168
+ } catch {
169
+ isListening.value = false;
170
+ resetVoiceSessionState();
171
+ }
172
+ } else {
173
+ resetVoiceSessionState();
174
+ }
175
+ };
176
+
177
+ recognitionRef.value = recognition;
178
+ return recognition;
179
+ };
180
+
181
+ const stopVoiceInput = () => {
182
+ isListening.value = false;
183
+ const r = recognitionRef.value;
184
+ if (r) {
185
+ try {
186
+ r.stop();
187
+ } catch {
188
+ try {
189
+ r.abort();
190
+ } catch {}
191
+ }
192
+ }
193
+ };
194
+
195
+ const startVoiceInput = () => {
196
+ const recognition = ensureRecognition();
197
+ if (!recognition) {
198
+ toast({
199
+ title: t('voiceInputError'),
200
+ description: t('voiceInputUnsupported'),
201
+ variant: 'destructive',
202
+ });
203
+ return;
204
+ }
205
+ recognition.lang = speechLang.value;
206
+ voiceSessionBase.value = inputMessage.value;
207
+ try {
208
+ recognition.start();
209
+ isListening.value = true;
210
+ } catch {
211
+ isListening.value = false;
212
+ resetVoiceSessionState();
213
+ toast({
214
+ title: t('voiceInputError'),
215
+ description: t('voiceInputErrorGeneric'),
216
+ variant: 'destructive',
217
+ });
218
+ }
219
+ };
220
+
221
+ const confirmBrowserWarningAndStart = () => {
222
+ browserWarningOpen.value = false;
223
+ startVoiceInput();
224
+ };
225
+
226
+ const onVoiceMicClick = () => {
227
+ if (!isVoiceInputPreferredBrowser.value) {
228
+ browserWarningOpen.value = true;
229
+ } else {
230
+ startVoiceInput();
231
+ }
232
+ };
233
+
234
+ const voiceInputDisabled = computed(() => props.isLoading || !props.hasCurrentChat || props.isStreaming);
235
+
236
+ const attachmentToolbarDisabled = computed(() => props.isLoading || !props.hasCurrentChat || props.isStreaming || isListening.value);
237
+
238
+ const normalizePendingList = raw => {
239
+ if (!Array.isArray(raw)) {
240
+ return [];
241
+ }
242
+ return raw.filter(entry => entry instanceof File);
243
+ };
244
+
245
+ const mergeFileList = incoming => {
246
+ const base = normalizePendingList(pendingFiles.value);
247
+ const merged = [...base];
248
+ const seen = new Set(base.map(f => `${f.name}:${f.size}:${f.lastModified}`));
249
+ for (const file of incoming) {
250
+ if (!(file instanceof File)) continue;
251
+ const key = `${file.name}:${file.size}:${file.lastModified}`;
252
+ if (seen.has(key)) continue;
253
+ seen.add(key);
254
+ merged.push(file);
255
+ }
256
+ return merged.slice(0, props.maxFiles);
257
+ };
258
+
259
+ const queueFilesFromList = fileList => {
260
+ const next = mergeFileList(Array.from(fileList || []));
261
+ pendingFiles.value = next;
262
+ };
263
+
264
+ const openFilePicker = () => {
265
+ if (attachmentToolbarDisabled.value) return;
266
+ fileInputRef.value?.click?.();
267
+ };
268
+
269
+ const removePendingAt = index => {
270
+ const list = normalizePendingList(pendingFiles.value);
271
+ list.splice(index, 1);
272
+ pendingFiles.value = [...list];
273
+ };
274
+
275
+ const onFileInputChange = event => {
276
+ const inputEl = event?.target;
277
+ queueFilesFromList(inputEl?.files);
278
+ if (inputEl) {
279
+ inputEl.value = '';
280
+ }
281
+ };
282
+
283
+ const onDragEnter = e => {
284
+ if (attachmentToolbarDisabled.value) return;
285
+ e.preventDefault();
286
+ dragDepth += 1;
287
+ isDragActive.value = true;
288
+ };
289
+
290
+ const onDragLeave = e => {
291
+ if (attachmentToolbarDisabled.value) return;
292
+ e.preventDefault();
293
+ dragDepth = Math.max(0, dragDepth - 1);
294
+ if (dragDepth === 0) {
295
+ isDragActive.value = false;
296
+ }
297
+ };
298
+
299
+ const onDragOver = e => {
300
+ if (attachmentToolbarDisabled.value) return;
301
+ e.preventDefault();
302
+ };
303
+
304
+ const onDrop = e => {
305
+ if (attachmentToolbarDisabled.value) return;
306
+ e.preventDefault();
307
+ dragDepth = 0;
308
+ isDragActive.value = false;
309
+ queueFilesFromList(e.dataTransfer?.files);
310
+ };
311
+
312
+ const onPaste = e => {
313
+ if (attachmentToolbarDisabled.value || isListening.value) return;
314
+ const dt = e.clipboardData;
315
+ const files = dt?.files?.length ? Array.from(dt.files) : [];
316
+ if (files.length === 0) return;
317
+ e.preventDefault();
318
+ queueFilesFromList(files);
319
+ };
320
+
321
+ const canSend = computed(() => {
322
+ const hasText = Boolean(String(inputMessage.value || '').trim());
323
+ const hasFiles = normalizePendingList(pendingFiles.value).length > 0;
324
+ return (hasText || hasFiles) && props.hasCurrentChat;
325
+ });
326
+
327
+ const hasStatusBanner = computed(() => String(props.statusBanner || '').trim() !== '');
328
+ const controlIconClass = 'h-4 w-4';
329
+
330
+ const micIdleButtonClass = 'h-8 w-8 rounded-[var(--sveda-radius)] text-muted-foreground hover:text-foreground';
331
+
332
+ const micStopButtonClass = 'h-8 w-8 rounded-[var(--sveda-radius)] text-destructive hover:bg-destructive/10 hover:text-destructive';
333
+
334
+ const sendButtonClass =
335
+ 'h-8 w-8 rounded-[var(--sveda-radius)] text-brand-primary-purple hover:bg-brand-primary-purple/10 hover:text-brand-primary-purple disabled:opacity-50 dark:text-purple-400 dark:hover:bg-purple-400/10 dark:hover:text-purple-300';
336
+
337
+ const streamStopButtonClass = 'h-8 w-8 rounded-[var(--sveda-radius)] text-destructive hover:bg-destructive/10 hover:text-destructive';
338
+
339
+ const controlToolbarClass = 'flex items-center justify-between px-2';
340
+
341
+ const adjustTextareaHeight = () => {
342
+ nextTick(() => {
343
+ if (textareaRef.value) {
344
+ const textarea = textareaRef.value.$el;
345
+ if (textarea && textarea.tagName === 'TEXTAREA') {
346
+ textarea.style.height = 'auto';
347
+ const scrollHeight = textarea.scrollHeight;
348
+ const newHeight = Math.min(Math.max(scrollHeight, MIN_HEIGHT), MAX_HEIGHT);
349
+ textarea.style.height = `${newHeight}px`;
350
+ textarea.style.overflowY = scrollHeight > MAX_HEIGHT ? 'auto' : 'hidden';
351
+ }
352
+ }
353
+ });
354
+ };
355
+
356
+ watch(
357
+ () => inputMessage.value,
358
+ () => {
359
+ adjustTextareaHeight();
360
+ }
361
+ );
362
+
363
+ onMounted(() => {
364
+ adjustTextareaHeight();
365
+ });
366
+
367
+ onBeforeUnmount(() => {
368
+ isListening.value = false;
369
+ resetVoiceSessionState();
370
+ const r = recognitionRef.value;
371
+ if (r) {
372
+ try {
373
+ r.abort();
374
+ } catch {}
375
+ recognitionRef.value = null;
376
+ }
377
+ });
378
+
379
+ const handleKeyPress = event => {
380
+ if (event.key === 'Enter' && !event.shiftKey) {
381
+ event.preventDefault();
382
+ emit('send');
383
+ }
384
+ };
385
+
386
+ const handleInput = () => {
387
+ adjustTextareaHeight();
388
+ };
389
+ </script>
390
+
391
+ <template>
392
+ <div
393
+ :class="
394
+ noBorder
395
+ ? 'flex flex-shrink-0 flex-col bg-transparent p-4'
396
+ : 'sveda-chat-surface flex flex-shrink-0 flex-col border-t border-border/50 p-4 dark:border-slate-700'
397
+ "
398
+ >
399
+ <div
400
+ v-if="hasStatusBanner"
401
+ class="mb-3 flex items-center gap-2 rounded-lg border border-border/50 bg-muted/50 px-3 py-2 text-sm text-muted-foreground"
402
+ >
403
+ <Loader2 class="h-4 w-4 shrink-0 animate-spin" />
404
+ <span class="leading-snug">{{ statusBanner }}</span>
405
+ </div>
406
+ <input
407
+ ref="fileInputRef"
408
+ type="file"
409
+ class="hidden"
410
+ :accept="acceptFiles"
411
+ multiple
412
+ @change="onFileInputChange"
413
+ />
414
+ <div
415
+ class="border-input-transparent relative flex flex-col rounded-[var(--sveda-radius)] border bg-background shadow-sm transition-colors"
416
+ :class="isDragActive && !attachmentToolbarDisabled ? 'border-brand-primary-purple/70 ring-1 ring-brand-primary-purple/30' : ''"
417
+ @dragenter="onDragEnter"
418
+ @dragleave="onDragLeave"
419
+ @dragover="onDragOver"
420
+ @drop="onDrop"
421
+ >
422
+ <div
423
+ v-if="normalizePendingList(pendingFiles).length > 0"
424
+ class="flex flex-wrap gap-2 border-b border-border/40 px-3 py-2"
425
+ >
426
+ <Badge
427
+ v-for="(file, idx) in normalizePendingList(pendingFiles)"
428
+ :key="`${file.name}-${file.size}-${idx}`"
429
+ variant="secondary"
430
+ class="max-w-[min(100%,14rem)] gap-1 pr-1"
431
+ >
432
+ <span class="truncate">{{ file.name }}</span>
433
+ <button
434
+ type="button"
435
+ class="rounded-[var(--sveda-radius)] p-0.5 hover:bg-muted"
436
+ :disabled="attachmentToolbarDisabled"
437
+ :aria-label="t('chatRemoveFile')"
438
+ @click="removePendingAt(idx)"
439
+ >
440
+ <X class="h-3 w-3" />
441
+ </button>
442
+ </Badge>
443
+ </div>
444
+ <Textarea
445
+ ref="textareaRef"
446
+ v-model="inputMessage"
447
+ @input="handleInput"
448
+ @keypress="handleKeyPress"
449
+ @paste="onPaste"
450
+ :placeholder="t('typeMessage')"
451
+ :disabled="isLoading"
452
+ :readonly="isListening"
453
+ class="sveda-chat-input-textarea max-h-[250px] min-h-[60px] w-full resize-none border-0 bg-transparent p-3 shadow-none !outline-none !ring-0 focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0"
454
+ style="height: 60px; outline: none; box-shadow: none"
455
+ />
456
+
457
+ <div :class="controlToolbarClass">
458
+ <div class="flex min-w-0 flex-1 items-center gap-1">
459
+ <TooltipProvider>
460
+ <Tooltip>
461
+ <TooltipTrigger as-child>
462
+ <Button
463
+ type="button"
464
+ variant="ghost"
465
+ size="icon"
466
+ :class="micIdleButtonClass"
467
+ :disabled="attachmentToolbarDisabled"
468
+ @click="openFilePicker"
469
+ >
470
+ <Paperclip :class="controlIconClass" />
471
+ </Button>
472
+ </TooltipTrigger>
473
+ <TooltipContent>
474
+ <p>{{ t('chatAttachFiles') }}</p>
475
+ </TooltipContent>
476
+ </Tooltip>
477
+ </TooltipProvider>
478
+ <div class="min-w-0 flex-1">
479
+ <slot name="bottom-left"></slot>
480
+ </div>
481
+ </div>
482
+
483
+ <div class="flex items-center gap-1">
484
+ <TooltipProvider v-if="speechSupported && !isStreaming">
485
+ <Tooltip v-if="!isListening">
486
+ <TooltipTrigger as-child>
487
+ <Button
488
+ type="button"
489
+ variant="ghost"
490
+ size="icon"
491
+ :class="micIdleButtonClass"
492
+ :disabled="voiceInputDisabled"
493
+ @click="onVoiceMicClick"
494
+ >
495
+ <Mic :class="controlIconClass" />
496
+ </Button>
497
+ </TooltipTrigger>
498
+ <TooltipContent>
499
+ <p>{{ t('voiceInputStart') }}</p>
500
+ </TooltipContent>
501
+ </Tooltip>
502
+ <Tooltip v-else>
503
+ <TooltipTrigger as-child>
504
+ <Button
505
+ type="button"
506
+ variant="ghost"
507
+ size="icon"
508
+ :class="micStopButtonClass"
509
+ @click="stopVoiceInput"
510
+ >
511
+ <Square :class="controlIconClass" />
512
+ </Button>
513
+ </TooltipTrigger>
514
+ <TooltipContent>
515
+ <p>{{ t('voiceInputStop') }}</p>
516
+ </TooltipContent>
517
+ </Tooltip>
518
+ </TooltipProvider>
519
+
520
+ <Button
521
+ v-if="isStreaming"
522
+ variant="ghost"
523
+ @click="$emit('stop')"
524
+ size="icon"
525
+ :class="streamStopButtonClass"
526
+ >
527
+ <Square :class="controlIconClass" />
528
+ </Button>
529
+ <Button
530
+ v-else
531
+ variant="ghost"
532
+ @click="$emit('send')"
533
+ :disabled="isLoading || !canSend"
534
+ size="icon"
535
+ :class="sendButtonClass"
536
+ >
537
+ <Loader2
538
+ v-if="isLoading"
539
+ :class="[controlIconClass, 'animate-spin']"
540
+ />
541
+ <Send
542
+ v-else
543
+ :class="controlIconClass"
544
+ />
545
+ </Button>
546
+ </div>
547
+ </div>
548
+ </div>
549
+
550
+ <div class="mt-2">
551
+ <slot name="bottom-outside"></slot>
552
+ </div>
553
+
554
+ <AlertDialog v-model:open="browserWarningOpen">
555
+ <AlertDialogContent>
556
+ <AlertDialogHeader>
557
+ <AlertDialogTitle>{{ t('voiceInputBrowserWarningTitle') }}</AlertDialogTitle>
558
+ <AlertDialogDescription>
559
+ {{ t('voiceInputBrowserWarningDescription') }}
560
+ </AlertDialogDescription>
561
+ </AlertDialogHeader>
562
+ <AlertDialogFooter>
563
+ <AlertDialogCancel>{{ t('cancel') }}</AlertDialogCancel>
564
+ <AlertDialogAction @click="confirmBrowserWarningAndStart">
565
+ {{ t('voiceInputBrowserWarningContinue') }}
566
+ </AlertDialogAction>
567
+ </AlertDialogFooter>
568
+ </AlertDialogContent>
569
+ </AlertDialog>
570
+ </div>
571
+ </template>