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,11 +1,17 @@
1
1
  import { useNamespace } from "../../utils/namespace.js";
2
2
  import { useLocale } from "../config-provider/use-config.js";
3
+ import { checkedUrl, opensNewTab } from "../../utils/safe-url.js";
4
+ import { DouPopover } from "../popover/index.js";
3
5
  import { sourceSite } from "./chat-sources.js";
4
- import popover_default from "../popover/popover.js";
5
- import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, normalizeClass, openBlock, resolveDynamicComponent, toDisplayString, unref, withCtx } from "vue";
6
+ import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, normalizeClass, openBlock, ref, resolveDynamicComponent, toDisplayString, unref, withCtx } from "vue";
6
7
  import { GlobeIcon } from "@dou-ui/icons";
7
8
  // src/components/chat-sources/chat-citation.vue?vue&type=script&setup=true&lang.ts
8
9
  var _hoisted_1 = ["src"];
10
+ var _hoisted_2 = [
11
+ "href",
12
+ "target",
13
+ "rel"
14
+ ];
9
15
  var chat_citation_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
10
16
  name: "DouChatCitation",
11
17
  __name: "chat-citation",
@@ -17,19 +23,39 @@ var chat_citation_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
17
23
  const props = __props;
18
24
  const ns = useNamespace("chat-citation");
19
25
  const { t } = useLocale();
26
+ const href = computed(() => checkedUrl("DouChatCitation", props.source?.url));
27
+ const newTab = computed(() => !!href.value && opensNewTab(href.value));
20
28
  const site = computed(() => props.source ? sourceSite(props.source) : "");
21
29
  const label = computed(() => props.source ? t("chat.citation", {
22
30
  index: props.index,
23
31
  title: props.source.title
24
32
  }) : String(props.index));
33
+ const open = ref(false);
34
+ let byFocus = false;
35
+ function onFocus(event) {
36
+ if (open.value || !event.target.matches(":focus-visible")) return;
37
+ byFocus = true;
38
+ open.value = true;
39
+ }
40
+ function onOpen(value) {
41
+ if (!value) byFocus = false;
42
+ }
43
+ function onBlur(event) {
44
+ const to = event.relatedTarget;
45
+ if (!byFocus || to?.closest(`.${ns.e("popover")}`)) return;
46
+ byFocus = false;
47
+ open.value = false;
48
+ }
25
49
  return (_ctx, _cache) => {
26
- return __props.source ? (openBlock(), createBlock(popover_default, {
50
+ return __props.source ? (openBlock(), createBlock(unref(DouPopover), {
27
51
  key: 0,
28
52
  trigger: "hover",
29
53
  placement: "top",
30
54
  width: 300,
31
55
  "show-delay": 150,
32
- class: normalizeClass(unref(ns).e("popover"))
56
+ class: normalizeClass(unref(ns).e("popover")),
57
+ open: open.value,
58
+ "onUpdate:open": [_cache[0] || (_cache[0] = ($event) => open.value = $event), onOpen]
33
59
  }, {
34
60
  content: withCtx(() => [
35
61
  createElementVNode("span", { class: normalizeClass(unref(ns).e("site")) }, [__props.source.icon ? (openBlock(), createElementBlock("img", {
@@ -41,23 +67,35 @@ var chat_citation_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
41
67
  key: 1,
42
68
  class: normalizeClass(unref(ns).e("favicon"))
43
69
  }, null, 8, ["class"])), createTextVNode(" " + toDisplayString(site.value), 1)], 2),
44
- createElementVNode("span", { class: normalizeClass(unref(ns).e("title")) }, toDisplayString(__props.source.title), 3),
45
- __props.source.description ? (openBlock(), createElementBlock("span", {
70
+ href.value ? (openBlock(), createElementBlock("a", {
46
71
  key: 0,
72
+ class: normalizeClass([unref(ns).e("title"), unref(ns).e("link")]),
73
+ href: href.value,
74
+ target: newTab.value ? "_blank" : void 0,
75
+ rel: newTab.value ? "noopener noreferrer" : void 0,
76
+ onBlur
77
+ }, toDisplayString(__props.source.title), 43, _hoisted_2)) : (openBlock(), createElementBlock("span", {
78
+ key: 1,
79
+ class: normalizeClass(unref(ns).e("title"))
80
+ }, toDisplayString(__props.source.title), 3)),
81
+ __props.source.description ? (openBlock(), createElementBlock("span", {
82
+ key: 2,
47
83
  class: normalizeClass(unref(ns).e("description"))
48
84
  }, toDisplayString(__props.source.description), 3)) : createCommentVNode("", true)
49
85
  ]),
50
- default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(__props.source.url ? "a" : "span"), {
86
+ default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(href.value ? "a" : "span"), {
51
87
  class: normalizeClass(unref(ns).b()),
52
- href: __props.source.url,
53
- target: __props.source.url ? "_blank" : void 0,
54
- rel: __props.source.url ? "noopener noreferrer" : void 0,
55
- tabindex: __props.source.url ? void 0 : 0,
56
- "aria-label": label.value
88
+ href: href.value,
89
+ target: newTab.value ? "_blank" : void 0,
90
+ rel: newTab.value ? "noopener noreferrer" : void 0,
91
+ tabindex: href.value ? void 0 : 0,
92
+ "aria-label": label.value,
93
+ onFocus,
94
+ onBlur
57
95
  }, {
58
96
  default: withCtx(() => [createTextVNode(toDisplayString(__props.index), 1)]),
59
97
  _: 1
60
- }, 8, [
98
+ }, 40, [
61
99
  "class",
62
100
  "href",
63
101
  "target",
@@ -66,7 +104,7 @@ var chat_citation_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
66
104
  "aria-label"
67
105
  ]))]),
68
106
  _: 1
69
- }, 8, ["class"])) : (openBlock(), createElementBlock("span", {
107
+ }, 8, ["class", "open"])) : (openBlock(), createElementBlock("span", {
70
108
  key: 1,
71
109
  class: normalizeClass(unref(ns).b())
72
110
  }, toDisplayString(__props.index), 3));
@@ -1 +1 @@
1
- {"version":3,"file":"chat-citation.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","DouPopover","_normalizeClass","_unref","_withCtx","_createElementVNode","_createElementBlock","_createTextVNode","_toDisplayString","_createCommentVNode","_resolveDynamicComponent"],"sources":["../../../src/components/chat-sources/chat-citation.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { GlobeIcon } from '@dou-ui/icons'\nimport { computed } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport DouPopover from '../popover/popover.vue'\nimport { sourceSite } from './chat-sources'\nimport type { ChatCitationProps } from './chat-sources'\n\ndefineOptions({ name: 'DouChatCitation' })\n\nconst props = defineProps<ChatCitationProps>()\n\nconst ns = useNamespace('chat-citation')\nconst { t } = useLocale()\nconst site = computed(() => (props.source ? sourceSite(props.source) : ''))\nconst label = computed(() =>\n props.source\n ? t('chat.citation', { index: props.index, title: props.source.title })\n : String(props.index),\n)\n</script>\n\n<template>\n <DouPopover\n v-if=\"source\"\n trigger=\"hover\"\n placement=\"top\"\n :width=\"300\"\n :show-delay=\"150\"\n :class=\"ns.e('popover')\"\n >\n <component\n :is=\"source.url ? 'a' : 'span'\"\n :class=\"ns.b()\"\n :href=\"source.url\"\n :target=\"source.url ? '_blank' : undefined\"\n :rel=\"source.url ? 'noopener noreferrer' : undefined\"\n :tabindex=\"source.url ? undefined : 0\"\n :aria-label=\"label\"\n >{{ index }}</component\n >\n <template #content>\n <span :class=\"ns.e('site')\">\n <img v-if=\"source.icon\" :class=\"ns.e('favicon')\" :src=\"source.icon\" alt=\"\" />\n <GlobeIcon v-else :class=\"ns.e('favicon')\" />\n {{ site }}\n </span>\n <span :class=\"ns.e('title')\">{{ source.title }}</span>\n <span v-if=\"source.description\" :class=\"ns.e('description')\">{{ source.description }}</span>\n </template>\n </DouPopover>\n <span v-else :class=\"ns.b()\">{{ index }}</span>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;EAWA,MAAM,QAAQ;EAEd,MAAM,KAAK,aAAa,eAAe;EACvC,MAAM,EAAE,MAAM,UAAU;EACxB,MAAM,OAAO,eAAgB,MAAM,SAAS,WAAW,MAAM,MAAM,IAAI,EAAG;EAC1E,MAAM,QAAQ,eACZ,MAAM,SACF,EAAE,iBAAiB;GAAE,OAAO,MAAM;GAAO,OAAO,MAAM,OAAO;EAAM,CAAC,IACpE,OAAO,MAAM,KAAK,CACxB;;GAKU,OAAA,QAAA,UADRA,UAAA,GAAAC,YA2BaC,iBAAA;;IAzBX,SAAQ;IACR,WAAU;IACT,OAAO;IACP,cAAY;IACZ,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,SAAA,CAAA;;IAYD,SAAOC,cAKT;KAJPC,mBAIO,QAAA,EAJA,OAAKH,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA,E,IACL,QAAA,OAAO,QAAlBJ,UAAA,GAAAO,mBAA6E,OAAA;;MAApD,OAAKJ,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,SAAA,CAAA;MAAc,KAAK,QAAA,OAAO;MAAM,KAAI;K,6BACxEJ,UAAA,GAAAC,YAA6CG,MAAA,SAAA,GAAA;;MAA1B,OAAKD,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,SAAA,CAAA;K,yBAAeI,gBAAA,MAC7CC,gBAAG,KAAA,KAAI,GAAA,CAAA,C;KAETH,mBAAsD,QAAA,EAA/C,OAAKH,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA,EAAc,GAAAK,gBAAA,QAAA,OAAO,KAAK,GAAA,CAAA;KAChC,QAAA,OAAO,eAAnBT,UAAA,GAAAO,mBAA4F,QAAA;;MAA3D,OAAKJ,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,aAAA,CAAA;KAAoB,GAAAK,gBAAA,QAAA,OAAO,WAAW,GAAA,CAAA,K;;IAjBpF,SAAAJ,cASC,EATDL,UAAA,GAAAC,YASCU,wBARM,QAAA,OAAO,MAAG,MAAA,MAAA,GAAA;KACd,OAAKR,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,CAAA;KACX,MAAM,QAAA,OAAO;KACb,QAAQ,QAAA,OAAO,MAAG,WAAc,KAAA;KAChC,KAAK,QAAA,OAAO,MAAG,wBAA2B,KAAA;KAC1C,UAAU,QAAA,OAAO,MAAM,KAAA,IAAS;KAChC,cAAY,MAAA;;KACZ,SAAAC,cAAW,CAARG,gBAAAC,gBAAA,QAAA,KAAK,GAAA,CAAA,C;;;;;;;;;;;G,qBAYbT,UAAA,GAAAO,mBAA+C,QAAA;;IAAjC,OAAKJ,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,CAAA;GAAO,GAAAK,gBAAA,QAAA,KAAK,GAAA,CAAA"}
1
+ {"version":3,"file":"chat-citation.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_unref","_normalizeClass","_withCtx","_createElementVNode","_createElementBlock","_createTextVNode","_toDisplayString","_createCommentVNode","_resolveDynamicComponent"],"sources":["../../../src/components/chat-sources/chat-citation.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { GlobeIcon } from '@dou-ui/icons'\nimport { computed, ref } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { checkedUrl, opensNewTab } from '../../utils/safe-url'\nimport { useLocale } from '../config-provider/use-config'\nimport { DouPopover } from '../popover'\nimport { sourceSite } from './chat-sources'\nimport type { ChatCitationProps } from './chat-sources'\n\ndefineOptions({ name: 'DouChatCitation' })\n\nconst props = defineProps<ChatCitationProps>()\n\nconst ns = useNamespace('chat-citation')\nconst { t } = useLocale()\n// unsafe addresses such as `javascript:` are shown without a link\nconst href = computed(() => checkedUrl('DouChatCitation', props.source?.url))\nconst newTab = computed(() => !!href.value && opensNewTab(href.value))\nconst site = computed(() => (props.source ? sourceSite(props.source) : ''))\nconst label = computed(() =>\n props.source\n ? t('chat.citation', { index: props.index, title: props.source.title })\n : String(props.index),\n)\n\n/*\n * Hover shows the card; a tap opens it first, and the title in it is the\n * link (a second tap on the number follows it too). Focus from the\n * keyboard shows the card, and it goes when focus leaves for somewhere\n * other than the card.\n */\nconst open = ref(false)\nlet byFocus = false\nfunction onFocus(event: FocusEvent) {\n if (open.value || !(event.target as Element).matches(':focus-visible')) return\n byFocus = true\n open.value = true\n}\nfunction onOpen(value: boolean) {\n if (!value) byFocus = false\n}\nfunction onBlur(event: FocusEvent) {\n const to = event.relatedTarget as Element | null\n if (!byFocus || to?.closest(`.${ns.e('popover')}`)) return\n byFocus = false\n open.value = false\n}\n</script>\n\n<template>\n <DouPopover\n v-if=\"source\"\n trigger=\"hover\"\n placement=\"top\"\n :width=\"300\"\n :show-delay=\"150\"\n :class=\"ns.e('popover')\"\n v-model:open=\"open\"\n @update:open=\"onOpen\"\n >\n <component\n :is=\"href ? 'a' : 'span'\"\n :class=\"ns.b()\"\n :href=\"href\"\n :target=\"newTab ? '_blank' : undefined\"\n :rel=\"newTab ? 'noopener noreferrer' : undefined\"\n :tabindex=\"href ? undefined : 0\"\n :aria-label=\"label\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n >{{ index }}</component\n >\n <template #content>\n <span :class=\"ns.e('site')\">\n <img v-if=\"source.icon\" :class=\"ns.e('favicon')\" :src=\"source.icon\" alt=\"\" />\n <GlobeIcon v-else :class=\"ns.e('favicon')\" />\n {{ site }}\n </span>\n <a\n v-if=\"href\"\n :class=\"[ns.e('title'), ns.e('link')]\"\n :href=\"href\"\n :target=\"newTab ? '_blank' : undefined\"\n :rel=\"newTab ? 'noopener noreferrer' : undefined\"\n @blur=\"onBlur\"\n >{{ source.title }}</a\n >\n <span v-else :class=\"ns.e('title')\">{{ source.title }}</span>\n <span v-if=\"source.description\" :class=\"ns.e('description')\">{{ source.description }}</span>\n </template>\n </DouPopover>\n <span v-else :class=\"ns.b()\">{{ index }}</span>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-sources.js","names":[],"sources":["../../../src/components/chat-sources/chat-sources.ts"],"sourcesContent":["export interface ChatSource {\n /** Unique within the list. Defaults to the position. */\n key?: string | number\n title: string\n /** Where the source lives. Without it the source is shown but not linked. */\n url?: string\n /** A short name for the site, e.g. `weather.sh.cn`. Defaults to the host of `url`. */\n site?: string\n /** A line of the text it was quoted from, shown in the citation preview. */\n description?: string\n /** A small image for the site, such as its favicon. */\n icon?: string\n}\n\nexport interface ChatSourcesProps {\n /** The sources, in citation order: the first is `[1]`. */\n items?: ChatSource[]\n /** Show at most this many, followed by a \"+N\" button that shows the rest. */\n max?: number\n}\n\nexport interface ChatSourcesSlots {\n /** Replaces the inside of each source. */\n item?: (props: { source: ChatSource; index: number }) => unknown\n}\n\nexport interface ChatCitationProps {\n /** The number shown, counted from 1. */\n index: number\n /** The source it points to. Shown in a preview on hover or focus. */\n source?: ChatSource\n}\n\n/** The host of a URL without `www.`, or an empty string when it does not parse. */\nexport function sourceSite(source: Pick<ChatSource, 'site' | 'url'>): string {\n if (source.site) return source.site\n if (!source.url) return ''\n try {\n return new URL(source.url).host.replace(/^www\\./, '')\n } catch {\n return ''\n }\n}\n"],"mappings":";;AAkCA,SAAgB,WAAW,QAAkD;CAC3E,IAAI,OAAO,MAAM,OAAO,OAAO;CAC/B,IAAI,CAAC,OAAO,KAAK,OAAO;CACxB,IAAI;EACF,OAAO,IAAI,IAAI,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,UAAU,EAAE;CACtD,QAAQ;EACN,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"chat-sources.js","names":[],"sources":["../../../src/components/chat-sources/chat-sources.ts"],"sourcesContent":["export interface ChatSource {\n /** Unique within the list. Defaults to the position. */\n key?: string | number\n title: string\n /**\n * Where the source lives. Without it the source is shown but not linked.\n * Only http(s), mailto, tel and relative addresses become links; others,\n * such as `javascript:`, are shown without a link. http(s) and relative\n * links open in a new tab.\n */\n url?: string\n /** A short name for the site, e.g. `weather.sh.cn`. Defaults to the host of `url`. */\n site?: string\n /** A line of the text it was quoted from, shown in the citation preview. */\n description?: string\n /** A small image for the site, such as its favicon. */\n icon?: string\n}\n\nexport interface ChatSourcesProps {\n /** The sources, in citation order: the first is `[1]`. */\n items?: ChatSource[]\n /** Show at most this many, followed by a \"+N\" button that shows the rest. */\n max?: number\n}\n\nexport interface ChatSourcesSlots {\n /** Replaces the inside of each source. */\n item?: (props: { source: ChatSource; index: number }) => unknown\n}\n\nexport interface ChatCitationProps {\n /** The number shown, counted from 1. */\n index: number\n /** The source it points to. Shown in a preview on hover or focus. */\n source?: ChatSource\n}\n\n/** The host of a URL without `www.`, or an empty string when it does not parse. */\nexport function sourceSite(source: Pick<ChatSource, 'site' | 'url'>): string {\n if (source.site) return source.site\n if (!source.url) return ''\n try {\n return new URL(source.url).host.replace(/^www\\./, '')\n } catch {\n return ''\n }\n}\n"],"mappings":";;AAuCA,SAAgB,WAAW,QAAkD;CAC3E,IAAI,OAAO,MAAM,OAAO,OAAO;CAC/B,IAAI,CAAC,OAAO,KAAK,OAAO;CACxB,IAAI;EACF,OAAO,IAAI,IAAI,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,UAAU,EAAE;CACtD,QAAQ;EACN,OAAO;CACT;AACF"}
@@ -1,5 +1,6 @@
1
1
  import { useNamespace } from "../../utils/namespace.js";
2
2
  import { useLocale } from "../config-provider/use-config.js";
3
+ import { checkedUrl, opensNewTab } from "../../utils/safe-url.js";
3
4
  import { sourceSite } from "./chat-sources.js";
4
5
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, normalizeClass, openBlock, ref, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref, withCtx } from "vue";
5
6
  import { GlobeIcon } from "@dou-ui/icons";
@@ -21,6 +22,7 @@ var chat_sources_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
21
22
  const expanded = ref(false);
22
23
  const visible = computed(() => props.max === void 0 || expanded.value ? props.items : props.items.slice(0, props.max));
23
24
  const hidden = computed(() => props.items.length - visible.value.length);
25
+ const hrefs = computed(() => visible.value.map((source) => checkedUrl("DouChatSources", source.url)));
24
26
  return (_ctx, _cache) => {
25
27
  return openBlock(), createElementBlock("div", { class: normalizeClass(unref(ns).b()) }, [createElementVNode("ol", {
26
28
  class: normalizeClass(unref(ns).e("list")),
@@ -29,11 +31,11 @@ var chat_sources_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
29
31
  return openBlock(), createElementBlock("li", {
30
32
  key: source.key ?? index,
31
33
  class: normalizeClass(unref(ns).e("item"))
32
- }, [(openBlock(), createBlock(resolveDynamicComponent(source.url ? "a" : "span"), {
34
+ }, [(openBlock(), createBlock(resolveDynamicComponent(hrefs.value[index] ? "a" : "span"), {
33
35
  class: normalizeClass(unref(ns).e("link")),
34
- href: source.url,
35
- target: source.url ? "_blank" : void 0,
36
- rel: source.url ? "noopener noreferrer" : void 0,
36
+ href: hrefs.value[index],
37
+ target: hrefs.value[index] && unref(opensNewTab)(hrefs.value[index]) ? "_blank" : void 0,
38
+ rel: hrefs.value[index] && unref(opensNewTab)(hrefs.value[index]) ? "noopener noreferrer" : void 0,
37
39
  title: source.title
38
40
  }, {
39
41
  default: withCtx(() => [renderSlot(_ctx.$slots, "item", {
@@ -1 +1 @@
1
- {"version":3,"file":"chat-sources.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_Fragment","_renderList","_createBlock","_resolveDynamicComponent","_withCtx","_renderSlot","_toDisplayString","_createCommentVNode"],"sources":["../../../src/components/chat-sources/chat-sources.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { GlobeIcon } from '@dou-ui/icons'\nimport { computed, ref } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport { sourceSite } from './chat-sources'\nimport type { ChatSourcesProps, ChatSourcesSlots } from './chat-sources'\n\ndefineOptions({ name: 'DouChatSources' })\n\nconst props = withDefaults(defineProps<ChatSourcesProps>(), {\n items: () => [],\n})\ndefineSlots<ChatSourcesSlots>()\n\nconst ns = useNamespace('chat-sources')\nconst { t } = useLocale()\n\nconst expanded = ref(false)\nconst visible = computed(() =>\n props.max === undefined || expanded.value ? props.items : props.items.slice(0, props.max),\n)\nconst hidden = computed(() => props.items.length - visible.value.length)\n</script>\n\n<template>\n <div :class=\"ns.b()\">\n <ol :class=\"ns.e('list')\" :aria-label=\"t('chat.sources')\">\n <li v-for=\"(source, index) in visible\" :key=\"source.key ?? index\" :class=\"ns.e('item')\">\n <component\n :is=\"source.url ? 'a' : 'span'\"\n :class=\"ns.e('link')\"\n :href=\"source.url\"\n :target=\"source.url ? '_blank' : undefined\"\n :rel=\"source.url ? 'noopener noreferrer' : undefined\"\n :title=\"source.title\"\n >\n <slot name=\"item\" :source=\"source\" :index=\"index\">\n <span :class=\"ns.e('index')\">{{ index + 1 }}</span>\n <img v-if=\"source.icon\" :class=\"ns.e('favicon')\" :src=\"source.icon\" alt=\"\" />\n <GlobeIcon v-else :class=\"ns.e('favicon')\" />\n <span :class=\"ns.e('site')\">{{ sourceSite(source) || source.title }}</span>\n <span v-if=\"sourceSite(source)\" :class=\"ns.e('title')\">{{ source.title }}</span>\n </slot>\n </component>\n </li>\n <li v-if=\"hidden > 0\">\n <button type=\"button\" :class=\"[ns.e('link'), ns.e('more')]\" @click=\"expanded = true\">\n +{{ hidden }}\n </button>\n </li>\n </ol>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;EAUA,MAAM,QAAQ;EAKd,MAAM,KAAK,aAAa,cAAc;EACtC,MAAM,EAAE,MAAM,UAAU;EAExB,MAAM,WAAW,IAAI,KAAK;EAC1B,MAAM,UAAU,eACd,MAAM,QAAQ,KAAA,KAAa,SAAS,QAAQ,MAAM,QAAQ,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,CAC1F;EACA,MAAM,SAAS,eAAe,MAAM,MAAM,SAAS,QAAQ,MAAM,MAAM;;GAIrE,OAAAA,UAAA,GAAAC,mBA0BM,OAAA,EA1BA,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,CAAA,E,IACfC,mBAwBK,MAAA;IAxBA,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA;IAAW,cAAYA,MAAA,CAAA,CAAC,CAAA,cAAA;G,KACtCH,UAAA,IAAA,GAAAC,mBAiBKI,UAAA,MAAAC,WAjByB,QAAA,QAAlB,QAAQ,UAAK;IAAzB,OAAAN,UAAA,GAAAC,mBAiBK,MAAA;KAjBmC,KAAK,OAAO,OAAO;KAAQ,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA;I,KAC5EH,UAAA,GAAAO,YAeYC,wBAdL,OAAO,MAAG,MAAA,MAAA,GAAA;KACd,OAAKN,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA;KACX,MAAM,OAAO;KACb,QAAQ,OAAO,MAAG,WAAc,KAAA;KAChC,KAAK,OAAO,MAAG,wBAA2B,KAAA;KAC1C,OAAO,OAAO;;KAEf,SAAAM,cAMO,CANPC,WAMO,KAAA,QAAA,QAAA;MANoB;MAAgB;KAA3C,SAMO;MALLN,mBAAmD,QAAA,EAA5C,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA,EAAc,GAAAQ,gBAAA,QAAK,CAAA,GAAA,CAAA;MAC1B,OAAO,QAAlBX,UAAA,GAAAC,mBAA6E,OAAA;;OAApD,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,SAAA,CAAA;OAAc,KAAK,OAAO;OAAM,KAAI;M,6BACxEH,UAAA,GAAAO,YAA6CJ,MAAA,SAAA,GAAA;;OAA1B,OAAKD,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,SAAA,CAAA;;MAC9BC,mBAA2E,QAAA,EAApE,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA,EAAa,GAAAQ,gBAAAR,MAAA,UAAA,CAAU,CAAC,MAAM,KAAK,OAAO,KAAK,GAAA,CAAA;MACrDA,MAAA,UAAA,CAAU,CAAC,MAAM,KAA7BH,UAAA,GAAAC,mBAAgF,QAAA;;OAA/C,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA;MAAc,GAAAQ,gBAAA,OAAO,KAAK,GAAA,CAAA,K;;;;;;;;;;G,WAIlE,OAAA,QAAM,KAAhBX,UAAA,GAAAC,mBAIK,MAAA,YAAA,CAHHG,mBAES,UAAA;IAFD,MAAK;IAAU,OAAKF,eAAA,CAAGC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,GAAUA,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA,CAAA;IAAY,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,SAAA,QAAQ;GAAS,GAAA,OAClFQ,gBAAG,OAAA,KAAM,GAAA,CAAA,C"}
1
+ {"version":3,"file":"chat-sources.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_Fragment","_renderList","_createBlock","_resolveDynamicComponent","_withCtx","_renderSlot","_toDisplayString","_createCommentVNode"],"sources":["../../../src/components/chat-sources/chat-sources.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { GlobeIcon } from '@dou-ui/icons'\nimport { computed, ref } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { checkedUrl, opensNewTab } from '../../utils/safe-url'\nimport { useLocale } from '../config-provider/use-config'\nimport { sourceSite } from './chat-sources'\nimport type { ChatSourcesProps, ChatSourcesSlots } from './chat-sources'\n\ndefineOptions({ name: 'DouChatSources' })\n\nconst props = withDefaults(defineProps<ChatSourcesProps>(), {\n items: () => [],\n})\ndefineSlots<ChatSourcesSlots>()\n\nconst ns = useNamespace('chat-sources')\nconst { t } = useLocale()\n\nconst expanded = ref(false)\nconst visible = computed(() =>\n props.max === undefined || expanded.value ? props.items : props.items.slice(0, props.max),\n)\nconst hidden = computed(() => props.items.length - visible.value.length)\n// unsafe addresses such as `javascript:` are shown without a link\nconst hrefs = computed(() =>\n visible.value.map((source) => checkedUrl('DouChatSources', source.url)),\n)\n</script>\n\n<template>\n <div :class=\"ns.b()\">\n <ol :class=\"ns.e('list')\" :aria-label=\"t('chat.sources')\">\n <li v-for=\"(source, index) in visible\" :key=\"source.key ?? index\" :class=\"ns.e('item')\">\n <component\n :is=\"hrefs[index] ? 'a' : 'span'\"\n :class=\"ns.e('link')\"\n :href=\"hrefs[index]\"\n :target=\"hrefs[index] && opensNewTab(hrefs[index]) ? '_blank' : undefined\"\n :rel=\"hrefs[index] && opensNewTab(hrefs[index]) ? 'noopener noreferrer' : undefined\"\n :title=\"source.title\"\n >\n <slot name=\"item\" :source=\"source\" :index=\"index\">\n <span :class=\"ns.e('index')\">{{ index + 1 }}</span>\n <img v-if=\"source.icon\" :class=\"ns.e('favicon')\" :src=\"source.icon\" alt=\"\" />\n <GlobeIcon v-else :class=\"ns.e('favicon')\" />\n <span :class=\"ns.e('site')\">{{ sourceSite(source) || source.title }}</span>\n <span v-if=\"sourceSite(source)\" :class=\"ns.e('title')\">{{ source.title }}</span>\n </slot>\n </component>\n </li>\n <li v-if=\"hidden > 0\">\n <button type=\"button\" :class=\"[ns.e('link'), ns.e('more')]\" @click=\"expanded = true\">\n +{{ hidden }}\n </button>\n </li>\n </ol>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAWA,MAAM,QAAQ;EAKd,MAAM,KAAK,aAAa,cAAc;EACtC,MAAM,EAAE,MAAM,UAAU;EAExB,MAAM,WAAW,IAAI,KAAK;EAC1B,MAAM,UAAU,eACd,MAAM,QAAQ,KAAA,KAAa,SAAS,QAAQ,MAAM,QAAQ,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,CAC1F;EACA,MAAM,SAAS,eAAe,MAAM,MAAM,SAAS,QAAQ,MAAM,MAAM;EAEvE,MAAM,QAAQ,eACZ,QAAQ,MAAM,KAAK,WAAW,WAAW,kBAAkB,OAAO,GAAG,CAAC,CACxE;;GAIE,OAAAA,UAAA,GAAAC,mBA0BM,OAAA,EA1BA,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,CAAA,E,IACfC,mBAwBK,MAAA;IAxBA,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA;IAAW,cAAYA,MAAA,CAAA,CAAC,CAAA,cAAA;G,KACtCH,UAAA,IAAA,GAAAC,mBAiBKI,UAAA,MAAAC,WAjByB,QAAA,QAAlB,QAAQ,UAAK;IAAzB,OAAAN,UAAA,GAAAC,mBAiBK,MAAA;KAjBmC,KAAK,OAAO,OAAO;KAAQ,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA;I,KAC5EH,UAAA,GAAAO,YAeYC,wBAdL,MAAA,MAAM,SAAK,MAAA,MAAA,GAAA;KACf,OAAKN,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA;KACX,MAAM,MAAA,MAAM;KACZ,QAAQ,MAAA,MAAM,UAAUA,MAAA,WAAA,CAAW,CAAC,MAAA,MAAM,MAAK,IAAA,WAAgB,KAAA;KAC/D,KAAK,MAAA,MAAM,UAAUA,MAAA,WAAA,CAAW,CAAC,MAAA,MAAM,MAAK,IAAA,wBAA6B,KAAA;KACzE,OAAO,OAAO;;KAEf,SAAAM,cAMO,CANPC,WAMO,KAAA,QAAA,QAAA;MANoB;MAAgB;KAA3C,SAMO;MALLN,mBAAmD,QAAA,EAA5C,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA,EAAc,GAAAQ,gBAAA,QAAK,CAAA,GAAA,CAAA;MAC1B,OAAO,QAAlBX,UAAA,GAAAC,mBAA6E,OAAA;;OAApD,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,SAAA,CAAA;OAAc,KAAK,OAAO;OAAM,KAAI;M,6BACxEH,UAAA,GAAAO,YAA6CJ,MAAA,SAAA,GAAA;;OAA1B,OAAKD,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,SAAA,CAAA;;MAC9BC,mBAA2E,QAAA,EAApE,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA,EAAa,GAAAQ,gBAAAR,MAAA,UAAA,CAAU,CAAC,MAAM,KAAK,OAAO,KAAK,GAAA,CAAA;MACrDA,MAAA,UAAA,CAAU,CAAC,MAAM,KAA7BH,UAAA,GAAAC,mBAAgF,QAAA;;OAA/C,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA;MAAc,GAAAQ,gBAAA,OAAO,KAAK,GAAA,CAAA,K;;;;;;;;;;G,WAIlE,OAAA,QAAM,KAAhBX,UAAA,GAAAC,mBAIK,MAAA,YAAA,CAHHG,mBAES,UAAA;IAFD,MAAK;IAAU,OAAKF,eAAA,CAAGC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,GAAUA,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA,CAAA;IAAY,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,SAAA,QAAQ;GAAS,GAAA,OAClFQ,gBAAG,OAAA,KAAM,GAAA,CAAA,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-sources2.js","names":["_sfc_main"],"sources":["../../../src/components/chat-sources/chat-sources.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { GlobeIcon } from '@dou-ui/icons'\nimport { computed, ref } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport { sourceSite } from './chat-sources'\nimport type { ChatSourcesProps, ChatSourcesSlots } from './chat-sources'\n\ndefineOptions({ name: 'DouChatSources' })\n\nconst props = withDefaults(defineProps<ChatSourcesProps>(), {\n items: () => [],\n})\ndefineSlots<ChatSourcesSlots>()\n\nconst ns = useNamespace('chat-sources')\nconst { t } = useLocale()\n\nconst expanded = ref(false)\nconst visible = computed(() =>\n props.max === undefined || expanded.value ? props.items : props.items.slice(0, props.max),\n)\nconst hidden = computed(() => props.items.length - visible.value.length)\n</script>\n\n<template>\n <div :class=\"ns.b()\">\n <ol :class=\"ns.e('list')\" :aria-label=\"t('chat.sources')\">\n <li v-for=\"(source, index) in visible\" :key=\"source.key ?? index\" :class=\"ns.e('item')\">\n <component\n :is=\"source.url ? 'a' : 'span'\"\n :class=\"ns.e('link')\"\n :href=\"source.url\"\n :target=\"source.url ? '_blank' : undefined\"\n :rel=\"source.url ? 'noopener noreferrer' : undefined\"\n :title=\"source.title\"\n >\n <slot name=\"item\" :source=\"source\" :index=\"index\">\n <span :class=\"ns.e('index')\">{{ index + 1 }}</span>\n <img v-if=\"source.icon\" :class=\"ns.e('favicon')\" :src=\"source.icon\" alt=\"\" />\n <GlobeIcon v-else :class=\"ns.e('favicon')\" />\n <span :class=\"ns.e('site')\">{{ sourceSite(source) || source.title }}</span>\n <span v-if=\"sourceSite(source)\" :class=\"ns.e('title')\">{{ source.title }}</span>\n </slot>\n </component>\n </li>\n <li v-if=\"hidden > 0\">\n <button type=\"button\" :class=\"[ns.e('link'), ns.e('more')]\" @click=\"expanded = true\">\n +{{ hidden }}\n </button>\n </li>\n </ol>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"chat-sources2.js","names":["_sfc_main"],"sources":["../../../src/components/chat-sources/chat-sources.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { GlobeIcon } from '@dou-ui/icons'\nimport { computed, ref } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { checkedUrl, opensNewTab } from '../../utils/safe-url'\nimport { useLocale } from '../config-provider/use-config'\nimport { sourceSite } from './chat-sources'\nimport type { ChatSourcesProps, ChatSourcesSlots } from './chat-sources'\n\ndefineOptions({ name: 'DouChatSources' })\n\nconst props = withDefaults(defineProps<ChatSourcesProps>(), {\n items: () => [],\n})\ndefineSlots<ChatSourcesSlots>()\n\nconst ns = useNamespace('chat-sources')\nconst { t } = useLocale()\n\nconst expanded = ref(false)\nconst visible = computed(() =>\n props.max === undefined || expanded.value ? props.items : props.items.slice(0, props.max),\n)\nconst hidden = computed(() => props.items.length - visible.value.length)\n// unsafe addresses such as `javascript:` are shown without a link\nconst hrefs = computed(() =>\n visible.value.map((source) => checkedUrl('DouChatSources', source.url)),\n)\n</script>\n\n<template>\n <div :class=\"ns.b()\">\n <ol :class=\"ns.e('list')\" :aria-label=\"t('chat.sources')\">\n <li v-for=\"(source, index) in visible\" :key=\"source.key ?? index\" :class=\"ns.e('item')\">\n <component\n :is=\"hrefs[index] ? 'a' : 'span'\"\n :class=\"ns.e('link')\"\n :href=\"hrefs[index]\"\n :target=\"hrefs[index] && opensNewTab(hrefs[index]) ? '_blank' : undefined\"\n :rel=\"hrefs[index] && opensNewTab(hrefs[index]) ? 'noopener noreferrer' : undefined\"\n :title=\"source.title\"\n >\n <slot name=\"item\" :source=\"source\" :index=\"index\">\n <span :class=\"ns.e('index')\">{{ index + 1 }}</span>\n <img v-if=\"source.icon\" :class=\"ns.e('favicon')\" :src=\"source.icon\" alt=\"\" />\n <GlobeIcon v-else :class=\"ns.e('favicon')\" />\n <span :class=\"ns.e('site')\">{{ sourceSite(source) || source.title }}</span>\n <span v-if=\"sourceSite(source)\" :class=\"ns.e('title')\">{{ source.title }}</span>\n </slot>\n </component>\n </li>\n <li v-if=\"hidden > 0\">\n <button type=\"button\" :class=\"[ns.e('link'), ns.e('more')]\" @click=\"expanded = true\">\n +{{ hidden }}\n </button>\n </li>\n </ol>\n </div>\n</template>\n"],"mappings":""}
@@ -1,6 +1,6 @@
1
1
  import { withInstall } from "../../utils/install.js";
2
- import chat_sources_default from "./chat-sources2.js";
3
2
  import chat_citation_default from "./chat-citation.js";
3
+ import chat_sources_default from "./chat-sources2.js";
4
4
  // src/components/chat-sources/index.ts
5
5
  var DouChatSources = withInstall(chat_sources_default);
6
6
  var DouChatCitation = withInstall(chat_citation_default);
@@ -1,6 +1,11 @@
1
- import chat_steps_vue_vue_type_script_setup_true_lang_default from "./chat-steps.vue_vue_type_script_setup_true_lang.js";
2
- // src/components/chat-steps/chat-steps.vue
3
- var chat_steps_default = chat_steps_vue_vue_type_script_setup_true_lang_default;
4
- export { chat_steps_default as default };
1
+ // src/components/chat-steps/chat-steps.ts
2
+ /**
3
+ * Whether the steps are running, as they show it: `live` when set, else
4
+ * whether a step is `running`. ChatMessage reads the same for `aria-busy`.
5
+ */
6
+ function stepsLive(items, live) {
7
+ return live ?? !!items?.some((step) => step.status === "running");
8
+ }
9
+ export { stepsLive };
5
10
 
6
11
  //# sourceMappingURL=chat-steps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-steps.js","names":["_sfc_main"],"sources":["../../../src/components/chat-steps/chat-steps.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { AlertCircleIcon, ChevronDownIcon } from '@dou-ui/icons'\nimport { computed, ref, useId } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { CollapseTransition } from '../collapse/collapse-transition'\nimport { useLocale } from '../config-provider/use-config'\nimport DouShimmer from '../shimmer/shimmer.vue'\nimport DouSpinner from '../spinner/spinner.vue'\nimport type { ChatStepsEmits, ChatStepsProps, ChatStepsSlots } from './chat-steps'\n\ndefineOptions({ name: 'DouChatSteps' })\n\nconst props = withDefaults(defineProps<ChatStepsProps>(), {\n items: () => [],\n running: undefined,\n open: undefined,\n})\nconst emit = defineEmits<ChatStepsEmits>()\nconst slots = defineSlots<ChatStepsSlots>()\n\nconst ns = useNamespace('chat-steps')\nconst { t } = useLocale()\nconst id = useId()\n\nconst inner = ref(false)\nconst open = computed(() => props.open ?? inner.value)\nfunction toggle() {\n inner.value = !open.value\n emit('update:open', inner.value)\n}\n\n// the last running step; a loop, since `findLast` needs a newer lib than the build targets\nconst current = computed(() => {\n for (let i = props.items.length - 1; i >= 0; i--) {\n if (props.items[i]!.status === 'running') return props.items[i]\n }\n return undefined\n})\nconst running = computed(() => props.running ?? !!current.value)\nconst summary = computed(() => {\n if (props.title) return props.title\n if (running.value) return current.value?.label ?? t('chat.working')\n return t('chat.stepsDone', { count: props.items.length })\n})\n</script>\n\n<template>\n <div :class=\"[ns.b(), ns.is('open', open), ns.is('running', running)]\">\n <button\n :id=\"`${id}-trigger`\"\n type=\"button\"\n :class=\"ns.e('header')\"\n :aria-expanded=\"open\"\n :aria-controls=\"`${id}-panel`\"\n @click=\"toggle\"\n >\n <span :class=\"ns.e('title')\">\n <slot name=\"title\" :running=\"running\" :count=\"items.length\">\n <DouShimmer :active=\"running\">{{ summary }}</DouShimmer>\n </slot>\n </span>\n <ChevronDownIcon :class=\"ns.e('arrow')\" />\n </button>\n <CollapseTransition>\n <div\n v-show=\"open\"\n :id=\"`${id}-panel`\"\n role=\"region\"\n :class=\"ns.e('panel')\"\n :aria-labelledby=\"`${id}-trigger`\"\n >\n <ol :class=\"ns.e('list')\">\n <li\n v-for=\"(step, index) in items\"\n :key=\"step.key ?? index\"\n :class=\"[ns.e('step'), ns.is(step.status ?? 'done')]\"\n >\n <span :class=\"ns.e('mark')\">\n <DouSpinner\n v-if=\"step.status === 'running'\"\n size=\"sm\"\n :label=\"t('chat.stepRunning')\"\n />\n <AlertCircleIcon v-else-if=\"step.status === 'error'\" :label=\"t('chat.stepError')\" />\n <component :is=\"step.icon\" v-else-if=\"step.icon\" />\n <span v-else :class=\"ns.e('dot')\" />\n </span>\n <div :class=\"ns.e('body')\">\n <div :class=\"ns.e('line')\">\n <slot name=\"step\" :step=\"step\" :index=\"index\">\n <span :class=\"ns.e('label')\">{{ step.label }}</span>\n <span v-if=\"step.detail\" :class=\"ns.e('detail')\">{{ step.detail }}</span>\n </slot>\n </div>\n <div v-if=\"slots.detail\" :class=\"ns.e('extra')\">\n <slot name=\"detail\" :step=\"step\" :index=\"index\" />\n </div>\n </div>\n </li>\n </ol>\n </div>\n </CollapseTransition>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"chat-steps.js","names":[],"sources":["../../../src/components/chat-steps/chat-steps.ts"],"sourcesContent":["import type { Component } from 'vue'\n\nexport type ChatStepStatus = 'running' | 'done' | 'error'\n\nexport interface ChatStep {\n /** Unique within the list. Defaults to the position. */\n key?: string | number\n /** What the step does, e.g. \"Searched the web\". */\n label: string\n /** What it was about, e.g. the query or the file name, shown quieter after the label. */\n detail?: string\n /** Defaults to `done`. */\n status?: ChatStepStatus\n /** An icon component for the step. A neutral dot when omitted. */\n icon?: Component\n}\n\nexport interface ChatStepsProps {\n /** The steps so far, in order. */\n items?: ChatStep[]\n /**\n * The work is going on now. While it is, the summary line names the\n * running step; afterwards it counts the steps. Defaults to whether any\n * step is `running`. Off once the turn has ended or been stopped: a\n * `running` step holds still, a solid dot in place of the spinner.\n */\n live?: boolean\n /** Replaces the summary line. */\n title?: string\n /** Expanded or not. Bound with `v-model:open`; folded by default. */\n open?: boolean\n}\n\nexport interface ChatStepsEmits {\n 'update:open': [open: boolean]\n}\n\nexport interface ChatStepsSlots {\n /** Replaces each step's text. */\n step?: (props: { step: ChatStep; index: number }) => unknown\n /** Content under each step, e.g. a tool call's result. */\n detail?: (props: { step: ChatStep; index: number }) => unknown\n /** Replaces the summary line. */\n title?: (props: { live: boolean; count: number }) => unknown\n}\n\n/**\n * Whether the steps are running, as they show it: `live` when set, else\n * whether a step is `running`. ChatMessage reads the same for `aria-busy`.\n */\nexport function stepsLive(items: readonly ChatStep[] | undefined, live?: boolean): boolean {\n return live ?? !!items?.some((step) => step.status === 'running')\n}\n"],"mappings":";;;;;AAkDA,SAAgB,UAAU,OAAwC,MAAyB;CACzF,OAAO,QAAQ,CAAC,CAAC,OAAO,MAAM,SAAS,KAAK,WAAW,SAAS;AAClE"}
@@ -1,8 +1,10 @@
1
1
  import { useNamespace } from "../../utils/namespace.js";
2
2
  import { useLocale } from "../config-provider/use-config.js";
3
- import spinner_default from "../spinner/spinner.js";
4
- import shimmer_default from "../shimmer/shimmer.js";
5
- import { CollapseTransition } from "../collapse/collapse-transition.js";
3
+ import { DouSpinner } from "../spinner/index.js";
4
+ import { DouShimmer } from "../shimmer/index.js";
5
+ import { DouCollapseTransition } from "../collapse/collapse-transition.js";
6
+ import { DouStatusDot } from "../status-dot/index.js";
7
+ import { stepsLive } from "./chat-steps.js";
6
8
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, ref, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref, useId, useSlots, vShow, withCtx, withDirectives } from "vue";
7
9
  import { AlertCircleIcon, ChevronDownIcon } from "@dou-ui/icons";
8
10
  // src/components/chat-steps/chat-steps.vue?vue&type=script&setup=true&lang.ts
@@ -17,7 +19,7 @@ var chat_steps_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
17
19
  __name: "chat-steps",
18
20
  props: {
19
21
  items: { default: () => [] },
20
- running: {
22
+ live: {
21
23
  type: Boolean,
22
24
  default: void 0
23
25
  },
@@ -44,17 +46,19 @@ var chat_steps_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
44
46
  const current = computed(() => {
45
47
  for (let i = props.items.length - 1; i >= 0; i--) if (props.items[i].status === "running") return props.items[i];
46
48
  });
47
- const running = computed(() => props.running ?? !!current.value);
49
+ const live = computed(() => stepsLive(props.items, props.live));
48
50
  const summary = computed(() => {
49
51
  if (props.title) return props.title;
50
- if (running.value) return current.value?.label ?? t("chat.working");
51
- return t("chat.stepsDone", { count: props.items.length });
52
+ if (live.value) return current.value?.label ?? t("chat.working");
53
+ const count = props.items.length;
54
+ const finished = props.items.every((step) => (step.status ?? "done") === "done");
55
+ return t(finished ? "chat.stepsDone" : "chat.stepsTotal", { count });
52
56
  });
53
57
  return (_ctx, _cache) => {
54
58
  return openBlock(), createElementBlock("div", { class: normalizeClass([
55
59
  unref(ns).b(),
56
60
  unref(ns).is("open", open.value),
57
- unref(ns).is("running", running.value)
61
+ unref(ns).is("running", live.value)
58
62
  ]) }, [createElementVNode("button", {
59
63
  id: `${unref(id)}-trigger`,
60
64
  type: "button",
@@ -63,12 +67,12 @@ var chat_steps_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
63
67
  "aria-controls": `${unref(id)}-panel`,
64
68
  onClick: toggle
65
69
  }, [createElementVNode("span", { class: normalizeClass(unref(ns).e("title")) }, [renderSlot(_ctx.$slots, "title", {
66
- running: running.value,
70
+ live: live.value,
67
71
  count: __props.items.length
68
- }, () => [createVNode(shimmer_default, { active: running.value }, {
72
+ }, () => [createVNode(unref(DouShimmer), { active: live.value }, {
69
73
  default: withCtx(() => [createTextVNode(toDisplayString(summary.value), 1)]),
70
74
  _: 1
71
- }, 8, ["active"])])], 2), createVNode(unref(ChevronDownIcon), { class: normalizeClass(unref(ns).e("arrow")) }, null, 8, ["class"])], 10, _hoisted_1), createVNode(unref(CollapseTransition), null, {
75
+ }, 8, ["active"])])], 2), createVNode(unref(ChevronDownIcon), { class: normalizeClass(unref(ns).e("arrow")) }, null, 8, ["class"])], 10, _hoisted_1), createVNode(unref(DouCollapseTransition), null, {
72
76
  default: withCtx(() => [withDirectives(createElementVNode("div", {
73
77
  id: `${unref(id)}-panel`,
74
78
  role: "region",
@@ -78,11 +82,14 @@ var chat_steps_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
78
82
  return openBlock(), createElementBlock("li", {
79
83
  key: step.key ?? index,
80
84
  class: normalizeClass([unref(ns).e("step"), unref(ns).is(step.status ?? "done")])
81
- }, [createElementVNode("span", { class: normalizeClass(unref(ns).e("mark")) }, [step.status === "running" ? (openBlock(), createBlock(spinner_default, {
85
+ }, [createElementVNode("span", { class: normalizeClass(unref(ns).e("mark")) }, [step.status === "running" ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [live.value ? (openBlock(), createBlock(unref(DouSpinner), {
82
86
  key: 0,
83
87
  size: "sm",
84
88
  label: unref(t)("chat.stepRunning")
85
- }, null, 8, ["label"])) : step.status === "error" ? (openBlock(), createBlock(unref(AlertCircleIcon), {
89
+ }, null, 8, ["label"])) : (openBlock(), createBlock(unref(DouStatusDot), {
90
+ key: 1,
91
+ label: unref(t)("chat.stepRunning")
92
+ }, null, 8, ["label"]))], 64)) : step.status === "error" ? (openBlock(), createBlock(unref(AlertCircleIcon), {
86
93
  key: 1,
87
94
  label: unref(t)("chat.stepError")
88
95
  }, null, 8, ["label"])) : step.icon ? (openBlock(), createBlock(resolveDynamicComponent(step.icon), { key: 2 })) : (openBlock(), createElementBlock("span", {
@@ -1 +1 @@
1
- {"version":3,"file":"chat-steps.vue_vue_type_script_setup_true_lang.js","names":["_useSlots","_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_renderSlot","_createVNode","DouShimmer","_withCtx","_createTextVNode","_toDisplayString","_withDirectives","_Fragment","_renderList","_createBlock","DouSpinner","_resolveDynamicComponent","_createCommentVNode","_vShow"],"sources":["../../../src/components/chat-steps/chat-steps.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { AlertCircleIcon, ChevronDownIcon } from '@dou-ui/icons'\nimport { computed, ref, useId } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { CollapseTransition } from '../collapse/collapse-transition'\nimport { useLocale } from '../config-provider/use-config'\nimport DouShimmer from '../shimmer/shimmer.vue'\nimport DouSpinner from '../spinner/spinner.vue'\nimport type { ChatStepsEmits, ChatStepsProps, ChatStepsSlots } from './chat-steps'\n\ndefineOptions({ name: 'DouChatSteps' })\n\nconst props = withDefaults(defineProps<ChatStepsProps>(), {\n items: () => [],\n running: undefined,\n open: undefined,\n})\nconst emit = defineEmits<ChatStepsEmits>()\nconst slots = defineSlots<ChatStepsSlots>()\n\nconst ns = useNamespace('chat-steps')\nconst { t } = useLocale()\nconst id = useId()\n\nconst inner = ref(false)\nconst open = computed(() => props.open ?? inner.value)\nfunction toggle() {\n inner.value = !open.value\n emit('update:open', inner.value)\n}\n\n// the last running step; a loop, since `findLast` needs a newer lib than the build targets\nconst current = computed(() => {\n for (let i = props.items.length - 1; i >= 0; i--) {\n if (props.items[i]!.status === 'running') return props.items[i]\n }\n return undefined\n})\nconst running = computed(() => props.running ?? !!current.value)\nconst summary = computed(() => {\n if (props.title) return props.title\n if (running.value) return current.value?.label ?? t('chat.working')\n return t('chat.stepsDone', { count: props.items.length })\n})\n</script>\n\n<template>\n <div :class=\"[ns.b(), ns.is('open', open), ns.is('running', running)]\">\n <button\n :id=\"`${id}-trigger`\"\n type=\"button\"\n :class=\"ns.e('header')\"\n :aria-expanded=\"open\"\n :aria-controls=\"`${id}-panel`\"\n @click=\"toggle\"\n >\n <span :class=\"ns.e('title')\">\n <slot name=\"title\" :running=\"running\" :count=\"items.length\">\n <DouShimmer :active=\"running\">{{ summary }}</DouShimmer>\n </slot>\n </span>\n <ChevronDownIcon :class=\"ns.e('arrow')\" />\n </button>\n <CollapseTransition>\n <div\n v-show=\"open\"\n :id=\"`${id}-panel`\"\n role=\"region\"\n :class=\"ns.e('panel')\"\n :aria-labelledby=\"`${id}-trigger`\"\n >\n <ol :class=\"ns.e('list')\">\n <li\n v-for=\"(step, index) in items\"\n :key=\"step.key ?? index\"\n :class=\"[ns.e('step'), ns.is(step.status ?? 'done')]\"\n >\n <span :class=\"ns.e('mark')\">\n <DouSpinner\n v-if=\"step.status === 'running'\"\n size=\"sm\"\n :label=\"t('chat.stepRunning')\"\n />\n <AlertCircleIcon v-else-if=\"step.status === 'error'\" :label=\"t('chat.stepError')\" />\n <component :is=\"step.icon\" v-else-if=\"step.icon\" />\n <span v-else :class=\"ns.e('dot')\" />\n </span>\n <div :class=\"ns.e('body')\">\n <div :class=\"ns.e('line')\">\n <slot name=\"step\" :step=\"step\" :index=\"index\">\n <span :class=\"ns.e('label')\">{{ step.label }}</span>\n <span v-if=\"step.detail\" :class=\"ns.e('detail')\">{{ step.detail }}</span>\n </slot>\n </div>\n <div v-if=\"slots.detail\" :class=\"ns.e('extra')\">\n <slot name=\"detail\" :step=\"step\" :index=\"index\" />\n </div>\n </div>\n </li>\n </ol>\n </div>\n </CollapseTransition>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"chat-steps.vue_vue_type_script_setup_true_lang.js","names":["_useSlots","_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_renderSlot","_createVNode","_withCtx","_createTextVNode","_toDisplayString","CollapseTransition","_withDirectives","_Fragment","_renderList","_createBlock","_resolveDynamicComponent","_createCommentVNode","_vShow"],"sources":["../../../src/components/chat-steps/chat-steps.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { AlertCircleIcon, ChevronDownIcon } from '@dou-ui/icons'\nimport { computed, ref, useId } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { DouCollapseTransition as CollapseTransition } from '../collapse/collapse-transition'\nimport { useLocale } from '../config-provider/use-config'\nimport { DouShimmer } from '../shimmer'\nimport { DouSpinner } from '../spinner'\nimport { DouStatusDot } from '../status-dot'\nimport { stepsLive } from './chat-steps'\nimport type { ChatStepsEmits, ChatStepsProps, ChatStepsSlots } from './chat-steps'\n\ndefineOptions({ name: 'DouChatSteps' })\n\nconst props = withDefaults(defineProps<ChatStepsProps>(), {\n items: () => [],\n live: undefined,\n open: undefined,\n})\nconst emit = defineEmits<ChatStepsEmits>()\nconst slots = defineSlots<ChatStepsSlots>()\n\nconst ns = useNamespace('chat-steps')\nconst { t } = useLocale()\nconst id = useId()\n\nconst inner = ref(false)\nconst open = computed(() => props.open ?? inner.value)\nfunction toggle() {\n inner.value = !open.value\n emit('update:open', inner.value)\n}\n\n// the last running step; a loop, since `findLast` needs a newer lib than the build targets\nconst current = computed(() => {\n for (let i = props.items.length - 1; i >= 0; i--) {\n if (props.items[i]!.status === 'running') return props.items[i]\n }\n return undefined\n})\nconst live = computed(() => stepsLive(props.items, props.live))\nconst summary = computed(() => {\n if (props.title) return props.title\n if (live.value) return current.value?.label ?? t('chat.working')\n // a stopped run with steps left unfinished doesn't read as done\n const count = props.items.length\n const finished = props.items.every((step) => (step.status ?? 'done') === 'done')\n return t(finished ? 'chat.stepsDone' : 'chat.stepsTotal', { count })\n})\n</script>\n\n<template>\n <div :class=\"[ns.b(), ns.is('open', open), ns.is('running', live)]\">\n <button\n :id=\"`${id}-trigger`\"\n type=\"button\"\n :class=\"ns.e('header')\"\n :aria-expanded=\"open\"\n :aria-controls=\"`${id}-panel`\"\n @click=\"toggle\"\n >\n <span :class=\"ns.e('title')\">\n <slot name=\"title\" :live=\"live\" :count=\"items.length\">\n <DouShimmer :active=\"live\">{{ summary }}</DouShimmer>\n </slot>\n </span>\n <ChevronDownIcon :class=\"ns.e('arrow')\" />\n </button>\n <CollapseTransition>\n <div\n v-show=\"open\"\n :id=\"`${id}-panel`\"\n role=\"region\"\n :class=\"ns.e('panel')\"\n :aria-labelledby=\"`${id}-trigger`\"\n >\n <ol :class=\"ns.e('list')\">\n <li\n v-for=\"(step, index) in items\"\n :key=\"step.key ?? index\"\n :class=\"[ns.e('step'), ns.is(step.status ?? 'done')]\"\n >\n <span :class=\"ns.e('mark')\">\n <template v-if=\"step.status === 'running'\">\n <DouSpinner v-if=\"live\" size=\"sm\" :label=\"t('chat.stepRunning')\" />\n <DouStatusDot v-else :label=\"t('chat.stepRunning')\" />\n </template>\n <AlertCircleIcon v-else-if=\"step.status === 'error'\" :label=\"t('chat.stepError')\" />\n <component :is=\"step.icon\" v-else-if=\"step.icon\" />\n <span v-else :class=\"ns.e('dot')\" />\n </span>\n <div :class=\"ns.e('body')\">\n <div :class=\"ns.e('line')\">\n <slot name=\"step\" :step=\"step\" :index=\"index\">\n <span :class=\"ns.e('label')\">{{ step.label }}</span>\n <span v-if=\"step.detail\" :class=\"ns.e('detail')\">{{ step.detail }}</span>\n </slot>\n </div>\n <div v-if=\"slots.detail\" :class=\"ns.e('extra')\">\n <slot name=\"detail\" :step=\"step\" :index=\"index\" />\n </div>\n </div>\n </li>\n </ol>\n </div>\n </CollapseTransition>\n </div>\n</template>\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import chat_steps_vue_vue_type_script_setup_true_lang_default from "./chat-steps.vue_vue_type_script_setup_true_lang.js";
2
+ // src/components/chat-steps/chat-steps.vue
3
+ var chat_steps_default = chat_steps_vue_vue_type_script_setup_true_lang_default;
4
+ export { chat_steps_default as default };
5
+
6
+ //# sourceMappingURL=chat-steps2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-steps2.js","names":["_sfc_main"],"sources":["../../../src/components/chat-steps/chat-steps.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { AlertCircleIcon, ChevronDownIcon } from '@dou-ui/icons'\nimport { computed, ref, useId } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { DouCollapseTransition as CollapseTransition } from '../collapse/collapse-transition'\nimport { useLocale } from '../config-provider/use-config'\nimport { DouShimmer } from '../shimmer'\nimport { DouSpinner } from '../spinner'\nimport { DouStatusDot } from '../status-dot'\nimport { stepsLive } from './chat-steps'\nimport type { ChatStepsEmits, ChatStepsProps, ChatStepsSlots } from './chat-steps'\n\ndefineOptions({ name: 'DouChatSteps' })\n\nconst props = withDefaults(defineProps<ChatStepsProps>(), {\n items: () => [],\n live: undefined,\n open: undefined,\n})\nconst emit = defineEmits<ChatStepsEmits>()\nconst slots = defineSlots<ChatStepsSlots>()\n\nconst ns = useNamespace('chat-steps')\nconst { t } = useLocale()\nconst id = useId()\n\nconst inner = ref(false)\nconst open = computed(() => props.open ?? inner.value)\nfunction toggle() {\n inner.value = !open.value\n emit('update:open', inner.value)\n}\n\n// the last running step; a loop, since `findLast` needs a newer lib than the build targets\nconst current = computed(() => {\n for (let i = props.items.length - 1; i >= 0; i--) {\n if (props.items[i]!.status === 'running') return props.items[i]\n }\n return undefined\n})\nconst live = computed(() => stepsLive(props.items, props.live))\nconst summary = computed(() => {\n if (props.title) return props.title\n if (live.value) return current.value?.label ?? t('chat.working')\n // a stopped run with steps left unfinished doesn't read as done\n const count = props.items.length\n const finished = props.items.every((step) => (step.status ?? 'done') === 'done')\n return t(finished ? 'chat.stepsDone' : 'chat.stepsTotal', { count })\n})\n</script>\n\n<template>\n <div :class=\"[ns.b(), ns.is('open', open), ns.is('running', live)]\">\n <button\n :id=\"`${id}-trigger`\"\n type=\"button\"\n :class=\"ns.e('header')\"\n :aria-expanded=\"open\"\n :aria-controls=\"`${id}-panel`\"\n @click=\"toggle\"\n >\n <span :class=\"ns.e('title')\">\n <slot name=\"title\" :live=\"live\" :count=\"items.length\">\n <DouShimmer :active=\"live\">{{ summary }}</DouShimmer>\n </slot>\n </span>\n <ChevronDownIcon :class=\"ns.e('arrow')\" />\n </button>\n <CollapseTransition>\n <div\n v-show=\"open\"\n :id=\"`${id}-panel`\"\n role=\"region\"\n :class=\"ns.e('panel')\"\n :aria-labelledby=\"`${id}-trigger`\"\n >\n <ol :class=\"ns.e('list')\">\n <li\n v-for=\"(step, index) in items\"\n :key=\"step.key ?? index\"\n :class=\"[ns.e('step'), ns.is(step.status ?? 'done')]\"\n >\n <span :class=\"ns.e('mark')\">\n <template v-if=\"step.status === 'running'\">\n <DouSpinner v-if=\"live\" size=\"sm\" :label=\"t('chat.stepRunning')\" />\n <DouStatusDot v-else :label=\"t('chat.stepRunning')\" />\n </template>\n <AlertCircleIcon v-else-if=\"step.status === 'error'\" :label=\"t('chat.stepError')\" />\n <component :is=\"step.icon\" v-else-if=\"step.icon\" />\n <span v-else :class=\"ns.e('dot')\" />\n </span>\n <div :class=\"ns.e('body')\">\n <div :class=\"ns.e('line')\">\n <slot name=\"step\" :step=\"step\" :index=\"index\">\n <span :class=\"ns.e('label')\">{{ step.label }}</span>\n <span v-if=\"step.detail\" :class=\"ns.e('detail')\">{{ step.detail }}</span>\n </slot>\n </div>\n <div v-if=\"slots.detail\" :class=\"ns.e('extra')\">\n <slot name=\"detail\" :step=\"step\" :index=\"index\" />\n </div>\n </div>\n </li>\n </ol>\n </div>\n </CollapseTransition>\n </div>\n</template>\n"],"mappings":""}
@@ -1,5 +1,5 @@
1
1
  import { withInstall } from "../../utils/install.js";
2
- import chat_steps_default from "./chat-steps.js";
2
+ import chat_steps_default from "./chat-steps2.js";
3
3
  // src/components/chat-steps/index.ts
4
4
  var DouChatSteps = withInstall(chat_steps_default);
5
5
  export { DouChatSteps, DouChatSteps as default };
@@ -1,4 +1,5 @@
1
1
  import '@dou-ui/theme/core.css'
2
+ import '@dou-ui/theme/components/status-dot.css'
2
3
  import '@dou-ui/theme/components/collapse.css'
3
4
  import '@dou-ui/theme/components/spinner.css'
4
5
  import '@dou-ui/theme/components/shimmer.css'
@@ -1 +1 @@
1
- {"version":3,"file":"chat-tool-call.js","names":[],"sources":["../../../src/components/chat-tool-call/chat-tool-call.ts"],"sourcesContent":["/** `pending` waits for the person to allow the call; the rest follow the run. */\nexport type ChatToolCallStatus = 'pending' | 'running' | 'success' | 'error'\n\nexport interface ChatToolCallProps {\n /** The tool's name, e.g. `search_web`. */\n name?: string\n /** A readable line shown instead of the name, e.g. \"Searching the web\". */\n title?: string\n status?: ChatToolCallStatus\n /** What the tool was called with. Objects are shown as formatted JSON. */\n input?: unknown\n /** What it returned, or the error. Objects are shown as formatted JSON. */\n output?: unknown\n /** Expanded or not. Bound with `v-model:open`. */\n open?: boolean\n}\n\nexport interface ChatToolCallEmits {\n 'update:open': [open: boolean]\n}\n\nexport interface ChatToolCallSlots {\n /** Replaces the tool icon. */\n icon?: () => unknown\n /** Replaces the title. */\n title?: () => unknown\n /** Replaces the input section. */\n input?: () => unknown\n /** Replaces the output section. */\n output?: () => unknown\n /** Extra content in the panel, after the output. */\n default?: () => unknown\n /** Under the header, always visible: e.g. allow / deny buttons for a `pending` call. */\n actions?: () => unknown\n}\n\n/** Show a value the way a person reads it: strings as they are, the rest as JSON. */\nexport function formatToolValue(value: unknown): string {\n if (typeof value === 'string') return value\n try {\n return JSON.stringify(value, null, 2) ?? String(value)\n } catch {\n return String(value)\n }\n}\n"],"mappings":";;AAqCA,SAAgB,gBAAgB,OAAwB;CACtD,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI;EACF,OAAO,KAAK,UAAU,OAAO,MAAM,CAAC,KAAK,OAAO,KAAK;CACvD,QAAQ;EACN,OAAO,OAAO,KAAK;CACrB;AACF"}
1
+ {"version":3,"file":"chat-tool-call.js","names":[],"sources":["../../../src/components/chat-tool-call/chat-tool-call.ts"],"sourcesContent":["/**\n * The same words as ChatPlan: `pending` hasn't started, `waiting` is paused on\n * someone else, such as the person allowing the call; `withdrawn` means the\n * call was taken back before it ran, as with ChatConfirm; the rest follow the run.\n */\nexport type ChatToolCallStatus = 'pending' | 'running' | 'waiting' | 'done' | 'error' | 'withdrawn'\n\nexport interface ChatToolCallProps {\n /** The tool's name, e.g. `search_web`. */\n name?: string\n /** A readable line shown instead of the name, e.g. \"Searching the web\". */\n title?: string\n status?: ChatToolCallStatus\n /** What the tool was called with. Objects are shown as formatted JSON. */\n input?: unknown\n /** What it returned, or the error. Objects are shown as formatted JSON. */\n output?: unknown\n /** Expanded or not. Bound with `v-model:open`. */\n open?: boolean\n /**\n * The run is going on now. Off once the turn has ended or been stopped: a\n * `running` call holds still, a solid dot in place of the spinner.\n */\n live?: boolean\n}\n\nexport interface ChatToolCallEmits {\n 'update:open': [open: boolean]\n}\n\nexport interface ChatToolCallSlots {\n /** Replaces the tool icon. */\n icon?: () => unknown\n /** Replaces the title. */\n title?: () => unknown\n /** Replaces the input section. */\n input?: () => unknown\n /** Replaces the output section. */\n output?: () => unknown\n /** Extra content in the panel, after the output. */\n default?: () => unknown\n /** Under the header, always visible: e.g. allow / deny buttons for a `waiting` call. */\n actions?: () => unknown\n}\n\n/** Show a value the way a person reads it: strings as they are, the rest as JSON. */\nexport function formatToolValue(value: unknown): string {\n if (typeof value === 'string') return value\n try {\n return JSON.stringify(value, null, 2) ?? String(value)\n } catch {\n return String(value)\n }\n}\n"],"mappings":";;AA8CA,SAAgB,gBAAgB,OAAwB;CACtD,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI;EACF,OAAO,KAAK,UAAU,OAAO,MAAM,CAAC,KAAK,OAAO,KAAK;CACvD,QAAQ;EACN,OAAO,OAAO,KAAK;CACrB;AACF"}
@@ -1,10 +1,12 @@
1
1
  import { useNamespace } from "../../utils/namespace.js";
2
2
  import { useLocale } from "../config-provider/use-config.js";
3
- import spinner_default from "../spinner/spinner.js";
4
- import { CollapseTransition } from "../collapse/collapse-transition.js";
3
+ import { devWarn, useStatusCheck } from "../../utils/status-check.js";
4
+ import { DouSpinner } from "../spinner/index.js";
5
+ import { DouCollapseTransition } from "../collapse/collapse-transition.js";
6
+ import { DouStatusDot } from "../status-dot/index.js";
5
7
  import { formatToolValue } from "./chat-tool-call.js";
6
- import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, ref, renderSlot, resolveDynamicComponent, toDisplayString, unref, useId, useSlots, vShow, withCtx, withDirectives } from "vue";
7
- import { AlertCircleIcon, CheckCircleIcon, ChevronDownIcon, ClockIcon, WrenchIcon } from "@dou-ui/icons";
8
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, ref, renderSlot, resolveDynamicComponent, toDisplayString, unref, useId, useSlots, vShow, watchEffect, withCtx, withDirectives } from "vue";
9
+ import { AlertCircleIcon, CheckCircleIcon, ChevronDownIcon, ClockIcon, ClockPauseIcon, UndoIcon, WrenchIcon } from "@dou-ui/icons";
8
10
  // src/components/chat-tool-call/chat-tool-call.vue?vue&type=script&setup=true&lang.ts
9
11
  var _hoisted_1 = ["id", "aria-labelledby"];
10
12
  var chat_tool_call_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
@@ -13,12 +15,16 @@ var chat_tool_call_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
13
15
  props: {
14
16
  name: {},
15
17
  title: {},
16
- status: { default: "success" },
18
+ status: { default: "done" },
17
19
  input: {},
18
20
  output: {},
19
21
  open: {
20
22
  type: Boolean,
21
23
  default: void 0
24
+ },
25
+ live: {
26
+ type: Boolean,
27
+ default: true
22
28
  }
23
29
  },
24
30
  emits: ["update:open"],
@@ -38,11 +44,25 @@ var chat_tool_call_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
38
44
  const hasInput = computed(() => !!slots.input || props.input !== void 0);
39
45
  const hasOutput = computed(() => !!slots.output || props.output !== void 0);
40
46
  const expandable = computed(() => hasInput.value || hasOutput.value || !!slots.default);
47
+ useStatusCheck("DouChatToolCall", () => [props.status], [
48
+ "pending",
49
+ "running",
50
+ "waiting",
51
+ "done",
52
+ "error",
53
+ "withdrawn"
54
+ ], { success: "done" });
55
+ if (process.env.NODE_ENV !== "production") watchEffect(() => {
56
+ if (props.status !== "pending" || !slots.actions) return;
57
+ devWarn("[dou-ui] DouChatToolCall: `pending` now means not started; use `waiting` for a call that waits for approval.");
58
+ });
41
59
  const statusText = computed(() => ({
42
60
  pending: t("chat.toolPending"),
43
61
  running: t("chat.toolRunning"),
44
- success: t("chat.toolSuccess"),
45
- error: t("chat.toolError")
62
+ waiting: t("chat.toolWaiting"),
63
+ done: t("chat.toolDone"),
64
+ error: t("chat.toolError"),
65
+ withdrawn: t("chat.toolWithdrawn")
46
66
  })[props.status]);
47
67
  return (_ctx, _cache) => {
48
68
  return openBlock(), createElementBlock("div", { class: normalizeClass([
@@ -67,19 +87,25 @@ var chat_tool_call_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
67
87
  key: 1,
68
88
  class: normalizeClass(unref(ns).e("name"))
69
89
  }, toDisplayString(__props.name), 3))])], 2),
70
- createElementVNode("span", { class: normalizeClass(unref(ns).e("status")) }, [__props.status === "running" ? (openBlock(), createBlock(spinner_default, {
90
+ createElementVNode("span", { class: normalizeClass(unref(ns).e("status")) }, [__props.status === "running" ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [__props.live ? (openBlock(), createBlock(unref(DouSpinner), {
71
91
  key: 0,
72
92
  size: "sm",
73
93
  "aria-hidden": "true"
74
- })) : __props.status === "pending" ? (openBlock(), createBlock(unref(ClockIcon), {
94
+ })) : (openBlock(), createBlock(unref(DouStatusDot), { key: 1 }))], 64)) : __props.status === "pending" ? (openBlock(), createBlock(unref(ClockIcon), {
75
95
  key: 1,
76
96
  "aria-hidden": "true"
77
- })) : __props.status === "success" ? (openBlock(), createBlock(unref(CheckCircleIcon), {
97
+ })) : __props.status === "waiting" ? (openBlock(), createBlock(unref(ClockPauseIcon), {
78
98
  key: 2,
79
99
  "aria-hidden": "true"
80
- })) : (openBlock(), createBlock(unref(AlertCircleIcon), {
100
+ })) : __props.status === "done" ? (openBlock(), createBlock(unref(CheckCircleIcon), {
81
101
  key: 3,
82
102
  "aria-hidden": "true"
103
+ })) : __props.status === "withdrawn" ? (openBlock(), createBlock(unref(UndoIcon), {
104
+ key: 4,
105
+ "aria-hidden": "true"
106
+ })) : (openBlock(), createBlock(unref(AlertCircleIcon), {
107
+ key: 5,
108
+ "aria-hidden": "true"
83
109
  })), createElementVNode("span", { class: normalizeClass(unref(ns).e("status-text")) }, toDisplayString(statusText.value), 3)], 2),
84
110
  expandable.value ? (openBlock(), createBlock(unref(ChevronDownIcon), {
85
111
  key: 0,
@@ -94,7 +120,7 @@ var chat_tool_call_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
94
120
  "aria-expanded",
95
121
  "aria-controls"
96
122
  ])),
97
- createVNode(unref(CollapseTransition), null, {
123
+ createVNode(unref(DouCollapseTransition), null, {
98
124
  default: withCtx(() => [expandable.value ? withDirectives((openBlock(), createElementBlock("div", {
99
125
  key: 0,
100
126
  id: `${unref(id)}-panel`,