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

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 (386) 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/cascader/cascader.js.map +1 -1
  8. package/dist/components/cascader/cascader.vue_vue_type_script_setup_true_lang.js +3 -3
  9. package/dist/components/cascader/cascader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  10. package/dist/components/chat-artifact/chat-artifact.js.map +1 -1
  11. package/dist/components/chat-artifact/chat-artifact.vue_vue_type_script_setup_true_lang.js +8 -2
  12. package/dist/components/chat-artifact/chat-artifact.vue_vue_type_script_setup_true_lang.js.map +1 -1
  13. package/dist/components/chat-attachments/chat-attachments.js.map +1 -1
  14. package/dist/components/chat-attachments/chat-attachments.vue_vue_type_script_setup_true_lang.js +11 -2
  15. package/dist/components/chat-attachments/chat-attachments.vue_vue_type_script_setup_true_lang.js.map +1 -1
  16. package/dist/components/chat-attachments/chat-attachments2.js.map +1 -1
  17. package/dist/components/chat-confirm/chat-confirm.js.map +1 -1
  18. package/dist/components/chat-confirm/chat-confirm.vue_vue_type_script_setup_true_lang.js +38 -14
  19. package/dist/components/chat-confirm/chat-confirm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  20. package/dist/components/chat-context-meter/chat-context-meter.vue_vue_type_script_setup_true_lang.js +2 -2
  21. package/dist/components/chat-context-meter/chat-context-meter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  22. package/dist/components/chat-context-meter/chat-context-meter2.js.map +1 -1
  23. package/dist/components/chat-message/chat-message.js.map +1 -1
  24. package/dist/components/chat-message/chat-message.vue_vue_type_script_setup_true_lang.js +88 -33
  25. package/dist/components/chat-message/chat-message.vue_vue_type_script_setup_true_lang.js.map +1 -1
  26. package/dist/components/chat-message/chat-message2.js.map +1 -1
  27. package/dist/components/chat-message/style.js +5 -0
  28. package/dist/components/chat-plan/chat-plan.js +9 -4
  29. package/dist/components/chat-plan/chat-plan.js.map +1 -1
  30. package/dist/components/chat-plan/chat-plan.vue_vue_type_script_setup_true_lang.js +64 -32
  31. package/dist/components/chat-plan/chat-plan.vue_vue_type_script_setup_true_lang.js.map +1 -1
  32. package/dist/components/chat-plan/chat-plan2.js +6 -0
  33. package/dist/components/chat-plan/chat-plan2.js.map +1 -0
  34. package/dist/components/chat-plan/index.js +1 -1
  35. package/dist/components/chat-plan/style.js +1 -0
  36. package/dist/components/chat-reasoning/chat-reasoning.js.map +1 -1
  37. package/dist/components/chat-reasoning/chat-reasoning.vue_vue_type_script_setup_true_lang.js +4 -4
  38. package/dist/components/chat-reasoning/chat-reasoning.vue_vue_type_script_setup_true_lang.js.map +1 -1
  39. package/dist/components/chat-sources/chat-citation.js.map +1 -1
  40. package/dist/components/chat-sources/chat-citation.vue_vue_type_script_setup_true_lang.js +52 -14
  41. package/dist/components/chat-sources/chat-citation.vue_vue_type_script_setup_true_lang.js.map +1 -1
  42. package/dist/components/chat-sources/chat-sources.js.map +1 -1
  43. package/dist/components/chat-sources/chat-sources.vue_vue_type_script_setup_true_lang.js +6 -4
  44. package/dist/components/chat-sources/chat-sources.vue_vue_type_script_setup_true_lang.js.map +1 -1
  45. package/dist/components/chat-sources/chat-sources2.js.map +1 -1
  46. package/dist/components/chat-sources/index.js +1 -1
  47. package/dist/components/chat-steps/chat-steps.js +9 -4
  48. package/dist/components/chat-steps/chat-steps.js.map +1 -1
  49. package/dist/components/chat-steps/chat-steps.vue_vue_type_script_setup_true_lang.js +20 -13
  50. package/dist/components/chat-steps/chat-steps.vue_vue_type_script_setup_true_lang.js.map +1 -1
  51. package/dist/components/chat-steps/chat-steps2.js +6 -0
  52. package/dist/components/chat-steps/chat-steps2.js.map +1 -0
  53. package/dist/components/chat-steps/index.js +1 -1
  54. package/dist/components/chat-steps/style.js +1 -0
  55. package/dist/components/chat-tool-call/chat-tool-call.js.map +1 -1
  56. package/dist/components/chat-tool-call/chat-tool-call.vue_vue_type_script_setup_true_lang.js +38 -12
  57. package/dist/components/chat-tool-call/chat-tool-call.vue_vue_type_script_setup_true_lang.js.map +1 -1
  58. package/dist/components/chat-tool-call/chat-tool-call2.js.map +1 -1
  59. package/dist/components/chat-tool-call/style.js +1 -0
  60. package/dist/components/code-block/code-block.js.map +1 -1
  61. package/dist/components/code-block/code-block.vue_vue_type_script_setup_true_lang.js +37 -5
  62. package/dist/components/code-block/code-block.vue_vue_type_script_setup_true_lang.js.map +1 -1
  63. package/dist/components/collapse/collapse-item.js.map +1 -1
  64. package/dist/components/collapse/collapse-item.vue_vue_type_script_setup_true_lang.js +2 -2
  65. package/dist/components/collapse/collapse-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  66. package/dist/components/collapse/collapse-transition.js +3 -1
  67. package/dist/components/collapse/collapse-transition.js.map +1 -1
  68. package/dist/components/collapse/index.js +1 -2
  69. package/dist/components/collapse/index.js.map +1 -1
  70. package/dist/components/color-mode/color-mode-button.js.map +1 -1
  71. package/dist/components/color-mode/color-mode-button.vue_vue_type_script_setup_true_lang.js +2 -2
  72. package/dist/components/color-mode/color-mode-button.vue_vue_type_script_setup_true_lang.js.map +1 -1
  73. package/dist/components/color-mode/color-mode-select.js.map +1 -1
  74. package/dist/components/color-mode/color-mode-select.vue_vue_type_script_setup_true_lang.js +2 -2
  75. package/dist/components/color-mode/color-mode-select.vue_vue_type_script_setup_true_lang.js.map +1 -1
  76. package/dist/components/color-mode/color-mode-switch.js.map +1 -1
  77. package/dist/components/color-mode/color-mode-switch.vue_vue_type_script_setup_true_lang.js +2 -2
  78. package/dist/components/color-mode/color-mode-switch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  79. package/dist/components/color-panel/color-panel.js.map +1 -1
  80. package/dist/components/color-panel/color-panel.vue_vue_type_script_setup_true_lang.js +5 -5
  81. package/dist/components/color-panel/color-panel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  82. package/dist/components/color-picker/color-picker.js.map +1 -1
  83. package/dist/components/color-picker/color-picker.vue_vue_type_script_setup_true_lang.js +2 -2
  84. package/dist/components/color-picker/color-picker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  85. package/dist/components/comment-thread/comment-thread.js.map +1 -1
  86. package/dist/components/comment-thread/comment-thread.vue_vue_type_script_setup_true_lang.js +15 -15
  87. package/dist/components/comment-thread/comment-thread.vue_vue_type_script_setup_true_lang.js.map +1 -1
  88. package/dist/components/comment-thread/style.js +2 -0
  89. package/dist/components/context-menu/context-menu.js.map +1 -1
  90. package/dist/components/context-menu/context-menu.vue_vue_type_script_setup_true_lang.js +26 -11
  91. package/dist/components/context-menu/context-menu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  92. package/dist/components/context-menu/index.js +2 -0
  93. package/dist/components/context-menu/index.js.map +1 -1
  94. package/dist/components/copy-button/copy-button.vue_vue_type_script_setup_true_lang.js +1 -1
  95. package/dist/components/descriptions/descriptions.js.map +1 -1
  96. package/dist/components/descriptions/descriptions.vue_vue_type_script_setup_true_lang.js +3 -1
  97. package/dist/components/descriptions/descriptions.vue_vue_type_script_setup_true_lang.js.map +1 -1
  98. package/dist/components/descriptions/descriptions2.js.map +1 -1
  99. package/dist/components/dropdown/dropdown-button.js.map +1 -1
  100. package/dist/components/dropdown/dropdown-button.vue_vue_type_script_setup_true_lang.js +5 -5
  101. package/dist/components/dropdown/dropdown-button.vue_vue_type_script_setup_true_lang.js.map +1 -1
  102. package/dist/components/dropdown/dropdown-group.js +6 -0
  103. package/dist/components/dropdown/dropdown-group.js.map +1 -0
  104. package/dist/components/dropdown/dropdown-group.vue_vue_type_script_setup_true_lang.js +42 -0
  105. package/dist/components/dropdown/dropdown-group.vue_vue_type_script_setup_true_lang.js.map +1 -0
  106. package/dist/components/dropdown/dropdown-item.js.map +1 -1
  107. package/dist/components/dropdown/dropdown-item.vue_vue_type_script_setup_true_lang.js +31 -9
  108. package/dist/components/dropdown/dropdown-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  109. package/dist/components/dropdown/dropdown-items.js.map +1 -1
  110. package/dist/components/dropdown/dropdown-items.vue_vue_type_script_setup_true_lang.js +77 -52
  111. package/dist/components/dropdown/dropdown-items.vue_vue_type_script_setup_true_lang.js.map +1 -1
  112. package/dist/components/dropdown/dropdown-radio-group.js.map +1 -1
  113. package/dist/components/dropdown/dropdown-radio-group.vue_vue_type_script_setup_true_lang.js +23 -5
  114. package/dist/components/dropdown/dropdown-radio-group.vue_vue_type_script_setup_true_lang.js.map +1 -1
  115. package/dist/components/dropdown/dropdown-sub.js.map +1 -1
  116. package/dist/components/dropdown/dropdown-sub.vue_vue_type_script_setup_true_lang.js +5 -4
  117. package/dist/components/dropdown/dropdown-sub.vue_vue_type_script_setup_true_lang.js.map +1 -1
  118. package/dist/components/dropdown/dropdown.js.map +1 -1
  119. package/dist/components/dropdown/dropdown.vue_vue_type_script_setup_true_lang.js +2 -1
  120. package/dist/components/dropdown/dropdown.vue_vue_type_script_setup_true_lang.js.map +1 -1
  121. package/dist/components/dropdown/dropdown2.js.map +1 -1
  122. package/dist/components/dropdown/index.js +4 -5
  123. package/dist/components/dropdown/index.js.map +1 -1
  124. package/dist/components/dropdown/item-components.js +11 -0
  125. package/dist/components/dropdown/item-components.js.map +1 -0
  126. package/dist/components/dropdown/menu-entries.js +14 -0
  127. package/dist/components/dropdown/menu-entries.js.map +1 -0
  128. package/dist/components/dropdown/menu-keys.js +1 -1
  129. package/dist/components/dropdown/menu-keys.js.map +1 -1
  130. package/dist/components/ellipsis/ellipsis.js.map +1 -1
  131. package/dist/components/ellipsis/ellipsis.vue_vue_type_script_setup_true_lang.js +2 -2
  132. package/dist/components/ellipsis/ellipsis.vue_vue_type_script_setup_true_lang.js.map +1 -1
  133. package/dist/components/image-cropper/image-cropper.js.map +1 -1
  134. package/dist/components/image-cropper/image-cropper.vue_vue_type_script_setup_true_lang.js +10 -10
  135. package/dist/components/image-cropper/image-cropper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  136. package/dist/components/infinite-scroll/infinite-scroll.js.map +1 -1
  137. package/dist/components/infinite-scroll/infinite-scroll.vue_vue_type_script_setup_true_lang.js +2 -2
  138. package/dist/components/infinite-scroll/infinite-scroll.vue_vue_type_script_setup_true_lang.js.map +1 -1
  139. package/dist/components/input-date/segment-field.js.map +1 -1
  140. package/dist/components/input-date/segment-field.vue_vue_type_script_setup_true_lang.js +2 -2
  141. package/dist/components/input-date/segment-field.vue_vue_type_script_setup_true_lang.js.map +1 -1
  142. package/dist/components/input-date/style.js +1 -0
  143. package/dist/components/input-time/style.js +1 -0
  144. package/dist/components/layout/layout-aside-trigger.js.map +1 -1
  145. package/dist/components/layout/layout-aside-trigger.vue_vue_type_script_setup_true_lang.js +2 -2
  146. package/dist/components/layout/layout-aside-trigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  147. package/dist/components/layout/layout-aside.js.map +1 -1
  148. package/dist/components/layout/layout-aside.vue_vue_type_script_setup_true_lang.js +3 -3
  149. package/dist/components/layout/layout-aside.vue_vue_type_script_setup_true_lang.js.map +1 -1
  150. package/dist/components/layout/layout-footer.js.map +1 -1
  151. package/dist/components/layout/layout-footer.vue_vue_type_script_setup_true_lang.js +5 -1
  152. package/dist/components/layout/layout-footer.vue_vue_type_script_setup_true_lang.js.map +1 -1
  153. package/dist/components/layout/layout.js.map +1 -1
  154. package/dist/components/markdown/index.js +9 -0
  155. package/dist/components/markdown/index.js.map +1 -0
  156. package/dist/components/markdown/markdown.js +6 -0
  157. package/dist/components/markdown/markdown.js.map +1 -0
  158. package/dist/components/markdown/markdown.vue_vue_type_script_setup_true_lang.js +225 -0
  159. package/dist/components/markdown/markdown.vue_vue_type_script_setup_true_lang.js.map +1 -0
  160. package/dist/components/markdown/parse-block.js +577 -0
  161. package/dist/components/markdown/parse-block.js.map +1 -0
  162. package/dist/components/markdown/parse-inline.js +626 -0
  163. package/dist/components/markdown/parse-inline.js.map +1 -0
  164. package/dist/components/markdown/parser.js +308 -0
  165. package/dist/components/markdown/parser.js.map +1 -0
  166. package/dist/components/markdown/render.js +424 -0
  167. package/dist/components/markdown/render.js.map +1 -0
  168. package/dist/components/markdown/style.d.ts +1 -0
  169. package/dist/components/markdown/style.js +10 -0
  170. package/dist/components/markdown/url.js +16 -0
  171. package/dist/components/markdown/url.js.map +1 -0
  172. package/dist/components/menu/menu-item.js.map +1 -1
  173. package/dist/components/menu/menu-item.vue_vue_type_script_setup_true_lang.js +3 -2
  174. package/dist/components/menu/menu-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  175. package/dist/components/menu/menu-list.js.map +1 -1
  176. package/dist/components/menu/menu-list.vue_vue_type_script_setup_true_lang.js +2 -2
  177. package/dist/components/menu/menu-list.vue_vue_type_script_setup_true_lang.js.map +1 -1
  178. package/dist/components/menu/menu-popup.js.map +1 -1
  179. package/dist/components/menu/menu-popup.vue_vue_type_script_setup_true_lang.js +33 -21
  180. package/dist/components/menu/menu-popup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  181. package/dist/components/menu/menu.js +16 -13
  182. package/dist/components/menu/menu.js.map +1 -1
  183. package/dist/components/menu/menu.vue_vue_type_script_setup_true_lang.js +4 -1
  184. package/dist/components/menu/menu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  185. package/dist/components/menu/menu2.js.map +1 -1
  186. package/dist/components/menubar/menubar.js.map +1 -1
  187. package/dist/components/node-graph/layout.js +136 -31
  188. package/dist/components/node-graph/layout.js.map +1 -1
  189. package/dist/components/node-graph/node-graph-legend.js.map +1 -1
  190. package/dist/components/node-graph/node-graph-legend.vue_vue_type_script_setup_true_lang.js +5 -5
  191. package/dist/components/node-graph/node-graph-legend.vue_vue_type_script_setup_true_lang.js.map +1 -1
  192. package/dist/components/node-graph/node-graph.js.map +1 -1
  193. package/dist/components/node-graph/node-graph.vue_vue_type_script_setup_true_lang.js +3 -3
  194. package/dist/components/node-graph/node-graph.vue_vue_type_script_setup_true_lang.js.map +1 -1
  195. package/dist/components/pagination/pagination-gap.js.map +1 -1
  196. package/dist/components/pagination/pagination-gap.vue_vue_type_script_setup_true_lang.js +2 -2
  197. package/dist/components/pagination/pagination-gap.vue_vue_type_script_setup_true_lang.js.map +1 -1
  198. package/dist/components/pagination/pagination.js.map +1 -1
  199. package/dist/components/pagination/pagination.vue_vue_type_script_setup_true_lang.js +7 -7
  200. package/dist/components/pagination/pagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  201. package/dist/components/popconfirm/index.js +2 -0
  202. package/dist/components/popconfirm/index.js.map +1 -1
  203. package/dist/components/popconfirm/popconfirm.js.map +1 -1
  204. package/dist/components/popconfirm/popconfirm.vue_vue_type_script_setup_true_lang.js +6 -2
  205. package/dist/components/popconfirm/popconfirm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  206. package/dist/components/popover/index.js +2 -0
  207. package/dist/components/popover/index.js.map +1 -1
  208. package/dist/components/popover/popover.js.map +1 -1
  209. package/dist/components/popover/popover.vue_vue_type_script_setup_true_lang.js +12 -5
  210. package/dist/components/popover/popover.vue_vue_type_script_setup_true_lang.js.map +1 -1
  211. package/dist/components/progress-group/progress-group.js.map +1 -1
  212. package/dist/components/progress-group/progress-group.vue_vue_type_script_setup_true_lang.js +11 -4
  213. package/dist/components/progress-group/progress-group.vue_vue_type_script_setup_true_lang.js.map +1 -1
  214. package/dist/components/qrcode/qrcode.js.map +1 -1
  215. package/dist/components/qrcode/qrcode.vue_vue_type_script_setup_true_lang.js +10 -2
  216. package/dist/components/qrcode/qrcode.vue_vue_type_script_setup_true_lang.js.map +1 -1
  217. package/dist/components/select/select.js.map +1 -1
  218. package/dist/components/select/select.vue_vue_type_script_setup_true_lang.js +2 -2
  219. package/dist/components/select/select.vue_vue_type_script_setup_true_lang.js.map +1 -1
  220. package/dist/components/slider/slider.js.map +1 -1
  221. package/dist/components/slider/slider.vue_vue_type_script_setup_true_lang.js +2 -2
  222. package/dist/components/slider/slider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  223. package/dist/components/status-dot/index.js +7 -0
  224. package/dist/components/status-dot/index.js.map +1 -0
  225. package/dist/components/status-dot/status-dot.js +26 -0
  226. package/dist/components/status-dot/status-dot.js.map +1 -0
  227. package/dist/components/status-dot/status-dot.vue_vue_type_script_lang.js +43 -0
  228. package/dist/components/status-dot/status-dot.vue_vue_type_script_lang.js.map +1 -0
  229. package/dist/components/status-dot/status-dot2.js +6 -0
  230. package/dist/components/status-dot/status-dot2.js.map +1 -0
  231. package/dist/components/status-dot/style.d.ts +1 -0
  232. package/dist/components/status-dot/style.js +2 -0
  233. package/dist/components/steps/steps.js.map +1 -1
  234. package/dist/components/steps/steps.vue_vue_type_script_setup_true_lang.js +6 -6
  235. package/dist/components/steps/steps.vue_vue_type_script_setup_true_lang.js.map +1 -1
  236. package/dist/components/table/table.js.map +1 -1
  237. package/dist/components/table/table.vue_vue_type_script_setup_true_lang.js +19 -14
  238. package/dist/components/table/table.vue_vue_type_script_setup_true_lang.js.map +1 -1
  239. package/dist/components/tabs/tab-panel.vue_vue_type_script_setup_true_lang.js +1 -0
  240. package/dist/components/tabs/tab-panel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  241. package/dist/components/tabs/tabs.js.map +1 -1
  242. package/dist/components/tabs/tabs.vue_vue_type_script_setup_true_lang.js +117 -47
  243. package/dist/components/tabs/tabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  244. package/dist/components/tabs/tabs2.js.map +1 -1
  245. package/dist/components/tag/tag.js.map +1 -1
  246. package/dist/components/tag/tag.vue_vue_type_script_setup_true_lang.js +21 -4
  247. package/dist/components/tag/tag.vue_vue_type_script_setup_true_lang.js.map +1 -1
  248. package/dist/components/timeline/style.js +1 -0
  249. package/dist/components/timeline/timeline-item.js.map +1 -1
  250. package/dist/components/timeline/timeline-item.vue_vue_type_script_setup_true_lang.js +6 -2
  251. package/dist/components/timeline/timeline-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  252. package/dist/components/tooltip/index.js +2 -0
  253. package/dist/components/tooltip/index.js.map +1 -1
  254. package/dist/components/tooltip/tooltip.js.map +1 -1
  255. package/dist/components/tooltip/tooltip.vue_vue_type_script_setup_true_lang.js +55 -8
  256. package/dist/components/tooltip/tooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  257. package/dist/components/tour/tour.js.map +1 -1
  258. package/dist/components/tour/tour.vue_vue_type_script_setup_true_lang.js +3 -3
  259. package/dist/components/tour/tour.vue_vue_type_script_setup_true_lang.js.map +1 -1
  260. package/dist/components/transfer/transfer-list.vue_vue_type_script_setup_true_lang.js +1 -1
  261. package/dist/components/tree/tree.vue_vue_type_script_setup_true_lang.js +1 -1
  262. package/dist/components/tree-select/tree-select.js.map +1 -1
  263. package/dist/components/tree-select/tree-select.vue_vue_type_script_setup_true_lang.js +3 -3
  264. package/dist/components/tree-select/tree-select.vue_vue_type_script_setup_true_lang.js.map +1 -1
  265. package/dist/components/upload/upload.vue_vue_type_script_setup_true_lang.js +2 -2
  266. package/dist/components/upload/upload.vue_vue_type_script_setup_true_lang.js.map +1 -1
  267. package/dist/components/upload/upload2.js.map +1 -1
  268. package/dist/components/user/user.js.map +1 -1
  269. package/dist/components/user/user.vue_vue_type_script_setup_true_lang.js +2 -2
  270. package/dist/components/user/user.vue_vue_type_script_setup_true_lang.js.map +1 -1
  271. package/dist/composables/use-popup.js +30 -5
  272. package/dist/composables/use-popup.js.map +1 -1
  273. package/dist/index.js +23 -17
  274. package/dist/index.js.map +1 -1
  275. package/dist/locale/en.js +13 -8
  276. package/dist/locale/en.js.map +1 -1
  277. package/dist/locale/zh-cn.js +13 -8
  278. package/dist/locale/zh-cn.js.map +1 -1
  279. package/dist/locale/zh-tw.js +13 -8
  280. package/dist/locale/zh-tw.js.map +1 -1
  281. package/dist/plugin.js +21 -14
  282. package/dist/plugin.js.map +1 -1
  283. package/dist/style.css +1 -1
  284. package/dist/types/components/button/button.d.ts +5 -1
  285. package/dist/types/components/calendar-view/calendar-view.d.ts +6 -0
  286. package/dist/types/components/calendar-view/calendar-view.vue.d.ts +1 -0
  287. package/dist/types/components/calendar-view/index.d.ts +3 -0
  288. package/dist/types/components/chat-artifact/chat-artifact.d.ts +2 -1
  289. package/dist/types/components/chat-attachments/chat-attachments.d.ts +2 -2
  290. package/dist/types/components/chat-confirm/chat-confirm.d.ts +7 -2
  291. package/dist/types/components/chat-list/index.d.ts +3 -3
  292. package/dist/types/components/chat-message/chat-message.d.ts +26 -3
  293. package/dist/types/components/chat-message/chat-message.vue.d.ts +4 -3
  294. package/dist/types/components/chat-message/index.d.ts +7 -4
  295. package/dist/types/components/chat-plan/chat-plan.d.ts +19 -2
  296. package/dist/types/components/chat-plan/chat-plan.vue.d.ts +2 -0
  297. package/dist/types/components/chat-plan/index.d.ts +6 -0
  298. package/dist/types/components/chat-sources/chat-sources.d.ts +6 -1
  299. package/dist/types/components/chat-steps/chat-steps.d.ts +10 -4
  300. package/dist/types/components/chat-steps/chat-steps.vue.d.ts +1 -1
  301. package/dist/types/components/chat-steps/index.d.ts +3 -3
  302. package/dist/types/components/chat-tool-call/chat-tool-call.d.ts +12 -3
  303. package/dist/types/components/chat-tool-call/chat-tool-call.vue.d.ts +1 -0
  304. package/dist/types/components/chat-tool-call/index.d.ts +3 -0
  305. package/dist/types/components/checkbox/index.d.ts +5 -5
  306. package/dist/types/components/code-block/code-block.d.ts +11 -0
  307. package/dist/types/components/code-block/code-block.vue.d.ts +3 -1
  308. package/dist/types/components/code-block/index.d.ts +9 -3
  309. package/dist/types/components/collapse/collapse-transition.d.ts +2 -7
  310. package/dist/types/components/collapse/collapse.vue.d.ts +1 -1
  311. package/dist/types/components/collapse/index.d.ts +5 -6
  312. package/dist/types/components/context-menu/context-menu.d.ts +37 -4
  313. package/dist/types/components/context-menu/context-menu.vue.d.ts +2 -0
  314. package/dist/types/components/context-menu/index.d.ts +5 -0
  315. package/dist/types/components/copy-button/copy-button.vue.d.ts +1 -1
  316. package/dist/types/components/copy-button/index.d.ts +1 -1
  317. package/dist/types/components/descriptions/descriptions.d.ts +9 -1
  318. package/dist/types/components/descriptions/descriptions.vue.d.ts +1 -0
  319. package/dist/types/components/descriptions/index.d.ts +3 -0
  320. package/dist/types/components/dropdown/dropdown-group.vue.d.ts +13 -0
  321. package/dist/types/components/dropdown/dropdown-items.vue.d.ts +2 -2
  322. package/dist/types/components/dropdown/dropdown-radio-group.vue.d.ts +8 -4
  323. package/dist/types/components/dropdown/dropdown.d.ts +28 -6
  324. package/dist/types/components/dropdown/dropdown.vue.d.ts +1 -1
  325. package/dist/types/components/dropdown/index.d.ts +10 -81
  326. package/dist/types/components/dropdown/item-components.d.ts +103 -0
  327. package/dist/types/components/dropdown/menu-entries.d.ts +4 -0
  328. package/dist/types/components/index.d.ts +2 -0
  329. package/dist/types/components/layout/index.d.ts +12 -6
  330. package/dist/types/components/layout/layout-aside.vue.d.ts +1 -1
  331. package/dist/types/components/layout/layout-footer.vue.d.ts +4 -2
  332. package/dist/types/components/layout/layout.d.ts +4 -0
  333. package/dist/types/components/markdown/index.d.ts +58 -0
  334. package/dist/types/components/markdown/markdown.d.ts +251 -0
  335. package/dist/types/components/markdown/markdown.vue.d.ts +22 -0
  336. package/dist/types/components/markdown/parse-block.d.ts +61 -0
  337. package/dist/types/components/markdown/parse-inline.d.ts +19 -0
  338. package/dist/types/components/markdown/parser.d.ts +22 -0
  339. package/dist/types/components/markdown/render.d.ts +84 -0
  340. package/dist/types/components/markdown/url.d.ts +10 -0
  341. package/dist/types/components/masonry/index.d.ts +3 -3
  342. package/dist/types/components/menu/index.d.ts +8 -3
  343. package/dist/types/components/menu/menu.d.ts +16 -5
  344. package/dist/types/components/menu/menu.vue.d.ts +3 -1
  345. package/dist/types/components/menubar/menubar.d.ts +1 -1
  346. package/dist/types/components/node-graph/layout.d.ts +16 -0
  347. package/dist/types/components/node-graph/node-graph.d.ts +1 -1
  348. package/dist/types/components/popover/index.d.ts +3 -3
  349. package/dist/types/components/popover/popover.vue.d.ts +1 -1
  350. package/dist/types/components/progress-group/index.d.ts +3 -0
  351. package/dist/types/components/progress-group/progress-group.d.ts +7 -0
  352. package/dist/types/components/progress-group/progress-group.vue.d.ts +1 -0
  353. package/dist/types/components/qrcode/index.d.ts +3 -0
  354. package/dist/types/components/qrcode/qrcode.d.ts +5 -0
  355. package/dist/types/components/qrcode/qrcode.vue.d.ts +1 -0
  356. package/dist/types/components/sortable/index.d.ts +3 -3
  357. package/dist/types/components/status-dot/index.d.ts +51 -0
  358. package/dist/types/components/status-dot/status-dot.d.ts +46 -0
  359. package/dist/types/components/status-dot/status-dot.vue.d.ts +46 -0
  360. package/dist/types/components/steps/steps.d.ts +1 -1
  361. package/dist/types/components/switch/index.d.ts +3 -3
  362. package/dist/types/components/table/index.d.ts +4 -3
  363. package/dist/types/components/table/table.d.ts +6 -1
  364. package/dist/types/components/tabs/index.d.ts +3 -0
  365. package/dist/types/components/tabs/tabs.d.ts +16 -3
  366. package/dist/types/components/tabs/tabs.vue.d.ts +1 -0
  367. package/dist/types/components/timeline/index.d.ts +3 -3
  368. package/dist/types/components/timeline/timeline-item.vue.d.ts +1 -1
  369. package/dist/types/components/virtual-list/index.d.ts +3 -3
  370. package/dist/types/composables/use-popup.d.ts +15 -5
  371. package/dist/types/locale/types.d.ts +18 -7
  372. package/dist/types/utils/only-child.d.ts +3 -1
  373. package/dist/types/utils/pointer.d.ts +5 -0
  374. package/dist/types/utils/safe-url.d.ts +14 -0
  375. package/dist/types/utils/status-check.d.ts +8 -0
  376. package/dist/utils/install.js +5 -0
  377. package/dist/utils/install.js.map +1 -1
  378. package/dist/utils/only-child.js +56 -5
  379. package/dist/utils/only-child.js.map +1 -1
  380. package/dist/utils/pointer.js +6 -1
  381. package/dist/utils/pointer.js.map +1 -1
  382. package/dist/utils/safe-url.js +57 -0
  383. package/dist/utils/safe-url.js.map +1 -0
  384. package/dist/utils/status-check.js +27 -0
  385. package/dist/utils/status-check.js.map +1 -0
  386. package/package.json +3 -3
@@ -1,26 +1,31 @@
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";
6
- import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, ref, renderList, renderSlot, toDisplayString, unref, useId, vShow, withCtx, withDirectives } from "vue";
7
- import { AlertCircleIcon, CheckIcon, ChevronDownIcon, ListChecksIcon } from "@dou-ui/icons";
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 { planRunning } from "./chat-plan.js";
8
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, ref, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref, useId, vShow, watchEffect, withCtx, withDirectives } from "vue";
9
+ import { AlertCircleIcon, CheckIcon, ChevronDownIcon, ClockPauseIcon, ListChecksIcon } from "@dou-ui/icons";
8
10
  // src/components/chat-plan/chat-plan.vue?vue&type=script&setup=true&lang.ts
9
- var _hoisted_1 = [
10
- "id",
11
- "aria-expanded",
12
- "aria-controls"
13
- ];
14
- var _hoisted_2 = ["id", "aria-labelledby"];
11
+ var _hoisted_1 = ["id", "aria-labelledby"];
15
12
  var chat_plan_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
16
13
  name: "DouChatPlan",
17
14
  __name: "chat-plan",
18
15
  props: {
19
16
  items: { default: () => [] },
20
17
  title: {},
18
+ collapsible: {
19
+ type: Boolean,
20
+ default: true
21
+ },
21
22
  open: {
22
23
  type: Boolean,
23
24
  default: void 0
25
+ },
26
+ live: {
27
+ type: Boolean,
28
+ default: true
24
29
  }
25
30
  },
26
31
  emits: ["update:open"],
@@ -31,64 +36,91 @@ var chat_plan_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
31
36
  const { t } = useLocale();
32
37
  const id = useId();
33
38
  const inner = ref(true);
34
- const open = computed(() => props.open ?? inner.value);
39
+ const open = computed(() => !props.collapsible || (props.open ?? inner.value));
35
40
  function toggle() {
36
41
  inner.value = !open.value;
37
42
  emit("update:open", inner.value);
38
43
  }
44
+ if (process.env.NODE_ENV !== "production") {
45
+ let warned = false;
46
+ watchEffect(() => {
47
+ if (warned || props.collapsible || props.open === void 0) return;
48
+ warned = true;
49
+ console.warn("[dou-ui] DouChatPlan: `open` is ignored when `collapsible` is false.");
50
+ });
51
+ }
39
52
  const finished = computed(() => props.items.filter((item) => item.status === "done" || item.status === "skipped").length);
40
- const running = computed(() => props.items.some((item) => item.status === "running"));
53
+ const running = computed(() => planRunning(props.items, props.live));
41
54
  return (_ctx, _cache) => {
42
55
  return openBlock(), createElementBlock("div", { class: normalizeClass([
43
56
  unref(ns).b(),
57
+ unref(ns).is("collapsible", __props.collapsible),
44
58
  unref(ns).is("open", open.value),
45
59
  unref(ns).is("running", running.value)
46
- ]) }, [createElementVNode("button", {
47
- id: `${unref(id)}-trigger`,
48
- type: "button",
60
+ ]) }, [(openBlock(), createBlock(resolveDynamicComponent(__props.collapsible ? "button" : "div"), {
61
+ id: `${unref(id)}-header`,
49
62
  class: normalizeClass(unref(ns).e("header")),
50
- "aria-expanded": open.value,
51
- "aria-controls": `${unref(id)}-panel`,
52
- onClick: toggle
53
- }, [
54
- createVNode(unref(ListChecksIcon), { class: normalizeClass(unref(ns).e("icon")) }, null, 8, ["class"]),
55
- createElementVNode("span", { class: normalizeClass(unref(ns).e("title")) }, toDisplayString(__props.title ?? unref(t)("chat.plan")), 3),
56
- createElementVNode("span", { class: normalizeClass(unref(ns).e("count")) }, toDisplayString(finished.value) + " / " + toDisplayString(__props.items.length), 3),
57
- createVNode(unref(ChevronDownIcon), { class: normalizeClass(unref(ns).e("arrow")) }, null, 8, ["class"])
58
- ], 10, _hoisted_1), createVNode(unref(CollapseTransition), null, {
63
+ type: __props.collapsible ? "button" : void 0,
64
+ "aria-expanded": __props.collapsible ? open.value : void 0,
65
+ "aria-controls": __props.collapsible ? `${unref(id)}-panel` : void 0,
66
+ onClick: _cache[0] || (_cache[0] = ($event) => __props.collapsible && toggle())
67
+ }, {
68
+ default: withCtx(() => [
69
+ createVNode(unref(ListChecksIcon), { class: normalizeClass(unref(ns).e("icon")) }, null, 8, ["class"]),
70
+ createElementVNode("span", { class: normalizeClass(unref(ns).e("title")) }, toDisplayString(__props.title ?? unref(t)("chat.plan")), 3),
71
+ createElementVNode("span", { class: normalizeClass(unref(ns).e("count")) }, toDisplayString(finished.value) + " / " + toDisplayString(__props.items.length), 3),
72
+ __props.collapsible ? (openBlock(), createBlock(unref(ChevronDownIcon), {
73
+ key: 0,
74
+ class: normalizeClass(unref(ns).e("arrow"))
75
+ }, null, 8, ["class"])) : createCommentVNode("", true)
76
+ ]),
77
+ _: 1
78
+ }, 8, [
79
+ "id",
80
+ "class",
81
+ "type",
82
+ "aria-expanded",
83
+ "aria-controls"
84
+ ])), createVNode(unref(DouCollapseTransition), null, {
59
85
  default: withCtx(() => [withDirectives(createElementVNode("div", {
60
86
  id: `${unref(id)}-panel`,
61
87
  role: "region",
62
88
  class: normalizeClass(unref(ns).e("panel")),
63
- "aria-labelledby": `${unref(id)}-trigger`
89
+ "aria-labelledby": `${unref(id)}-header`
64
90
  }, [createElementVNode("ol", { class: normalizeClass(unref(ns).e("list")) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, index) => {
65
91
  return openBlock(), createElementBlock("li", {
66
92
  key: item.key ?? index,
67
93
  class: normalizeClass([unref(ns).e("item"), unref(ns).is(item.status ?? "pending")])
68
- }, [createElementVNode("span", { class: normalizeClass(unref(ns).e("mark")) }, [item.status === "running" ? (openBlock(), createBlock(spinner_default, {
94
+ }, [createElementVNode("span", { class: normalizeClass(unref(ns).e("mark")) }, [item.status === "running" ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [__props.live ? (openBlock(), createBlock(unref(DouSpinner), {
69
95
  key: 0,
70
96
  size: "sm",
71
97
  label: unref(t)("chat.stepRunning")
72
- }, null, 8, ["label"])) : item.status === "done" ? (openBlock(), createBlock(unref(CheckIcon), {
98
+ }, null, 8, ["label"])) : (openBlock(), createBlock(unref(DouStatusDot), {
99
+ key: 1,
100
+ label: unref(t)("chat.stepRunning")
101
+ }, null, 8, ["label"]))], 64)) : item.status === "waiting" ? (openBlock(), createBlock(unref(ClockPauseIcon), {
73
102
  key: 1,
103
+ label: unref(t)("chat.stepWaiting")
104
+ }, null, 8, ["label"])) : item.status === "done" ? (openBlock(), createBlock(unref(CheckIcon), {
105
+ key: 2,
74
106
  label: unref(t)("chat.stepDone")
75
107
  }, null, 8, ["label"])) : item.status === "error" ? (openBlock(), createBlock(unref(AlertCircleIcon), {
76
- key: 2,
108
+ key: 3,
77
109
  label: unref(t)("chat.stepError")
78
110
  }, null, 8, ["label"])) : (openBlock(), createElementBlock("span", {
79
- key: 3,
111
+ key: 4,
80
112
  class: normalizeClass(unref(ns).e("dot"))
81
113
  }, null, 2))], 2), createElementVNode("span", { class: normalizeClass(unref(ns).e("text")) }, [renderSlot(_ctx.$slots, "item", {
82
114
  item,
83
115
  index
84
- }, () => [createElementVNode("span", { class: normalizeClass(unref(ns).e("label")) }, [createVNode(shimmer_default, { active: item.status === "running" }, {
116
+ }, () => [createElementVNode("span", { class: normalizeClass(unref(ns).e("label")) }, [createVNode(unref(DouShimmer), { active: __props.live && item.status === "running" }, {
85
117
  default: withCtx(() => [createTextVNode(toDisplayString(item.label), 1)]),
86
118
  _: 2
87
119
  }, 1032, ["active"])], 2), item.description ? (openBlock(), createElementBlock("span", {
88
120
  key: 0,
89
121
  class: normalizeClass(unref(ns).e("description"))
90
122
  }, toDisplayString(item.description), 3)) : createCommentVNode("", true)])], 2)], 2);
91
- }), 128))], 2)], 10, _hoisted_2), [[vShow, open.value]])]),
123
+ }), 128))], 2)], 10, _hoisted_1), [[vShow, open.value]])]),
92
124
  _: 3
93
125
  })], 2);
94
126
  };
@@ -1 +1 @@
1
- {"version":3,"file":"chat-plan.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_createVNode","_toDisplayString","_withCtx","_withDirectives","_Fragment","_renderList","_createBlock","DouSpinner","_renderSlot","DouShimmer","_createTextVNode","_createCommentVNode","_vShow"],"sources":["../../../src/components/chat-plan/chat-plan.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { AlertCircleIcon, CheckIcon, ChevronDownIcon, ListChecksIcon } 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 { ChatPlanEmits, ChatPlanProps, ChatPlanSlots } from './chat-plan'\n\ndefineOptions({ name: 'DouChatPlan' })\n\nconst props = withDefaults(defineProps<ChatPlanProps>(), {\n items: () => [],\n open: undefined,\n})\nconst emit = defineEmits<ChatPlanEmits>()\ndefineSlots<ChatPlanSlots>()\n\nconst ns = useNamespace('chat-plan')\nconst { t } = useLocale()\nconst id = useId()\n\nconst inner = ref(true)\nconst open = computed(() => props.open ?? inner.value)\nfunction toggle() {\n inner.value = !open.value\n emit('update:open', inner.value)\n}\n\nconst finished = computed(\n () => props.items.filter((item) => item.status === 'done' || item.status === 'skipped').length,\n)\nconst running = computed(() => props.items.some((item) => item.status === 'running'))\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 <ListChecksIcon :class=\"ns.e('icon')\" />\n <span :class=\"ns.e('title')\">{{ title ?? t('chat.plan') }}</span>\n <span :class=\"ns.e('count')\">{{ finished }} / {{ items.length }}</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=\"(item, index) in items\"\n :key=\"item.key ?? index\"\n :class=\"[ns.e('item'), ns.is(item.status ?? 'pending')]\"\n >\n <span :class=\"ns.e('mark')\">\n <DouSpinner\n v-if=\"item.status === 'running'\"\n size=\"sm\"\n :label=\"t('chat.stepRunning')\"\n />\n <CheckIcon v-else-if=\"item.status === 'done'\" :label=\"t('chat.stepDone')\" />\n <AlertCircleIcon v-else-if=\"item.status === 'error'\" :label=\"t('chat.stepError')\" />\n <span v-else :class=\"ns.e('dot')\" />\n </span>\n <span :class=\"ns.e('text')\">\n <slot name=\"item\" :item=\"item\" :index=\"index\">\n <span :class=\"ns.e('label')\">\n <DouShimmer :active=\"item.status === 'running'\">{{ item.label }}</DouShimmer>\n </span>\n <span v-if=\"item.description\" :class=\"ns.e('description')\">\n {{ item.description }}\n </span>\n </slot>\n </span>\n </li>\n </ol>\n </div>\n </CollapseTransition>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"chat-plan.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createBlock","_resolveDynamicComponent","_withCtx","_createVNode","_createElementVNode","_toDisplayString","_createCommentVNode","CollapseTransition","_withDirectives","_Fragment","_renderList","_renderSlot","_createTextVNode","_vShow"],"sources":["../../../src/components/chat-plan/chat-plan.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n AlertCircleIcon,\n CheckIcon,\n ChevronDownIcon,\n ClockPauseIcon,\n ListChecksIcon,\n} from '@dou-ui/icons'\nimport { computed, ref, useId, watchEffect } 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 { planRunning } from './chat-plan'\nimport type { ChatPlanEmits, ChatPlanProps, ChatPlanSlots } from './chat-plan'\n\ndefineOptions({ name: 'DouChatPlan' })\n\nconst props = withDefaults(defineProps<ChatPlanProps>(), {\n items: () => [],\n collapsible: true,\n open: undefined,\n live: true,\n})\nconst emit = defineEmits<ChatPlanEmits>()\ndefineSlots<ChatPlanSlots>()\n\nconst ns = useNamespace('chat-plan')\nconst { t } = useLocale()\nconst id = useId()\n\nconst inner = ref(true)\nconst open = computed(() => !props.collapsible || (props.open ?? inner.value))\nfunction toggle() {\n inner.value = !open.value\n emit('update:open', inner.value)\n}\n\n// Say once, while developing, that `open` does nothing on a plain panel.\n// The app's bundler replaces this, as for Vue's own warnings.\nif (process.env.NODE_ENV !== 'production') {\n let warned = false\n watchEffect(() => {\n if (warned || props.collapsible || props.open === undefined) return\n warned = true\n console.warn('[dou-ui] DouChatPlan: `open` is ignored when `collapsible` is false.')\n })\n}\n\nconst finished = computed(\n () => props.items.filter((item) => item.status === 'done' || item.status === 'skipped').length,\n)\n// `live` false: the run has stopped, so a running step holds still\nconst running = computed(() => planRunning(props.items, props.live))\n</script>\n\n<template>\n <div\n :class=\"[\n ns.b(),\n ns.is('collapsible', collapsible),\n ns.is('open', open),\n ns.is('running', running),\n ]\"\n >\n <component\n :is=\"collapsible ? 'button' : 'div'\"\n :id=\"`${id}-header`\"\n :class=\"ns.e('header')\"\n :type=\"collapsible ? 'button' : undefined\"\n :aria-expanded=\"collapsible ? open : undefined\"\n :aria-controls=\"collapsible ? `${id}-panel` : undefined\"\n @click=\"collapsible && toggle()\"\n >\n <ListChecksIcon :class=\"ns.e('icon')\" />\n <span :class=\"ns.e('title')\">{{ title ?? t('chat.plan') }}</span>\n <span :class=\"ns.e('count')\">{{ finished }} / {{ items.length }}</span>\n <ChevronDownIcon v-if=\"collapsible\" :class=\"ns.e('arrow')\" />\n </component>\n <CollapseTransition>\n <div\n v-show=\"open\"\n :id=\"`${id}-panel`\"\n role=\"region\"\n :class=\"ns.e('panel')\"\n :aria-labelledby=\"`${id}-header`\"\n >\n <ol :class=\"ns.e('list')\">\n <li\n v-for=\"(item, index) in items\"\n :key=\"item.key ?? index\"\n :class=\"[ns.e('item'), ns.is(item.status ?? 'pending')]\"\n >\n <span :class=\"ns.e('mark')\">\n <template v-if=\"item.status === 'running'\">\n <DouSpinner v-if=\"live\" size=\"sm\" :label=\"t('chat.stepRunning')\" />\n <DouStatusDot v-else :label=\"t('chat.stepRunning')\" />\n </template>\n <ClockPauseIcon\n v-else-if=\"item.status === 'waiting'\"\n :label=\"t('chat.stepWaiting')\"\n />\n <CheckIcon v-else-if=\"item.status === 'done'\" :label=\"t('chat.stepDone')\" />\n <AlertCircleIcon v-else-if=\"item.status === 'error'\" :label=\"t('chat.stepError')\" />\n <span v-else :class=\"ns.e('dot')\" />\n </span>\n <span :class=\"ns.e('text')\">\n <slot name=\"item\" :item=\"item\" :index=\"index\">\n <span :class=\"ns.e('label')\">\n <DouShimmer :active=\"live && item.status === 'running'\">{{\n item.label\n }}</DouShimmer>\n </span>\n <span v-if=\"item.description\" :class=\"ns.e('description')\">\n {{ item.description }}\n </span>\n </slot>\n </span>\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_plan_vue_vue_type_script_setup_true_lang_default from "./chat-plan.vue_vue_type_script_setup_true_lang.js";
2
+ // src/components/chat-plan/chat-plan.vue
3
+ var chat_plan_default = chat_plan_vue_vue_type_script_setup_true_lang_default;
4
+ export { chat_plan_default as default };
5
+
6
+ //# sourceMappingURL=chat-plan2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-plan2.js","names":["_sfc_main"],"sources":["../../../src/components/chat-plan/chat-plan.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n AlertCircleIcon,\n CheckIcon,\n ChevronDownIcon,\n ClockPauseIcon,\n ListChecksIcon,\n} from '@dou-ui/icons'\nimport { computed, ref, useId, watchEffect } 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 { planRunning } from './chat-plan'\nimport type { ChatPlanEmits, ChatPlanProps, ChatPlanSlots } from './chat-plan'\n\ndefineOptions({ name: 'DouChatPlan' })\n\nconst props = withDefaults(defineProps<ChatPlanProps>(), {\n items: () => [],\n collapsible: true,\n open: undefined,\n live: true,\n})\nconst emit = defineEmits<ChatPlanEmits>()\ndefineSlots<ChatPlanSlots>()\n\nconst ns = useNamespace('chat-plan')\nconst { t } = useLocale()\nconst id = useId()\n\nconst inner = ref(true)\nconst open = computed(() => !props.collapsible || (props.open ?? inner.value))\nfunction toggle() {\n inner.value = !open.value\n emit('update:open', inner.value)\n}\n\n// Say once, while developing, that `open` does nothing on a plain panel.\n// The app's bundler replaces this, as for Vue's own warnings.\nif (process.env.NODE_ENV !== 'production') {\n let warned = false\n watchEffect(() => {\n if (warned || props.collapsible || props.open === undefined) return\n warned = true\n console.warn('[dou-ui] DouChatPlan: `open` is ignored when `collapsible` is false.')\n })\n}\n\nconst finished = computed(\n () => props.items.filter((item) => item.status === 'done' || item.status === 'skipped').length,\n)\n// `live` false: the run has stopped, so a running step holds still\nconst running = computed(() => planRunning(props.items, props.live))\n</script>\n\n<template>\n <div\n :class=\"[\n ns.b(),\n ns.is('collapsible', collapsible),\n ns.is('open', open),\n ns.is('running', running),\n ]\"\n >\n <component\n :is=\"collapsible ? 'button' : 'div'\"\n :id=\"`${id}-header`\"\n :class=\"ns.e('header')\"\n :type=\"collapsible ? 'button' : undefined\"\n :aria-expanded=\"collapsible ? open : undefined\"\n :aria-controls=\"collapsible ? `${id}-panel` : undefined\"\n @click=\"collapsible && toggle()\"\n >\n <ListChecksIcon :class=\"ns.e('icon')\" />\n <span :class=\"ns.e('title')\">{{ title ?? t('chat.plan') }}</span>\n <span :class=\"ns.e('count')\">{{ finished }} / {{ items.length }}</span>\n <ChevronDownIcon v-if=\"collapsible\" :class=\"ns.e('arrow')\" />\n </component>\n <CollapseTransition>\n <div\n v-show=\"open\"\n :id=\"`${id}-panel`\"\n role=\"region\"\n :class=\"ns.e('panel')\"\n :aria-labelledby=\"`${id}-header`\"\n >\n <ol :class=\"ns.e('list')\">\n <li\n v-for=\"(item, index) in items\"\n :key=\"item.key ?? index\"\n :class=\"[ns.e('item'), ns.is(item.status ?? 'pending')]\"\n >\n <span :class=\"ns.e('mark')\">\n <template v-if=\"item.status === 'running'\">\n <DouSpinner v-if=\"live\" size=\"sm\" :label=\"t('chat.stepRunning')\" />\n <DouStatusDot v-else :label=\"t('chat.stepRunning')\" />\n </template>\n <ClockPauseIcon\n v-else-if=\"item.status === 'waiting'\"\n :label=\"t('chat.stepWaiting')\"\n />\n <CheckIcon v-else-if=\"item.status === 'done'\" :label=\"t('chat.stepDone')\" />\n <AlertCircleIcon v-else-if=\"item.status === 'error'\" :label=\"t('chat.stepError')\" />\n <span v-else :class=\"ns.e('dot')\" />\n </span>\n <span :class=\"ns.e('text')\">\n <slot name=\"item\" :item=\"item\" :index=\"index\">\n <span :class=\"ns.e('label')\">\n <DouShimmer :active=\"live && item.status === 'running'\">{{\n item.label\n }}</DouShimmer>\n </span>\n <span v-if=\"item.description\" :class=\"ns.e('description')\">\n {{ item.description }}\n </span>\n </slot>\n </span>\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_plan_default from "./chat-plan.js";
2
+ import chat_plan_default from "./chat-plan2.js";
3
3
  // src/components/chat-plan/index.ts
4
4
  var DouChatPlan = withInstall(chat_plan_default);
5
5
  export { DouChatPlan, DouChatPlan 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-reasoning.js","names":["_sfc_main"],"sources":["../../../src/components/chat-reasoning/chat-reasoning.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ChevronDownIcon, SparklesIcon } from '@dou-ui/icons'\nimport { computed, ref, useId, watch } 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 { formatDuration } from './format'\nimport type { ChatReasoningEmits, ChatReasoningProps, ChatReasoningSlots } from './chat-reasoning'\n\ndefineOptions({ name: 'DouChatReasoning' })\n\nconst props = withDefaults(defineProps<ChatReasoningProps>(), {\n thinking: false,\n open: undefined,\n autoCollapse: true,\n})\nconst emit = defineEmits<ChatReasoningEmits>()\ndefineSlots<ChatReasoningSlots>()\n\nconst ns = useNamespace('chat-reasoning')\nconst { t } = useLocale()\nconst id = useId()\n\nconst inner = ref(props.thinking)\nconst open = computed(() => props.open ?? inner.value)\nfunction setOpen(value: boolean) {\n inner.value = value\n emit('update:open', value)\n}\n\nlet startedAt = props.thinking ? Date.now() : 0\nconst measured = ref<number>()\nwatch(\n () => props.thinking,\n (thinking) => {\n if (thinking) {\n startedAt = Date.now()\n measured.value = undefined\n if (!open.value) setOpen(true)\n return\n }\n if (startedAt) measured.value = Math.round((Date.now() - startedAt) / 1000)\n startedAt = 0\n if (props.autoCollapse && open.value) setOpen(false)\n },\n)\n\nconst duration = computed(() => props.duration ?? measured.value)\nconst label = computed(() => {\n if (props.title) return props.title\n if (props.thinking) return t('chat.thinking')\n if (duration.value === undefined) return t('chat.reasoning')\n return formatDuration(duration.value, t)\n})\n</script>\n\n<template>\n <div :class=\"[ns.b(), ns.is('open', open), ns.is('thinking', thinking)]\">\n <button\n :id=\"`${id}-trigger`\"\n type=\"button\"\n :class=\"ns.e('trigger')\"\n :aria-expanded=\"open\"\n :aria-controls=\"`${id}-panel`\"\n @click=\"setOpen(!open)\"\n >\n <SparklesIcon :class=\"ns.e('icon')\" />\n <span :class=\"ns.e('title')\">\n <slot name=\"title\" :thinking=\"thinking\" :duration=\"duration\">\n <DouShimmer :active=\"thinking\">{{ label }}</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 <div :class=\"ns.e('content')\">\n <div :class=\"ns.e('text')\"><slot /></div>\n </div>\n </div>\n </CollapseTransition>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"chat-reasoning.js","names":["_sfc_main"],"sources":["../../../src/components/chat-reasoning/chat-reasoning.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ChevronDownIcon, SparklesIcon } from '@dou-ui/icons'\nimport { computed, ref, useId, watch } 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 { formatDuration } from './format'\nimport type { ChatReasoningEmits, ChatReasoningProps, ChatReasoningSlots } from './chat-reasoning'\n\ndefineOptions({ name: 'DouChatReasoning' })\n\nconst props = withDefaults(defineProps<ChatReasoningProps>(), {\n thinking: false,\n open: undefined,\n autoCollapse: true,\n})\nconst emit = defineEmits<ChatReasoningEmits>()\ndefineSlots<ChatReasoningSlots>()\n\nconst ns = useNamespace('chat-reasoning')\nconst { t } = useLocale()\nconst id = useId()\n\nconst inner = ref(props.thinking)\nconst open = computed(() => props.open ?? inner.value)\nfunction setOpen(value: boolean) {\n inner.value = value\n emit('update:open', value)\n}\n\nlet startedAt = props.thinking ? Date.now() : 0\nconst measured = ref<number>()\nwatch(\n () => props.thinking,\n (thinking) => {\n if (thinking) {\n startedAt = Date.now()\n measured.value = undefined\n if (!open.value) setOpen(true)\n return\n }\n if (startedAt) measured.value = Math.round((Date.now() - startedAt) / 1000)\n startedAt = 0\n if (props.autoCollapse && open.value) setOpen(false)\n },\n)\n\nconst duration = computed(() => props.duration ?? measured.value)\nconst label = computed(() => {\n if (props.title) return props.title\n if (props.thinking) return t('chat.thinking')\n if (duration.value === undefined) return t('chat.reasoning')\n return formatDuration(duration.value, t)\n})\n</script>\n\n<template>\n <div :class=\"[ns.b(), ns.is('open', open), ns.is('thinking', thinking)]\">\n <button\n :id=\"`${id}-trigger`\"\n type=\"button\"\n :class=\"ns.e('trigger')\"\n :aria-expanded=\"open\"\n :aria-controls=\"`${id}-panel`\"\n @click=\"setOpen(!open)\"\n >\n <SparklesIcon :class=\"ns.e('icon')\" />\n <span :class=\"ns.e('title')\">\n <slot name=\"title\" :thinking=\"thinking\" :duration=\"duration\">\n <DouShimmer :active=\"thinking\">{{ label }}</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 <div :class=\"ns.e('content')\">\n <div :class=\"ns.e('text')\"><slot /></div>\n </div>\n </div>\n </CollapseTransition>\n </div>\n</template>\n"],"mappings":""}
@@ -1,7 +1,7 @@
1
1
  import { useNamespace } from "../../utils/namespace.js";
2
2
  import { useLocale } from "../config-provider/use-config.js";
3
- import shimmer_default from "../shimmer/shimmer.js";
4
- import { CollapseTransition } from "../collapse/collapse-transition.js";
3
+ import { DouShimmer } from "../shimmer/index.js";
4
+ import { DouCollapseTransition } from "../collapse/collapse-transition.js";
5
5
  import { formatDuration } from "./format.js";
6
6
  import { computed, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, ref, renderSlot, toDisplayString, unref, useId, vShow, watch, withCtx, withDirectives } from "vue";
7
7
  import { ChevronDownIcon, SparklesIcon } from "@dou-ui/icons";
@@ -81,12 +81,12 @@ var chat_reasoning_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
81
81
  createElementVNode("span", { class: normalizeClass(unref(ns).e("title")) }, [renderSlot(_ctx.$slots, "title", {
82
82
  thinking: __props.thinking,
83
83
  duration: duration.value
84
- }, () => [createVNode(shimmer_default, { active: __props.thinking }, {
84
+ }, () => [createVNode(unref(DouShimmer), { active: __props.thinking }, {
85
85
  default: withCtx(() => [createTextVNode(toDisplayString(label.value), 1)]),
86
86
  _: 1
87
87
  }, 8, ["active"])])], 2),
88
88
  createVNode(unref(ChevronDownIcon), { class: normalizeClass(unref(ns).e("arrow")) }, null, 8, ["class"])
89
- ], 10, _hoisted_1), createVNode(unref(CollapseTransition), null, {
89
+ ], 10, _hoisted_1), createVNode(unref(DouCollapseTransition), null, {
90
90
  default: withCtx(() => [withDirectives(createElementVNode("div", {
91
91
  id: `${unref(id)}-panel`,
92
92
  role: "region",
@@ -1 +1 @@
1
- {"version":3,"file":"chat-reasoning.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_createVNode","_renderSlot","DouShimmer","_withCtx","_createTextVNode","_toDisplayString","_withDirectives","_vShow"],"sources":["../../../src/components/chat-reasoning/chat-reasoning.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ChevronDownIcon, SparklesIcon } from '@dou-ui/icons'\nimport { computed, ref, useId, watch } 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 { formatDuration } from './format'\nimport type { ChatReasoningEmits, ChatReasoningProps, ChatReasoningSlots } from './chat-reasoning'\n\ndefineOptions({ name: 'DouChatReasoning' })\n\nconst props = withDefaults(defineProps<ChatReasoningProps>(), {\n thinking: false,\n open: undefined,\n autoCollapse: true,\n})\nconst emit = defineEmits<ChatReasoningEmits>()\ndefineSlots<ChatReasoningSlots>()\n\nconst ns = useNamespace('chat-reasoning')\nconst { t } = useLocale()\nconst id = useId()\n\nconst inner = ref(props.thinking)\nconst open = computed(() => props.open ?? inner.value)\nfunction setOpen(value: boolean) {\n inner.value = value\n emit('update:open', value)\n}\n\nlet startedAt = props.thinking ? Date.now() : 0\nconst measured = ref<number>()\nwatch(\n () => props.thinking,\n (thinking) => {\n if (thinking) {\n startedAt = Date.now()\n measured.value = undefined\n if (!open.value) setOpen(true)\n return\n }\n if (startedAt) measured.value = Math.round((Date.now() - startedAt) / 1000)\n startedAt = 0\n if (props.autoCollapse && open.value) setOpen(false)\n },\n)\n\nconst duration = computed(() => props.duration ?? measured.value)\nconst label = computed(() => {\n if (props.title) return props.title\n if (props.thinking) return t('chat.thinking')\n if (duration.value === undefined) return t('chat.reasoning')\n return formatDuration(duration.value, t)\n})\n</script>\n\n<template>\n <div :class=\"[ns.b(), ns.is('open', open), ns.is('thinking', thinking)]\">\n <button\n :id=\"`${id}-trigger`\"\n type=\"button\"\n :class=\"ns.e('trigger')\"\n :aria-expanded=\"open\"\n :aria-controls=\"`${id}-panel`\"\n @click=\"setOpen(!open)\"\n >\n <SparklesIcon :class=\"ns.e('icon')\" />\n <span :class=\"ns.e('title')\">\n <slot name=\"title\" :thinking=\"thinking\" :duration=\"duration\">\n <DouShimmer :active=\"thinking\">{{ label }}</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 <div :class=\"ns.e('content')\">\n <div :class=\"ns.e('text')\"><slot /></div>\n </div>\n </div>\n </CollapseTransition>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"chat-reasoning.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_createVNode","_renderSlot","_withCtx","_createTextVNode","_toDisplayString","CollapseTransition","_withDirectives","_vShow"],"sources":["../../../src/components/chat-reasoning/chat-reasoning.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ChevronDownIcon, SparklesIcon } from '@dou-ui/icons'\nimport { computed, ref, useId, watch } 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 { formatDuration } from './format'\nimport type { ChatReasoningEmits, ChatReasoningProps, ChatReasoningSlots } from './chat-reasoning'\n\ndefineOptions({ name: 'DouChatReasoning' })\n\nconst props = withDefaults(defineProps<ChatReasoningProps>(), {\n thinking: false,\n open: undefined,\n autoCollapse: true,\n})\nconst emit = defineEmits<ChatReasoningEmits>()\ndefineSlots<ChatReasoningSlots>()\n\nconst ns = useNamespace('chat-reasoning')\nconst { t } = useLocale()\nconst id = useId()\n\nconst inner = ref(props.thinking)\nconst open = computed(() => props.open ?? inner.value)\nfunction setOpen(value: boolean) {\n inner.value = value\n emit('update:open', value)\n}\n\nlet startedAt = props.thinking ? Date.now() : 0\nconst measured = ref<number>()\nwatch(\n () => props.thinking,\n (thinking) => {\n if (thinking) {\n startedAt = Date.now()\n measured.value = undefined\n if (!open.value) setOpen(true)\n return\n }\n if (startedAt) measured.value = Math.round((Date.now() - startedAt) / 1000)\n startedAt = 0\n if (props.autoCollapse && open.value) setOpen(false)\n },\n)\n\nconst duration = computed(() => props.duration ?? measured.value)\nconst label = computed(() => {\n if (props.title) return props.title\n if (props.thinking) return t('chat.thinking')\n if (duration.value === undefined) return t('chat.reasoning')\n return formatDuration(duration.value, t)\n})\n</script>\n\n<template>\n <div :class=\"[ns.b(), ns.is('open', open), ns.is('thinking', thinking)]\">\n <button\n :id=\"`${id}-trigger`\"\n type=\"button\"\n :class=\"ns.e('trigger')\"\n :aria-expanded=\"open\"\n :aria-controls=\"`${id}-panel`\"\n @click=\"setOpen(!open)\"\n >\n <SparklesIcon :class=\"ns.e('icon')\" />\n <span :class=\"ns.e('title')\">\n <slot name=\"title\" :thinking=\"thinking\" :duration=\"duration\">\n <DouShimmer :active=\"thinking\">{{ label }}</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 <div :class=\"ns.e('content')\">\n <div :class=\"ns.e('text')\"><slot /></div>\n </div>\n </div>\n </CollapseTransition>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-citation.js","names":["_sfc_main"],"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":""}
1
+ {"version":3,"file":"chat-citation.js","names":["_sfc_main"],"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":""}
@@ -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);