dou-ui 0.1.0-alpha.2 → 0.1.0-alpha.4

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 (459) hide show
  1. package/dist/components/button/button.js.map +1 -1
  2. package/dist/components/button/button.vue_vue_type_script_setup_true_lang.js +2 -1
  3. package/dist/components/button/button.vue_vue_type_script_setup_true_lang.js.map +1 -1
  4. package/dist/components/calendar-view/calendar-view.js.map +1 -1
  5. package/dist/components/calendar-view/calendar-view.vue_vue_type_script_setup_true_lang.js +7 -2
  6. package/dist/components/calendar-view/calendar-view.vue_vue_type_script_setup_true_lang.js.map +1 -1
  7. package/dist/components/card/card.js.map +1 -1
  8. package/dist/components/card/card.vue_vue_type_script_setup_true_lang.js +45 -19
  9. package/dist/components/card/card.vue_vue_type_script_setup_true_lang.js.map +1 -1
  10. package/dist/components/cascader/cascader.js.map +1 -1
  11. package/dist/components/cascader/cascader.vue_vue_type_script_setup_true_lang.js +3 -3
  12. package/dist/components/cascader/cascader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  13. package/dist/components/chat-artifact/chat-artifact.js.map +1 -1
  14. package/dist/components/chat-artifact/chat-artifact.vue_vue_type_script_setup_true_lang.js +8 -2
  15. package/dist/components/chat-artifact/chat-artifact.vue_vue_type_script_setup_true_lang.js.map +1 -1
  16. package/dist/components/chat-attachments/chat-attachments.js.map +1 -1
  17. package/dist/components/chat-attachments/chat-attachments.vue_vue_type_script_setup_true_lang.js +11 -2
  18. package/dist/components/chat-attachments/chat-attachments.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/components/chat-attachments/chat-attachments2.js.map +1 -1
  20. package/dist/components/chat-confirm/chat-confirm.js.map +1 -1
  21. package/dist/components/chat-confirm/chat-confirm.vue_vue_type_script_setup_true_lang.js +40 -17
  22. package/dist/components/chat-confirm/chat-confirm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  23. package/dist/components/chat-context-meter/chat-context-meter.vue_vue_type_script_setup_true_lang.js +2 -2
  24. package/dist/components/chat-context-meter/chat-context-meter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  25. package/dist/components/chat-context-meter/chat-context-meter2.js.map +1 -1
  26. package/dist/components/chat-input/chat-input.js.map +1 -1
  27. package/dist/components/chat-input/chat-input.vue_vue_type_script_setup_true_lang.js +75 -7
  28. package/dist/components/chat-input/chat-input.vue_vue_type_script_setup_true_lang.js.map +1 -1
  29. package/dist/components/chat-input/chat-input2.js.map +1 -1
  30. package/dist/components/chat-list/chat-list.js +9 -4
  31. package/dist/components/chat-list/chat-list.js.map +1 -1
  32. package/dist/components/chat-list/chat-list.vue_vue_type_script_setup_true_lang.js +34 -0
  33. package/dist/components/chat-list/chat-list.vue_vue_type_script_setup_true_lang.js.map +1 -1
  34. package/dist/components/chat-list/chat-list2.js +6 -0
  35. package/dist/components/chat-list/chat-list2.js.map +1 -0
  36. package/dist/components/chat-list/index.js +1 -1
  37. package/dist/components/chat-message/chat-message.js.map +1 -1
  38. package/dist/components/chat-message/chat-message.vue_vue_type_script_setup_true_lang.js +119 -39
  39. package/dist/components/chat-message/chat-message.vue_vue_type_script_setup_true_lang.js.map +1 -1
  40. package/dist/components/chat-message/chat-message2.js.map +1 -1
  41. package/dist/components/chat-message/style.js +6 -0
  42. package/dist/components/chat-plan/chat-plan.js +9 -4
  43. package/dist/components/chat-plan/chat-plan.js.map +1 -1
  44. package/dist/components/chat-plan/chat-plan.vue_vue_type_script_setup_true_lang.js +64 -32
  45. package/dist/components/chat-plan/chat-plan.vue_vue_type_script_setup_true_lang.js.map +1 -1
  46. package/dist/components/chat-plan/chat-plan2.js +6 -0
  47. package/dist/components/chat-plan/chat-plan2.js.map +1 -0
  48. package/dist/components/chat-plan/index.js +1 -1
  49. package/dist/components/chat-plan/style.js +1 -0
  50. package/dist/components/chat-question/chat-question.js +6 -0
  51. package/dist/components/chat-question/chat-question.js.map +1 -0
  52. package/dist/components/chat-question/chat-question.vue_vue_type_script_setup_true_lang.js +116 -0
  53. package/dist/components/chat-question/chat-question.vue_vue_type_script_setup_true_lang.js.map +1 -0
  54. package/dist/components/chat-question/index.js +7 -0
  55. package/dist/components/chat-question/index.js.map +1 -0
  56. package/dist/components/chat-question/style.d.ts +1 -0
  57. package/dist/components/chat-question/style.js +2 -0
  58. package/dist/components/chat-reasoning/chat-reasoning.js.map +1 -1
  59. package/dist/components/chat-reasoning/chat-reasoning.vue_vue_type_script_setup_true_lang.js +4 -4
  60. package/dist/components/chat-reasoning/chat-reasoning.vue_vue_type_script_setup_true_lang.js.map +1 -1
  61. package/dist/components/chat-sources/chat-citation.js.map +1 -1
  62. package/dist/components/chat-sources/chat-citation.vue_vue_type_script_setup_true_lang.js +52 -14
  63. package/dist/components/chat-sources/chat-citation.vue_vue_type_script_setup_true_lang.js.map +1 -1
  64. package/dist/components/chat-sources/chat-sources.js.map +1 -1
  65. package/dist/components/chat-sources/chat-sources.vue_vue_type_script_setup_true_lang.js +6 -4
  66. package/dist/components/chat-sources/chat-sources.vue_vue_type_script_setup_true_lang.js.map +1 -1
  67. package/dist/components/chat-sources/chat-sources2.js.map +1 -1
  68. package/dist/components/chat-sources/index.js +1 -1
  69. package/dist/components/chat-steps/chat-steps.js +9 -4
  70. package/dist/components/chat-steps/chat-steps.js.map +1 -1
  71. package/dist/components/chat-steps/chat-steps.vue_vue_type_script_setup_true_lang.js +20 -13
  72. package/dist/components/chat-steps/chat-steps.vue_vue_type_script_setup_true_lang.js.map +1 -1
  73. package/dist/components/chat-steps/chat-steps2.js +6 -0
  74. package/dist/components/chat-steps/chat-steps2.js.map +1 -0
  75. package/dist/components/chat-steps/index.js +1 -1
  76. package/dist/components/chat-steps/style.js +1 -0
  77. package/dist/components/chat-tool-call/chat-tool-call.js.map +1 -1
  78. package/dist/components/chat-tool-call/chat-tool-call.vue_vue_type_script_setup_true_lang.js +38 -12
  79. package/dist/components/chat-tool-call/chat-tool-call.vue_vue_type_script_setup_true_lang.js.map +1 -1
  80. package/dist/components/chat-tool-call/chat-tool-call2.js.map +1 -1
  81. package/dist/components/chat-tool-call/style.js +1 -0
  82. package/dist/components/code-block/code-block.js.map +1 -1
  83. package/dist/components/code-block/code-block.vue_vue_type_script_setup_true_lang.js +37 -5
  84. package/dist/components/code-block/code-block.vue_vue_type_script_setup_true_lang.js.map +1 -1
  85. package/dist/components/collapse/collapse-item.js.map +1 -1
  86. package/dist/components/collapse/collapse-item.vue_vue_type_script_setup_true_lang.js +2 -2
  87. package/dist/components/collapse/collapse-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  88. package/dist/components/collapse/collapse-transition.js +3 -1
  89. package/dist/components/collapse/collapse-transition.js.map +1 -1
  90. package/dist/components/collapse/index.js +1 -2
  91. package/dist/components/collapse/index.js.map +1 -1
  92. package/dist/components/color-mode/color-mode-button.js.map +1 -1
  93. package/dist/components/color-mode/color-mode-button.vue_vue_type_script_setup_true_lang.js +2 -2
  94. package/dist/components/color-mode/color-mode-button.vue_vue_type_script_setup_true_lang.js.map +1 -1
  95. package/dist/components/color-mode/color-mode-select.js.map +1 -1
  96. package/dist/components/color-mode/color-mode-select.vue_vue_type_script_setup_true_lang.js +2 -2
  97. package/dist/components/color-mode/color-mode-select.vue_vue_type_script_setup_true_lang.js.map +1 -1
  98. package/dist/components/color-mode/color-mode-switch.js.map +1 -1
  99. package/dist/components/color-mode/color-mode-switch.vue_vue_type_script_setup_true_lang.js +2 -2
  100. package/dist/components/color-mode/color-mode-switch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  101. package/dist/components/color-panel/color-panel.js.map +1 -1
  102. package/dist/components/color-panel/color-panel.vue_vue_type_script_setup_true_lang.js +5 -5
  103. package/dist/components/color-panel/color-panel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  104. package/dist/components/color-picker/color-picker.js.map +1 -1
  105. package/dist/components/color-picker/color-picker.vue_vue_type_script_setup_true_lang.js +2 -2
  106. package/dist/components/color-picker/color-picker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  107. package/dist/components/comment-thread/comment-thread.js.map +1 -1
  108. package/dist/components/comment-thread/comment-thread.vue_vue_type_script_setup_true_lang.js +19 -15
  109. package/dist/components/comment-thread/comment-thread.vue_vue_type_script_setup_true_lang.js.map +1 -1
  110. package/dist/components/comment-thread/style.js +2 -0
  111. package/dist/components/config-provider/use-config.js +5 -2
  112. package/dist/components/config-provider/use-config.js.map +1 -1
  113. package/dist/components/context-menu/context-menu.js.map +1 -1
  114. package/dist/components/context-menu/context-menu.vue_vue_type_script_setup_true_lang.js +26 -11
  115. package/dist/components/context-menu/context-menu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  116. package/dist/components/context-menu/index.js +2 -0
  117. package/dist/components/context-menu/index.js.map +1 -1
  118. package/dist/components/copy-button/copy-button.vue_vue_type_script_setup_true_lang.js +1 -1
  119. package/dist/components/descriptions/descriptions.js.map +1 -1
  120. package/dist/components/descriptions/descriptions.vue_vue_type_script_setup_true_lang.js +3 -1
  121. package/dist/components/descriptions/descriptions.vue_vue_type_script_setup_true_lang.js.map +1 -1
  122. package/dist/components/descriptions/descriptions2.js.map +1 -1
  123. package/dist/components/dialog/functional.js +3 -7
  124. package/dist/components/dialog/functional.js.map +1 -1
  125. package/dist/components/dialog/index.js +4 -3
  126. package/dist/components/dialog/index.js.map +1 -1
  127. package/dist/components/dropdown/dropdown-button.js.map +1 -1
  128. package/dist/components/dropdown/dropdown-button.vue_vue_type_script_setup_true_lang.js +5 -5
  129. package/dist/components/dropdown/dropdown-button.vue_vue_type_script_setup_true_lang.js.map +1 -1
  130. package/dist/components/dropdown/dropdown-group.js +6 -0
  131. package/dist/components/dropdown/dropdown-group.js.map +1 -0
  132. package/dist/components/dropdown/dropdown-group.vue_vue_type_script_setup_true_lang.js +42 -0
  133. package/dist/components/dropdown/dropdown-group.vue_vue_type_script_setup_true_lang.js.map +1 -0
  134. package/dist/components/dropdown/dropdown-item.js.map +1 -1
  135. package/dist/components/dropdown/dropdown-item.vue_vue_type_script_setup_true_lang.js +31 -9
  136. package/dist/components/dropdown/dropdown-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  137. package/dist/components/dropdown/dropdown-items.js.map +1 -1
  138. package/dist/components/dropdown/dropdown-items.vue_vue_type_script_setup_true_lang.js +77 -52
  139. package/dist/components/dropdown/dropdown-items.vue_vue_type_script_setup_true_lang.js.map +1 -1
  140. package/dist/components/dropdown/dropdown-radio-group.js.map +1 -1
  141. package/dist/components/dropdown/dropdown-radio-group.vue_vue_type_script_setup_true_lang.js +23 -5
  142. package/dist/components/dropdown/dropdown-radio-group.vue_vue_type_script_setup_true_lang.js.map +1 -1
  143. package/dist/components/dropdown/dropdown-sub.js.map +1 -1
  144. package/dist/components/dropdown/dropdown-sub.vue_vue_type_script_setup_true_lang.js +5 -4
  145. package/dist/components/dropdown/dropdown-sub.vue_vue_type_script_setup_true_lang.js.map +1 -1
  146. package/dist/components/dropdown/dropdown.js.map +1 -1
  147. package/dist/components/dropdown/dropdown.vue_vue_type_script_setup_true_lang.js +2 -1
  148. package/dist/components/dropdown/dropdown.vue_vue_type_script_setup_true_lang.js.map +1 -1
  149. package/dist/components/dropdown/dropdown2.js.map +1 -1
  150. package/dist/components/dropdown/index.js +4 -5
  151. package/dist/components/dropdown/index.js.map +1 -1
  152. package/dist/components/dropdown/item-components.js +11 -0
  153. package/dist/components/dropdown/item-components.js.map +1 -0
  154. package/dist/components/dropdown/menu-entries.js +14 -0
  155. package/dist/components/dropdown/menu-entries.js.map +1 -0
  156. package/dist/components/dropdown/menu-keys.js +1 -1
  157. package/dist/components/dropdown/menu-keys.js.map +1 -1
  158. package/dist/components/ellipsis/ellipsis.js.map +1 -1
  159. package/dist/components/ellipsis/ellipsis.vue_vue_type_script_setup_true_lang.js +2 -2
  160. package/dist/components/ellipsis/ellipsis.vue_vue_type_script_setup_true_lang.js.map +1 -1
  161. package/dist/components/image/image.js.map +1 -1
  162. package/dist/components/image/image.vue_vue_type_script_setup_true_lang.js +10 -1
  163. package/dist/components/image/image.vue_vue_type_script_setup_true_lang.js.map +1 -1
  164. package/dist/components/image-cropper/image-cropper.js.map +1 -1
  165. package/dist/components/image-cropper/image-cropper.vue_vue_type_script_setup_true_lang.js +10 -10
  166. package/dist/components/image-cropper/image-cropper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  167. package/dist/components/infinite-scroll/infinite-scroll.js.map +1 -1
  168. package/dist/components/infinite-scroll/infinite-scroll.vue_vue_type_script_setup_true_lang.js +2 -2
  169. package/dist/components/infinite-scroll/infinite-scroll.vue_vue_type_script_setup_true_lang.js.map +1 -1
  170. package/dist/components/input-date/segment-field.js.map +1 -1
  171. package/dist/components/input-date/segment-field.vue_vue_type_script_setup_true_lang.js +2 -2
  172. package/dist/components/input-date/segment-field.vue_vue_type_script_setup_true_lang.js.map +1 -1
  173. package/dist/components/input-date/style.js +1 -0
  174. package/dist/components/input-time/style.js +1 -0
  175. package/dist/components/layout/layout-aside-trigger.js.map +1 -1
  176. package/dist/components/layout/layout-aside-trigger.vue_vue_type_script_setup_true_lang.js +2 -2
  177. package/dist/components/layout/layout-aside-trigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  178. package/dist/components/layout/layout-aside.js.map +1 -1
  179. package/dist/components/layout/layout-aside.vue_vue_type_script_setup_true_lang.js +3 -3
  180. package/dist/components/layout/layout-aside.vue_vue_type_script_setup_true_lang.js.map +1 -1
  181. package/dist/components/layout/layout-footer.js.map +1 -1
  182. package/dist/components/layout/layout-footer.vue_vue_type_script_setup_true_lang.js +5 -1
  183. package/dist/components/layout/layout-footer.vue_vue_type_script_setup_true_lang.js.map +1 -1
  184. package/dist/components/layout/layout.js.map +1 -1
  185. package/dist/components/link/link.js.map +1 -1
  186. package/dist/components/link/link.vue_vue_type_script_setup_true_lang.js +116 -31
  187. package/dist/components/link/link.vue_vue_type_script_setup_true_lang.js.map +1 -1
  188. package/dist/components/markdown/index.js +9 -0
  189. package/dist/components/markdown/index.js.map +1 -0
  190. package/dist/components/markdown/markdown.js +6 -0
  191. package/dist/components/markdown/markdown.js.map +1 -0
  192. package/dist/components/markdown/markdown.vue_vue_type_script_setup_true_lang.js +225 -0
  193. package/dist/components/markdown/markdown.vue_vue_type_script_setup_true_lang.js.map +1 -0
  194. package/dist/components/markdown/parse-block.js +577 -0
  195. package/dist/components/markdown/parse-block.js.map +1 -0
  196. package/dist/components/markdown/parse-inline.js +626 -0
  197. package/dist/components/markdown/parse-inline.js.map +1 -0
  198. package/dist/components/markdown/parser.js +308 -0
  199. package/dist/components/markdown/parser.js.map +1 -0
  200. package/dist/components/markdown/render.js +424 -0
  201. package/dist/components/markdown/render.js.map +1 -0
  202. package/dist/components/markdown/style.d.ts +1 -0
  203. package/dist/components/markdown/style.js +10 -0
  204. package/dist/components/markdown/url.js +16 -0
  205. package/dist/components/markdown/url.js.map +1 -0
  206. package/dist/components/menu/menu-actions.js +65 -0
  207. package/dist/components/menu/menu-actions.js.map +1 -0
  208. package/dist/components/menu/menu-item.js.map +1 -1
  209. package/dist/components/menu/menu-item.vue_vue_type_script_setup_true_lang.js +52 -13
  210. package/dist/components/menu/menu-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  211. package/dist/components/menu/menu-list.js.map +1 -1
  212. package/dist/components/menu/menu-list.vue_vue_type_script_setup_true_lang.js +33 -18
  213. package/dist/components/menu/menu-list.vue_vue_type_script_setup_true_lang.js.map +1 -1
  214. package/dist/components/menu/menu-popup.js.map +1 -1
  215. package/dist/components/menu/menu-popup.vue_vue_type_script_setup_true_lang.js +60 -19
  216. package/dist/components/menu/menu-popup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  217. package/dist/components/menu/menu.js +17 -13
  218. package/dist/components/menu/menu.js.map +1 -1
  219. package/dist/components/menu/menu.vue_vue_type_script_setup_true_lang.js +9 -2
  220. package/dist/components/menu/menu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  221. package/dist/components/menu/menu2.js.map +1 -1
  222. package/dist/components/menubar/menubar.js.map +1 -1
  223. package/dist/components/node-graph/layout.js +251 -38
  224. package/dist/components/node-graph/layout.js.map +1 -1
  225. package/dist/components/node-graph/node-graph-legend.js.map +1 -1
  226. package/dist/components/node-graph/node-graph-legend.vue_vue_type_script_setup_true_lang.js +5 -5
  227. package/dist/components/node-graph/node-graph-legend.vue_vue_type_script_setup_true_lang.js.map +1 -1
  228. package/dist/components/node-graph/node-graph.js.map +1 -1
  229. package/dist/components/node-graph/node-graph.vue_vue_type_script_setup_true_lang.js +3 -3
  230. package/dist/components/node-graph/node-graph.vue_vue_type_script_setup_true_lang.js.map +1 -1
  231. package/dist/components/pagination/pagination-gap.js.map +1 -1
  232. package/dist/components/pagination/pagination-gap.vue_vue_type_script_setup_true_lang.js +2 -2
  233. package/dist/components/pagination/pagination-gap.vue_vue_type_script_setup_true_lang.js.map +1 -1
  234. package/dist/components/pagination/pagination.js.map +1 -1
  235. package/dist/components/pagination/pagination.vue_vue_type_script_setup_true_lang.js +7 -7
  236. package/dist/components/pagination/pagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  237. package/dist/components/popconfirm/index.js +2 -0
  238. package/dist/components/popconfirm/index.js.map +1 -1
  239. package/dist/components/popconfirm/popconfirm.js.map +1 -1
  240. package/dist/components/popconfirm/popconfirm.vue_vue_type_script_setup_true_lang.js +6 -2
  241. package/dist/components/popconfirm/popconfirm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  242. package/dist/components/popover/index.js +2 -0
  243. package/dist/components/popover/index.js.map +1 -1
  244. package/dist/components/popover/popover.js.map +1 -1
  245. package/dist/components/popover/popover.vue_vue_type_script_setup_true_lang.js +12 -5
  246. package/dist/components/popover/popover.vue_vue_type_script_setup_true_lang.js.map +1 -1
  247. package/dist/components/progress-group/progress-group.js.map +1 -1
  248. package/dist/components/progress-group/progress-group.vue_vue_type_script_setup_true_lang.js +11 -4
  249. package/dist/components/progress-group/progress-group.vue_vue_type_script_setup_true_lang.js.map +1 -1
  250. package/dist/components/qrcode/qrcode.js.map +1 -1
  251. package/dist/components/qrcode/qrcode.vue_vue_type_script_setup_true_lang.js +10 -2
  252. package/dist/components/qrcode/qrcode.vue_vue_type_script_setup_true_lang.js.map +1 -1
  253. package/dist/components/select/select.js.map +1 -1
  254. package/dist/components/select/select.vue_vue_type_script_setup_true_lang.js +2 -2
  255. package/dist/components/select/select.vue_vue_type_script_setup_true_lang.js.map +1 -1
  256. package/dist/components/slider/slider.js.map +1 -1
  257. package/dist/components/slider/slider.vue_vue_type_script_setup_true_lang.js +2 -2
  258. package/dist/components/slider/slider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  259. package/dist/components/status-dot/index.js +7 -0
  260. package/dist/components/status-dot/index.js.map +1 -0
  261. package/dist/components/status-dot/status-dot.js +26 -0
  262. package/dist/components/status-dot/status-dot.js.map +1 -0
  263. package/dist/components/status-dot/status-dot.vue_vue_type_script_lang.js +43 -0
  264. package/dist/components/status-dot/status-dot.vue_vue_type_script_lang.js.map +1 -0
  265. package/dist/components/status-dot/status-dot2.js +6 -0
  266. package/dist/components/status-dot/status-dot2.js.map +1 -0
  267. package/dist/components/status-dot/style.d.ts +1 -0
  268. package/dist/components/status-dot/style.js +2 -0
  269. package/dist/components/steps/steps.js.map +1 -1
  270. package/dist/components/steps/steps.vue_vue_type_script_setup_true_lang.js +6 -6
  271. package/dist/components/steps/steps.vue_vue_type_script_setup_true_lang.js.map +1 -1
  272. package/dist/components/table/table.js.map +1 -1
  273. package/dist/components/table/table.vue_vue_type_script_setup_true_lang.js +19 -14
  274. package/dist/components/table/table.vue_vue_type_script_setup_true_lang.js.map +1 -1
  275. package/dist/components/tabs/tab-panel.vue_vue_type_script_setup_true_lang.js +1 -0
  276. package/dist/components/tabs/tab-panel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  277. package/dist/components/tabs/tabs.js.map +1 -1
  278. package/dist/components/tabs/tabs.vue_vue_type_script_setup_true_lang.js +117 -47
  279. package/dist/components/tabs/tabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  280. package/dist/components/tabs/tabs2.js.map +1 -1
  281. package/dist/components/tag/tag.js.map +1 -1
  282. package/dist/components/tag/tag.vue_vue_type_script_setup_true_lang.js +21 -4
  283. package/dist/components/tag/tag.vue_vue_type_script_setup_true_lang.js.map +1 -1
  284. package/dist/components/timeline/style.js +1 -0
  285. package/dist/components/timeline/timeline-item.js.map +1 -1
  286. package/dist/components/timeline/timeline-item.vue_vue_type_script_setup_true_lang.js +6 -2
  287. package/dist/components/timeline/timeline-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  288. package/dist/components/toast/index.js +5 -4
  289. package/dist/components/toast/index.js.map +1 -1
  290. package/dist/components/toast/store.js +1 -9
  291. package/dist/components/toast/store.js.map +1 -1
  292. package/dist/components/tooltip/index.js +2 -0
  293. package/dist/components/tooltip/index.js.map +1 -1
  294. package/dist/components/tooltip/tooltip.js.map +1 -1
  295. package/dist/components/tooltip/tooltip.vue_vue_type_script_setup_true_lang.js +55 -8
  296. package/dist/components/tooltip/tooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  297. package/dist/components/tour/tour.js.map +1 -1
  298. package/dist/components/tour/tour.vue_vue_type_script_setup_true_lang.js +3 -3
  299. package/dist/components/tour/tour.vue_vue_type_script_setup_true_lang.js.map +1 -1
  300. package/dist/components/transfer/transfer-list.vue_vue_type_script_setup_true_lang.js +1 -1
  301. package/dist/components/tree/tree.vue_vue_type_script_setup_true_lang.js +1 -1
  302. package/dist/components/tree-select/tree-select.js.map +1 -1
  303. package/dist/components/tree-select/tree-select.vue_vue_type_script_setup_true_lang.js +3 -3
  304. package/dist/components/tree-select/tree-select.vue_vue_type_script_setup_true_lang.js.map +1 -1
  305. package/dist/components/upload/upload.vue_vue_type_script_setup_true_lang.js +2 -2
  306. package/dist/components/upload/upload.vue_vue_type_script_setup_true_lang.js.map +1 -1
  307. package/dist/components/upload/upload2.js.map +1 -1
  308. package/dist/components/user/user.js.map +1 -1
  309. package/dist/components/user/user.vue_vue_type_script_setup_true_lang.js +2 -2
  310. package/dist/components/user/user.vue_vue_type_script_setup_true_lang.js.map +1 -1
  311. package/dist/components/virtual-list/virtual-list.js +7 -1
  312. package/dist/components/virtual-list/virtual-list.js.map +1 -1
  313. package/dist/components/virtual-list/virtual-list.vue_vue_type_script_setup_true_lang.js +2 -7
  314. package/dist/components/virtual-list/virtual-list.vue_vue_type_script_setup_true_lang.js.map +1 -1
  315. package/dist/components/virtual-list/virtual-list2.js.map +1 -1
  316. package/dist/composables/use-popup.js +30 -5
  317. package/dist/composables/use-popup.js.map +1 -1
  318. package/dist/index.js +26 -19
  319. package/dist/index.js.map +1 -1
  320. package/dist/locale/en.js +14 -8
  321. package/dist/locale/en.js.map +1 -1
  322. package/dist/locale/zh-cn.js +14 -8
  323. package/dist/locale/zh-cn.js.map +1 -1
  324. package/dist/locale/zh-tw.js +14 -8
  325. package/dist/locale/zh-tw.js.map +1 -1
  326. package/dist/plugin.js +25 -14
  327. package/dist/plugin.js.map +1 -1
  328. package/dist/style.css +1 -1
  329. package/dist/types/components/button/button.d.ts +5 -1
  330. package/dist/types/components/calendar-view/calendar-view.d.ts +6 -0
  331. package/dist/types/components/calendar-view/calendar-view.vue.d.ts +1 -0
  332. package/dist/types/components/calendar-view/index.d.ts +3 -0
  333. package/dist/types/components/card/card.d.ts +6 -1
  334. package/dist/types/components/chat-artifact/chat-artifact.d.ts +2 -1
  335. package/dist/types/components/chat-attachments/chat-attachments.d.ts +2 -2
  336. package/dist/types/components/chat-confirm/chat-confirm.d.ts +7 -2
  337. package/dist/types/components/chat-input/chat-input.d.ts +33 -3
  338. package/dist/types/components/chat-input/chat-input.vue.d.ts +7 -0
  339. package/dist/types/components/chat-input/index.d.ts +20 -0
  340. package/dist/types/components/chat-list/chat-list.d.ts +19 -1
  341. package/dist/types/components/chat-list/index.d.ts +3 -3
  342. package/dist/types/components/chat-message/chat-message.d.ts +58 -5
  343. package/dist/types/components/chat-message/chat-message.vue.d.ts +7 -3
  344. package/dist/types/components/chat-message/index.d.ts +15 -4
  345. package/dist/types/components/chat-plan/chat-plan.d.ts +19 -2
  346. package/dist/types/components/chat-plan/chat-plan.vue.d.ts +2 -0
  347. package/dist/types/components/chat-plan/index.d.ts +6 -0
  348. package/dist/types/components/chat-question/chat-question.d.ts +43 -0
  349. package/dist/types/components/chat-question/chat-question.vue.d.ts +18 -0
  350. package/dist/types/components/chat-question/index.d.ts +43 -0
  351. package/dist/types/components/chat-sources/chat-sources.d.ts +6 -1
  352. package/dist/types/components/chat-steps/chat-steps.d.ts +10 -4
  353. package/dist/types/components/chat-steps/chat-steps.vue.d.ts +1 -1
  354. package/dist/types/components/chat-steps/index.d.ts +3 -3
  355. package/dist/types/components/chat-tool-call/chat-tool-call.d.ts +12 -3
  356. package/dist/types/components/chat-tool-call/chat-tool-call.vue.d.ts +1 -0
  357. package/dist/types/components/chat-tool-call/index.d.ts +3 -0
  358. package/dist/types/components/checkbox/index.d.ts +5 -5
  359. package/dist/types/components/code-block/code-block.d.ts +11 -0
  360. package/dist/types/components/code-block/code-block.vue.d.ts +3 -1
  361. package/dist/types/components/code-block/index.d.ts +9 -3
  362. package/dist/types/components/collapse/collapse-transition.d.ts +2 -7
  363. package/dist/types/components/collapse/collapse.vue.d.ts +1 -1
  364. package/dist/types/components/collapse/index.d.ts +5 -6
  365. package/dist/types/components/comment-thread/comment-thread.d.ts +6 -0
  366. package/dist/types/components/comment-thread/comment-thread.vue.d.ts +1 -0
  367. package/dist/types/components/comment-thread/index.d.ts +3 -0
  368. package/dist/types/components/context-menu/context-menu.d.ts +37 -4
  369. package/dist/types/components/context-menu/context-menu.vue.d.ts +2 -0
  370. package/dist/types/components/context-menu/index.d.ts +5 -0
  371. package/dist/types/components/copy-button/copy-button.vue.d.ts +1 -1
  372. package/dist/types/components/copy-button/index.d.ts +1 -1
  373. package/dist/types/components/descriptions/descriptions.d.ts +9 -1
  374. package/dist/types/components/descriptions/descriptions.vue.d.ts +1 -0
  375. package/dist/types/components/descriptions/index.d.ts +3 -0
  376. package/dist/types/components/dialog/functional.d.ts +0 -3
  377. package/dist/types/components/dialog/index.d.ts +1 -1
  378. package/dist/types/components/dropdown/dropdown-group.vue.d.ts +13 -0
  379. package/dist/types/components/dropdown/dropdown-items.vue.d.ts +2 -2
  380. package/dist/types/components/dropdown/dropdown-radio-group.vue.d.ts +8 -4
  381. package/dist/types/components/dropdown/dropdown.d.ts +28 -6
  382. package/dist/types/components/dropdown/dropdown.vue.d.ts +1 -1
  383. package/dist/types/components/dropdown/index.d.ts +10 -81
  384. package/dist/types/components/dropdown/item-components.d.ts +103 -0
  385. package/dist/types/components/dropdown/menu-entries.d.ts +4 -0
  386. package/dist/types/components/image/image.d.ts +9 -0
  387. package/dist/types/components/index.d.ts +3 -0
  388. package/dist/types/components/layout/index.d.ts +12 -6
  389. package/dist/types/components/layout/layout-aside.vue.d.ts +1 -1
  390. package/dist/types/components/layout/layout-footer.vue.d.ts +4 -2
  391. package/dist/types/components/layout/layout.d.ts +4 -0
  392. package/dist/types/components/link/index.d.ts +3 -0
  393. package/dist/types/components/link/link.d.ts +24 -3
  394. package/dist/types/components/link/link.vue.d.ts +1 -0
  395. package/dist/types/components/markdown/index.d.ts +58 -0
  396. package/dist/types/components/markdown/markdown.d.ts +251 -0
  397. package/dist/types/components/markdown/markdown.vue.d.ts +22 -0
  398. package/dist/types/components/markdown/parse-block.d.ts +61 -0
  399. package/dist/types/components/markdown/parse-inline.d.ts +19 -0
  400. package/dist/types/components/markdown/parser.d.ts +22 -0
  401. package/dist/types/components/markdown/render.d.ts +84 -0
  402. package/dist/types/components/markdown/url.d.ts +10 -0
  403. package/dist/types/components/masonry/index.d.ts +3 -3
  404. package/dist/types/components/menu/index.d.ts +11 -3
  405. package/dist/types/components/menu/menu-actions.d.ts +26 -0
  406. package/dist/types/components/menu/menu-item.vue.d.ts +6 -0
  407. package/dist/types/components/menu/menu.d.ts +48 -5
  408. package/dist/types/components/menu/menu.vue.d.ts +4 -1
  409. package/dist/types/components/menubar/menubar.d.ts +1 -1
  410. package/dist/types/components/node-graph/layout.d.ts +42 -0
  411. package/dist/types/components/node-graph/node-graph.d.ts +1 -1
  412. package/dist/types/components/popover/index.d.ts +3 -3
  413. package/dist/types/components/popover/popover.vue.d.ts +1 -1
  414. package/dist/types/components/progress-group/index.d.ts +3 -0
  415. package/dist/types/components/progress-group/progress-group.d.ts +7 -0
  416. package/dist/types/components/progress-group/progress-group.vue.d.ts +1 -0
  417. package/dist/types/components/qrcode/index.d.ts +3 -0
  418. package/dist/types/components/qrcode/qrcode.d.ts +5 -0
  419. package/dist/types/components/qrcode/qrcode.vue.d.ts +1 -0
  420. package/dist/types/components/select/index.d.ts +3 -3
  421. package/dist/types/components/select/select.vue.d.ts +1 -1
  422. package/dist/types/components/sortable/index.d.ts +3 -3
  423. package/dist/types/components/status-dot/index.d.ts +51 -0
  424. package/dist/types/components/status-dot/status-dot.d.ts +46 -0
  425. package/dist/types/components/status-dot/status-dot.vue.d.ts +46 -0
  426. package/dist/types/components/steps/steps.d.ts +1 -1
  427. package/dist/types/components/switch/index.d.ts +3 -3
  428. package/dist/types/components/table/index.d.ts +4 -3
  429. package/dist/types/components/table/table.d.ts +6 -1
  430. package/dist/types/components/tabs/index.d.ts +3 -0
  431. package/dist/types/components/tabs/tabs.d.ts +16 -3
  432. package/dist/types/components/tabs/tabs.vue.d.ts +1 -0
  433. package/dist/types/components/timeline/index.d.ts +3 -3
  434. package/dist/types/components/timeline/timeline-item.vue.d.ts +1 -1
  435. package/dist/types/components/toast/index.d.ts +0 -2
  436. package/dist/types/components/toast/store.d.ts +0 -4
  437. package/dist/types/components/virtual-list/index.d.ts +3 -3
  438. package/dist/types/components/virtual-list/virtual-list.d.ts +2 -0
  439. package/dist/types/composables/use-popup.d.ts +15 -5
  440. package/dist/types/index.d.ts +1 -0
  441. package/dist/types/locale/types.d.ts +20 -7
  442. package/dist/types/utils/app-context.d.ts +14 -0
  443. package/dist/types/utils/only-child.d.ts +3 -1
  444. package/dist/types/utils/pointer.d.ts +5 -0
  445. package/dist/types/utils/safe-url.d.ts +14 -0
  446. package/dist/types/utils/status-check.d.ts +8 -0
  447. package/dist/utils/app-context.js +22 -0
  448. package/dist/utils/app-context.js.map +1 -0
  449. package/dist/utils/install.js +5 -0
  450. package/dist/utils/install.js.map +1 -1
  451. package/dist/utils/only-child.js +56 -5
  452. package/dist/utils/only-child.js.map +1 -1
  453. package/dist/utils/pointer.js +6 -1
  454. package/dist/utils/pointer.js.map +1 -1
  455. package/dist/utils/safe-url.js +57 -0
  456. package/dist/utils/safe-url.js.map +1 -0
  457. package/dist/utils/status-check.js +27 -0
  458. package/dist/utils/status-check.js.map +1 -0
  459. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"chat-attachments.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_Fragment","_renderList","_renderSlot","_createElementVNode","_createBlock","_resolveDynamicComponent","_toDisplayString","_normalizeStyle","_createCommentVNode","_createVNode"],"sources":["../../../src/components/chat-attachments/chat-attachments.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n CloseIcon,\n FileArchiveIcon,\n FileAudioIcon,\n FileCodeIcon,\n FileIcon,\n FileImageIcon,\n FileSpreadsheetIcon,\n FileTextIcon,\n FileVideoIcon,\n} from '@dou-ui/icons'\nimport type { Component } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport { formatFileSize } from '../upload/upload'\nimport { attachmentKind, fileExtension } from './chat-attachments'\nimport type {\n ChatAttachment,\n ChatAttachmentKind,\n ChatAttachmentsEmits,\n ChatAttachmentsProps,\n ChatAttachmentsSlots,\n} from './chat-attachments'\n\ndefineOptions({ name: 'DouChatAttachments' })\n\nconst props = withDefaults(defineProps<ChatAttachmentsProps>(), {\n modelValue: () => [],\n removable: true,\n})\nconst emit = defineEmits<ChatAttachmentsEmits>()\ndefineSlots<ChatAttachmentsSlots>()\n\nconst ns = useNamespace('chat-attachments')\nconst { t } = useLocale()\n\nconst icons: Record<ChatAttachmentKind, Component> = {\n image: FileImageIcon,\n video: FileVideoIcon,\n audio: FileAudioIcon,\n archive: FileArchiveIcon,\n code: FileCodeIcon,\n spreadsheet: FileSpreadsheetIcon,\n text: FileTextIcon,\n file: FileIcon,\n}\n\nconst isThumb = (file: ChatAttachment) => !!file.url && attachmentKind(file) === 'image'\n\nfunction detail(file: ChatAttachment) {\n if (file.status === 'uploading') return `${t('chat.uploading')} ${Math.round(file.percent ?? 0)}%`\n if (file.status === 'error') return t('chat.uploadError')\n return [fileExtension(file.name), file.size === undefined ? '' : formatFileSize(file.size)]\n .filter(Boolean)\n .join(' · ')\n}\n\nfunction remove(file: ChatAttachment) {\n emit(\n 'update:modelValue',\n props.modelValue.filter((item) => item.uid !== file.uid),\n )\n emit('remove', file)\n}\n</script>\n\n<template>\n <ul :class=\"ns.b()\" :aria-label=\"t('chat.attachments')\">\n <li\n v-for=\"file in modelValue\"\n :key=\"file.uid\"\n :class=\"[ns.e('item'), ns.is('thumb', isThumb(file)), file.status ? ns.is(file.status) : '']\"\n >\n <slot name=\"item\" :file=\"file\" :remove=\"() => remove(file)\">\n <button\n type=\"button\"\n :class=\"ns.e('main')\"\n :title=\"file.name\"\n :aria-label=\"isThumb(file) ? file.name : undefined\"\n @click=\"emit('open', file)\"\n >\n <img v-if=\"isThumb(file)\" :class=\"ns.e('image')\" :src=\"file.url\" alt=\"\" />\n <template v-else>\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <component :is=\"icons[attachmentKind(file)]\" />\n </span>\n <span :class=\"ns.e('meta')\">\n <span :class=\"ns.e('name')\">{{ file.name }}</span>\n <span :class=\"ns.e('detail')\">{{ detail(file) }}</span>\n </span>\n </template>\n <span\n v-if=\"file.status === 'uploading'\"\n :class=\"ns.e('progress')\"\n role=\"progressbar\"\n :aria-label=\"file.name\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuenow=\"Math.round(file.percent ?? 0)\"\n >\n <span :style=\"{ width: `${file.percent ?? 0}%` }\" />\n </span>\n </button>\n <button\n v-if=\"removable\"\n type=\"button\"\n :class=\"ns.e('remove')\"\n :aria-label=\"`${t('chat.remove')} ${file.name}`\"\n @click=\"remove(file)\"\n >\n <CloseIcon />\n </button>\n </slot>\n </li>\n </ul>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BA,MAAM,QAAQ;EAId,MAAM,OAAO;EAGb,MAAM,KAAK,aAAa,kBAAkB;EAC1C,MAAM,EAAE,MAAM,UAAU;EAExB,MAAM,QAA+C;GACnD,OAAO;GACP,OAAO;GACP,OAAO;GACP,SAAS;GACT,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;EACR;EAEA,MAAM,WAAW,SAAyB,CAAC,CAAC,KAAK,OAAO,eAAe,IAAI,MAAM;EAEjF,SAAS,OAAO,MAAsB;GACpC,IAAI,KAAK,WAAW,aAAa,OAAO,GAAG,EAAE,gBAAgB,EAAE,GAAG,KAAK,MAAM,KAAK,WAAW,CAAC,EAAE;GAChG,IAAI,KAAK,WAAW,SAAS,OAAO,EAAE,kBAAkB;GACxD,OAAO,CAAC,cAAc,KAAK,IAAI,GAAG,KAAK,SAAS,KAAA,IAAY,KAAK,eAAe,KAAK,IAAI,CAAC,CAAA,CACvF,OAAO,OAAO,CAAA,CACd,KAAK,KAAK;EACf;EAEA,SAAS,OAAO,MAAsB;GACpC,KACE,qBACA,MAAM,WAAW,QAAQ,SAAS,KAAK,QAAQ,KAAK,GAAG,CACzD;GACA,KAAK,UAAU,IAAI;EACrB;;GAIE,OAAAA,UAAA,GAAAC,mBA+CK,MAAA;IA/CA,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,CAAA;IAAK,cAAYA,MAAA,CAAA,CAAC,CAAA,kBAAA;G,KAChCH,UAAA,IAAA,GAAAC,mBA6CKG,UAAA,MAAAC,WA5CY,QAAA,aAAR,SAAI;IADb,OAAAL,UAAA,GAAAC,mBA6CK,MAAA;KA3CF,KAAK,KAAK;KACV,OAAKC,eAAA;MAAGC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA;MAAUA,MAAA,EAAA,CAAE,CAAC,GAAE,SAAU,QAAQ,IAAI,CAAA;MAAI,KAAK,SAASA,MAAA,EAAA,CAAE,CAAC,GAAG,KAAK,MAAM,IAAA;KAAA,CAAA;I,IAErFG,WAuCO,KAAA,QAAA,QAAA;KAvCkB;KAAO,cAAc,OAAO,IAAI;IAAzD,SAuCO,CAtCLC,mBA4BS,UAAA;KA3BP,MAAK;KACJ,OAAKL,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA;KACX,OAAO,KAAK;KACZ,cAAY,QAAQ,IAAI,IAAI,KAAK,OAAO,KAAA;KACxC,UAAK,WAAE,KAAI,QAAS,IAAI;I,IAEd,QAAQ,IAAI,KAAvBH,UAAA,GAAAC,mBAA0E,OAAA;;KAA/C,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA;KAAY,KAAK,KAAK;KAAK,KAAI;I,6BACrEH,UAAA,GAAAC,mBAQWG,UAAA,EAAA,KAAA,EAAA,GAAA,CAPTG,mBAEO,QAAA;KAFA,OAAKL,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA;KAAU,eAAY;I,KACtCH,UAAA,GAAAQ,YAA+CC,wBAA/B,MAAMN,MAAA,cAAA,CAAc,CAAC,IAAI,EAAA,CAAA,E,OAE3CI,mBAGO,QAAA,EAHA,OAAKL,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA,E,IAChBI,mBAAkD,QAAA,EAA3C,OAAKL,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA,EAAa,GAAAO,gBAAA,KAAK,IAAI,GAAA,CAAA,GACxCH,mBAAuD,QAAA,EAAhD,OAAKL,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,QAAA,CAAA,EAAe,GAAAO,gBAAA,OAAO,IAAI,CAAA,GAAA,CAAA,C,cAIxC,KAAK,WAAM,eADnBV,UAAA,GAAAC,mBAUO,QAAA;;KARJ,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,UAAA,CAAA;KACZ,MAAK;KACJ,cAAY,KAAK;KAClB,iBAAc;KACd,iBAAc;KACb,iBAAe,KAAK,MAAM,KAAK,WAAO,CAAA;I,IAEvCI,mBAAoD,QAAA,EAA7C,OAAKI,eAAA,EAAA,OAAA,GAAc,KAAK,WAAO,EAAA,GAAA,CAAA,E,iFAIlC,QAAA,aADRX,UAAA,GAAAC,mBAQS,UAAA;;KANP,MAAK;KACJ,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,QAAA,CAAA;KACX,cAAU,GAAKA,MAAA,CAAA,CAAC,CAAA,aAAA,EAAA,GAAmB,KAAK;KACxC,UAAK,WAAE,OAAO,IAAI;I,IAEnBU,YAAaV,MAAA,SAAA,CAAA,C"}
1
+ {"version":3,"file":"chat-attachments.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_Fragment","_renderList","_renderSlot","_createElementVNode","_createBlock","_resolveDynamicComponent","_toDisplayString","_normalizeStyle","_createCommentVNode","_createVNode"],"sources":["../../../src/components/chat-attachments/chat-attachments.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n CloseIcon,\n FileArchiveIcon,\n FileAudioIcon,\n FileCodeIcon,\n FileIcon,\n FileImageIcon,\n FileSpreadsheetIcon,\n FileTextIcon,\n FileVideoIcon,\n} from '@dou-ui/icons'\nimport type { Component } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useStatusCheck } from '../../utils/status-check'\nimport { useLocale } from '../config-provider/use-config'\nimport { formatFileSize } from '../upload/upload'\nimport { attachmentKind, fileExtension } from './chat-attachments'\nimport type {\n ChatAttachment,\n ChatAttachmentKind,\n ChatAttachmentsEmits,\n ChatAttachmentsProps,\n ChatAttachmentsSlots,\n} from './chat-attachments'\n\ndefineOptions({ name: 'DouChatAttachments' })\n\nconst props = withDefaults(defineProps<ChatAttachmentsProps>(), {\n modelValue: () => [],\n removable: true,\n})\nconst emit = defineEmits<ChatAttachmentsEmits>()\ndefineSlots<ChatAttachmentsSlots>()\n\nconst ns = useNamespace('chat-attachments')\nconst { t } = useLocale()\n\nconst icons: Record<ChatAttachmentKind, Component> = {\n image: FileImageIcon,\n video: FileVideoIcon,\n audio: FileAudioIcon,\n archive: FileArchiveIcon,\n code: FileCodeIcon,\n spreadsheet: FileSpreadsheetIcon,\n text: FileTextIcon,\n file: FileIcon,\n}\n\nuseStatusCheck(\n 'DouChatAttachments',\n () => (props.modelValue ?? []).map((file) => file.status),\n ['running', 'done', 'error'],\n { uploading: 'running', success: 'done' },\n)\n\nconst isThumb = (file: ChatAttachment) => !!file.url && attachmentKind(file) === 'image'\n\nfunction detail(file: ChatAttachment) {\n if (file.status === 'running') return `${t('chat.uploading')} ${Math.round(file.percent ?? 0)}%`\n if (file.status === 'error') return t('chat.uploadError')\n return [fileExtension(file.name), file.size === undefined ? '' : formatFileSize(file.size)]\n .filter(Boolean)\n .join(' · ')\n}\n\nfunction remove(file: ChatAttachment) {\n emit(\n 'update:modelValue',\n props.modelValue.filter((item) => item.uid !== file.uid),\n )\n emit('remove', file)\n}\n</script>\n\n<template>\n <ul :class=\"ns.b()\" :aria-label=\"t('chat.attachments')\">\n <li\n v-for=\"file in modelValue\"\n :key=\"file.uid\"\n :class=\"[ns.e('item'), ns.is('thumb', isThumb(file)), file.status ? ns.is(file.status) : '']\"\n >\n <slot name=\"item\" :file=\"file\" :remove=\"() => remove(file)\">\n <button\n type=\"button\"\n :class=\"ns.e('main')\"\n :title=\"file.name\"\n :aria-label=\"isThumb(file) ? file.name : undefined\"\n @click=\"emit('open', file)\"\n >\n <img v-if=\"isThumb(file)\" :class=\"ns.e('image')\" :src=\"file.url\" alt=\"\" />\n <template v-else>\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <component :is=\"icons[attachmentKind(file)]\" />\n </span>\n <span :class=\"ns.e('meta')\">\n <span :class=\"ns.e('name')\">{{ file.name }}</span>\n <span :class=\"ns.e('detail')\">{{ detail(file) }}</span>\n </span>\n </template>\n <span\n v-if=\"file.status === 'running'\"\n :class=\"ns.e('progress')\"\n role=\"progressbar\"\n :aria-label=\"file.name\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuenow=\"Math.round(file.percent ?? 0)\"\n >\n <span :style=\"{ width: `${file.percent ?? 0}%` }\" />\n </span>\n </button>\n <button\n v-if=\"removable\"\n type=\"button\"\n :class=\"ns.e('remove')\"\n :aria-label=\"`${t('chat.remove')} ${file.name}`\"\n @click=\"remove(file)\"\n >\n <CloseIcon />\n </button>\n </slot>\n </li>\n </ul>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BA,MAAM,QAAQ;EAId,MAAM,OAAO;EAGb,MAAM,KAAK,aAAa,kBAAkB;EAC1C,MAAM,EAAE,MAAM,UAAU;EAExB,MAAM,QAA+C;GACnD,OAAO;GACP,OAAO;GACP,OAAO;GACP,SAAS;GACT,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;EACR;EAEA,eACE,6BACO,MAAM,cAAc,CAAC,EAAA,CAAG,KAAK,SAAS,KAAK,MAAM,GACxD;GAAC;GAAW;GAAQ;EAAO,GAC3B;GAAE,WAAW;GAAW,SAAS;EAAO,CAC1C;EAEA,MAAM,WAAW,SAAyB,CAAC,CAAC,KAAK,OAAO,eAAe,IAAI,MAAM;EAEjF,SAAS,OAAO,MAAsB;GACpC,IAAI,KAAK,WAAW,WAAW,OAAO,GAAG,EAAE,gBAAgB,EAAE,GAAG,KAAK,MAAM,KAAK,WAAW,CAAC,EAAE;GAC9F,IAAI,KAAK,WAAW,SAAS,OAAO,EAAE,kBAAkB;GACxD,OAAO,CAAC,cAAc,KAAK,IAAI,GAAG,KAAK,SAAS,KAAA,IAAY,KAAK,eAAe,KAAK,IAAI,CAAC,CAAA,CACvF,OAAO,OAAO,CAAA,CACd,KAAK,KAAK;EACf;EAEA,SAAS,OAAO,MAAsB;GACpC,KACE,qBACA,MAAM,WAAW,QAAQ,SAAS,KAAK,QAAQ,KAAK,GAAG,CACzD;GACA,KAAK,UAAU,IAAI;EACrB;;GAIE,OAAAA,UAAA,GAAAC,mBA+CK,MAAA;IA/CA,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,CAAA;IAAK,cAAYA,MAAA,CAAA,CAAC,CAAA,kBAAA;G,KAChCH,UAAA,IAAA,GAAAC,mBA6CKG,UAAA,MAAAC,WA5CY,QAAA,aAAR,SAAI;IADb,OAAAL,UAAA,GAAAC,mBA6CK,MAAA;KA3CF,KAAK,KAAK;KACV,OAAKC,eAAA;MAAGC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA;MAAUA,MAAA,EAAA,CAAE,CAAC,GAAE,SAAU,QAAQ,IAAI,CAAA;MAAI,KAAK,SAASA,MAAA,EAAA,CAAE,CAAC,GAAG,KAAK,MAAM,IAAA;KAAA,CAAA;I,IAErFG,WAuCO,KAAA,QAAA,QAAA;KAvCkB;KAAO,cAAc,OAAO,IAAI;IAAzD,SAuCO,CAtCLC,mBA4BS,UAAA;KA3BP,MAAK;KACJ,OAAKL,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA;KACX,OAAO,KAAK;KACZ,cAAY,QAAQ,IAAI,IAAI,KAAK,OAAO,KAAA;KACxC,UAAK,WAAE,KAAI,QAAS,IAAI;I,IAEd,QAAQ,IAAI,KAAvBH,UAAA,GAAAC,mBAA0E,OAAA;;KAA/C,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA;KAAY,KAAK,KAAK;KAAK,KAAI;I,6BACrEH,UAAA,GAAAC,mBAQWG,UAAA,EAAA,KAAA,EAAA,GAAA,CAPTG,mBAEO,QAAA;KAFA,OAAKL,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA;KAAU,eAAY;I,KACtCH,UAAA,GAAAQ,YAA+CC,wBAA/B,MAAMN,MAAA,cAAA,CAAc,CAAC,IAAI,EAAA,CAAA,E,OAE3CI,mBAGO,QAAA,EAHA,OAAKL,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA,E,IAChBI,mBAAkD,QAAA,EAA3C,OAAKL,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA,EAAa,GAAAO,gBAAA,KAAK,IAAI,GAAA,CAAA,GACxCH,mBAAuD,QAAA,EAAhD,OAAKL,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,QAAA,CAAA,EAAe,GAAAO,gBAAA,OAAO,IAAI,CAAA,GAAA,CAAA,C,cAIxC,KAAK,WAAM,aADnBV,UAAA,GAAAC,mBAUO,QAAA;;KARJ,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,UAAA,CAAA;KACZ,MAAK;KACJ,cAAY,KAAK;KAClB,iBAAc;KACd,iBAAc;KACb,iBAAe,KAAK,MAAM,KAAK,WAAO,CAAA;I,IAEvCI,mBAAoD,QAAA,EAA7C,OAAKI,eAAA,EAAA,OAAA,GAAc,KAAK,WAAO,EAAA,GAAA,CAAA,E,iFAIlC,QAAA,aADRX,UAAA,GAAAC,mBAQS,UAAA;;KANP,MAAK;KACJ,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,QAAA,CAAA;KACX,cAAU,GAAKA,MAAA,CAAA,CAAC,CAAA,aAAA,EAAA,GAAmB,KAAK;KACxC,UAAK,WAAE,OAAO,IAAI;I,IAEnBU,YAAaV,MAAA,SAAA,CAAA,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-attachments2.js","names":["_sfc_main"],"sources":["../../../src/components/chat-attachments/chat-attachments.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n CloseIcon,\n FileArchiveIcon,\n FileAudioIcon,\n FileCodeIcon,\n FileIcon,\n FileImageIcon,\n FileSpreadsheetIcon,\n FileTextIcon,\n FileVideoIcon,\n} from '@dou-ui/icons'\nimport type { Component } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport { formatFileSize } from '../upload/upload'\nimport { attachmentKind, fileExtension } from './chat-attachments'\nimport type {\n ChatAttachment,\n ChatAttachmentKind,\n ChatAttachmentsEmits,\n ChatAttachmentsProps,\n ChatAttachmentsSlots,\n} from './chat-attachments'\n\ndefineOptions({ name: 'DouChatAttachments' })\n\nconst props = withDefaults(defineProps<ChatAttachmentsProps>(), {\n modelValue: () => [],\n removable: true,\n})\nconst emit = defineEmits<ChatAttachmentsEmits>()\ndefineSlots<ChatAttachmentsSlots>()\n\nconst ns = useNamespace('chat-attachments')\nconst { t } = useLocale()\n\nconst icons: Record<ChatAttachmentKind, Component> = {\n image: FileImageIcon,\n video: FileVideoIcon,\n audio: FileAudioIcon,\n archive: FileArchiveIcon,\n code: FileCodeIcon,\n spreadsheet: FileSpreadsheetIcon,\n text: FileTextIcon,\n file: FileIcon,\n}\n\nconst isThumb = (file: ChatAttachment) => !!file.url && attachmentKind(file) === 'image'\n\nfunction detail(file: ChatAttachment) {\n if (file.status === 'uploading') return `${t('chat.uploading')} ${Math.round(file.percent ?? 0)}%`\n if (file.status === 'error') return t('chat.uploadError')\n return [fileExtension(file.name), file.size === undefined ? '' : formatFileSize(file.size)]\n .filter(Boolean)\n .join(' · ')\n}\n\nfunction remove(file: ChatAttachment) {\n emit(\n 'update:modelValue',\n props.modelValue.filter((item) => item.uid !== file.uid),\n )\n emit('remove', file)\n}\n</script>\n\n<template>\n <ul :class=\"ns.b()\" :aria-label=\"t('chat.attachments')\">\n <li\n v-for=\"file in modelValue\"\n :key=\"file.uid\"\n :class=\"[ns.e('item'), ns.is('thumb', isThumb(file)), file.status ? ns.is(file.status) : '']\"\n >\n <slot name=\"item\" :file=\"file\" :remove=\"() => remove(file)\">\n <button\n type=\"button\"\n :class=\"ns.e('main')\"\n :title=\"file.name\"\n :aria-label=\"isThumb(file) ? file.name : undefined\"\n @click=\"emit('open', file)\"\n >\n <img v-if=\"isThumb(file)\" :class=\"ns.e('image')\" :src=\"file.url\" alt=\"\" />\n <template v-else>\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <component :is=\"icons[attachmentKind(file)]\" />\n </span>\n <span :class=\"ns.e('meta')\">\n <span :class=\"ns.e('name')\">{{ file.name }}</span>\n <span :class=\"ns.e('detail')\">{{ detail(file) }}</span>\n </span>\n </template>\n <span\n v-if=\"file.status === 'uploading'\"\n :class=\"ns.e('progress')\"\n role=\"progressbar\"\n :aria-label=\"file.name\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuenow=\"Math.round(file.percent ?? 0)\"\n >\n <span :style=\"{ width: `${file.percent ?? 0}%` }\" />\n </span>\n </button>\n <button\n v-if=\"removable\"\n type=\"button\"\n :class=\"ns.e('remove')\"\n :aria-label=\"`${t('chat.remove')} ${file.name}`\"\n @click=\"remove(file)\"\n >\n <CloseIcon />\n </button>\n </slot>\n </li>\n </ul>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"chat-attachments2.js","names":["_sfc_main"],"sources":["../../../src/components/chat-attachments/chat-attachments.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n CloseIcon,\n FileArchiveIcon,\n FileAudioIcon,\n FileCodeIcon,\n FileIcon,\n FileImageIcon,\n FileSpreadsheetIcon,\n FileTextIcon,\n FileVideoIcon,\n} from '@dou-ui/icons'\nimport type { Component } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useStatusCheck } from '../../utils/status-check'\nimport { useLocale } from '../config-provider/use-config'\nimport { formatFileSize } from '../upload/upload'\nimport { attachmentKind, fileExtension } from './chat-attachments'\nimport type {\n ChatAttachment,\n ChatAttachmentKind,\n ChatAttachmentsEmits,\n ChatAttachmentsProps,\n ChatAttachmentsSlots,\n} from './chat-attachments'\n\ndefineOptions({ name: 'DouChatAttachments' })\n\nconst props = withDefaults(defineProps<ChatAttachmentsProps>(), {\n modelValue: () => [],\n removable: true,\n})\nconst emit = defineEmits<ChatAttachmentsEmits>()\ndefineSlots<ChatAttachmentsSlots>()\n\nconst ns = useNamespace('chat-attachments')\nconst { t } = useLocale()\n\nconst icons: Record<ChatAttachmentKind, Component> = {\n image: FileImageIcon,\n video: FileVideoIcon,\n audio: FileAudioIcon,\n archive: FileArchiveIcon,\n code: FileCodeIcon,\n spreadsheet: FileSpreadsheetIcon,\n text: FileTextIcon,\n file: FileIcon,\n}\n\nuseStatusCheck(\n 'DouChatAttachments',\n () => (props.modelValue ?? []).map((file) => file.status),\n ['running', 'done', 'error'],\n { uploading: 'running', success: 'done' },\n)\n\nconst isThumb = (file: ChatAttachment) => !!file.url && attachmentKind(file) === 'image'\n\nfunction detail(file: ChatAttachment) {\n if (file.status === 'running') return `${t('chat.uploading')} ${Math.round(file.percent ?? 0)}%`\n if (file.status === 'error') return t('chat.uploadError')\n return [fileExtension(file.name), file.size === undefined ? '' : formatFileSize(file.size)]\n .filter(Boolean)\n .join(' · ')\n}\n\nfunction remove(file: ChatAttachment) {\n emit(\n 'update:modelValue',\n props.modelValue.filter((item) => item.uid !== file.uid),\n )\n emit('remove', file)\n}\n</script>\n\n<template>\n <ul :class=\"ns.b()\" :aria-label=\"t('chat.attachments')\">\n <li\n v-for=\"file in modelValue\"\n :key=\"file.uid\"\n :class=\"[ns.e('item'), ns.is('thumb', isThumb(file)), file.status ? ns.is(file.status) : '']\"\n >\n <slot name=\"item\" :file=\"file\" :remove=\"() => remove(file)\">\n <button\n type=\"button\"\n :class=\"ns.e('main')\"\n :title=\"file.name\"\n :aria-label=\"isThumb(file) ? file.name : undefined\"\n @click=\"emit('open', file)\"\n >\n <img v-if=\"isThumb(file)\" :class=\"ns.e('image')\" :src=\"file.url\" alt=\"\" />\n <template v-else>\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <component :is=\"icons[attachmentKind(file)]\" />\n </span>\n <span :class=\"ns.e('meta')\">\n <span :class=\"ns.e('name')\">{{ file.name }}</span>\n <span :class=\"ns.e('detail')\">{{ detail(file) }}</span>\n </span>\n </template>\n <span\n v-if=\"file.status === 'running'\"\n :class=\"ns.e('progress')\"\n role=\"progressbar\"\n :aria-label=\"file.name\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuenow=\"Math.round(file.percent ?? 0)\"\n >\n <span :style=\"{ width: `${file.percent ?? 0}%` }\" />\n </span>\n </button>\n <button\n v-if=\"removable\"\n type=\"button\"\n :class=\"ns.e('remove')\"\n :aria-label=\"`${t('chat.remove')} ${file.name}`\"\n @click=\"remove(file)\"\n >\n <CloseIcon />\n </button>\n </slot>\n </li>\n </ul>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-confirm.js","names":["_sfc_main"],"sources":["../../../src/components/chat-confirm/chat-confirm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { CheckIcon, CloseIcon, ShieldIcon } from '@dou-ui/icons'\nimport { computed, useId } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { DouButton } from '../button'\nimport { useLocale } from '../config-provider/use-config'\nimport type { ChatConfirmEmits, ChatConfirmProps, ChatConfirmSlots } from './chat-confirm'\n\ndefineOptions({ name: 'DouChatConfirm' })\n\nconst props = withDefaults(defineProps<ChatConfirmProps>(), {\n status: 'pending',\n allowAlways: false,\n tone: 'neutral',\n})\nconst emit = defineEmits<ChatConfirmEmits>()\nconst slots = defineSlots<ChatConfirmSlots>()\n\nconst ns = useNamespace('chat-confirm')\nconst { t } = useLocale()\nconst id = useId()\n\nconst hasTitle = computed(() => !!props.title || !!slots.title)\nconst pending = computed(() => props.status === 'pending')\n</script>\n\n<template>\n <div\n :class=\"[ns.b(), ns.m(tone), ns.is(status)]\"\n role=\"group\"\n :aria-labelledby=\"hasTitle ? `${id}-title` : undefined\"\n >\n <div :class=\"ns.e('header')\">\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <slot name=\"icon\"><ShieldIcon /></slot>\n </span>\n <div :class=\"ns.e('text')\">\n <div v-if=\"hasTitle\" :id=\"`${id}-title`\" :class=\"ns.e('title')\">\n <slot name=\"title\">{{ title }}</slot>\n </div>\n <div v-if=\"description\" :class=\"ns.e('description')\">{{ description }}</div>\n </div>\n <span v-if=\"!pending\" :class=\"ns.e('result')\" role=\"status\">\n <CheckIcon v-if=\"status === 'approved'\" aria-hidden=\"true\" />\n <CloseIcon v-else aria-hidden=\"true\" />\n {{ status === 'approved' ? t('chat.approved') : t('chat.denied') }}\n </span>\n </div>\n <div v-if=\"slots.default\" :class=\"ns.e('detail')\"><slot /></div>\n <div v-if=\"pending\" :class=\"ns.e('actions')\">\n <DouButton size=\"sm\" variant=\"outline\" @click=\"emit('decide', 'deny')\">\n {{ denyText ?? t('chat.deny') }}\n </DouButton>\n <DouButton v-if=\"allowAlways\" size=\"sm\" variant=\"outline\" @click=\"emit('decide', 'always')\">\n {{ t('chat.allowAlways') }}\n </DouButton>\n <DouButton\n size=\"sm\"\n :tone=\"tone === 'danger' ? 'danger' : 'neutral'\"\n @click=\"emit('decide', 'approve')\"\n >\n {{ approveText ?? t('chat.approve') }}\n </DouButton>\n </div>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"chat-confirm.js","names":["_sfc_main"],"sources":["../../../src/components/chat-confirm/chat-confirm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { CheckIcon, CloseIcon, ShieldIcon, UndoIcon } from '@dou-ui/icons'\nimport { computed, nextTick, ref, useId, watch } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useStatusCheck } from '../../utils/status-check'\nimport { DouButton } from '../button'\nimport { useLocale } from '../config-provider/use-config'\nimport type { ChatConfirmEmits, ChatConfirmProps, ChatConfirmSlots } from './chat-confirm'\n\ndefineOptions({ name: 'DouChatConfirm' })\n\nconst props = withDefaults(defineProps<ChatConfirmProps>(), {\n status: 'waiting',\n allowAlways: false,\n tone: 'neutral',\n})\nconst emit = defineEmits<ChatConfirmEmits>()\nconst slots = defineSlots<ChatConfirmSlots>()\n\nconst ns = useNamespace('chat-confirm')\nconst { t } = useLocale()\nconst id = useId()\n\nconst waiting = computed(() => props.status === 'waiting')\n// How each answered or withdrawn request reads once it has collapsed.\nconst outcomes = {\n approved: { icon: CheckIcon, text: 'chat.approved' },\n denied: { icon: CloseIcon, text: 'chat.denied' },\n withdrawn: { icon: UndoIcon, text: 'chat.withdrawn' },\n} as const\nconst outcome = computed(() =>\n Object.hasOwn(outcomes, props.status)\n ? outcomes[props.status as keyof typeof outcomes]\n : undefined,\n)\n\n// Answering or withdrawing removes the buttons; if focus was on one, keep it\n// on the card instead of losing it to the page. The watcher runs before the\n// DOM updates, while the focused button is still there to find.\nconst root = ref<HTMLElement>()\nwatch(\n () => props.status,\n (now, before) => {\n if (before !== 'waiting' || now === 'waiting') return\n if (!root.value?.contains(document.activeElement)) return\n void nextTick(() => root.value?.focus({ preventScroll: true }))\n },\n)\n\nconst statuses = ['waiting', 'approved', 'denied', 'withdrawn']\nuseStatusCheck('DouChatConfirm', () => [props.status], statuses, { pending: 'waiting' })\n</script>\n\n<template>\n <div\n ref=\"root\"\n :class=\"[ns.b(), ns.m(tone), ns.is(status)]\"\n role=\"group\"\n tabindex=\"-1\"\n :aria-labelledby=\"title || slots.title ? `${id}-title` : undefined\"\n >\n <div :class=\"ns.e('header')\">\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <slot name=\"icon\"><ShieldIcon /></slot>\n </span>\n <div :class=\"ns.e('text')\">\n <div v-if=\"title || slots.title\" :id=\"`${id}-title`\" :class=\"ns.e('title')\">\n <slot name=\"title\">{{ title }}</slot>\n </div>\n <div v-if=\"description\" :class=\"ns.e('description')\">{{ description }}</div>\n </div>\n <!-- always there, so screen readers announce the outcome when it appears -->\n <span :class=\"ns.e('result')\" role=\"status\">\n <template v-if=\"outcome\">\n <component :is=\"outcome.icon\" aria-hidden=\"true\" />\n {{ t(outcome.text) }}\n </template>\n </span>\n </div>\n <div v-if=\"slots.default\" :class=\"ns.e('detail')\"><slot /></div>\n <div v-if=\"waiting\" :class=\"ns.e('actions')\">\n <DouButton size=\"sm\" variant=\"outline\" @click=\"emit('decide', 'deny')\">\n {{ denyText ?? t('chat.deny') }}\n </DouButton>\n <DouButton v-if=\"allowAlways\" size=\"sm\" variant=\"outline\" @click=\"emit('decide', 'always')\">\n {{ t('chat.allowAlways') }}\n </DouButton>\n <DouButton\n size=\"sm\"\n :tone=\"tone === 'danger' ? 'danger' : 'neutral'\"\n @click=\"emit('decide', 'approve')\"\n >\n {{ approveText ?? t('chat.approve') }}\n </DouButton>\n </div>\n </div>\n</template>\n"],"mappings":""}
@@ -1,8 +1,9 @@
1
1
  import { useNamespace } from "../../utils/namespace.js";
2
2
  import { useLocale } from "../config-provider/use-config.js";
3
+ import { useStatusCheck } from "../../utils/status-check.js";
3
4
  import { DouButton } from "../button/index.js";
4
- import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, renderSlot, toDisplayString, unref, useId, useSlots, withCtx } from "vue";
5
- import { CheckIcon, CloseIcon, ShieldIcon } from "@dou-ui/icons";
5
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, normalizeClass, openBlock, ref, renderSlot, resolveDynamicComponent, toDisplayString, unref, useId, useSlots, watch, withCtx } from "vue";
6
+ import { CheckIcon, CloseIcon, ShieldIcon, UndoIcon } from "@dou-ui/icons";
6
7
  // src/components/chat-confirm/chat-confirm.vue?vue&type=script&setup=true&lang.ts
7
8
  var _hoisted_1 = ["aria-labelledby"];
8
9
  var _hoisted_2 = ["id"];
@@ -12,7 +13,7 @@ var chat_confirm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
12
13
  props: {
13
14
  title: {},
14
15
  description: {},
15
- status: { default: "pending" },
16
+ status: { default: "waiting" },
16
17
  allowAlways: {
17
18
  type: Boolean,
18
19
  default: false
@@ -29,24 +30,53 @@ var chat_confirm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
29
30
  const ns = useNamespace("chat-confirm");
30
31
  const { t } = useLocale();
31
32
  const id = useId();
32
- const hasTitle = computed(() => !!props.title || !!slots.title);
33
- const pending = computed(() => props.status === "pending");
33
+ const waiting = computed(() => props.status === "waiting");
34
+ const outcomes = {
35
+ approved: {
36
+ icon: CheckIcon,
37
+ text: "chat.approved"
38
+ },
39
+ denied: {
40
+ icon: CloseIcon,
41
+ text: "chat.denied"
42
+ },
43
+ withdrawn: {
44
+ icon: UndoIcon,
45
+ text: "chat.withdrawn"
46
+ }
47
+ };
48
+ const outcome = computed(() => Object.hasOwn(outcomes, props.status) ? outcomes[props.status] : void 0);
49
+ const root = ref();
50
+ watch(() => props.status, (now, before) => {
51
+ if (before !== "waiting" || now === "waiting") return;
52
+ if (!root.value?.contains(document.activeElement)) return;
53
+ nextTick(() => root.value?.focus({ preventScroll: true }));
54
+ });
55
+ useStatusCheck("DouChatConfirm", () => [props.status], [
56
+ "waiting",
57
+ "approved",
58
+ "denied",
59
+ "withdrawn"
60
+ ], { pending: "waiting" });
34
61
  return (_ctx, _cache) => {
35
62
  return openBlock(), createElementBlock("div", {
63
+ ref_key: "root",
64
+ ref: root,
36
65
  class: normalizeClass([
37
66
  unref(ns).b(),
38
67
  unref(ns).m(__props.tone),
39
68
  unref(ns).is(__props.status)
40
69
  ]),
41
70
  role: "group",
42
- "aria-labelledby": hasTitle.value ? `${unref(id)}-title` : void 0
71
+ tabindex: "-1",
72
+ "aria-labelledby": __props.title || slots.title ? `${unref(id)}-title` : void 0
43
73
  }, [
44
74
  createElementVNode("div", { class: normalizeClass(unref(ns).e("header")) }, [
45
75
  createElementVNode("span", {
46
76
  class: normalizeClass(unref(ns).e("icon")),
47
77
  "aria-hidden": "true"
48
78
  }, [renderSlot(_ctx.$slots, "icon", {}, () => [createVNode(unref(ShieldIcon))])], 2),
49
- createElementVNode("div", { class: normalizeClass(unref(ns).e("text")) }, [hasTitle.value ? (openBlock(), createElementBlock("div", {
79
+ createElementVNode("div", { class: normalizeClass(unref(ns).e("text")) }, [__props.title || slots.title ? (openBlock(), createElementBlock("div", {
50
80
  key: 0,
51
81
  id: `${unref(id)}-title`,
52
82
  class: normalizeClass(unref(ns).e("title"))
@@ -54,23 +84,16 @@ var chat_confirm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
54
84
  key: 1,
55
85
  class: normalizeClass(unref(ns).e("description"))
56
86
  }, toDisplayString(__props.description), 3)) : createCommentVNode("", true)], 2),
57
- !pending.value ? (openBlock(), createElementBlock("span", {
58
- key: 0,
87
+ createElementVNode("span", {
59
88
  class: normalizeClass(unref(ns).e("result")),
60
89
  role: "status"
61
- }, [__props.status === "approved" ? (openBlock(), createBlock(unref(CheckIcon), {
62
- key: 0,
63
- "aria-hidden": "true"
64
- })) : (openBlock(), createBlock(unref(CloseIcon), {
65
- key: 1,
66
- "aria-hidden": "true"
67
- })), createTextVNode(" " + toDisplayString(__props.status === "approved" ? unref(t)("chat.approved") : unref(t)("chat.denied")), 1)], 2)) : createCommentVNode("", true)
90
+ }, [outcome.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [(openBlock(), createBlock(resolveDynamicComponent(outcome.value.icon), { "aria-hidden": "true" })), createTextVNode(" " + toDisplayString(unref(t)(outcome.value.text)), 1)], 64)) : createCommentVNode("", true)], 2)
68
91
  ], 2),
69
92
  slots.default ? (openBlock(), createElementBlock("div", {
70
93
  key: 0,
71
94
  class: normalizeClass(unref(ns).e("detail"))
72
95
  }, [renderSlot(_ctx.$slots, "default")], 2)) : createCommentVNode("", true),
73
- pending.value ? (openBlock(), createElementBlock("div", {
96
+ waiting.value ? (openBlock(), createElementBlock("div", {
74
97
  key: 1,
75
98
  class: normalizeClass(unref(ns).e("actions"))
76
99
  }, [
@@ -1 +1 @@
1
- {"version":3,"file":"chat-confirm.vue_vue_type_script_setup_true_lang.js","names":["_useSlots","_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_renderSlot","_createVNode","_createTextVNode","_toDisplayString","_createCommentVNode","_createBlock","_withCtx"],"sources":["../../../src/components/chat-confirm/chat-confirm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { CheckIcon, CloseIcon, ShieldIcon } from '@dou-ui/icons'\nimport { computed, useId } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { DouButton } from '../button'\nimport { useLocale } from '../config-provider/use-config'\nimport type { ChatConfirmEmits, ChatConfirmProps, ChatConfirmSlots } from './chat-confirm'\n\ndefineOptions({ name: 'DouChatConfirm' })\n\nconst props = withDefaults(defineProps<ChatConfirmProps>(), {\n status: 'pending',\n allowAlways: false,\n tone: 'neutral',\n})\nconst emit = defineEmits<ChatConfirmEmits>()\nconst slots = defineSlots<ChatConfirmSlots>()\n\nconst ns = useNamespace('chat-confirm')\nconst { t } = useLocale()\nconst id = useId()\n\nconst hasTitle = computed(() => !!props.title || !!slots.title)\nconst pending = computed(() => props.status === 'pending')\n</script>\n\n<template>\n <div\n :class=\"[ns.b(), ns.m(tone), ns.is(status)]\"\n role=\"group\"\n :aria-labelledby=\"hasTitle ? `${id}-title` : undefined\"\n >\n <div :class=\"ns.e('header')\">\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <slot name=\"icon\"><ShieldIcon /></slot>\n </span>\n <div :class=\"ns.e('text')\">\n <div v-if=\"hasTitle\" :id=\"`${id}-title`\" :class=\"ns.e('title')\">\n <slot name=\"title\">{{ title }}</slot>\n </div>\n <div v-if=\"description\" :class=\"ns.e('description')\">{{ description }}</div>\n </div>\n <span v-if=\"!pending\" :class=\"ns.e('result')\" role=\"status\">\n <CheckIcon v-if=\"status === 'approved'\" aria-hidden=\"true\" />\n <CloseIcon v-else aria-hidden=\"true\" />\n {{ status === 'approved' ? t('chat.approved') : t('chat.denied') }}\n </span>\n </div>\n <div v-if=\"slots.default\" :class=\"ns.e('detail')\"><slot /></div>\n <div v-if=\"pending\" :class=\"ns.e('actions')\">\n <DouButton size=\"sm\" variant=\"outline\" @click=\"emit('decide', 'deny')\">\n {{ denyText ?? t('chat.deny') }}\n </DouButton>\n <DouButton v-if=\"allowAlways\" size=\"sm\" variant=\"outline\" @click=\"emit('decide', 'always')\">\n {{ t('chat.allowAlways') }}\n </DouButton>\n <DouButton\n size=\"sm\"\n :tone=\"tone === 'danger' ? 'danger' : 'neutral'\"\n @click=\"emit('decide', 'approve')\"\n >\n {{ approveText ?? t('chat.approve') }}\n </DouButton>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"chat-confirm.vue_vue_type_script_setup_true_lang.js","names":["_useSlots","_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_renderSlot","_createVNode","_createTextVNode","_toDisplayString","_createCommentVNode","_Fragment","_createBlock","_resolveDynamicComponent","_withCtx"],"sources":["../../../src/components/chat-confirm/chat-confirm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { CheckIcon, CloseIcon, ShieldIcon, UndoIcon } from '@dou-ui/icons'\nimport { computed, nextTick, ref, useId, watch } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useStatusCheck } from '../../utils/status-check'\nimport { DouButton } from '../button'\nimport { useLocale } from '../config-provider/use-config'\nimport type { ChatConfirmEmits, ChatConfirmProps, ChatConfirmSlots } from './chat-confirm'\n\ndefineOptions({ name: 'DouChatConfirm' })\n\nconst props = withDefaults(defineProps<ChatConfirmProps>(), {\n status: 'waiting',\n allowAlways: false,\n tone: 'neutral',\n})\nconst emit = defineEmits<ChatConfirmEmits>()\nconst slots = defineSlots<ChatConfirmSlots>()\n\nconst ns = useNamespace('chat-confirm')\nconst { t } = useLocale()\nconst id = useId()\n\nconst waiting = computed(() => props.status === 'waiting')\n// How each answered or withdrawn request reads once it has collapsed.\nconst outcomes = {\n approved: { icon: CheckIcon, text: 'chat.approved' },\n denied: { icon: CloseIcon, text: 'chat.denied' },\n withdrawn: { icon: UndoIcon, text: 'chat.withdrawn' },\n} as const\nconst outcome = computed(() =>\n Object.hasOwn(outcomes, props.status)\n ? outcomes[props.status as keyof typeof outcomes]\n : undefined,\n)\n\n// Answering or withdrawing removes the buttons; if focus was on one, keep it\n// on the card instead of losing it to the page. The watcher runs before the\n// DOM updates, while the focused button is still there to find.\nconst root = ref<HTMLElement>()\nwatch(\n () => props.status,\n (now, before) => {\n if (before !== 'waiting' || now === 'waiting') return\n if (!root.value?.contains(document.activeElement)) return\n void nextTick(() => root.value?.focus({ preventScroll: true }))\n },\n)\n\nconst statuses = ['waiting', 'approved', 'denied', 'withdrawn']\nuseStatusCheck('DouChatConfirm', () => [props.status], statuses, { pending: 'waiting' })\n</script>\n\n<template>\n <div\n ref=\"root\"\n :class=\"[ns.b(), ns.m(tone), ns.is(status)]\"\n role=\"group\"\n tabindex=\"-1\"\n :aria-labelledby=\"title || slots.title ? `${id}-title` : undefined\"\n >\n <div :class=\"ns.e('header')\">\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <slot name=\"icon\"><ShieldIcon /></slot>\n </span>\n <div :class=\"ns.e('text')\">\n <div v-if=\"title || slots.title\" :id=\"`${id}-title`\" :class=\"ns.e('title')\">\n <slot name=\"title\">{{ title }}</slot>\n </div>\n <div v-if=\"description\" :class=\"ns.e('description')\">{{ description }}</div>\n </div>\n <!-- always there, so screen readers announce the outcome when it appears -->\n <span :class=\"ns.e('result')\" role=\"status\">\n <template v-if=\"outcome\">\n <component :is=\"outcome.icon\" aria-hidden=\"true\" />\n {{ t(outcome.text) }}\n </template>\n </span>\n </div>\n <div v-if=\"slots.default\" :class=\"ns.e('detail')\"><slot /></div>\n <div v-if=\"waiting\" :class=\"ns.e('actions')\">\n <DouButton size=\"sm\" variant=\"outline\" @click=\"emit('decide', 'deny')\">\n {{ denyText ?? t('chat.deny') }}\n </DouButton>\n <DouButton v-if=\"allowAlways\" size=\"sm\" variant=\"outline\" @click=\"emit('decide', 'always')\">\n {{ t('chat.allowAlways') }}\n </DouButton>\n <DouButton\n size=\"sm\"\n :tone=\"tone === 'danger' ? 'danger' : 'neutral'\"\n @click=\"emit('decide', 'approve')\"\n >\n {{ approveText ?? t('chat.approve') }}\n </DouButton>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { useNamespace } from "../../utils/namespace.js";
2
2
  import { useLocale } from "../config-provider/use-config.js";
3
- import tooltip_default from "../tooltip/tooltip.js";
3
+ import { DouTooltip } from "../tooltip/index.js";
4
4
  import { compactNumber } from "./chat-context-meter.js";
5
5
  import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, mergeProps, normalizeClass, openBlock, toDisplayString, unref, withCtx } from "vue";
6
6
  // src/components/chat-context-meter/chat-context-meter.vue?vue&type=script&setup=true&lang.ts
@@ -40,7 +40,7 @@ var chat_context_meter_vue_vue_type_script_setup_true_lang_default = /*@__PURE__
40
40
  }));
41
41
  const CIRCUMFERENCE = 2 * Math.PI * 6;
42
42
  return (_ctx, _cache) => {
43
- return openBlock(), createBlock(tooltip_default, { content: text.value }, {
43
+ return openBlock(), createBlock(unref(DouTooltip), { content: text.value }, {
44
44
  default: withCtx(() => [createElementVNode("span", mergeProps(_ctx.$attrs, {
45
45
  class: [unref(ns).b(), unref(ns).m(tone.value)],
46
46
  role: "meter",
@@ -1 +1 @@
1
- {"version":3,"file":"chat-context-meter.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_openBlock","_createBlock","DouTooltip","_withCtx","_createElementVNode","_mergeProps","_unref","_createElementBlock","_normalizeClass","_toDisplayString","_createCommentVNode"],"sources":["../../../src/components/chat-context-meter/chat-context-meter.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport DouTooltip from '../tooltip/tooltip.vue'\nimport { compactNumber } from './chat-context-meter'\nimport type { ChatContextMeterProps } from './chat-context-meter'\n\ndefineOptions({ name: 'DouChatContextMeter', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<ChatContextMeterProps>(), {\n used: 0,\n total: 0,\n warnAt: 0.8,\n dangerAt: 0.95,\n showLabel: false,\n})\n\nconst ns = useNamespace('chat-context-meter')\nconst { t } = useLocale()\n\nconst share = computed(() =>\n props.total > 0 ? Math.min(Math.max(props.used / props.total, 0), 1) : 0,\n)\nconst percent = computed(() => Math.round(share.value * 100))\nconst tone = computed(() =>\n share.value >= props.dangerAt ? 'danger' : share.value >= props.warnAt ? 'warning' : 'neutral',\n)\nconst fmt = (value: number) => (props.format ?? compactNumber)(value)\nconst text = computed(() =>\n t('chat.context', { used: fmt(props.used), total: fmt(props.total), percent: percent.value }),\n)\n\n// r = 6 on a 16 box; the circumference drives the dash\nconst CIRCUMFERENCE = 2 * Math.PI * 6\n</script>\n\n<template>\n <DouTooltip :content=\"text\">\n <span\n v-bind=\"$attrs\"\n :class=\"[ns.b(), ns.m(tone)]\"\n role=\"meter\"\n tabindex=\"0\"\n :aria-label=\"t('chat.contextLabel')\"\n :aria-valuenow=\"percent\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuetext=\"text\"\n >\n <svg :class=\"ns.e('ring')\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <circle :class=\"ns.e('track')\" cx=\"8\" cy=\"8\" r=\"6\" />\n <circle\n :class=\"ns.e('bar')\"\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n :stroke-dasharray=\"`${CIRCUMFERENCE * share} ${CIRCUMFERENCE}`\"\n />\n </svg>\n <span v-if=\"showLabel\" :class=\"ns.e('label')\">{{ percent }}%</span>\n </span>\n </DouTooltip>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUA,MAAM,QAAQ;EAQd,MAAM,KAAK,aAAa,oBAAoB;EAC5C,MAAM,EAAE,MAAM,UAAU;EAExB,MAAM,QAAQ,eACZ,MAAM,QAAQ,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CACzE;EACA,MAAM,UAAU,eAAe,KAAK,MAAM,MAAM,QAAQ,GAAG,CAAC;EAC5D,MAAM,OAAO,eACX,MAAM,SAAS,MAAM,WAAW,WAAW,MAAM,SAAS,MAAM,SAAS,YAAY,SACvF;EACA,MAAM,OAAO,WAAmB,MAAM,UAAU,cAAA,CAAe,KAAK;EACpE,MAAM,OAAO,eACX,EAAE,gBAAgB;GAAE,MAAM,IAAI,MAAM,IAAI;GAAG,OAAO,IAAI,MAAM,KAAK;GAAG,SAAS,QAAQ;EAAM,CAAC,CAC9F;EAGA,MAAM,gBAAgB,IAAI,KAAK,KAAK;;GAIlC,OAAAC,UAAA,GAAAC,YAwBaC,iBAAA,EAxBA,SAAS,KAAA,MAAI,GAAA;IACxB,SAAAC,cAsBO,CAtBPC,mBAsBO,QAtBPC,WACUN,KAqBH,QArBS;KACb,OAAK,CAAGO,MAAA,EAAA,CAAE,CAAC,EAAC,GAAIA,MAAA,EAAA,CAAE,CAAC,EAAE,KAAA,KAAI,CAAA;KAC1B,MAAK;KACL,UAAS;KACR,cAAYA,MAAA,CAAA,CAAC,CAAA,mBAAA;KACb,iBAAe,QAAA;KAChB,iBAAc;KACd,iBAAc;KACb,kBAAgB,KAAA;I,MAEjBN,UAAA,GAAAO,mBASM,OAAA;KATA,OAAKC,eAAEF,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA;KAAU,SAAQ;KAAY,eAAY;I,IACzDF,mBAAqD,UAAA;KAA5C,OAAKI,eAAEF,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA;KAAW,IAAG;KAAI,IAAG;KAAI,GAAE;I,aAC/CF,mBAME,UAAA;KALC,OAAKI,eAAEF,MAAA,EAAA,CAAE,CAAC,EAAC,KAAA,CAAA;KACZ,IAAG;KACH,IAAG;KACH,GAAE;KACD,oBAAgB,GAAK,gBAAgB,MAAA,MAAK,GAAI;I,gCAGvC,QAAA,aAAZN,UAAA,GAAAO,mBAAmE,QAAA;;KAA3C,OAAKC,eAAEF,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA;IAAc,GAAAG,gBAAA,QAAA,KAAO,IAAG,KAAC,CAAA,K"}
1
+ {"version":3,"file":"chat-context-meter.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_openBlock","_createBlock","_unref","_withCtx","_createElementVNode","_mergeProps","_createElementBlock","_normalizeClass","_toDisplayString","_createCommentVNode"],"sources":["../../../src/components/chat-context-meter/chat-context-meter.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport { DouTooltip } from '../tooltip'\nimport { compactNumber } from './chat-context-meter'\nimport type { ChatContextMeterProps } from './chat-context-meter'\n\ndefineOptions({ name: 'DouChatContextMeter', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<ChatContextMeterProps>(), {\n used: 0,\n total: 0,\n warnAt: 0.8,\n dangerAt: 0.95,\n showLabel: false,\n})\n\nconst ns = useNamespace('chat-context-meter')\nconst { t } = useLocale()\n\nconst share = computed(() =>\n props.total > 0 ? Math.min(Math.max(props.used / props.total, 0), 1) : 0,\n)\nconst percent = computed(() => Math.round(share.value * 100))\nconst tone = computed(() =>\n share.value >= props.dangerAt ? 'danger' : share.value >= props.warnAt ? 'warning' : 'neutral',\n)\nconst fmt = (value: number) => (props.format ?? compactNumber)(value)\nconst text = computed(() =>\n t('chat.context', { used: fmt(props.used), total: fmt(props.total), percent: percent.value }),\n)\n\n// r = 6 on a 16 box; the circumference drives the dash\nconst CIRCUMFERENCE = 2 * Math.PI * 6\n</script>\n\n<template>\n <DouTooltip :content=\"text\">\n <span\n v-bind=\"$attrs\"\n :class=\"[ns.b(), ns.m(tone)]\"\n role=\"meter\"\n tabindex=\"0\"\n :aria-label=\"t('chat.contextLabel')\"\n :aria-valuenow=\"percent\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuetext=\"text\"\n >\n <svg :class=\"ns.e('ring')\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <circle :class=\"ns.e('track')\" cx=\"8\" cy=\"8\" r=\"6\" />\n <circle\n :class=\"ns.e('bar')\"\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n :stroke-dasharray=\"`${CIRCUMFERENCE * share} ${CIRCUMFERENCE}`\"\n />\n </svg>\n <span v-if=\"showLabel\" :class=\"ns.e('label')\">{{ percent }}%</span>\n </span>\n </DouTooltip>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUA,MAAM,QAAQ;EAQd,MAAM,KAAK,aAAa,oBAAoB;EAC5C,MAAM,EAAE,MAAM,UAAU;EAExB,MAAM,QAAQ,eACZ,MAAM,QAAQ,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CACzE;EACA,MAAM,UAAU,eAAe,KAAK,MAAM,MAAM,QAAQ,GAAG,CAAC;EAC5D,MAAM,OAAO,eACX,MAAM,SAAS,MAAM,WAAW,WAAW,MAAM,SAAS,MAAM,SAAS,YAAY,SACvF;EACA,MAAM,OAAO,WAAmB,MAAM,UAAU,cAAA,CAAe,KAAK;EACpE,MAAM,OAAO,eACX,EAAE,gBAAgB;GAAE,MAAM,IAAI,MAAM,IAAI;GAAG,OAAO,IAAI,MAAM,KAAK;GAAG,SAAS,QAAQ;EAAM,CAAC,CAC9F;EAGA,MAAM,gBAAgB,IAAI,KAAK,KAAK;;GAIlC,OAAAC,UAAA,GAAAC,YAwBaC,MAAA,UAAA,GAAA,EAxBA,SAAS,KAAA,MAAI,GAAA;IACxB,SAAAC,cAsBO,CAtBPC,mBAsBO,QAtBPC,WACUN,KAqBH,QArBS;KACb,OAAK,CAAGG,MAAA,EAAA,CAAE,CAAC,EAAC,GAAIA,MAAA,EAAA,CAAE,CAAC,EAAE,KAAA,KAAI,CAAA;KAC1B,MAAK;KACL,UAAS;KACR,cAAYA,MAAA,CAAA,CAAC,CAAA,mBAAA;KACb,iBAAe,QAAA;KAChB,iBAAc;KACd,iBAAc;KACb,kBAAgB,KAAA;I,MAEjBF,UAAA,GAAAM,mBASM,OAAA;KATA,OAAKC,eAAEL,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA;KAAU,SAAQ;KAAY,eAAY;I,IACzDE,mBAAqD,UAAA;KAA5C,OAAKG,eAAEL,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA;KAAW,IAAG;KAAI,IAAG;KAAI,GAAE;I,aAC/CE,mBAME,UAAA;KALC,OAAKG,eAAEL,MAAA,EAAA,CAAE,CAAC,EAAC,KAAA,CAAA;KACZ,IAAG;KACH,IAAG;KACH,GAAE;KACD,oBAAgB,GAAK,gBAAgB,MAAA,MAAK,GAAI;I,gCAGvC,QAAA,aAAZF,UAAA,GAAAM,mBAAmE,QAAA;;KAA3C,OAAKC,eAAEL,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA;IAAc,GAAAM,gBAAA,QAAA,KAAO,IAAG,KAAC,CAAA,K"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-context-meter2.js","names":["_sfc_main"],"sources":["../../../src/components/chat-context-meter/chat-context-meter.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport DouTooltip from '../tooltip/tooltip.vue'\nimport { compactNumber } from './chat-context-meter'\nimport type { ChatContextMeterProps } from './chat-context-meter'\n\ndefineOptions({ name: 'DouChatContextMeter', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<ChatContextMeterProps>(), {\n used: 0,\n total: 0,\n warnAt: 0.8,\n dangerAt: 0.95,\n showLabel: false,\n})\n\nconst ns = useNamespace('chat-context-meter')\nconst { t } = useLocale()\n\nconst share = computed(() =>\n props.total > 0 ? Math.min(Math.max(props.used / props.total, 0), 1) : 0,\n)\nconst percent = computed(() => Math.round(share.value * 100))\nconst tone = computed(() =>\n share.value >= props.dangerAt ? 'danger' : share.value >= props.warnAt ? 'warning' : 'neutral',\n)\nconst fmt = (value: number) => (props.format ?? compactNumber)(value)\nconst text = computed(() =>\n t('chat.context', { used: fmt(props.used), total: fmt(props.total), percent: percent.value }),\n)\n\n// r = 6 on a 16 box; the circumference drives the dash\nconst CIRCUMFERENCE = 2 * Math.PI * 6\n</script>\n\n<template>\n <DouTooltip :content=\"text\">\n <span\n v-bind=\"$attrs\"\n :class=\"[ns.b(), ns.m(tone)]\"\n role=\"meter\"\n tabindex=\"0\"\n :aria-label=\"t('chat.contextLabel')\"\n :aria-valuenow=\"percent\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuetext=\"text\"\n >\n <svg :class=\"ns.e('ring')\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <circle :class=\"ns.e('track')\" cx=\"8\" cy=\"8\" r=\"6\" />\n <circle\n :class=\"ns.e('bar')\"\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n :stroke-dasharray=\"`${CIRCUMFERENCE * share} ${CIRCUMFERENCE}`\"\n />\n </svg>\n <span v-if=\"showLabel\" :class=\"ns.e('label')\">{{ percent }}%</span>\n </span>\n </DouTooltip>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"chat-context-meter2.js","names":["_sfc_main"],"sources":["../../../src/components/chat-context-meter/chat-context-meter.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport { DouTooltip } from '../tooltip'\nimport { compactNumber } from './chat-context-meter'\nimport type { ChatContextMeterProps } from './chat-context-meter'\n\ndefineOptions({ name: 'DouChatContextMeter', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<ChatContextMeterProps>(), {\n used: 0,\n total: 0,\n warnAt: 0.8,\n dangerAt: 0.95,\n showLabel: false,\n})\n\nconst ns = useNamespace('chat-context-meter')\nconst { t } = useLocale()\n\nconst share = computed(() =>\n props.total > 0 ? Math.min(Math.max(props.used / props.total, 0), 1) : 0,\n)\nconst percent = computed(() => Math.round(share.value * 100))\nconst tone = computed(() =>\n share.value >= props.dangerAt ? 'danger' : share.value >= props.warnAt ? 'warning' : 'neutral',\n)\nconst fmt = (value: number) => (props.format ?? compactNumber)(value)\nconst text = computed(() =>\n t('chat.context', { used: fmt(props.used), total: fmt(props.total), percent: percent.value }),\n)\n\n// r = 6 on a 16 box; the circumference drives the dash\nconst CIRCUMFERENCE = 2 * Math.PI * 6\n</script>\n\n<template>\n <DouTooltip :content=\"text\">\n <span\n v-bind=\"$attrs\"\n :class=\"[ns.b(), ns.m(tone)]\"\n role=\"meter\"\n tabindex=\"0\"\n :aria-label=\"t('chat.contextLabel')\"\n :aria-valuenow=\"percent\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuetext=\"text\"\n >\n <svg :class=\"ns.e('ring')\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <circle :class=\"ns.e('track')\" cx=\"8\" cy=\"8\" r=\"6\" />\n <circle\n :class=\"ns.e('bar')\"\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n :stroke-dasharray=\"`${CIRCUMFERENCE * share} ${CIRCUMFERENCE}`\"\n />\n </svg>\n <span v-if=\"showLabel\" :class=\"ns.e('label')\">{{ percent }}%</span>\n </span>\n </DouTooltip>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-input.js","names":[],"sources":["../../../src/components/chat-input/chat-input.ts"],"sourcesContent":["import type { Component } from 'vue'\nimport type { Size } from '../../utils/types'\n\n/** An entry of the `/` command or `@` mention menu. */\nexport interface ChatInputOption {\n /** What is matched and handed back. For a mention it is also what gets inserted after `@`. */\n value: string\n /** Shown in the menu. Defaults to `value`. */\n label?: string\n /** A quieter line after the label. */\n description?: string\n /** An icon component before the label. */\n icon?: Component\n disabled?: boolean\n}\n\n/** `enter` sends on Enter (Shift+Enter breaks the line); `mod-enter` sends on Ctrl / ⌘ + Enter. */\nexport type ChatInputSubmitOn = 'enter' | 'mod-enter'\n\nexport interface ChatInputProps {\n /** The text, bound with `v-model`. */\n modelValue?: string\n /** Defaults to the locale's prompt. */\n placeholder?: string\n /** Which key sends. Keys pressed while an input method is composing never send. */\n submitOn?: ChatInputSubmitOn\n /**\n * A reply is being generated: the send button turns into a stop button.\n * Typing goes on meanwhile; once there is text, the button sends again\n * so the app can queue the message.\n */\n loading?: boolean\n /** Text size and padding; the corners and buttons follow. */\n size?: Size\n disabled?: boolean\n /** Rows shown when empty. */\n minRows?: number\n /** Rows to grow to before the text scrolls. */\n maxRows?: number\n /**\n * Whether sending is allowed. By default only when the text is not\n * blank; set it when, say, attachments alone may be sent.\n */\n canSubmit?: boolean\n /**\n * Commands offered when the text starts with `/`. Picking one removes\n * the typed `/…` and emits `command`.\n */\n commands?: ChatInputOption[]\n /**\n * Things to reference offered after `@`, e.g. files or people. Picking\n * one replaces the typed `@…` with `@value` and emits `mention`.\n */\n mentions?: ChatInputOption[]\n /** Where to render the `/` and `@` menu; `false` keeps it in place. */\n teleport?: string | HTMLElement | false\n}\n\nexport interface ChatInputEmits {\n 'update:modelValue': [value: string]\n /** The send key or button was pressed, with the text. Clearing it is up to you. */\n submit: [value: string]\n /** The stop button was pressed while `loading`. */\n stop: []\n /** A command was picked from the `/` menu. */\n command: [option: ChatInputOption]\n /** Something was picked from the `@` menu. */\n mention: [option: ChatInputOption]\n /** Files were pasted or dropped onto the input. */\n attach: [files: File[]]\n}\n\nexport interface ChatInputSlots {\n /** Above the text, e.g. `DouChatAttachments` or a quoted message. */\n header?: () => unknown\n /** The left of the bottom bar: buttons to attach files, pick a model and the like. */\n actions?: () => unknown\n /** Replaces the inside of each menu entry. */\n option?: (props: { option: ChatInputOption; trigger: '/' | '@' }) => unknown\n /** Replaces the send / stop button. */\n submit?: (props: {\n submit: () => void\n stop: () => void\n loading: boolean\n disabled: boolean\n }) => unknown\n}\n\nexport interface ChatInputExpose {\n /** The native `<textarea>`. */\n textarea: HTMLTextAreaElement | null\n focus: () => void\n blur: () => void\n /** Send as if the send key were pressed. */\n submit: () => void\n}\n\n/** The `/` or `@` token the caret is in, if any. */\nexport interface ChatInputToken {\n trigger: '/' | '@'\n /** Typed after the trigger. */\n query: string\n /** Where the trigger character is. */\n start: number\n /** Where the token ends (the caret). */\n end: number\n}\n\n/**\n * Find the token being typed at `caret`. A `/` counts only at the very\n * start of the text; an `@` at the start or after white space. The query\n * holds no white space.\n */\nexport function findToken(text: string, caret: number): ChatInputToken | null {\n let start = caret\n while (start > 0 && !/\\s/.test(text[start - 1]!)) start--\n const word = text.slice(start, caret)\n const trigger = word[0]\n if (trigger === '/' && text.slice(0, start).trim() === '')\n return { trigger, query: word.slice(1), start, end: caret }\n if (trigger === '@') return { trigger, query: word.slice(1), start, end: caret }\n return null\n}\n"],"mappings":";;;;;;AAiHA,SAAgB,UAAU,MAAc,OAAsC;CAC5E,IAAI,QAAQ;CACZ,OAAO,QAAQ,KAAK,CAAC,KAAK,KAAK,KAAK,QAAQ,EAAG,GAAG;CAClD,MAAM,OAAO,KAAK,MAAM,OAAO,KAAK;CACpC,MAAM,UAAU,KAAK;CACrB,IAAI,YAAY,OAAO,KAAK,MAAM,GAAG,KAAK,CAAC,CAAC,KAAK,MAAM,IACrD,OAAO;EAAE;EAAS,OAAO,KAAK,MAAM,CAAC;EAAG;EAAO,KAAK;CAAM;CAC5D,IAAI,YAAY,KAAK,OAAO;EAAE;EAAS,OAAO,KAAK,MAAM,CAAC;EAAG;EAAO,KAAK;CAAM;CAC/E,OAAO;AACT"}
1
+ {"version":3,"file":"chat-input.js","names":[],"sources":["../../../src/components/chat-input/chat-input.ts"],"sourcesContent":["import type { Component } from 'vue'\nimport type { Size } from '../../utils/types'\n\n/** An entry of the `/` command or `@` mention menu. */\nexport interface ChatInputOption {\n /**\n * Handed back when picked; for a mention it is also what gets inserted\n * after `@`, and so matched too. A command's value is never shown and\n * is matched only when there is no `label`: it may be an id.\n */\n value: string\n /** Shown in the menu and matched against what is typed. Defaults to `value`. */\n label?: string\n /** More words that find it, e.g. other names or pinyin. */\n keywords?: string[]\n /** A quieter line after the label; matched too. */\n description?: string\n /** An icon component before the label. */\n icon?: Component\n disabled?: boolean\n}\n\n/** Whether an option matches what is typed after the `/` or `@`. */\nexport type ChatInputFilter = (\n option: ChatInputOption,\n query: string,\n trigger: '/' | '@',\n) => boolean\n/** `true` matches as described under `filter`, `false` lists every option as given. */\nexport type ChatInputFilterMode = boolean | ChatInputFilter\n\n/** `enter` sends on Enter (Shift+Enter breaks the line); `mod-enter` sends on Ctrl / ⌘ + Enter. */\nexport type ChatInputSubmitOn = 'enter' | 'mod-enter'\n\nexport interface ChatInputProps {\n /** The text, bound with `v-model`. */\n modelValue?: string\n /** Defaults to the locale's prompt. */\n placeholder?: string\n /** Which key sends. Keys pressed while an input method is composing never send. */\n submitOn?: ChatInputSubmitOn\n /**\n * A reply is being generated: the send button turns into a stop button.\n * Typing goes on meanwhile; once there is text, the button sends again\n * so the app can queue the message.\n */\n loading?: boolean\n /** Text size and padding; the corners and buttons follow. */\n size?: Size\n disabled?: boolean\n /** Rows shown when empty. */\n minRows?: number\n /** Rows to grow to before the text scrolls. */\n maxRows?: number\n /**\n * Whether sending is allowed. By default only when the text is not\n * blank; set it when, say, attachments alone may be sent.\n */\n canSubmit?: boolean\n /**\n * Commands offered when the text starts with `/`. Picking one removes\n * the typed `/…` and emits `command`.\n */\n commands?: ChatInputOption[]\n /**\n * Things to reference offered after `@`, e.g. files or people. Picking\n * one replaces the typed `@…` with `@value` and emits `mention`.\n */\n mentions?: ChatInputOption[]\n /**\n * How options match what is typed after the trigger. By default what\n * the person sees holds it, ignoring case: the label (or the value, when\n * there is no label), a mention's value, the description and `keywords`.\n * `false` lists them all as given, e.g. results already looked up with\n * `search`. Give `{ '@': false }` to set the `/` and `@` menus apart;\n * a trigger left out matches by default.\n */\n filter?: ChatInputFilterMode | { '/'?: ChatInputFilterMode; '@'?: ChatInputFilterMode }\n /** Wait this many ms after the last keystroke before emitting `search`. */\n searchDelay?: number\n /** Where to render the `/` and `@` menu; `false` keeps it in place. */\n teleport?: string | HTMLElement | false\n}\n\nexport interface ChatInputEmits {\n 'update:modelValue': [value: string]\n /** The send key or button was pressed, with the text. Clearing it is up to you. */\n submit: [value: string]\n /** The stop button was pressed while `loading`. */\n stop: []\n /** A command was picked from the `/` menu. */\n command: [option: ChatInputOption]\n /** Something was picked from the `@` menu. */\n mention: [option: ChatInputOption]\n /**\n * The text after a `/` or `@` changed (after `searchDelay`), and when one\n * is typed: look options up somewhere else and replace `commands` or\n * `mentions` with them, usually with `filter` set to `false`.\n */\n search: [query: string, trigger: '/' | '@']\n /** Files were pasted or dropped onto the input. */\n attach: [files: File[]]\n}\n\nexport interface ChatInputSlots {\n /** Above the text, e.g. `DouChatAttachments` or a quoted message. */\n header?: () => unknown\n /** The left of the bottom bar: buttons to attach files, pick a model and the like. */\n actions?: () => unknown\n /** Replaces the inside of each menu entry. */\n option?: (props: { option: ChatInputOption; trigger: '/' | '@' }) => unknown\n /** Replaces the send / stop button. */\n submit?: (props: {\n submit: () => void\n stop: () => void\n loading: boolean\n disabled: boolean\n }) => unknown\n}\n\nexport interface ChatInputExpose {\n /** The native `<textarea>`. */\n textarea: HTMLTextAreaElement | null\n focus: () => void\n blur: () => void\n /** Send as if the send key were pressed. */\n submit: () => void\n}\n\n/** The `/` or `@` token the caret is in, if any. */\nexport interface ChatInputToken {\n trigger: '/' | '@'\n /** Typed after the trigger. */\n query: string\n /** Where the trigger character is. */\n start: number\n /** Where the token ends (the caret). */\n end: number\n}\n\n/**\n * Find the token being typed at `caret`. A `/` counts only at the very\n * start of the text; an `@` at the start or after white space. The query\n * holds no white space.\n */\nexport function findToken(text: string, caret: number): ChatInputToken | null {\n let start = caret\n while (start > 0 && !/\\s/.test(text[start - 1]!)) start--\n const word = text.slice(start, caret)\n const trigger = word[0]\n if (trigger === '/' && text.slice(0, start).trim() === '')\n return { trigger, query: word.slice(1), start, end: caret }\n if (trigger === '@') return { trigger, query: word.slice(1), start, end: caret }\n return null\n}\n"],"mappings":";;;;;;AAiJA,SAAgB,UAAU,MAAc,OAAsC;CAC5E,IAAI,QAAQ;CACZ,OAAO,QAAQ,KAAK,CAAC,KAAK,KAAK,KAAK,QAAQ,EAAG,GAAG;CAClD,MAAM,OAAO,KAAK,MAAM,OAAO,KAAK;CACpC,MAAM,UAAU,KAAK;CACrB,IAAI,YAAY,OAAO,KAAK,MAAM,GAAG,KAAK,CAAC,CAAC,KAAK,MAAM,IACrD,OAAO;EAAE;EAAS,OAAO,KAAK,MAAM,CAAC;EAAG;EAAO,KAAK;CAAM;CAC5D,IAAI,YAAY,KAAK,OAAO;EAAE;EAAS,OAAO,KAAK,MAAM,CAAC;EAAG;EAAO,KAAK;CAAM;CAC/E,OAAO;AACT"}
@@ -8,7 +8,7 @@ import { useFormDisabled } from "../form/use-form-item.js";
8
8
  import { useTeleport } from "../../utils/teleport.js";
9
9
  import { DouButton } from "../button/index.js";
10
10
  import { findToken } from "./chat-input.js";
11
- import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, mergeModels, mergeProps, nextTick, normalizeClass, normalizeStyle, onMounted, openBlock, ref, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref, useAttrs, useId, useModel, useSlots, useTemplateRef, vModelText, watch, withCtx, withDirectives, withModifiers } from "vue";
11
+ import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, getCurrentInstance, mergeModels, mergeProps, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, openBlock, reactive, ref, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref, useAttrs, useId, useModel, useSlots, useTemplateRef, vModelText, watch, withCtx, withDirectives, withModifiers } from "vue";
12
12
  import { ArrowUpIcon, StopIcon } from "@dou-ui/icons";
13
13
  // src/components/chat-input/chat-input.vue?vue&type=script&setup=true&lang.ts
14
14
  var _hoisted_1 = [
@@ -23,6 +23,7 @@ var _hoisted_1 = [
23
23
  ];
24
24
  var _hoisted_2 = [
25
25
  "id",
26
+ "aria-busy",
26
27
  "data-placement",
27
28
  "data-dou-theme"
28
29
  ];
@@ -58,6 +59,15 @@ var chat_input_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
58
59
  },
59
60
  commands: { default: () => [] },
60
61
  mentions: { default: () => [] },
62
+ filter: {
63
+ type: [
64
+ Boolean,
65
+ Function,
66
+ Object
67
+ ],
68
+ default: true
69
+ },
70
+ searchDelay: { default: 300 },
61
71
  teleport: {
62
72
  type: [String, Boolean],
63
73
  default: void 0
@@ -72,6 +82,7 @@ var chat_input_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
72
82
  "stop",
73
83
  "command",
74
84
  "mention",
85
+ "search",
75
86
  "attach"
76
87
  ], ["update:modelValue"]),
77
88
  setup(__props, { expose: __expose, emit: __emit }) {
@@ -121,22 +132,71 @@ var chat_input_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
121
132
  const token = ref(null);
122
133
  const dismissed = ref(null);
123
134
  const active = ref(0);
135
+ let composing = false;
136
+ function onCaret(event) {
137
+ if (composing || event instanceof KeyboardEvent && isComposing(event)) return;
138
+ if (event?.isComposing) return;
139
+ readToken();
140
+ }
141
+ function onCompositionStart() {
142
+ composing = true;
143
+ }
144
+ function onCompositionEnd() {
145
+ composing = false;
146
+ readToken();
147
+ }
124
148
  function readToken() {
125
149
  const el = textareaRef.value;
126
150
  if (!el) return;
127
- const next = findToken(model.value, el.selectionStart ?? model.value.length);
151
+ const next = findToken(el.value, el.selectionStart ?? el.value.length);
128
152
  const current = token.value;
129
153
  if (next && current && next.trigger === current.trigger && next.start === current.start && next.end === current.end && next.query === current.query) return;
130
154
  if (next?.start !== current?.start) dismissed.value = null;
131
155
  token.value = next;
132
156
  }
157
+ const filterOf = (trigger) => typeof props.filter === "object" ? props.filter[trigger] ?? true : props.filter;
133
158
  const options = computed(() => {
134
159
  const current = token.value;
135
160
  if (!current || dismissed.value === current.start) return [];
136
161
  const source = current.trigger === "/" ? props.commands : props.mentions;
162
+ const filter = filterOf(current.trigger);
163
+ if (filter === false || filter === true && !current.query) return source;
164
+ if (typeof filter === "function") return source.filter((option) => filter(option, current.query, current.trigger));
137
165
  const query = current.query.toLowerCase();
138
- return source.filter((option) => option.value.toLowerCase().includes(query) || (option.label ?? "").toLowerCase().includes(query));
166
+ const texts = (option) => [
167
+ option.label ?? option.value,
168
+ ...current.trigger === "@" && option.label ? [option.value] : [],
169
+ option.description ?? "",
170
+ ...option.keywords ?? []
171
+ ];
172
+ return source.filter((option) => texts(option).some((text) => text.toLowerCase().includes(query)));
173
+ });
174
+ const instance = getCurrentInstance();
175
+ const listening = () => !!instance?.vnode.props?.onSearch;
176
+ const asked = {};
177
+ const answered = reactive({});
178
+ watch(() => props.commands, () => answered["/"] = asked["/"]);
179
+ watch(() => props.mentions, () => answered["@"] = asked["@"]);
180
+ const stale = computed(() => {
181
+ const current = token.value;
182
+ if (!current || filterOf(current.trigger) !== false || !listening()) return false;
183
+ const last = answered[current.trigger];
184
+ return !!last && (last.start !== current.start || last.query !== current.query);
185
+ });
186
+ let searchTimer;
187
+ watch(() => token.value ? `${token.value.start}${token.value.trigger}${token.value.query}` : null, (key) => {
188
+ clearTimeout(searchTimer);
189
+ const current = token.value;
190
+ if (key === null || !current || dismissed.value === current.start) return;
191
+ searchTimer = setTimeout(() => {
192
+ if (listening()) asked[current.trigger] = {
193
+ start: current.start,
194
+ query: current.query
195
+ };
196
+ emit("search", current.query, current.trigger);
197
+ }, props.searchDelay);
139
198
  });
199
+ onBeforeUnmount(() => clearTimeout(searchTimer));
140
200
  const menuOpen = computed(() => !disabled.value && options.value.length > 0);
141
201
  const rootRef = useTemplateRef("root");
142
202
  const menuRef = useTemplateRef("menu");
@@ -217,6 +277,7 @@ var chat_input_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
217
277
  }
218
278
  if ((event.key === "Enter" || event.key === "Tab") && !isComposing(event)) {
219
279
  event.preventDefault();
280
+ if (stale.value) return true;
220
281
  pick(options.value[active.value]);
221
282
  return true;
222
283
  }
@@ -317,9 +378,11 @@ var chat_input_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
317
378
  "aria-controls": menuOpen.value ? `${unref(id)}-menu` : void 0,
318
379
  "aria-activedescendant": menuOpen.value ? optionId(active.value) : void 0,
319
380
  onKeydown,
320
- onKeyup: readToken,
321
- onClick: readToken,
322
- onInput: readToken,
381
+ onKeyup: onCaret,
382
+ onClick: onCaret,
383
+ onInput: onCaret,
384
+ onCompositionstart: onCompositionStart,
385
+ onCompositionend: onCompositionEnd,
323
386
  onBlur: _cache[1] || (_cache[1] = ($event) => token.value = null),
324
387
  onPaste
325
388
  }), null, 16, _hoisted_1), [[vModelText, model.value]]),
@@ -332,7 +395,12 @@ var chat_input_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
332
395
  key: 0,
333
396
  id: `${unref(id)}-menu`,
334
397
  ref: "menu",
335
- class: normalizeClass([unref(ns).e("menu"), "dou-floating"]),
398
+ class: normalizeClass([
399
+ unref(ns).e("menu"),
400
+ "dou-floating",
401
+ unref(ns).is("stale", stale.value)
402
+ ]),
403
+ "aria-busy": stale.value || void 0,
336
404
  style: normalizeStyle(menuStyle.value),
337
405
  "data-placement": unref(menuPlacement),
338
406
  "data-dou-theme": unref(theme),