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 +1 @@
1
- {"version":3,"file":"cascader.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_useModel","_openBlock","_createElementBlock","_Fragment","_createVNode","_unref","_withCtx","_createElementVNode","_mergeProps","_normalizeClass","_renderList","_createBlock","_createTextVNode","_toDisplayString","_createCommentVNode","_withDirectives","_vModelText","_withModifiers","_Teleport","_Transition","_normalizeStyle","DouCheckbox","_renderSlot","_vShow"],"sources":["../../../src/components/cascader/cascader.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n CheckIcon,\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n CloseIcon,\n} from '@dou-ui/icons'\nimport { computed, nextTick, reactive, ref, useId, useTemplateRef, watch } from 'vue'\nimport type { HTMLAttributes } from 'vue'\nimport { usePopup } from '../../composables/use-popup'\nimport { isComposing } from '../../utils/keyboard'\nimport { useNarrowViewport } from '../../utils/media'\nimport { useNamespace } from '../../utils/namespace'\nimport { shouldVirtualize, visibleWindow } from '../../utils/virtual'\nimport { OnlyChild } from '../../utils/only-child'\nimport { useLocale } from '../config-provider/use-config'\nimport { useFormDisabled, useFormItem, useFormReadonly, useFormSize } from '../form/use-form-item'\nimport DouCheckbox from '../checkbox/checkbox.vue'\nimport { DouSpinner } from '../spinner'\nimport { DouTag } from '../tag'\nimport type {\n CascaderExpose,\n CascaderOption,\n CascaderProps,\n CascaderSlots,\n CascaderValue,\n} from './cascader'\nimport { useTeleport } from '../../utils/teleport'\n\ndefineOptions({ name: 'DouCascader', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<CascaderProps>(), {\n options: () => [],\n changeOnSelect: false,\n expandTrigger: 'click',\n filterable: false,\n separator: ' / ',\n showLastOnly: false,\n multiple: false,\n checkStrictly: false,\n disabled: false,\n invalid: false,\n clearable: false,\n placement: 'bottom-start',\n teleport: undefined,\n})\nconst teleportTarget = useTeleport(() => props.teleport)\nconst model = defineModel<CascaderValue[] | CascaderValue[][] | null>()\nconst emit = defineEmits<{\n change: [\n value: CascaderValue[] | CascaderValue[][] | null,\n path: CascaderOption[] | CascaderOption[][],\n ]\n}>()\nconst slots = defineSlots<CascaderSlots>()\n\nconst ns = useNamespace('cascader')\nconst { t } = useLocale()\nconst { formItem } = useFormItem()\nif (!props.filterable) formItem?.markGroup()\nconst size = useFormSize(() => props.size)\nconst disabled = useFormDisabled(() => props.disabled)\nconst readonly = useFormReadonly(() => props.readonly)\n// Read-only keeps the field focusable but never opens or changes it.\nconst locked = computed(() => disabled.value || readonly.value)\nconst invalid = computed(() => props.invalid || !!formItem?.invalid.value)\n\nconst id = `dou-cascader-${useId()}`\nconst listboxId = (level: number) => `${id}-list-${level}`\nconst keyOf = (path: CascaderValue[]) => path.map(String).join('\\u0000')\nconst optionId = (path: CascaderValue[]) =>\n `${id}-option-${path.map((value) => String(value).replace(/[^\\w-]/g, '_')).join('-')}`\nconst labelOf = (option: CascaderOption) => option.label ?? String(option.value)\n\n/* the tree, with the branches loaded so far */\n\nconst loaded = reactive(new Map<string, CascaderOption[]>())\nconst loading = reactive(new Set<string>())\n\nconst childrenOf = (option: CascaderOption, path: CascaderValue[]) =>\n option.children ?? loaded.get(keyOf(path))\nconst isLeaf = (option: CascaderOption, path: CascaderValue[]) => {\n const children = childrenOf(option, path)\n if (children) return children.length === 0\n return !props.load || !!option.leaf\n}\n\n/** The options along a path of values, as far as they are known. */\nfunction resolve(values: CascaderValue[]): CascaderOption[] {\n const found: CascaderOption[] = []\n let level: CascaderOption[] | undefined = props.options\n for (const [index, value] of values.entries()) {\n const option: CascaderOption | undefined = level?.find((item) => item.value === value)\n if (!option) break\n found.push(option)\n level = childrenOf(option, values.slice(0, index + 1))\n }\n return found\n}\n\nasync function ensure(option: CascaderOption, path: CascaderValue[]) {\n const key = keyOf(path)\n if (!props.load || option.children || option.leaf || loaded.has(key) || loading.has(key)) return\n loading.add(key)\n try {\n loaded.set(key, await props.load(option, resolve(path)))\n } catch {\n // leave it unloaded so opening it again retries\n } finally {\n loading.delete(key)\n }\n}\n\n/* the open columns: the chain of options under the pointer or cursor */\n\nconst expanded = ref<CascaderValue[]>([])\nconst columns = computed(() => {\n const list: { options: CascaderOption[]; path: CascaderValue[] }[] = [\n { options: props.options, path: [] },\n ]\n const chain = resolve(expanded.value)\n for (const [index, option] of chain.entries()) {\n const path = expanded.value.slice(0, index + 1)\n const children = childrenOf(option, path)\n if (children?.length || loading.has(keyOf(path))) list.push({ options: children ?? [], path })\n }\n return list\n})\n\n// On a phone the columns do not fit side by side: show the deepest one, with\n// the way back up above it.\nconst narrow = useNarrowViewport()\nconst backTrail = computed(() => resolve(expanded.value).map(labelOf).join(props.separator))\nfunction goUp() {\n if (!expanded.value.length) return\n active.value = expanded.value\n expanded.value = expanded.value.slice(0, -1)\n}\n\n// The highlighted option, as a path of values. Focus stays in the field.\nconst active = ref<CascaderValue[]>([])\n\n/** The single path, or nothing with `multiple`. */\nconst single = computed<CascaderValue[]>(() =>\n props.multiple || !model.value ? [] : (model.value as CascaderValue[]),\n)\nconst selectedPath = computed(() => resolve(single.value))\nconst isOnSelected = (path: CascaderValue[]) => {\n if (props.multiple) return checkState(path) === 'on'\n const value = single.value\n return (\n value.length > 0 &&\n path.length <= value.length &&\n path.every((item, index) => value[index] === item)\n )\n}\n\n/* checking, with `multiple` */\n\nconst checkedPaths = computed<CascaderValue[][]>(() =>\n props.multiple && Array.isArray(model.value)\n ? (model.value as unknown[]).filter((item): item is CascaderValue[] => Array.isArray(item))\n : [],\n)\nconst checkedKeys = computed(() => new Set(checkedPaths.value.map(keyOf)))\nconst isUnder = (path: CascaderValue[], parent: CascaderValue[]) =>\n path.length >= parent.length && parent.every((value, index) => path[index] === value)\n\n/** The paths a check of this option stands for: its leaves as far as they are known. */\nfunction leavesUnder(option: CascaderOption, path: CascaderValue[]): CascaderValue[][] {\n const children = childrenOf(option, path)\n if (isLeaf(option, path) || !children) return [path]\n return children\n .filter((child) => !child.disabled)\n .flatMap((child) => leavesUnder(child, [...path, child.value]))\n}\n\n// Every proper prefix of a checked path, so \"partly checked\" is one lookup.\nconst checkedPrefixes = computed(() => {\n const set = new Set<string>()\n for (const path of checkedPaths.value) {\n for (let length = 1; length < path.length; length++) set.add(keyOf(path.slice(0, length)))\n }\n return set\n})\n\n/** The check state of an option already resolved from `path`. */\nfunction stateOf(option: CascaderOption, path: CascaderValue[], key = keyOf(path)) {\n if (checkedKeys.value.has(key)) return 'on'\n if (props.checkStrictly) return 'off'\n if (!checkedPrefixes.value.has(key)) return 'off'\n const leaves = leavesUnder(option, path)\n const count = leaves.filter((leaf) => checkedKeys.value.has(keyOf(leaf))).length\n if (count && count === leaves.length && !isLeaf(option, path)) return 'on'\n return 'some'\n}\n\nfunction checkState(path: CascaderValue[]): 'on' | 'off' | 'some' {\n if (checkedKeys.value.has(keyOf(path))) return 'on'\n const chain = resolve(path)\n const option = chain.at(-1)\n if (!option || chain.length !== path.length) return 'off'\n return stateOf(option, path)\n}\n\nasync function toggleCheck(option: CascaderOption, path: CascaderValue[]) {\n if (option.disabled) return\n const on = checkState(path) === 'on'\n if (props.checkStrictly) {\n commit(\n on\n ? checkedPaths.value.filter((item) => keyOf(item) !== keyOf(path))\n : [...checkedPaths.value, path],\n )\n return\n }\n await ensure(option, path)\n const rest = checkedPaths.value.filter((item) => !isUnder(item, path))\n commit(on ? rest : [...rest, ...leavesUnder(option, path)])\n}\n\nfunction removePath(path: CascaderValue[]) {\n if (locked.value) return\n commit(checkedPaths.value.filter((item) => keyOf(item) !== keyOf(path)))\n}\n\n/* what each open column shows, worked out once per change rather than per render */\n\ninterface Row {\n index: number\n option: CascaderOption\n path: CascaderValue[]\n key: string\n id: string\n leaf: boolean\n state: 'on' | 'off' | 'some'\n selected: boolean\n}\nconst columnRows = computed(() =>\n columns.value.map((column) =>\n column.options.map((option, index): Row => {\n const path = [...column.path, option.value]\n const key = keyOf(path)\n const state = props.multiple ? stateOf(option, path, key) : 'off'\n return {\n index,\n option,\n path,\n key,\n id: optionId(path),\n leaf: isLeaf(option, path),\n state,\n selected: props.multiple ? state === 'on' : isOnSelected(path),\n }\n }),\n ),\n)\nconst activeKey = computed(() => keyOf(active.value))\n\n// Long columns render only the options in view, with spacers for the rest.\nconst ROW = 32\nconst VIEWPORT = 280\nconst INSET = 4\nconst columnScroll = ref<number[]>([])\nconst isVirtualColumn = (level: number) =>\n shouldVirtualize(undefined, columnRows.value[level]?.length ?? 0)\nfunction columnWindow(level: number) {\n const list = columnRows.value[level] ?? []\n if (!isVirtualColumn(level)) return { rows: list, before: 0, after: 0 }\n const scrollTop = Math.max(0, (columnScroll.value[level] ?? 0) - INSET)\n const { from, to } = visibleWindow(list.length, scrollTop, VIEWPORT, ROW)\n return { rows: list.slice(from, to), before: from * ROW, after: (list.length - to) * ROW }\n}\n// A virtual column sizes to the widest options rendered so far, so it\n// does not jitter as different options scroll into view.\nfunction onColumnScroll(level: number, event: Event) {\n const el = event.target as HTMLElement\n columnScroll.value[level] = el.scrollTop\n if (isVirtualColumn(level)) {\n void nextTick(() => {\n el.style.minWidth = `${Math.max(parseFloat(el.style.minWidth) || 0, el.offsetWidth)}px`\n })\n }\n}\nconst windows = computed(() => columnRows.value.map((_, level) => columnWindow(level)))\nwatch(\n () => columns.value.map((column) => keyOf(column.path)).join('\\u0001'),\n () => (columnScroll.value = columnScroll.value.slice(0, columns.value.length)),\n)\n\n/* search */\n\nconst query = ref('')\ninterface Match {\n path: CascaderOption[]\n values: CascaderValue[]\n label: string\n}\nconst matches = computed<Match[]>(() => {\n const text = query.value.trim().toLowerCase()\n if (!props.filterable || !text) return []\n const result: Match[] = []\n const walk = (options: CascaderOption[], trail: CascaderOption[], values: CascaderValue[]) => {\n for (const option of options) {\n if (option.disabled) continue\n const path = [...trail, option]\n const keys = [...values, option.value]\n const label = path.map(labelOf).join(props.separator)\n const leaf = isLeaf(option, keys)\n const pickable = leaf || props.changeOnSelect || (props.multiple && props.checkStrictly)\n if (pickable && label.toLowerCase().includes(text)) result.push({ path, values: keys, label })\n const children = childrenOf(option, keys)\n if (children) walk(children, path, keys)\n }\n }\n walk(props.options, [], [])\n return result\n})\nconst searching = computed(() => props.filterable && !!query.value.trim())\nconst activeMatch = ref(-1)\n// Only a different list of matches moves the highlight back to the top.\nwatch(\n () => matches.value.map((match) => match.values.map(String).join('\\u0001')).join('\\u0000'),\n () => (activeMatch.value = matches.value.length ? 0 : -1),\n)\n\n/* the popup */\n\nconst open = ref(false)\nconst popup = usePopup({\n open,\n trigger: 'manual',\n closeOnOutside: true,\n disabled: locked,\n placement: () => props.placement,\n offset: 4,\n})\nconst { triggerRef, panelRef, rendered, theme, placement, panelStyle } = popup\n\nfunction show() {\n if (locked.value || open.value) return\n open.value = true\n const chosen = props.multiple ? (checkedPaths.value[0] ?? []) : single.value\n expanded.value = chosen.slice(0, -1)\n active.value = chosen.length ? [...chosen] : firstEnabled([])\n}\nfunction hide() {\n open.value = false\n query.value = ''\n}\nwatch(open, (value) => {\n if (!value) query.value = ''\n})\n\nwatch(active, async (path) => {\n await nextTick()\n const level = path.length - 1\n if (level >= 0 && isVirtualColumn(level)) {\n // The option may not be rendered: scroll its column by its row instead.\n const column = panelRef.value?.querySelector<HTMLElement>(`#${CSS.escape(listboxId(level))}`)\n const at = columnRows.value[level]!.findIndex((row) => row.key === keyOf(path))\n if (!column || at < 0) return\n const top = at * ROW + INSET\n let target = column.scrollTop\n if (top < target) target = top - INSET\n else if (top + ROW > target + column.clientHeight)\n target = top + ROW - column.clientHeight + INSET\n column.scrollTop = Math.max(0, target)\n columnScroll.value[level] = column.scrollTop\n return\n }\n panelRef.value?.querySelector(`#${CSS.escape(optionId(path))}`)?.scrollIntoView?.({\n block: 'nearest',\n })\n})\n\nfunction optionsAt(parent: CascaderValue[]) {\n if (!parent.length) return props.options\n const chain = resolve(parent)\n const last = chain.at(-1)\n return chain.length === parent.length && last ? (childrenOf(last, parent) ?? []) : []\n}\nfunction firstEnabled(parent: CascaderValue[]) {\n const option = optionsAt(parent).find((item) => !item.disabled)\n return option ? [...parent, option.value] : []\n}\n\nfunction commit(values: CascaderValue[] | CascaderValue[][] | null) {\n model.value = values\n if (props.multiple) {\n const list = (values ?? []) as CascaderValue[][]\n emit('change', values, list.map(resolve))\n } else emit('change', values, values ? resolve(values as CascaderValue[]) : [])\n formItem?.trigger('change')\n}\n\n/** Open an option's column; `choose` also picks it when that is allowed. */\nasync function activate(option: CascaderOption, path: CascaderValue[], choose: boolean) {\n if (option.disabled) return\n active.value = path\n const parent = path.slice(0, -1)\n expanded.value = path\n await ensure(option, path)\n if (isLeaf(option, path)) {\n expanded.value = parent\n if (choose) {\n commit(path)\n hide()\n focus()\n }\n return\n }\n if (choose && props.changeOnSelect) commit(path)\n}\n\nfunction onOptionClick(option: CascaderOption, path: CascaderValue[]) {\n if (props.multiple && isLeaf(option, path)) {\n active.value = path\n expanded.value = path.slice(0, -1)\n void toggleCheck(option, path)\n } else void activate(option, path, !props.multiple)\n}\nfunction onOptionHover(option: CascaderOption, path: CascaderValue[]) {\n if (option.disabled) return\n active.value = path\n if (props.expandTrigger === 'hover' && !isLeaf(option, path)) void activate(option, path, false)\n}\n\nfunction chooseMatch(match: Match | undefined) {\n if (!match) return\n if (props.multiple) return void toggleCheck(match.path.at(-1)!, match.values)\n commit(match.values)\n hide()\n focus()\n}\n\nfunction clear() {\n commit(props.multiple ? [] : null)\n hide()\n focus()\n}\n\nconst fieldRef = useTemplateRef<HTMLElement>('field')\nconst inputRef = useTemplateRef<HTMLInputElement>('input')\nconst combobox = () => (props.filterable ? inputRef.value : fieldRef.value)\nfunction focus() {\n combobox()?.focus()\n}\n\nfunction moveWithin(step: 1 | -1 | 'first' | 'last') {\n const parent = active.value.slice(0, -1)\n const list = optionsAt(parent).filter((option) => !option.disabled)\n if (!list.length) return\n const at = list.findIndex((option) => option.value === active.value.at(-1))\n const index =\n step === 'first'\n ? 0\n : step === 'last'\n ? list.length - 1\n : (at + step + list.length) % list.length\n const path = [...parent, list[index]!.value]\n active.value = path\n // keep the next column in step with the cursor\n expanded.value = parent\n}\n\nasync function enter(choose: boolean) {\n const chain = resolve(active.value)\n const option = chain.at(-1)\n if (!option || chain.length !== active.value.length) return\n const path = [...active.value]\n await activate(option, path, choose)\n if (!isLeaf(option, path) && !choose) {\n const next = firstEnabled(path)\n if (next.length) active.value = next\n }\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n if (locked.value || isComposing(event)) return\n if (searching.value) {\n const count = matches.value.length\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n event.preventDefault()\n if (count)\n activeMatch.value =\n (activeMatch.value + (event.key === 'ArrowDown' ? 1 : -1) + count) % count\n return\n case 'Enter':\n event.preventDefault()\n chooseMatch(matches.value[activeMatch.value])\n return\n case 'Tab':\n hide()\n }\n return\n }\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n event.preventDefault()\n if (!open.value) show()\n else moveWithin(event.key === 'ArrowDown' ? 1 : -1)\n return\n case 'Home':\n case 'End':\n if (!open.value || props.filterable) return\n event.preventDefault()\n moveWithin(event.key === 'Home' ? 'first' : 'last')\n return\n case 'ArrowRight':\n if (!open.value) return\n event.preventDefault()\n void enter(false)\n return\n case 'ArrowLeft':\n if (!open.value || active.value.length < 2) return\n event.preventDefault()\n active.value = active.value.slice(0, -1)\n expanded.value = active.value.slice(0, -1)\n return\n case 'Enter':\n case ' ':\n if (event.key === ' ' && props.filterable) return\n event.preventDefault()\n if (!open.value) show()\n else if (props.multiple) {\n const option = resolve(active.value).at(-1)\n if (option && resolve(active.value).length === active.value.length)\n void toggleCheck(option, [...active.value])\n } else void enter(true)\n return\n case 'Backspace':\n if (props.multiple && props.filterable && !query.value && checkedPaths.value.length)\n removePath(checkedPaths.value.at(-1)!)\n return\n case 'Tab':\n hide()\n }\n}\n\nfunction onFieldMousedown(event: MouseEvent) {\n if (locked.value) return\n const target = event.target as HTMLElement\n if (target.closest('button')) return\n if (target !== inputRef.value) event.preventDefault()\n focus()\n if (open.value && target !== inputRef.value) hide()\n else show()\n}\n\nfunction onBlur(event: FocusEvent) {\n const next = event.relatedTarget\n if (next instanceof Node && (fieldRef.value?.contains(next) || panelRef.value?.contains(next))) {\n return\n }\n hide()\n formItem?.trigger('blur')\n}\n\nconst pathLabel = (path: CascaderOption[]) =>\n props.showLastOnly ? labelOf(path.at(-1)!) : path.map(labelOf).join(props.separator)\nconst tags = computed(() =>\n checkedPaths.value.map((values) => {\n const path = resolve(values)\n return {\n values,\n label:\n path.length === values.length ? pathLabel(path) : values.map(String).join(props.separator),\n }\n }),\n)\nconst shownTags = computed(() =>\n props.maxTagCount === undefined\n ? tags.value\n : tags.value.slice(0, Math.max(0, props.maxTagCount)),\n)\nconst hiddenTags = computed(() => tags.value.slice(shownTags.value.length))\n\nconst display = computed(() => {\n const path = selectedPath.value\n if (!path.length) return ''\n return props.showLastOnly ? labelOf(path.at(-1)!) : path.map(labelOf).join(props.separator)\n})\nconst placeholderText = computed(() => props.placeholder ?? t('cascader.placeholder'))\n\nconst activeDescendant = computed(() => {\n if (!open.value) return undefined\n if (searching.value)\n return activeMatch.value >= 0 ? `${id}-match-${activeMatch.value}` : undefined\n return active.value.length ? optionId(active.value) : undefined\n})\n\nconst comboboxAttrs = computed<HTMLAttributes>(() => ({\n role: 'combobox',\n 'aria-haspopup': 'listbox',\n 'aria-expanded': open.value,\n 'aria-controls': rendered.value\n ? searching.value\n ? `${id}-matches`\n : listboxId(Math.max(0, active.value.length - 1))\n : undefined,\n 'aria-activedescendant': activeDescendant.value,\n 'aria-invalid': invalid.value || undefined,\n 'aria-required': formItem?.required.value || undefined,\n 'aria-describedby': formItem?.describedBy.value,\n}))\n\nconst showClear = computed(() => props.clearable && !locked.value && !!model.value?.length)\nconst inputPlaceholder = computed(() => {\n if (props.multiple) return tags.value.length ? '' : placeholderText.value\n return display.value || placeholderText.value\n})\n\ndefineExpose<CascaderExpose>({ focus, blur: () => combobox()?.blur() })\n</script>\n\n<template>\n <OnlyChild ref=\"triggerRef\">\n <div\n ref=\"field\"\n v-bind=\"{ ...$attrs, ...(filterable ? {} : comboboxAttrs) }\"\n :class=\"[\n ns.b(),\n 'dou-picker',\n `dou-picker--${size}`,\n ns.is('open', open),\n ns.is('multiple', multiple),\n ns.is('has-tags', tags.length > 0),\n ns.is('disabled', disabled),\n ns.is('readonly', readonly),\n ns.is('invalid', invalid),\n ]\"\n :id=\"filterable ? undefined : formItem?.inputId\"\n :aria-labelledby=\"filterable ? undefined : formItem?.labelId\"\n :tabindex=\"filterable || disabled ? undefined : 0\"\n @mousedown=\"onFieldMousedown\"\n @keydown=\"filterable ? undefined : onKeydown($event)\"\n @focusout=\"onBlur\"\n >\n <div v-if=\"multiple\" :class=\"ns.e('tags')\">\n <DouTag\n v-for=\"tag in shownTags\"\n :key=\"keyOf(tag.values)\"\n :size=\"size\"\n :closable=\"!locked\"\n @close=\"removePath(tag.values)\"\n >\n {{ tag.label }}\n </DouTag>\n <DouTag\n v-if=\"hiddenTags.length\"\n :size=\"size\"\n :class=\"ns.e('tag-more')\"\n :title=\"hiddenTags.map((tag) => tag.label).join('、')\"\n >\n +{{ hiddenTags.length }}\n </DouTag>\n <input\n v-if=\"filterable\"\n ref=\"input\"\n v-model=\"query\"\n v-bind=\"comboboxAttrs\"\n :id=\"formItem?.inputId\"\n class=\"dou-picker__input\"\n :class=\"ns.e('input')\"\n type=\"text\"\n autocomplete=\"off\"\n aria-autocomplete=\"list\"\n :placeholder=\"inputPlaceholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n @input=\"show\"\n @keydown=\"onKeydown\"\n />\n <span v-else-if=\"!tags.length\" class=\"dou-picker__placeholder\">{{ placeholderText }}</span>\n </div>\n <input\n v-else-if=\"filterable\"\n ref=\"input\"\n v-model=\"query\"\n v-bind=\"comboboxAttrs\"\n :id=\"formItem?.inputId\"\n class=\"dou-picker__input\"\n type=\"text\"\n autocomplete=\"off\"\n aria-autocomplete=\"list\"\n :placeholder=\"display || placeholderText\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :class=\"ns.is('has-value', !!display)\"\n @input=\"show\"\n @keydown=\"onKeydown\"\n />\n <span v-else-if=\"display\" class=\"dou-picker__value\">{{ display }}</span>\n <span v-else class=\"dou-picker__placeholder\">{{ placeholderText }}</span>\n <button\n v-if=\"showClear\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"dou-picker__clear\"\n :aria-label=\"t('cascader.clear')\"\n @mousedown.prevent\n @click=\"clear\"\n >\n <CloseIcon />\n </button>\n <ChevronDownIcon class=\"dou-picker__arrow\" />\n </div>\n </OnlyChild>\n <Teleport v-if=\"rendered\" :to=\"teleportTarget.to\" :disabled=\"teleportTarget.disabled\">\n <Transition appear name=\"dou-floating\">\n <div\n v-show=\"open\"\n ref=\"panelRef\"\n :class=\"[ns.e('panel'), 'dou-picker-panel', 'dou-floating']\"\n :style=\"panelStyle\"\n :data-placement=\"placement\"\n :data-dou-theme=\"theme\"\n @mousedown.prevent\n >\n <ul\n v-if=\"searching\"\n :id=\"`${id}-matches`\"\n role=\"listbox\"\n :class=\"[ns.e('column'), ns.e('matches')]\"\n >\n <li\n v-for=\"(match, index) in matches\"\n :id=\"`${id}-match-${index}`\"\n :key=\"keyOf(match.values)\"\n role=\"option\"\n :aria-selected=\"\n multiple ? stateOf(match.path.at(-1)!, match.values) === 'on' : index === activeMatch\n \"\n :class=\"[ns.e('option'), ns.is('active', index === activeMatch)]\"\n @click=\"chooseMatch(match)\"\n @mousemove=\"activeMatch = index\"\n >\n <DouCheckbox\n v-if=\"multiple\"\n :model-value=\"stateOf(match.path.at(-1)!, match.values) === 'on'\"\n size=\"sm\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :class=\"ns.e('checkbox')\"\n @click.stop\n @update:model-value=\"chooseMatch(match)\"\n />\n <span :class=\"ns.e('label')\">{{ match.label }}</span>\n </li>\n <li v-if=\"!matches.length\" role=\"presentation\" :class=\"ns.e('empty')\">\n <slot name=\"empty\">{{ t('cascader.empty') }}</slot>\n </li>\n </ul>\n <div v-else :class=\"[ns.e('columns'), ns.is('narrow', narrow)]\">\n <button\n v-if=\"narrow && columns.length > 1\"\n type=\"button\"\n tabindex=\"-1\"\n :class=\"ns.e('back')\"\n :aria-label=\"t('cascader.back')\"\n @click=\"goUp\"\n >\n <ChevronLeftIcon :class=\"ns.e('back-icon')\" />\n <span :class=\"ns.e('trail')\">{{ backTrail }}</span>\n </button>\n <ul\n v-for=\"(column, level) in columns\"\n v-show=\"!narrow || level === columns.length - 1\"\n :id=\"listboxId(level)\"\n :key=\"keyOf(column.path)\"\n role=\"listbox\"\n :class=\"ns.e('column')\"\n :aria-multiselectable=\"multiple || undefined\"\n :aria-busy=\"loading.has(keyOf(column.path)) || undefined\"\n @scroll=\"onColumnScroll(level, $event)\"\n >\n <li\n v-if=\"windows[level]!.before\"\n role=\"presentation\"\n :style=\"{ height: `${windows[level]!.before}px` }\"\n />\n <li\n v-for=\"{ index, option, path, key, id: rowId, leaf, state, selected } in windows[\n level\n ]!.rows\"\n :id=\"rowId\"\n :key=\"String(option.value)\"\n role=\"option\"\n :aria-selected=\"selected\"\n :aria-setsize=\"\n windows[level]!.rows.length < columnRows[level]!.length\n ? columnRows[level]!.length\n : undefined\n \"\n :aria-posinset=\"\n windows[level]!.rows.length < columnRows[level]!.length ? index + 1 : undefined\n \"\n :aria-disabled=\"option.disabled || undefined\"\n :aria-expanded=\"leaf ? undefined : expanded[level] === option.value\"\n :class=\"[\n ns.e('option'),\n ns.is('active', activeKey === key),\n ns.is('expanded', expanded[level] === option.value),\n ns.is('selected', selected),\n ns.is('disabled', !!option.disabled),\n ]\"\n @click=\"onOptionClick(option, path)\"\n @mouseenter=\"onOptionHover(option, path)\"\n >\n <DouCheckbox\n v-if=\"multiple\"\n :model-value=\"state === 'on'\"\n :indeterminate=\"state === 'some'\"\n :disabled=\"!!option.disabled\"\n size=\"sm\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :class=\"ns.e('checkbox')\"\n @click.stop\n @update:model-value=\"toggleCheck(option, path)\"\n />\n <span :class=\"ns.e('label')\">\n <slot name=\"option\" :option=\"option\" :level=\"level\">{{ labelOf(option) }}</slot>\n </span>\n <DouSpinner v-if=\"loading.has(key)\" size=\"sm\" :class=\"ns.e('suffix')\" />\n <ChevronRightIcon v-else-if=\"!leaf\" :class=\"ns.e('suffix')\" />\n <CheckIcon\n v-else-if=\"!multiple && selected\"\n :class=\"[ns.e('suffix'), ns.e('check')]\"\n />\n </li>\n <li\n v-if=\"windows[level]!.after\"\n role=\"presentation\"\n :style=\"{ height: `${windows[level]!.after}px` }\"\n />\n <li\n v-if=\"!column.options.length && !loading.has(keyOf(column.path))\"\n role=\"presentation\"\n :class=\"ns.e('empty')\"\n >\n <slot name=\"empty\">{{ t('cascader.empty') }}</slot>\n </li>\n </ul>\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"cascader.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_useModel","_openBlock","_createElementBlock","_Fragment","_createVNode","_unref","_withCtx","_createElementVNode","_mergeProps","_normalizeClass","_renderList","_createBlock","_createTextVNode","_toDisplayString","_createCommentVNode","_withDirectives","_vModelText","_withModifiers","_Teleport","_Transition","_normalizeStyle","_renderSlot","_vShow"],"sources":["../../../src/components/cascader/cascader.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n CheckIcon,\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n CloseIcon,\n} from '@dou-ui/icons'\nimport { computed, nextTick, reactive, ref, useId, useTemplateRef, watch } from 'vue'\nimport type { HTMLAttributes } from 'vue'\nimport { usePopup } from '../../composables/use-popup'\nimport { isComposing } from '../../utils/keyboard'\nimport { useNarrowViewport } from '../../utils/media'\nimport { useNamespace } from '../../utils/namespace'\nimport { shouldVirtualize, visibleWindow } from '../../utils/virtual'\nimport { OnlyChild } from '../../utils/only-child'\nimport { useLocale } from '../config-provider/use-config'\nimport { useFormDisabled, useFormItem, useFormReadonly, useFormSize } from '../form/use-form-item'\nimport { DouCheckbox } from '../checkbox'\nimport { DouSpinner } from '../spinner'\nimport { DouTag } from '../tag'\nimport type {\n CascaderExpose,\n CascaderOption,\n CascaderProps,\n CascaderSlots,\n CascaderValue,\n} from './cascader'\nimport { useTeleport } from '../../utils/teleport'\n\ndefineOptions({ name: 'DouCascader', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<CascaderProps>(), {\n options: () => [],\n changeOnSelect: false,\n expandTrigger: 'click',\n filterable: false,\n separator: ' / ',\n showLastOnly: false,\n multiple: false,\n checkStrictly: false,\n disabled: false,\n invalid: false,\n clearable: false,\n placement: 'bottom-start',\n teleport: undefined,\n})\nconst teleportTarget = useTeleport(() => props.teleport)\nconst model = defineModel<CascaderValue[] | CascaderValue[][] | null>()\nconst emit = defineEmits<{\n change: [\n value: CascaderValue[] | CascaderValue[][] | null,\n path: CascaderOption[] | CascaderOption[][],\n ]\n}>()\nconst slots = defineSlots<CascaderSlots>()\n\nconst ns = useNamespace('cascader')\nconst { t } = useLocale()\nconst { formItem } = useFormItem()\nif (!props.filterable) formItem?.markGroup()\nconst size = useFormSize(() => props.size)\nconst disabled = useFormDisabled(() => props.disabled)\nconst readonly = useFormReadonly(() => props.readonly)\n// Read-only keeps the field focusable but never opens or changes it.\nconst locked = computed(() => disabled.value || readonly.value)\nconst invalid = computed(() => props.invalid || !!formItem?.invalid.value)\n\nconst id = `dou-cascader-${useId()}`\nconst listboxId = (level: number) => `${id}-list-${level}`\nconst keyOf = (path: CascaderValue[]) => path.map(String).join('\\u0000')\nconst optionId = (path: CascaderValue[]) =>\n `${id}-option-${path.map((value) => String(value).replace(/[^\\w-]/g, '_')).join('-')}`\nconst labelOf = (option: CascaderOption) => option.label ?? String(option.value)\n\n/* the tree, with the branches loaded so far */\n\nconst loaded = reactive(new Map<string, CascaderOption[]>())\nconst loading = reactive(new Set<string>())\n\nconst childrenOf = (option: CascaderOption, path: CascaderValue[]) =>\n option.children ?? loaded.get(keyOf(path))\nconst isLeaf = (option: CascaderOption, path: CascaderValue[]) => {\n const children = childrenOf(option, path)\n if (children) return children.length === 0\n return !props.load || !!option.leaf\n}\n\n/** The options along a path of values, as far as they are known. */\nfunction resolve(values: CascaderValue[]): CascaderOption[] {\n const found: CascaderOption[] = []\n let level: CascaderOption[] | undefined = props.options\n for (const [index, value] of values.entries()) {\n const option: CascaderOption | undefined = level?.find((item) => item.value === value)\n if (!option) break\n found.push(option)\n level = childrenOf(option, values.slice(0, index + 1))\n }\n return found\n}\n\nasync function ensure(option: CascaderOption, path: CascaderValue[]) {\n const key = keyOf(path)\n if (!props.load || option.children || option.leaf || loaded.has(key) || loading.has(key)) return\n loading.add(key)\n try {\n loaded.set(key, await props.load(option, resolve(path)))\n } catch {\n // leave it unloaded so opening it again retries\n } finally {\n loading.delete(key)\n }\n}\n\n/* the open columns: the chain of options under the pointer or cursor */\n\nconst expanded = ref<CascaderValue[]>([])\nconst columns = computed(() => {\n const list: { options: CascaderOption[]; path: CascaderValue[] }[] = [\n { options: props.options, path: [] },\n ]\n const chain = resolve(expanded.value)\n for (const [index, option] of chain.entries()) {\n const path = expanded.value.slice(0, index + 1)\n const children = childrenOf(option, path)\n if (children?.length || loading.has(keyOf(path))) list.push({ options: children ?? [], path })\n }\n return list\n})\n\n// On a phone the columns do not fit side by side: show the deepest one, with\n// the way back up above it.\nconst narrow = useNarrowViewport()\nconst backTrail = computed(() => resolve(expanded.value).map(labelOf).join(props.separator))\nfunction goUp() {\n if (!expanded.value.length) return\n active.value = expanded.value\n expanded.value = expanded.value.slice(0, -1)\n}\n\n// The highlighted option, as a path of values. Focus stays in the field.\nconst active = ref<CascaderValue[]>([])\n\n/** The single path, or nothing with `multiple`. */\nconst single = computed<CascaderValue[]>(() =>\n props.multiple || !model.value ? [] : (model.value as CascaderValue[]),\n)\nconst selectedPath = computed(() => resolve(single.value))\nconst isOnSelected = (path: CascaderValue[]) => {\n if (props.multiple) return checkState(path) === 'on'\n const value = single.value\n return (\n value.length > 0 &&\n path.length <= value.length &&\n path.every((item, index) => value[index] === item)\n )\n}\n\n/* checking, with `multiple` */\n\nconst checkedPaths = computed<CascaderValue[][]>(() =>\n props.multiple && Array.isArray(model.value)\n ? (model.value as unknown[]).filter((item): item is CascaderValue[] => Array.isArray(item))\n : [],\n)\nconst checkedKeys = computed(() => new Set(checkedPaths.value.map(keyOf)))\nconst isUnder = (path: CascaderValue[], parent: CascaderValue[]) =>\n path.length >= parent.length && parent.every((value, index) => path[index] === value)\n\n/** The paths a check of this option stands for: its leaves as far as they are known. */\nfunction leavesUnder(option: CascaderOption, path: CascaderValue[]): CascaderValue[][] {\n const children = childrenOf(option, path)\n if (isLeaf(option, path) || !children) return [path]\n return children\n .filter((child) => !child.disabled)\n .flatMap((child) => leavesUnder(child, [...path, child.value]))\n}\n\n// Every proper prefix of a checked path, so \"partly checked\" is one lookup.\nconst checkedPrefixes = computed(() => {\n const set = new Set<string>()\n for (const path of checkedPaths.value) {\n for (let length = 1; length < path.length; length++) set.add(keyOf(path.slice(0, length)))\n }\n return set\n})\n\n/** The check state of an option already resolved from `path`. */\nfunction stateOf(option: CascaderOption, path: CascaderValue[], key = keyOf(path)) {\n if (checkedKeys.value.has(key)) return 'on'\n if (props.checkStrictly) return 'off'\n if (!checkedPrefixes.value.has(key)) return 'off'\n const leaves = leavesUnder(option, path)\n const count = leaves.filter((leaf) => checkedKeys.value.has(keyOf(leaf))).length\n if (count && count === leaves.length && !isLeaf(option, path)) return 'on'\n return 'some'\n}\n\nfunction checkState(path: CascaderValue[]): 'on' | 'off' | 'some' {\n if (checkedKeys.value.has(keyOf(path))) return 'on'\n const chain = resolve(path)\n const option = chain.at(-1)\n if (!option || chain.length !== path.length) return 'off'\n return stateOf(option, path)\n}\n\nasync function toggleCheck(option: CascaderOption, path: CascaderValue[]) {\n if (option.disabled) return\n const on = checkState(path) === 'on'\n if (props.checkStrictly) {\n commit(\n on\n ? checkedPaths.value.filter((item) => keyOf(item) !== keyOf(path))\n : [...checkedPaths.value, path],\n )\n return\n }\n await ensure(option, path)\n const rest = checkedPaths.value.filter((item) => !isUnder(item, path))\n commit(on ? rest : [...rest, ...leavesUnder(option, path)])\n}\n\nfunction removePath(path: CascaderValue[]) {\n if (locked.value) return\n commit(checkedPaths.value.filter((item) => keyOf(item) !== keyOf(path)))\n}\n\n/* what each open column shows, worked out once per change rather than per render */\n\ninterface Row {\n index: number\n option: CascaderOption\n path: CascaderValue[]\n key: string\n id: string\n leaf: boolean\n state: 'on' | 'off' | 'some'\n selected: boolean\n}\nconst columnRows = computed(() =>\n columns.value.map((column) =>\n column.options.map((option, index): Row => {\n const path = [...column.path, option.value]\n const key = keyOf(path)\n const state = props.multiple ? stateOf(option, path, key) : 'off'\n return {\n index,\n option,\n path,\n key,\n id: optionId(path),\n leaf: isLeaf(option, path),\n state,\n selected: props.multiple ? state === 'on' : isOnSelected(path),\n }\n }),\n ),\n)\nconst activeKey = computed(() => keyOf(active.value))\n\n// Long columns render only the options in view, with spacers for the rest.\nconst ROW = 32\nconst VIEWPORT = 280\nconst INSET = 4\nconst columnScroll = ref<number[]>([])\nconst isVirtualColumn = (level: number) =>\n shouldVirtualize(undefined, columnRows.value[level]?.length ?? 0)\nfunction columnWindow(level: number) {\n const list = columnRows.value[level] ?? []\n if (!isVirtualColumn(level)) return { rows: list, before: 0, after: 0 }\n const scrollTop = Math.max(0, (columnScroll.value[level] ?? 0) - INSET)\n const { from, to } = visibleWindow(list.length, scrollTop, VIEWPORT, ROW)\n return { rows: list.slice(from, to), before: from * ROW, after: (list.length - to) * ROW }\n}\n// A virtual column sizes to the widest options rendered so far, so it\n// does not jitter as different options scroll into view.\nfunction onColumnScroll(level: number, event: Event) {\n const el = event.target as HTMLElement\n columnScroll.value[level] = el.scrollTop\n if (isVirtualColumn(level)) {\n void nextTick(() => {\n el.style.minWidth = `${Math.max(parseFloat(el.style.minWidth) || 0, el.offsetWidth)}px`\n })\n }\n}\nconst windows = computed(() => columnRows.value.map((_, level) => columnWindow(level)))\nwatch(\n () => columns.value.map((column) => keyOf(column.path)).join('\\u0001'),\n () => (columnScroll.value = columnScroll.value.slice(0, columns.value.length)),\n)\n\n/* search */\n\nconst query = ref('')\ninterface Match {\n path: CascaderOption[]\n values: CascaderValue[]\n label: string\n}\nconst matches = computed<Match[]>(() => {\n const text = query.value.trim().toLowerCase()\n if (!props.filterable || !text) return []\n const result: Match[] = []\n const walk = (options: CascaderOption[], trail: CascaderOption[], values: CascaderValue[]) => {\n for (const option of options) {\n if (option.disabled) continue\n const path = [...trail, option]\n const keys = [...values, option.value]\n const label = path.map(labelOf).join(props.separator)\n const leaf = isLeaf(option, keys)\n const pickable = leaf || props.changeOnSelect || (props.multiple && props.checkStrictly)\n if (pickable && label.toLowerCase().includes(text)) result.push({ path, values: keys, label })\n const children = childrenOf(option, keys)\n if (children) walk(children, path, keys)\n }\n }\n walk(props.options, [], [])\n return result\n})\nconst searching = computed(() => props.filterable && !!query.value.trim())\nconst activeMatch = ref(-1)\n// Only a different list of matches moves the highlight back to the top.\nwatch(\n () => matches.value.map((match) => match.values.map(String).join('\\u0001')).join('\\u0000'),\n () => (activeMatch.value = matches.value.length ? 0 : -1),\n)\n\n/* the popup */\n\nconst open = ref(false)\nconst popup = usePopup({\n open,\n trigger: 'manual',\n closeOnOutside: true,\n disabled: locked,\n placement: () => props.placement,\n offset: 4,\n})\nconst { triggerRef, panelRef, rendered, theme, placement, panelStyle } = popup\n\nfunction show() {\n if (locked.value || open.value) return\n open.value = true\n const chosen = props.multiple ? (checkedPaths.value[0] ?? []) : single.value\n expanded.value = chosen.slice(0, -1)\n active.value = chosen.length ? [...chosen] : firstEnabled([])\n}\nfunction hide() {\n open.value = false\n query.value = ''\n}\nwatch(open, (value) => {\n if (!value) query.value = ''\n})\n\nwatch(active, async (path) => {\n await nextTick()\n const level = path.length - 1\n if (level >= 0 && isVirtualColumn(level)) {\n // The option may not be rendered: scroll its column by its row instead.\n const column = panelRef.value?.querySelector<HTMLElement>(`#${CSS.escape(listboxId(level))}`)\n const at = columnRows.value[level]!.findIndex((row) => row.key === keyOf(path))\n if (!column || at < 0) return\n const top = at * ROW + INSET\n let target = column.scrollTop\n if (top < target) target = top - INSET\n else if (top + ROW > target + column.clientHeight)\n target = top + ROW - column.clientHeight + INSET\n column.scrollTop = Math.max(0, target)\n columnScroll.value[level] = column.scrollTop\n return\n }\n panelRef.value?.querySelector(`#${CSS.escape(optionId(path))}`)?.scrollIntoView?.({\n block: 'nearest',\n })\n})\n\nfunction optionsAt(parent: CascaderValue[]) {\n if (!parent.length) return props.options\n const chain = resolve(parent)\n const last = chain.at(-1)\n return chain.length === parent.length && last ? (childrenOf(last, parent) ?? []) : []\n}\nfunction firstEnabled(parent: CascaderValue[]) {\n const option = optionsAt(parent).find((item) => !item.disabled)\n return option ? [...parent, option.value] : []\n}\n\nfunction commit(values: CascaderValue[] | CascaderValue[][] | null) {\n model.value = values\n if (props.multiple) {\n const list = (values ?? []) as CascaderValue[][]\n emit('change', values, list.map(resolve))\n } else emit('change', values, values ? resolve(values as CascaderValue[]) : [])\n formItem?.trigger('change')\n}\n\n/** Open an option's column; `choose` also picks it when that is allowed. */\nasync function activate(option: CascaderOption, path: CascaderValue[], choose: boolean) {\n if (option.disabled) return\n active.value = path\n const parent = path.slice(0, -1)\n expanded.value = path\n await ensure(option, path)\n if (isLeaf(option, path)) {\n expanded.value = parent\n if (choose) {\n commit(path)\n hide()\n focus()\n }\n return\n }\n if (choose && props.changeOnSelect) commit(path)\n}\n\nfunction onOptionClick(option: CascaderOption, path: CascaderValue[]) {\n if (props.multiple && isLeaf(option, path)) {\n active.value = path\n expanded.value = path.slice(0, -1)\n void toggleCheck(option, path)\n } else void activate(option, path, !props.multiple)\n}\nfunction onOptionHover(option: CascaderOption, path: CascaderValue[]) {\n if (option.disabled) return\n active.value = path\n if (props.expandTrigger === 'hover' && !isLeaf(option, path)) void activate(option, path, false)\n}\n\nfunction chooseMatch(match: Match | undefined) {\n if (!match) return\n if (props.multiple) return void toggleCheck(match.path.at(-1)!, match.values)\n commit(match.values)\n hide()\n focus()\n}\n\nfunction clear() {\n commit(props.multiple ? [] : null)\n hide()\n focus()\n}\n\nconst fieldRef = useTemplateRef<HTMLElement>('field')\nconst inputRef = useTemplateRef<HTMLInputElement>('input')\nconst combobox = () => (props.filterable ? inputRef.value : fieldRef.value)\nfunction focus() {\n combobox()?.focus()\n}\n\nfunction moveWithin(step: 1 | -1 | 'first' | 'last') {\n const parent = active.value.slice(0, -1)\n const list = optionsAt(parent).filter((option) => !option.disabled)\n if (!list.length) return\n const at = list.findIndex((option) => option.value === active.value.at(-1))\n const index =\n step === 'first'\n ? 0\n : step === 'last'\n ? list.length - 1\n : (at + step + list.length) % list.length\n const path = [...parent, list[index]!.value]\n active.value = path\n // keep the next column in step with the cursor\n expanded.value = parent\n}\n\nasync function enter(choose: boolean) {\n const chain = resolve(active.value)\n const option = chain.at(-1)\n if (!option || chain.length !== active.value.length) return\n const path = [...active.value]\n await activate(option, path, choose)\n if (!isLeaf(option, path) && !choose) {\n const next = firstEnabled(path)\n if (next.length) active.value = next\n }\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n if (locked.value || isComposing(event)) return\n if (searching.value) {\n const count = matches.value.length\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n event.preventDefault()\n if (count)\n activeMatch.value =\n (activeMatch.value + (event.key === 'ArrowDown' ? 1 : -1) + count) % count\n return\n case 'Enter':\n event.preventDefault()\n chooseMatch(matches.value[activeMatch.value])\n return\n case 'Tab':\n hide()\n }\n return\n }\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n event.preventDefault()\n if (!open.value) show()\n else moveWithin(event.key === 'ArrowDown' ? 1 : -1)\n return\n case 'Home':\n case 'End':\n if (!open.value || props.filterable) return\n event.preventDefault()\n moveWithin(event.key === 'Home' ? 'first' : 'last')\n return\n case 'ArrowRight':\n if (!open.value) return\n event.preventDefault()\n void enter(false)\n return\n case 'ArrowLeft':\n if (!open.value || active.value.length < 2) return\n event.preventDefault()\n active.value = active.value.slice(0, -1)\n expanded.value = active.value.slice(0, -1)\n return\n case 'Enter':\n case ' ':\n if (event.key === ' ' && props.filterable) return\n event.preventDefault()\n if (!open.value) show()\n else if (props.multiple) {\n const option = resolve(active.value).at(-1)\n if (option && resolve(active.value).length === active.value.length)\n void toggleCheck(option, [...active.value])\n } else void enter(true)\n return\n case 'Backspace':\n if (props.multiple && props.filterable && !query.value && checkedPaths.value.length)\n removePath(checkedPaths.value.at(-1)!)\n return\n case 'Tab':\n hide()\n }\n}\n\nfunction onFieldMousedown(event: MouseEvent) {\n if (locked.value) return\n const target = event.target as HTMLElement\n if (target.closest('button')) return\n if (target !== inputRef.value) event.preventDefault()\n focus()\n if (open.value && target !== inputRef.value) hide()\n else show()\n}\n\nfunction onBlur(event: FocusEvent) {\n const next = event.relatedTarget\n if (next instanceof Node && (fieldRef.value?.contains(next) || panelRef.value?.contains(next))) {\n return\n }\n hide()\n formItem?.trigger('blur')\n}\n\nconst pathLabel = (path: CascaderOption[]) =>\n props.showLastOnly ? labelOf(path.at(-1)!) : path.map(labelOf).join(props.separator)\nconst tags = computed(() =>\n checkedPaths.value.map((values) => {\n const path = resolve(values)\n return {\n values,\n label:\n path.length === values.length ? pathLabel(path) : values.map(String).join(props.separator),\n }\n }),\n)\nconst shownTags = computed(() =>\n props.maxTagCount === undefined\n ? tags.value\n : tags.value.slice(0, Math.max(0, props.maxTagCount)),\n)\nconst hiddenTags = computed(() => tags.value.slice(shownTags.value.length))\n\nconst display = computed(() => {\n const path = selectedPath.value\n if (!path.length) return ''\n return props.showLastOnly ? labelOf(path.at(-1)!) : path.map(labelOf).join(props.separator)\n})\nconst placeholderText = computed(() => props.placeholder ?? t('cascader.placeholder'))\n\nconst activeDescendant = computed(() => {\n if (!open.value) return undefined\n if (searching.value)\n return activeMatch.value >= 0 ? `${id}-match-${activeMatch.value}` : undefined\n return active.value.length ? optionId(active.value) : undefined\n})\n\nconst comboboxAttrs = computed<HTMLAttributes>(() => ({\n role: 'combobox',\n 'aria-haspopup': 'listbox',\n 'aria-expanded': open.value,\n 'aria-controls': rendered.value\n ? searching.value\n ? `${id}-matches`\n : listboxId(Math.max(0, active.value.length - 1))\n : undefined,\n 'aria-activedescendant': activeDescendant.value,\n 'aria-invalid': invalid.value || undefined,\n 'aria-required': formItem?.required.value || undefined,\n 'aria-describedby': formItem?.describedBy.value,\n}))\n\nconst showClear = computed(() => props.clearable && !locked.value && !!model.value?.length)\nconst inputPlaceholder = computed(() => {\n if (props.multiple) return tags.value.length ? '' : placeholderText.value\n return display.value || placeholderText.value\n})\n\ndefineExpose<CascaderExpose>({ focus, blur: () => combobox()?.blur() })\n</script>\n\n<template>\n <OnlyChild ref=\"triggerRef\">\n <div\n ref=\"field\"\n v-bind=\"{ ...$attrs, ...(filterable ? {} : comboboxAttrs) }\"\n :class=\"[\n ns.b(),\n 'dou-picker',\n `dou-picker--${size}`,\n ns.is('open', open),\n ns.is('multiple', multiple),\n ns.is('has-tags', tags.length > 0),\n ns.is('disabled', disabled),\n ns.is('readonly', readonly),\n ns.is('invalid', invalid),\n ]\"\n :id=\"filterable ? undefined : formItem?.inputId\"\n :aria-labelledby=\"filterable ? undefined : formItem?.labelId\"\n :tabindex=\"filterable || disabled ? undefined : 0\"\n @mousedown=\"onFieldMousedown\"\n @keydown=\"filterable ? undefined : onKeydown($event)\"\n @focusout=\"onBlur\"\n >\n <div v-if=\"multiple\" :class=\"ns.e('tags')\">\n <DouTag\n v-for=\"tag in shownTags\"\n :key=\"keyOf(tag.values)\"\n :size=\"size\"\n :closable=\"!locked\"\n @close=\"removePath(tag.values)\"\n >\n {{ tag.label }}\n </DouTag>\n <DouTag\n v-if=\"hiddenTags.length\"\n :size=\"size\"\n :class=\"ns.e('tag-more')\"\n :title=\"hiddenTags.map((tag) => tag.label).join('、')\"\n >\n +{{ hiddenTags.length }}\n </DouTag>\n <input\n v-if=\"filterable\"\n ref=\"input\"\n v-model=\"query\"\n v-bind=\"comboboxAttrs\"\n :id=\"formItem?.inputId\"\n class=\"dou-picker__input\"\n :class=\"ns.e('input')\"\n type=\"text\"\n autocomplete=\"off\"\n aria-autocomplete=\"list\"\n :placeholder=\"inputPlaceholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n @input=\"show\"\n @keydown=\"onKeydown\"\n />\n <span v-else-if=\"!tags.length\" class=\"dou-picker__placeholder\">{{ placeholderText }}</span>\n </div>\n <input\n v-else-if=\"filterable\"\n ref=\"input\"\n v-model=\"query\"\n v-bind=\"comboboxAttrs\"\n :id=\"formItem?.inputId\"\n class=\"dou-picker__input\"\n type=\"text\"\n autocomplete=\"off\"\n aria-autocomplete=\"list\"\n :placeholder=\"display || placeholderText\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :class=\"ns.is('has-value', !!display)\"\n @input=\"show\"\n @keydown=\"onKeydown\"\n />\n <span v-else-if=\"display\" class=\"dou-picker__value\">{{ display }}</span>\n <span v-else class=\"dou-picker__placeholder\">{{ placeholderText }}</span>\n <button\n v-if=\"showClear\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"dou-picker__clear\"\n :aria-label=\"t('cascader.clear')\"\n @mousedown.prevent\n @click=\"clear\"\n >\n <CloseIcon />\n </button>\n <ChevronDownIcon class=\"dou-picker__arrow\" />\n </div>\n </OnlyChild>\n <Teleport v-if=\"rendered\" :to=\"teleportTarget.to\" :disabled=\"teleportTarget.disabled\">\n <Transition appear name=\"dou-floating\">\n <div\n v-show=\"open\"\n ref=\"panelRef\"\n :class=\"[ns.e('panel'), 'dou-picker-panel', 'dou-floating']\"\n :style=\"panelStyle\"\n :data-placement=\"placement\"\n :data-dou-theme=\"theme\"\n @mousedown.prevent\n >\n <ul\n v-if=\"searching\"\n :id=\"`${id}-matches`\"\n role=\"listbox\"\n :class=\"[ns.e('column'), ns.e('matches')]\"\n >\n <li\n v-for=\"(match, index) in matches\"\n :id=\"`${id}-match-${index}`\"\n :key=\"keyOf(match.values)\"\n role=\"option\"\n :aria-selected=\"\n multiple ? stateOf(match.path.at(-1)!, match.values) === 'on' : index === activeMatch\n \"\n :class=\"[ns.e('option'), ns.is('active', index === activeMatch)]\"\n @click=\"chooseMatch(match)\"\n @mousemove=\"activeMatch = index\"\n >\n <DouCheckbox\n v-if=\"multiple\"\n :model-value=\"stateOf(match.path.at(-1)!, match.values) === 'on'\"\n size=\"sm\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :class=\"ns.e('checkbox')\"\n @click.stop\n @update:model-value=\"chooseMatch(match)\"\n />\n <span :class=\"ns.e('label')\">{{ match.label }}</span>\n </li>\n <li v-if=\"!matches.length\" role=\"presentation\" :class=\"ns.e('empty')\">\n <slot name=\"empty\">{{ t('cascader.empty') }}</slot>\n </li>\n </ul>\n <div v-else :class=\"[ns.e('columns'), ns.is('narrow', narrow)]\">\n <button\n v-if=\"narrow && columns.length > 1\"\n type=\"button\"\n tabindex=\"-1\"\n :class=\"ns.e('back')\"\n :aria-label=\"t('cascader.back')\"\n @click=\"goUp\"\n >\n <ChevronLeftIcon :class=\"ns.e('back-icon')\" />\n <span :class=\"ns.e('trail')\">{{ backTrail }}</span>\n </button>\n <ul\n v-for=\"(column, level) in columns\"\n v-show=\"!narrow || level === columns.length - 1\"\n :id=\"listboxId(level)\"\n :key=\"keyOf(column.path)\"\n role=\"listbox\"\n :class=\"ns.e('column')\"\n :aria-multiselectable=\"multiple || undefined\"\n :aria-busy=\"loading.has(keyOf(column.path)) || undefined\"\n @scroll=\"onColumnScroll(level, $event)\"\n >\n <li\n v-if=\"windows[level]!.before\"\n role=\"presentation\"\n :style=\"{ height: `${windows[level]!.before}px` }\"\n />\n <li\n v-for=\"{ index, option, path, key, id: rowId, leaf, state, selected } in windows[\n level\n ]!.rows\"\n :id=\"rowId\"\n :key=\"String(option.value)\"\n role=\"option\"\n :aria-selected=\"selected\"\n :aria-setsize=\"\n windows[level]!.rows.length < columnRows[level]!.length\n ? columnRows[level]!.length\n : undefined\n \"\n :aria-posinset=\"\n windows[level]!.rows.length < columnRows[level]!.length ? index + 1 : undefined\n \"\n :aria-disabled=\"option.disabled || undefined\"\n :aria-expanded=\"leaf ? undefined : expanded[level] === option.value\"\n :class=\"[\n ns.e('option'),\n ns.is('active', activeKey === key),\n ns.is('expanded', expanded[level] === option.value),\n ns.is('selected', selected),\n ns.is('disabled', !!option.disabled),\n ]\"\n @click=\"onOptionClick(option, path)\"\n @mouseenter=\"onOptionHover(option, path)\"\n >\n <DouCheckbox\n v-if=\"multiple\"\n :model-value=\"state === 'on'\"\n :indeterminate=\"state === 'some'\"\n :disabled=\"!!option.disabled\"\n size=\"sm\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :class=\"ns.e('checkbox')\"\n @click.stop\n @update:model-value=\"toggleCheck(option, path)\"\n />\n <span :class=\"ns.e('label')\">\n <slot name=\"option\" :option=\"option\" :level=\"level\">{{ labelOf(option) }}</slot>\n </span>\n <DouSpinner v-if=\"loading.has(key)\" size=\"sm\" :class=\"ns.e('suffix')\" />\n <ChevronRightIcon v-else-if=\"!leaf\" :class=\"ns.e('suffix')\" />\n <CheckIcon\n v-else-if=\"!multiple && selected\"\n :class=\"[ns.e('suffix'), ns.e('check')]\"\n />\n </li>\n <li\n v-if=\"windows[level]!.after\"\n role=\"presentation\"\n :style=\"{ height: `${windows[level]!.after}px` }\"\n />\n <li\n v-if=\"!column.options.length && !loading.has(keyOf(column.path))\"\n role=\"presentation\"\n :class=\"ns.e('empty')\"\n >\n <slot name=\"empty\">{{ t('cascader.empty') }}</slot>\n </li>\n </ul>\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-artifact.js","names":["_sfc_main"],"sources":["../../../src/components/chat-artifact/chat-artifact.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n AlertCircleIcon,\n ChevronRightIcon,\n CodeIcon,\n FileIcon,\n FileTextIcon,\n GlobeIcon,\n ImageIcon,\n TableIcon,\n} from '@dou-ui/icons'\nimport type { Component } from 'vue'\nimport { computed } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport DouShimmer from '../shimmer/shimmer.vue'\nimport type {\n ChatArtifactEmits,\n ChatArtifactKind,\n ChatArtifactProps,\n ChatArtifactSlots,\n} from './chat-artifact'\n\ndefineOptions({ name: 'DouChatArtifact' })\n\nconst props = withDefaults(defineProps<ChatArtifactProps>(), {\n kind: 'document',\n status: 'done',\n active: false,\n})\nconst emit = defineEmits<ChatArtifactEmits>()\nconst slots = defineSlots<ChatArtifactSlots>()\n\nconst ns = useNamespace('chat-artifact')\nconst { t } = useLocale()\n\nconst icons: Record<ChatArtifactKind, Component> = {\n document: FileTextIcon,\n code: CodeIcon,\n image: ImageIcon,\n web: GlobeIcon,\n data: TableIcon,\n file: FileIcon,\n}\nconst Icon = computed(() => icons[props.kind])\n</script>\n\n<template>\n <div :class=\"[ns.b(), ns.is(status), ns.is('active', active)]\">\n <button\n type=\"button\"\n :class=\"ns.e('main')\"\n :aria-current=\"active || undefined\"\n @click=\"emit('open', $event)\"\n >\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <slot name=\"icon\"><component :is=\"Icon\" /></slot>\n </span>\n <span :class=\"ns.e('text')\">\n <span :class=\"ns.e('title')\">{{ title }}</span>\n <span :class=\"ns.e('description')\">\n <DouShimmer v-if=\"status === 'generating'\">{{ t('chat.generating') }}</DouShimmer>\n <template v-else-if=\"status === 'error'\">\n <AlertCircleIcon aria-hidden=\"true\" />{{ t('chat.generateError') }}\n </template>\n <template v-else>{{ description }}</template>\n </span>\n </span>\n <ChevronRightIcon v-if=\"!slots.actions\" :class=\"ns.e('arrow')\" />\n </button>\n <div v-if=\"slots.actions\" :class=\"ns.e('actions')\"><slot name=\"actions\" /></div>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"chat-artifact.js","names":["_sfc_main"],"sources":["../../../src/components/chat-artifact/chat-artifact.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n AlertCircleIcon,\n ChevronRightIcon,\n CodeIcon,\n FileIcon,\n FileTextIcon,\n GlobeIcon,\n ImageIcon,\n TableIcon,\n} from '@dou-ui/icons'\nimport type { Component } from 'vue'\nimport { computed } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useStatusCheck } from '../../utils/status-check'\nimport { useLocale } from '../config-provider/use-config'\nimport { DouShimmer } from '../shimmer'\nimport type {\n ChatArtifactEmits,\n ChatArtifactKind,\n ChatArtifactProps,\n ChatArtifactSlots,\n} from './chat-artifact'\n\ndefineOptions({ name: 'DouChatArtifact' })\n\nconst props = withDefaults(defineProps<ChatArtifactProps>(), {\n kind: 'document',\n status: 'done',\n active: false,\n})\nconst emit = defineEmits<ChatArtifactEmits>()\nconst slots = defineSlots<ChatArtifactSlots>()\n\nconst ns = useNamespace('chat-artifact')\nconst { t } = useLocale()\n\nuseStatusCheck('DouChatArtifact', () => [props.status], ['running', 'done', 'error'], {\n generating: 'running',\n})\n\nconst icons: Record<ChatArtifactKind, Component> = {\n document: FileTextIcon,\n code: CodeIcon,\n image: ImageIcon,\n web: GlobeIcon,\n data: TableIcon,\n file: FileIcon,\n}\nconst Icon = computed(() => icons[props.kind])\n</script>\n\n<template>\n <div :class=\"[ns.b(), ns.is(status), ns.is('active', active)]\">\n <button\n type=\"button\"\n :class=\"ns.e('main')\"\n :aria-current=\"active || undefined\"\n @click=\"emit('open', $event)\"\n >\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <slot name=\"icon\"><component :is=\"Icon\" /></slot>\n </span>\n <span :class=\"ns.e('text')\">\n <span :class=\"ns.e('title')\">{{ title }}</span>\n <span :class=\"ns.e('description')\">\n <DouShimmer v-if=\"status === 'running'\">{{ t('chat.generating') }}</DouShimmer>\n <template v-else-if=\"status === 'error'\">\n <AlertCircleIcon aria-hidden=\"true\" />{{ t('chat.generateError') }}\n </template>\n <template v-else>{{ description }}</template>\n </span>\n </span>\n <ChevronRightIcon v-if=\"!slots.actions\" :class=\"ns.e('arrow')\" />\n </button>\n <div v-if=\"slots.actions\" :class=\"ns.e('actions')\"><slot name=\"actions\" /></div>\n </div>\n</template>\n"],"mappings":""}
@@ -1,6 +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";
3
+ import { useStatusCheck } from "../../utils/status-check.js";
4
+ import { DouShimmer } from "../shimmer/index.js";
4
5
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, renderSlot, resolveDynamicComponent, toDisplayString, unref, useSlots, withCtx } from "vue";
5
6
  import { AlertCircleIcon, ChevronRightIcon, CodeIcon, FileIcon, FileTextIcon, GlobeIcon, ImageIcon, TableIcon } from "@dou-ui/icons";
6
7
  // src/components/chat-artifact/chat-artifact.vue?vue&type=script&setup=true&lang.ts
@@ -25,6 +26,11 @@ var chat_artifact_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
25
26
  const slots = useSlots();
26
27
  const ns = useNamespace("chat-artifact");
27
28
  const { t } = useLocale();
29
+ useStatusCheck("DouChatArtifact", () => [props.status], [
30
+ "running",
31
+ "done",
32
+ "error"
33
+ ], { generating: "running" });
28
34
  const icons = {
29
35
  document: FileTextIcon,
30
36
  code: CodeIcon,
@@ -49,7 +55,7 @@ var chat_artifact_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
49
55
  class: normalizeClass(unref(ns).e("icon")),
50
56
  "aria-hidden": "true"
51
57
  }, [renderSlot(_ctx.$slots, "icon", {}, () => [(openBlock(), createBlock(resolveDynamicComponent(Icon.value)))])], 2),
52
- createElementVNode("span", { class: normalizeClass(unref(ns).e("text")) }, [createElementVNode("span", { class: normalizeClass(unref(ns).e("title")) }, toDisplayString(__props.title), 3), createElementVNode("span", { class: normalizeClass(unref(ns).e("description")) }, [__props.status === "generating" ? (openBlock(), createBlock(shimmer_default, { key: 0 }, {
58
+ createElementVNode("span", { class: normalizeClass(unref(ns).e("text")) }, [createElementVNode("span", { class: normalizeClass(unref(ns).e("title")) }, toDisplayString(__props.title), 3), createElementVNode("span", { class: normalizeClass(unref(ns).e("description")) }, [__props.status === "running" ? (openBlock(), createBlock(unref(DouShimmer), { key: 0 }, {
53
59
  default: withCtx(() => [createTextVNode(toDisplayString(unref(t)("chat.generating")), 1)]),
54
60
  _: 1
55
61
  })) : __props.status === "error" ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [createVNode(unref(AlertCircleIcon), { "aria-hidden": "true" }), createTextVNode(toDisplayString(unref(t)("chat.generateError")), 1)], 64)) : (openBlock(), createElementBlock(Fragment, { key: 2 }, [createTextVNode(toDisplayString(__props.description), 1)], 64))], 2)], 2),
@@ -1 +1 @@
1
- {"version":3,"file":"chat-artifact.vue_vue_type_script_setup_true_lang.js","names":["_useSlots","_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_renderSlot","_createBlock","_resolveDynamicComponent","_toDisplayString","DouShimmer","_withCtx","_createTextVNode","_Fragment","_createVNode","_createCommentVNode"],"sources":["../../../src/components/chat-artifact/chat-artifact.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n AlertCircleIcon,\n ChevronRightIcon,\n CodeIcon,\n FileIcon,\n FileTextIcon,\n GlobeIcon,\n ImageIcon,\n TableIcon,\n} from '@dou-ui/icons'\nimport type { Component } from 'vue'\nimport { computed } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport DouShimmer from '../shimmer/shimmer.vue'\nimport type {\n ChatArtifactEmits,\n ChatArtifactKind,\n ChatArtifactProps,\n ChatArtifactSlots,\n} from './chat-artifact'\n\ndefineOptions({ name: 'DouChatArtifact' })\n\nconst props = withDefaults(defineProps<ChatArtifactProps>(), {\n kind: 'document',\n status: 'done',\n active: false,\n})\nconst emit = defineEmits<ChatArtifactEmits>()\nconst slots = defineSlots<ChatArtifactSlots>()\n\nconst ns = useNamespace('chat-artifact')\nconst { t } = useLocale()\n\nconst icons: Record<ChatArtifactKind, Component> = {\n document: FileTextIcon,\n code: CodeIcon,\n image: ImageIcon,\n web: GlobeIcon,\n data: TableIcon,\n file: FileIcon,\n}\nconst Icon = computed(() => icons[props.kind])\n</script>\n\n<template>\n <div :class=\"[ns.b(), ns.is(status), ns.is('active', active)]\">\n <button\n type=\"button\"\n :class=\"ns.e('main')\"\n :aria-current=\"active || undefined\"\n @click=\"emit('open', $event)\"\n >\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <slot name=\"icon\"><component :is=\"Icon\" /></slot>\n </span>\n <span :class=\"ns.e('text')\">\n <span :class=\"ns.e('title')\">{{ title }}</span>\n <span :class=\"ns.e('description')\">\n <DouShimmer v-if=\"status === 'generating'\">{{ t('chat.generating') }}</DouShimmer>\n <template v-else-if=\"status === 'error'\">\n <AlertCircleIcon aria-hidden=\"true\" />{{ t('chat.generateError') }}\n </template>\n <template v-else>{{ description }}</template>\n </span>\n </span>\n <ChevronRightIcon v-if=\"!slots.actions\" :class=\"ns.e('arrow')\" />\n </button>\n <div v-if=\"slots.actions\" :class=\"ns.e('actions')\"><slot name=\"actions\" /></div>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAyBA,MAAM,QAAQ;EAKd,MAAM,OAAO;EACb,MAAM,QAAQA,SAAA;EAEd,MAAM,KAAK,aAAa,eAAe;EACvC,MAAM,EAAE,MAAM,UAAU;EAExB,MAAM,QAA6C;GACjD,UAAU;GACV,MAAM;GACN,OAAO;GACP,KAAK;GACL,MAAM;GACN,MAAM;EACR;EACA,MAAM,OAAO,eAAe,MAAM,MAAM,KAAK;;GAI3C,OAAAC,UAAA,GAAAC,mBAuBM,OAAA,EAvBA,OAAKC,eAAA;IAAGC,MAAA,EAAA,CAAE,CAAC,EAAC;IAAIA,MAAA,EAAA,CAAE,CAAC,GAAG,QAAA,MAAM;IAAGA,MAAA,EAAA,CAAE,CAAC,GAAE,UAAW,QAAA,MAAM;GAAA,CAAA,E,IACzDC,mBAoBS,UAAA;IAnBP,MAAK;IACJ,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA;IACX,gBAAc,QAAA,UAAU,KAAA;IACxB,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,QAAS,MAAM;;IAE3BC,mBAEO,QAAA;KAFA,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA;KAAU,eAAY;I,IACtCE,WAAiD,KAAA,QAAA,QAAA,CAAA,SAAA,EAA/BL,UAAA,GAAAM,YAAwBC,wBAAR,KAAA,KAAI,CAAA,E;IAExCH,mBASO,QAAA,EATA,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA,E,IAChBC,mBAA+C,QAAA,EAAxC,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA,EAAc,GAAAK,gBAAA,QAAA,KAAK,GAAA,CAAA,GACrCJ,mBAMO,QAAA,EANA,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,aAAA,CAAA,E,IACE,QAAA,WAAM,gBAAxBH,UAAA,GAAAM,YAAkFG,iBAAA,EAAA,KAAA,EAAA,GAAA;KAAvC,SAAAC,cAA0B,CAAvBC,gBAAAH,gBAAAL,MAAA,CAAA,CAAC,CAAA,iBAAA,CAAA,GAAA,CAAA,C;;I,MAC1B,QAAA,WAAM,WAA3BH,UAAA,GAAAC,mBAEWW,UAAA,EAAA,KAAA,EAAA,GAAA,CADTC,YAAsCV,MAAA,eAAA,GAAA,EAArB,eAAY,OAAM,CAAA,GAAMQ,gBAAAH,gBAAAL,MAAA,CAAA,CAAC,CAAA,oBAAA,CAAA,GAAA,CAAA,C,WAE5CH,UAAA,GAAAC,mBAA6CW,UAAA,EAAA,KAAA,EAAA,GAAA,CAAzBD,gBAAAH,gBAAA,QAAA,WAAW,GAAA,CAAA,C;IAGV,CAAA,MAAM,WAA/BR,UAAA,GAAAM,YAAiEH,MAAA,gBAAA,GAAA;;KAAxB,OAAKD,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA;;G,oBAE3C,MAAM,WAAjBH,UAAA,GAAAC,mBAAgF,OAAA;;IAArD,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,SAAA,CAAA;G,IAAaE,WAAuB,KAAA,QAAA,SAAA,C"}
1
+ {"version":3,"file":"chat-artifact.vue_vue_type_script_setup_true_lang.js","names":["_useSlots","_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_renderSlot","_createBlock","_resolveDynamicComponent","_toDisplayString","_withCtx","_createTextVNode","_Fragment","_createVNode","_createCommentVNode"],"sources":["../../../src/components/chat-artifact/chat-artifact.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n AlertCircleIcon,\n ChevronRightIcon,\n CodeIcon,\n FileIcon,\n FileTextIcon,\n GlobeIcon,\n ImageIcon,\n TableIcon,\n} from '@dou-ui/icons'\nimport type { Component } from 'vue'\nimport { computed } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useStatusCheck } from '../../utils/status-check'\nimport { useLocale } from '../config-provider/use-config'\nimport { DouShimmer } from '../shimmer'\nimport type {\n ChatArtifactEmits,\n ChatArtifactKind,\n ChatArtifactProps,\n ChatArtifactSlots,\n} from './chat-artifact'\n\ndefineOptions({ name: 'DouChatArtifact' })\n\nconst props = withDefaults(defineProps<ChatArtifactProps>(), {\n kind: 'document',\n status: 'done',\n active: false,\n})\nconst emit = defineEmits<ChatArtifactEmits>()\nconst slots = defineSlots<ChatArtifactSlots>()\n\nconst ns = useNamespace('chat-artifact')\nconst { t } = useLocale()\n\nuseStatusCheck('DouChatArtifact', () => [props.status], ['running', 'done', 'error'], {\n generating: 'running',\n})\n\nconst icons: Record<ChatArtifactKind, Component> = {\n document: FileTextIcon,\n code: CodeIcon,\n image: ImageIcon,\n web: GlobeIcon,\n data: TableIcon,\n file: FileIcon,\n}\nconst Icon = computed(() => icons[props.kind])\n</script>\n\n<template>\n <div :class=\"[ns.b(), ns.is(status), ns.is('active', active)]\">\n <button\n type=\"button\"\n :class=\"ns.e('main')\"\n :aria-current=\"active || undefined\"\n @click=\"emit('open', $event)\"\n >\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <slot name=\"icon\"><component :is=\"Icon\" /></slot>\n </span>\n <span :class=\"ns.e('text')\">\n <span :class=\"ns.e('title')\">{{ title }}</span>\n <span :class=\"ns.e('description')\">\n <DouShimmer v-if=\"status === 'running'\">{{ t('chat.generating') }}</DouShimmer>\n <template v-else-if=\"status === 'error'\">\n <AlertCircleIcon aria-hidden=\"true\" />{{ t('chat.generateError') }}\n </template>\n <template v-else>{{ description }}</template>\n </span>\n </span>\n <ChevronRightIcon v-if=\"!slots.actions\" :class=\"ns.e('arrow')\" />\n </button>\n <div v-if=\"slots.actions\" :class=\"ns.e('actions')\"><slot name=\"actions\" /></div>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;EA0BA,MAAM,QAAQ;EAKd,MAAM,OAAO;EACb,MAAM,QAAQA,SAAA;EAEd,MAAM,KAAK,aAAa,eAAe;EACvC,MAAM,EAAE,MAAM,UAAU;EAExB,eAAe,yBAAyB,CAAC,MAAM,MAAM,GAAG;GAAC;GAAW;GAAQ;EAAO,GAAG,EACpF,YAAY,UACd,CAAC;EAED,MAAM,QAA6C;GACjD,UAAU;GACV,MAAM;GACN,OAAO;GACP,KAAK;GACL,MAAM;GACN,MAAM;EACR;EACA,MAAM,OAAO,eAAe,MAAM,MAAM,KAAK;;GAI3C,OAAAC,UAAA,GAAAC,mBAuBM,OAAA,EAvBA,OAAKC,eAAA;IAAGC,MAAA,EAAA,CAAE,CAAC,EAAC;IAAIA,MAAA,EAAA,CAAE,CAAC,GAAG,QAAA,MAAM;IAAGA,MAAA,EAAA,CAAE,CAAC,GAAE,UAAW,QAAA,MAAM;GAAA,CAAA,E,IACzDC,mBAoBS,UAAA;IAnBP,MAAK;IACJ,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA;IACX,gBAAc,QAAA,UAAU,KAAA;IACxB,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,QAAS,MAAM;;IAE3BC,mBAEO,QAAA;KAFA,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA;KAAU,eAAY;I,IACtCE,WAAiD,KAAA,QAAA,QAAA,CAAA,SAAA,EAA/BL,UAAA,GAAAM,YAAwBC,wBAAR,KAAA,KAAI,CAAA,E;IAExCH,mBASO,QAAA,EATA,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA,E,IAChBC,mBAA+C,QAAA,EAAxC,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA,EAAc,GAAAK,gBAAA,QAAA,KAAK,GAAA,CAAA,GACrCJ,mBAMO,QAAA,EANA,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,aAAA,CAAA,E,IACE,QAAA,WAAM,aAAxBH,UAAA,GAAAM,YAA+EH,MAAA,UAAA,GAAA,EAAA,KAAA,EAAA,GAAA;KAAvC,SAAAM,cAA0B,CAAvBC,gBAAAF,gBAAAL,MAAA,CAAA,CAAC,CAAA,iBAAA,CAAA,GAAA,CAAA,C;;I,MACvB,QAAA,WAAM,WAA3BH,UAAA,GAAAC,mBAEWU,UAAA,EAAA,KAAA,EAAA,GAAA,CADTC,YAAsCT,MAAA,eAAA,GAAA,EAArB,eAAY,OAAM,CAAA,GAAMO,gBAAAF,gBAAAL,MAAA,CAAA,CAAC,CAAA,oBAAA,CAAA,GAAA,CAAA,C,WAE5CH,UAAA,GAAAC,mBAA6CU,UAAA,EAAA,KAAA,EAAA,GAAA,CAAzBD,gBAAAF,gBAAA,QAAA,WAAW,GAAA,CAAA,C;IAGV,CAAA,MAAM,WAA/BR,UAAA,GAAAM,YAAiEH,MAAA,gBAAA,GAAA;;KAAxB,OAAKD,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA;;G,oBAE3C,MAAM,WAAjBH,UAAA,GAAAC,mBAAgF,OAAA;;IAArD,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,SAAA,CAAA;G,IAAaE,WAAuB,KAAA,QAAA,SAAA,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-attachments.js","names":[],"sources":["../../../src/components/chat-attachments/chat-attachments.ts"],"sourcesContent":["export type ChatAttachmentStatus = 'uploading' | 'success' | 'error'\n\nexport interface ChatAttachment {\n /** Unique within the list. */\n uid: string\n name: string\n /** In bytes. */\n size?: number\n /** The MIME type. Picks the file icon, and marks images to show as thumbnails. */\n type?: string\n /** A link or object URL. Images with one are shown as thumbnails. */\n url?: string\n /** Leave out once the file is ready. */\n status?: ChatAttachmentStatus\n /** Upload progress, from 0 to 100, while `uploading`. */\n percent?: number\n}\n\nexport interface ChatAttachmentsProps {\n /** The attachments, bound with `v-model`. */\n modelValue?: ChatAttachment[]\n /** Show a remove button on each. Turn off for a message already sent. */\n removable?: boolean\n}\n\nexport interface ChatAttachmentsEmits {\n 'update:modelValue': [files: ChatAttachment[]]\n /** An attachment was removed. */\n remove: [file: ChatAttachment]\n /** An attachment was pressed, e.g. to preview it. */\n open: [file: ChatAttachment]\n}\n\nexport interface ChatAttachmentsSlots {\n /** Replaces the inside of each attachment. */\n item?: (props: { file: ChatAttachment; remove: () => void }) => unknown\n}\n\n/** The upper-cased extension of a file name, e.g. `PDF`; empty when there is none. */\nexport function fileExtension(name: string): string {\n const dot = name.lastIndexOf('.')\n return dot > 0 && dot < name.length - 1 ? name.slice(dot + 1).toUpperCase() : ''\n}\n\nexport type ChatAttachmentKind =\n 'image' | 'video' | 'audio' | 'archive' | 'code' | 'spreadsheet' | 'text' | 'file'\n\nconst byExtension: Record<string, ChatAttachmentKind> = {\n zip: 'archive',\n rar: 'archive',\n '7z': 'archive',\n gz: 'archive',\n tar: 'archive',\n js: 'code',\n ts: 'code',\n vue: 'code',\n json: 'code',\n html: 'code',\n css: 'code',\n py: 'code',\n go: 'code',\n rs: 'code',\n java: 'code',\n xls: 'spreadsheet',\n xlsx: 'spreadsheet',\n csv: 'spreadsheet',\n numbers: 'spreadsheet',\n txt: 'text',\n md: 'text',\n pdf: 'text',\n doc: 'text',\n docx: 'text',\n png: 'image',\n jpg: 'image',\n jpeg: 'image',\n gif: 'image',\n webp: 'image',\n avif: 'image',\n svg: 'image',\n mp4: 'video',\n mov: 'video',\n webm: 'video',\n mp3: 'audio',\n wav: 'audio',\n m4a: 'audio',\n flac: 'audio',\n}\n\n/** What kind of file it is, from the MIME type and then the extension. */\nexport function attachmentKind(file: Pick<ChatAttachment, 'name' | 'type'>): ChatAttachmentKind {\n const type = file.type ?? ''\n if (type.startsWith('image/')) return 'image'\n if (type.startsWith('video/')) return 'video'\n if (type.startsWith('audio/')) return 'audio'\n return (\n byExtension[fileExtension(file.name).toLowerCase()] ??\n (type.startsWith('text/') ? 'text' : 'file')\n )\n}\n"],"mappings":";;AAuCA,SAAgB,cAAc,MAAsB;CAClD,MAAM,MAAM,KAAK,YAAY,GAAG;CAChC,OAAO,MAAM,KAAK,MAAM,KAAK,SAAS,IAAI,KAAK,MAAM,MAAM,CAAC,CAAC,CAAC,YAAY,IAAI;AAChF;AAKA,IAAM,cAAkD;CACtD,KAAK;CACL,KAAK;CACL,MAAM;CACN,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,MAAM;CACN,MAAM;CACN,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,MAAM;CACN,KAAK;CACL,MAAM;CACN,KAAK;CACL,SAAS;CACT,KAAK;CACL,IAAI;CACJ,KAAK;CACL,KAAK;CACL,MAAM;CACN,KAAK;CACL,KAAK;CACL,MAAM;CACN,KAAK;CACL,MAAM;CACN,MAAM;CACN,KAAK;CACL,KAAK;CACL,KAAK;CACL,MAAM;CACN,KAAK;CACL,KAAK;CACL,KAAK;CACL,MAAM;AACR;;AAGA,SAAgB,eAAe,MAAiE;CAC9F,MAAM,OAAO,KAAK,QAAQ;CAC1B,IAAI,KAAK,WAAW,QAAQ,GAAG,OAAO;CACtC,IAAI,KAAK,WAAW,QAAQ,GAAG,OAAO;CACtC,IAAI,KAAK,WAAW,QAAQ,GAAG,OAAO;CACtC,OACE,YAAY,cAAc,KAAK,IAAI,CAAC,CAAC,YAAY,OAChD,KAAK,WAAW,OAAO,IAAI,SAAS;AAEzC"}
1
+ {"version":3,"file":"chat-attachments.js","names":[],"sources":["../../../src/components/chat-attachments/chat-attachments.ts"],"sourcesContent":["export type ChatAttachmentStatus = 'running' | 'done' | 'error'\n\nexport interface ChatAttachment {\n /** Unique within the list. */\n uid: string\n name: string\n /** In bytes. */\n size?: number\n /** The MIME type. Picks the file icon, and marks images to show as thumbnails. */\n type?: string\n /** A link or object URL. Images with one are shown as thumbnails. */\n url?: string\n /** Leave out once the file is ready. */\n status?: ChatAttachmentStatus\n /** Upload progress, from 0 to 100, while `running`. */\n percent?: number\n}\n\nexport interface ChatAttachmentsProps {\n /** The attachments, bound with `v-model`. */\n modelValue?: ChatAttachment[]\n /** Show a remove button on each. Turn off for a message already sent. */\n removable?: boolean\n}\n\nexport interface ChatAttachmentsEmits {\n 'update:modelValue': [files: ChatAttachment[]]\n /** An attachment was removed. */\n remove: [file: ChatAttachment]\n /** An attachment was pressed, e.g. to preview it. */\n open: [file: ChatAttachment]\n}\n\nexport interface ChatAttachmentsSlots {\n /** Replaces the inside of each attachment. */\n item?: (props: { file: ChatAttachment; remove: () => void }) => unknown\n}\n\n/** The upper-cased extension of a file name, e.g. `PDF`; empty when there is none. */\nexport function fileExtension(name: string): string {\n const dot = name.lastIndexOf('.')\n return dot > 0 && dot < name.length - 1 ? name.slice(dot + 1).toUpperCase() : ''\n}\n\nexport type ChatAttachmentKind =\n 'image' | 'video' | 'audio' | 'archive' | 'code' | 'spreadsheet' | 'text' | 'file'\n\nconst byExtension: Record<string, ChatAttachmentKind> = {\n zip: 'archive',\n rar: 'archive',\n '7z': 'archive',\n gz: 'archive',\n tar: 'archive',\n js: 'code',\n ts: 'code',\n vue: 'code',\n json: 'code',\n html: 'code',\n css: 'code',\n py: 'code',\n go: 'code',\n rs: 'code',\n java: 'code',\n xls: 'spreadsheet',\n xlsx: 'spreadsheet',\n csv: 'spreadsheet',\n numbers: 'spreadsheet',\n txt: 'text',\n md: 'text',\n pdf: 'text',\n doc: 'text',\n docx: 'text',\n png: 'image',\n jpg: 'image',\n jpeg: 'image',\n gif: 'image',\n webp: 'image',\n avif: 'image',\n svg: 'image',\n mp4: 'video',\n mov: 'video',\n webm: 'video',\n mp3: 'audio',\n wav: 'audio',\n m4a: 'audio',\n flac: 'audio',\n}\n\n/** What kind of file it is, from the MIME type and then the extension. */\nexport function attachmentKind(file: Pick<ChatAttachment, 'name' | 'type'>): ChatAttachmentKind {\n const type = file.type ?? ''\n if (type.startsWith('image/')) return 'image'\n if (type.startsWith('video/')) return 'video'\n if (type.startsWith('audio/')) return 'audio'\n return (\n byExtension[fileExtension(file.name).toLowerCase()] ??\n (type.startsWith('text/') ? 'text' : 'file')\n )\n}\n"],"mappings":";;AAuCA,SAAgB,cAAc,MAAsB;CAClD,MAAM,MAAM,KAAK,YAAY,GAAG;CAChC,OAAO,MAAM,KAAK,MAAM,KAAK,SAAS,IAAI,KAAK,MAAM,MAAM,CAAC,CAAC,CAAC,YAAY,IAAI;AAChF;AAKA,IAAM,cAAkD;CACtD,KAAK;CACL,KAAK;CACL,MAAM;CACN,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,MAAM;CACN,MAAM;CACN,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,MAAM;CACN,KAAK;CACL,MAAM;CACN,KAAK;CACL,SAAS;CACT,KAAK;CACL,IAAI;CACJ,KAAK;CACL,KAAK;CACL,MAAM;CACN,KAAK;CACL,KAAK;CACL,MAAM;CACN,KAAK;CACL,MAAM;CACN,MAAM;CACN,KAAK;CACL,KAAK;CACL,KAAK;CACL,MAAM;CACN,KAAK;CACL,KAAK;CACL,KAAK;CACL,MAAM;AACR;;AAGA,SAAgB,eAAe,MAAiE;CAC9F,MAAM,OAAO,KAAK,QAAQ;CAC1B,IAAI,KAAK,WAAW,QAAQ,GAAG,OAAO;CACtC,IAAI,KAAK,WAAW,QAAQ,GAAG,OAAO;CACtC,IAAI,KAAK,WAAW,QAAQ,GAAG,OAAO;CACtC,OACE,YAAY,cAAc,KAAK,IAAI,CAAC,CAAC,YAAY,OAChD,KAAK,WAAW,OAAO,IAAI,SAAS;AAEzC"}
@@ -1,5 +1,6 @@
1
1
  import { useNamespace } from "../../utils/namespace.js";
2
2
  import { useLocale } from "../config-provider/use-config.js";
3
+ import { useStatusCheck } from "../../utils/status-check.js";
3
4
  import { formatFileSize } from "../upload/upload.js";
4
5
  import { attachmentKind, fileExtension } from "./chat-attachments.js";
5
6
  import { Fragment, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref } from "vue";
@@ -44,9 +45,17 @@ var chat_attachments_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
44
45
  text: FileTextIcon,
45
46
  file: FileIcon
46
47
  };
48
+ useStatusCheck("DouChatAttachments", () => (props.modelValue ?? []).map((file) => file.status), [
49
+ "running",
50
+ "done",
51
+ "error"
52
+ ], {
53
+ uploading: "running",
54
+ success: "done"
55
+ });
47
56
  const isThumb = (file) => !!file.url && attachmentKind(file) === "image";
48
57
  function detail(file) {
49
- if (file.status === "uploading") return `${t("chat.uploading")} ${Math.round(file.percent ?? 0)}%`;
58
+ if (file.status === "running") return `${t("chat.uploading")} ${Math.round(file.percent ?? 0)}%`;
50
59
  if (file.status === "error") return t("chat.uploadError");
51
60
  return [fileExtension(file.name), file.size === void 0 ? "" : formatFileSize(file.size)].filter(Boolean).join(" · ");
52
61
  }
@@ -83,7 +92,7 @@ var chat_attachments_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
83
92
  }, null, 10, _hoisted_3)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [createElementVNode("span", {
84
93
  class: normalizeClass(unref(ns).e("icon")),
85
94
  "aria-hidden": "true"
86
- }, [(openBlock(), createBlock(resolveDynamicComponent(icons[unref(attachmentKind)(file)])))], 2), createElementVNode("span", { class: normalizeClass(unref(ns).e("meta")) }, [createElementVNode("span", { class: normalizeClass(unref(ns).e("name")) }, toDisplayString(file.name), 3), createElementVNode("span", { class: normalizeClass(unref(ns).e("detail")) }, toDisplayString(detail(file)), 3)], 2)], 64)), file.status === "uploading" ? (openBlock(), createElementBlock("span", {
95
+ }, [(openBlock(), createBlock(resolveDynamicComponent(icons[unref(attachmentKind)(file)])))], 2), createElementVNode("span", { class: normalizeClass(unref(ns).e("meta")) }, [createElementVNode("span", { class: normalizeClass(unref(ns).e("name")) }, toDisplayString(file.name), 3), createElementVNode("span", { class: normalizeClass(unref(ns).e("detail")) }, toDisplayString(detail(file)), 3)], 2)], 64)), file.status === "running" ? (openBlock(), createElementBlock("span", {
87
96
  key: 2,
88
97
  class: normalizeClass(unref(ns).e("progress")),
89
98
  role: "progressbar",
@@ -1 +1 @@
1
- {"version":3,"file":"chat-attachments.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_Fragment","_renderList","_renderSlot","_createElementVNode","_createBlock","_resolveDynamicComponent","_toDisplayString","_normalizeStyle","_createCommentVNode","_createVNode"],"sources":["../../../src/components/chat-attachments/chat-attachments.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n CloseIcon,\n FileArchiveIcon,\n FileAudioIcon,\n FileCodeIcon,\n FileIcon,\n FileImageIcon,\n FileSpreadsheetIcon,\n FileTextIcon,\n FileVideoIcon,\n} from '@dou-ui/icons'\nimport type { Component } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport { formatFileSize } from '../upload/upload'\nimport { attachmentKind, fileExtension } from './chat-attachments'\nimport type {\n ChatAttachment,\n ChatAttachmentKind,\n ChatAttachmentsEmits,\n ChatAttachmentsProps,\n ChatAttachmentsSlots,\n} from './chat-attachments'\n\ndefineOptions({ name: 'DouChatAttachments' })\n\nconst props = withDefaults(defineProps<ChatAttachmentsProps>(), {\n modelValue: () => [],\n removable: true,\n})\nconst emit = defineEmits<ChatAttachmentsEmits>()\ndefineSlots<ChatAttachmentsSlots>()\n\nconst ns = useNamespace('chat-attachments')\nconst { t } = useLocale()\n\nconst icons: Record<ChatAttachmentKind, Component> = {\n image: FileImageIcon,\n video: FileVideoIcon,\n audio: FileAudioIcon,\n archive: FileArchiveIcon,\n code: FileCodeIcon,\n spreadsheet: FileSpreadsheetIcon,\n text: FileTextIcon,\n file: FileIcon,\n}\n\nconst isThumb = (file: ChatAttachment) => !!file.url && attachmentKind(file) === 'image'\n\nfunction detail(file: ChatAttachment) {\n if (file.status === 'uploading') return `${t('chat.uploading')} ${Math.round(file.percent ?? 0)}%`\n if (file.status === 'error') return t('chat.uploadError')\n return [fileExtension(file.name), file.size === undefined ? '' : formatFileSize(file.size)]\n .filter(Boolean)\n .join(' · ')\n}\n\nfunction remove(file: ChatAttachment) {\n emit(\n 'update:modelValue',\n props.modelValue.filter((item) => item.uid !== file.uid),\n )\n emit('remove', file)\n}\n</script>\n\n<template>\n <ul :class=\"ns.b()\" :aria-label=\"t('chat.attachments')\">\n <li\n v-for=\"file in modelValue\"\n :key=\"file.uid\"\n :class=\"[ns.e('item'), ns.is('thumb', isThumb(file)), file.status ? ns.is(file.status) : '']\"\n >\n <slot name=\"item\" :file=\"file\" :remove=\"() => remove(file)\">\n <button\n type=\"button\"\n :class=\"ns.e('main')\"\n :title=\"file.name\"\n :aria-label=\"isThumb(file) ? file.name : undefined\"\n @click=\"emit('open', file)\"\n >\n <img v-if=\"isThumb(file)\" :class=\"ns.e('image')\" :src=\"file.url\" alt=\"\" />\n <template v-else>\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <component :is=\"icons[attachmentKind(file)]\" />\n </span>\n <span :class=\"ns.e('meta')\">\n <span :class=\"ns.e('name')\">{{ file.name }}</span>\n <span :class=\"ns.e('detail')\">{{ detail(file) }}</span>\n </span>\n </template>\n <span\n v-if=\"file.status === 'uploading'\"\n :class=\"ns.e('progress')\"\n role=\"progressbar\"\n :aria-label=\"file.name\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuenow=\"Math.round(file.percent ?? 0)\"\n >\n <span :style=\"{ width: `${file.percent ?? 0}%` }\" />\n </span>\n </button>\n <button\n v-if=\"removable\"\n type=\"button\"\n :class=\"ns.e('remove')\"\n :aria-label=\"`${t('chat.remove')} ${file.name}`\"\n @click=\"remove(file)\"\n >\n <CloseIcon />\n </button>\n </slot>\n </li>\n </ul>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"chat-attachments.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_Fragment","_renderList","_renderSlot","_createElementVNode","_createBlock","_resolveDynamicComponent","_toDisplayString","_normalizeStyle","_createCommentVNode","_createVNode"],"sources":["../../../src/components/chat-attachments/chat-attachments.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n CloseIcon,\n FileArchiveIcon,\n FileAudioIcon,\n FileCodeIcon,\n FileIcon,\n FileImageIcon,\n FileSpreadsheetIcon,\n FileTextIcon,\n FileVideoIcon,\n} from '@dou-ui/icons'\nimport type { Component } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useStatusCheck } from '../../utils/status-check'\nimport { useLocale } from '../config-provider/use-config'\nimport { formatFileSize } from '../upload/upload'\nimport { attachmentKind, fileExtension } from './chat-attachments'\nimport type {\n ChatAttachment,\n ChatAttachmentKind,\n ChatAttachmentsEmits,\n ChatAttachmentsProps,\n ChatAttachmentsSlots,\n} from './chat-attachments'\n\ndefineOptions({ name: 'DouChatAttachments' })\n\nconst props = withDefaults(defineProps<ChatAttachmentsProps>(), {\n modelValue: () => [],\n removable: true,\n})\nconst emit = defineEmits<ChatAttachmentsEmits>()\ndefineSlots<ChatAttachmentsSlots>()\n\nconst ns = useNamespace('chat-attachments')\nconst { t } = useLocale()\n\nconst icons: Record<ChatAttachmentKind, Component> = {\n image: FileImageIcon,\n video: FileVideoIcon,\n audio: FileAudioIcon,\n archive: FileArchiveIcon,\n code: FileCodeIcon,\n spreadsheet: FileSpreadsheetIcon,\n text: FileTextIcon,\n file: FileIcon,\n}\n\nuseStatusCheck(\n 'DouChatAttachments',\n () => (props.modelValue ?? []).map((file) => file.status),\n ['running', 'done', 'error'],\n { uploading: 'running', success: 'done' },\n)\n\nconst isThumb = (file: ChatAttachment) => !!file.url && attachmentKind(file) === 'image'\n\nfunction detail(file: ChatAttachment) {\n if (file.status === 'running') return `${t('chat.uploading')} ${Math.round(file.percent ?? 0)}%`\n if (file.status === 'error') return t('chat.uploadError')\n return [fileExtension(file.name), file.size === undefined ? '' : formatFileSize(file.size)]\n .filter(Boolean)\n .join(' · ')\n}\n\nfunction remove(file: ChatAttachment) {\n emit(\n 'update:modelValue',\n props.modelValue.filter((item) => item.uid !== file.uid),\n )\n emit('remove', file)\n}\n</script>\n\n<template>\n <ul :class=\"ns.b()\" :aria-label=\"t('chat.attachments')\">\n <li\n v-for=\"file in modelValue\"\n :key=\"file.uid\"\n :class=\"[ns.e('item'), ns.is('thumb', isThumb(file)), file.status ? ns.is(file.status) : '']\"\n >\n <slot name=\"item\" :file=\"file\" :remove=\"() => remove(file)\">\n <button\n type=\"button\"\n :class=\"ns.e('main')\"\n :title=\"file.name\"\n :aria-label=\"isThumb(file) ? file.name : undefined\"\n @click=\"emit('open', file)\"\n >\n <img v-if=\"isThumb(file)\" :class=\"ns.e('image')\" :src=\"file.url\" alt=\"\" />\n <template v-else>\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <component :is=\"icons[attachmentKind(file)]\" />\n </span>\n <span :class=\"ns.e('meta')\">\n <span :class=\"ns.e('name')\">{{ file.name }}</span>\n <span :class=\"ns.e('detail')\">{{ detail(file) }}</span>\n </span>\n </template>\n <span\n v-if=\"file.status === 'running'\"\n :class=\"ns.e('progress')\"\n role=\"progressbar\"\n :aria-label=\"file.name\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuenow=\"Math.round(file.percent ?? 0)\"\n >\n <span :style=\"{ width: `${file.percent ?? 0}%` }\" />\n </span>\n </button>\n <button\n v-if=\"removable\"\n type=\"button\"\n :class=\"ns.e('remove')\"\n :aria-label=\"`${t('chat.remove')} ${file.name}`\"\n @click=\"remove(file)\"\n >\n <CloseIcon />\n </button>\n </slot>\n </li>\n </ul>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-attachments2.js","names":["_sfc_main"],"sources":["../../../src/components/chat-attachments/chat-attachments.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n CloseIcon,\n FileArchiveIcon,\n FileAudioIcon,\n FileCodeIcon,\n FileIcon,\n FileImageIcon,\n FileSpreadsheetIcon,\n FileTextIcon,\n FileVideoIcon,\n} from '@dou-ui/icons'\nimport type { Component } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport { formatFileSize } from '../upload/upload'\nimport { attachmentKind, fileExtension } from './chat-attachments'\nimport type {\n ChatAttachment,\n ChatAttachmentKind,\n ChatAttachmentsEmits,\n ChatAttachmentsProps,\n ChatAttachmentsSlots,\n} from './chat-attachments'\n\ndefineOptions({ name: 'DouChatAttachments' })\n\nconst props = withDefaults(defineProps<ChatAttachmentsProps>(), {\n modelValue: () => [],\n removable: true,\n})\nconst emit = defineEmits<ChatAttachmentsEmits>()\ndefineSlots<ChatAttachmentsSlots>()\n\nconst ns = useNamespace('chat-attachments')\nconst { t } = useLocale()\n\nconst icons: Record<ChatAttachmentKind, Component> = {\n image: FileImageIcon,\n video: FileVideoIcon,\n audio: FileAudioIcon,\n archive: FileArchiveIcon,\n code: FileCodeIcon,\n spreadsheet: FileSpreadsheetIcon,\n text: FileTextIcon,\n file: FileIcon,\n}\n\nconst isThumb = (file: ChatAttachment) => !!file.url && attachmentKind(file) === 'image'\n\nfunction detail(file: ChatAttachment) {\n if (file.status === 'uploading') return `${t('chat.uploading')} ${Math.round(file.percent ?? 0)}%`\n if (file.status === 'error') return t('chat.uploadError')\n return [fileExtension(file.name), file.size === undefined ? '' : formatFileSize(file.size)]\n .filter(Boolean)\n .join(' · ')\n}\n\nfunction remove(file: ChatAttachment) {\n emit(\n 'update:modelValue',\n props.modelValue.filter((item) => item.uid !== file.uid),\n )\n emit('remove', file)\n}\n</script>\n\n<template>\n <ul :class=\"ns.b()\" :aria-label=\"t('chat.attachments')\">\n <li\n v-for=\"file in modelValue\"\n :key=\"file.uid\"\n :class=\"[ns.e('item'), ns.is('thumb', isThumb(file)), file.status ? ns.is(file.status) : '']\"\n >\n <slot name=\"item\" :file=\"file\" :remove=\"() => remove(file)\">\n <button\n type=\"button\"\n :class=\"ns.e('main')\"\n :title=\"file.name\"\n :aria-label=\"isThumb(file) ? file.name : undefined\"\n @click=\"emit('open', file)\"\n >\n <img v-if=\"isThumb(file)\" :class=\"ns.e('image')\" :src=\"file.url\" alt=\"\" />\n <template v-else>\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <component :is=\"icons[attachmentKind(file)]\" />\n </span>\n <span :class=\"ns.e('meta')\">\n <span :class=\"ns.e('name')\">{{ file.name }}</span>\n <span :class=\"ns.e('detail')\">{{ detail(file) }}</span>\n </span>\n </template>\n <span\n v-if=\"file.status === 'uploading'\"\n :class=\"ns.e('progress')\"\n role=\"progressbar\"\n :aria-label=\"file.name\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuenow=\"Math.round(file.percent ?? 0)\"\n >\n <span :style=\"{ width: `${file.percent ?? 0}%` }\" />\n </span>\n </button>\n <button\n v-if=\"removable\"\n type=\"button\"\n :class=\"ns.e('remove')\"\n :aria-label=\"`${t('chat.remove')} ${file.name}`\"\n @click=\"remove(file)\"\n >\n <CloseIcon />\n </button>\n </slot>\n </li>\n </ul>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"chat-attachments2.js","names":["_sfc_main"],"sources":["../../../src/components/chat-attachments/chat-attachments.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n CloseIcon,\n FileArchiveIcon,\n FileAudioIcon,\n FileCodeIcon,\n FileIcon,\n FileImageIcon,\n FileSpreadsheetIcon,\n FileTextIcon,\n FileVideoIcon,\n} from '@dou-ui/icons'\nimport type { Component } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useStatusCheck } from '../../utils/status-check'\nimport { useLocale } from '../config-provider/use-config'\nimport { formatFileSize } from '../upload/upload'\nimport { attachmentKind, fileExtension } from './chat-attachments'\nimport type {\n ChatAttachment,\n ChatAttachmentKind,\n ChatAttachmentsEmits,\n ChatAttachmentsProps,\n ChatAttachmentsSlots,\n} from './chat-attachments'\n\ndefineOptions({ name: 'DouChatAttachments' })\n\nconst props = withDefaults(defineProps<ChatAttachmentsProps>(), {\n modelValue: () => [],\n removable: true,\n})\nconst emit = defineEmits<ChatAttachmentsEmits>()\ndefineSlots<ChatAttachmentsSlots>()\n\nconst ns = useNamespace('chat-attachments')\nconst { t } = useLocale()\n\nconst icons: Record<ChatAttachmentKind, Component> = {\n image: FileImageIcon,\n video: FileVideoIcon,\n audio: FileAudioIcon,\n archive: FileArchiveIcon,\n code: FileCodeIcon,\n spreadsheet: FileSpreadsheetIcon,\n text: FileTextIcon,\n file: FileIcon,\n}\n\nuseStatusCheck(\n 'DouChatAttachments',\n () => (props.modelValue ?? []).map((file) => file.status),\n ['running', 'done', 'error'],\n { uploading: 'running', success: 'done' },\n)\n\nconst isThumb = (file: ChatAttachment) => !!file.url && attachmentKind(file) === 'image'\n\nfunction detail(file: ChatAttachment) {\n if (file.status === 'running') return `${t('chat.uploading')} ${Math.round(file.percent ?? 0)}%`\n if (file.status === 'error') return t('chat.uploadError')\n return [fileExtension(file.name), file.size === undefined ? '' : formatFileSize(file.size)]\n .filter(Boolean)\n .join(' · ')\n}\n\nfunction remove(file: ChatAttachment) {\n emit(\n 'update:modelValue',\n props.modelValue.filter((item) => item.uid !== file.uid),\n )\n emit('remove', file)\n}\n</script>\n\n<template>\n <ul :class=\"ns.b()\" :aria-label=\"t('chat.attachments')\">\n <li\n v-for=\"file in modelValue\"\n :key=\"file.uid\"\n :class=\"[ns.e('item'), ns.is('thumb', isThumb(file)), file.status ? ns.is(file.status) : '']\"\n >\n <slot name=\"item\" :file=\"file\" :remove=\"() => remove(file)\">\n <button\n type=\"button\"\n :class=\"ns.e('main')\"\n :title=\"file.name\"\n :aria-label=\"isThumb(file) ? file.name : undefined\"\n @click=\"emit('open', file)\"\n >\n <img v-if=\"isThumb(file)\" :class=\"ns.e('image')\" :src=\"file.url\" alt=\"\" />\n <template v-else>\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <component :is=\"icons[attachmentKind(file)]\" />\n </span>\n <span :class=\"ns.e('meta')\">\n <span :class=\"ns.e('name')\">{{ file.name }}</span>\n <span :class=\"ns.e('detail')\">{{ detail(file) }}</span>\n </span>\n </template>\n <span\n v-if=\"file.status === 'running'\"\n :class=\"ns.e('progress')\"\n role=\"progressbar\"\n :aria-label=\"file.name\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuenow=\"Math.round(file.percent ?? 0)\"\n >\n <span :style=\"{ width: `${file.percent ?? 0}%` }\" />\n </span>\n </button>\n <button\n v-if=\"removable\"\n type=\"button\"\n :class=\"ns.e('remove')\"\n :aria-label=\"`${t('chat.remove')} ${file.name}`\"\n @click=\"remove(file)\"\n >\n <CloseIcon />\n </button>\n </slot>\n </li>\n </ul>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-confirm.js","names":["_sfc_main"],"sources":["../../../src/components/chat-confirm/chat-confirm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { CheckIcon, CloseIcon, ShieldIcon } from '@dou-ui/icons'\nimport { computed, useId } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { DouButton } from '../button'\nimport { useLocale } from '../config-provider/use-config'\nimport type { ChatConfirmEmits, ChatConfirmProps, ChatConfirmSlots } from './chat-confirm'\n\ndefineOptions({ name: 'DouChatConfirm' })\n\nconst props = withDefaults(defineProps<ChatConfirmProps>(), {\n status: 'pending',\n allowAlways: false,\n tone: 'neutral',\n})\nconst emit = defineEmits<ChatConfirmEmits>()\nconst slots = defineSlots<ChatConfirmSlots>()\n\nconst ns = useNamespace('chat-confirm')\nconst { t } = useLocale()\nconst id = useId()\n\nconst hasTitle = computed(() => !!props.title || !!slots.title)\nconst pending = computed(() => props.status === 'pending')\n</script>\n\n<template>\n <div\n :class=\"[ns.b(), ns.m(tone), ns.is(status)]\"\n role=\"group\"\n :aria-labelledby=\"hasTitle ? `${id}-title` : undefined\"\n >\n <div :class=\"ns.e('header')\">\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <slot name=\"icon\"><ShieldIcon /></slot>\n </span>\n <div :class=\"ns.e('text')\">\n <div v-if=\"hasTitle\" :id=\"`${id}-title`\" :class=\"ns.e('title')\">\n <slot name=\"title\">{{ title }}</slot>\n </div>\n <div v-if=\"description\" :class=\"ns.e('description')\">{{ description }}</div>\n </div>\n <span v-if=\"!pending\" :class=\"ns.e('result')\" role=\"status\">\n <CheckIcon v-if=\"status === 'approved'\" aria-hidden=\"true\" />\n <CloseIcon v-else aria-hidden=\"true\" />\n {{ status === 'approved' ? t('chat.approved') : t('chat.denied') }}\n </span>\n </div>\n <div v-if=\"slots.default\" :class=\"ns.e('detail')\"><slot /></div>\n <div v-if=\"pending\" :class=\"ns.e('actions')\">\n <DouButton size=\"sm\" variant=\"outline\" @click=\"emit('decide', 'deny')\">\n {{ denyText ?? t('chat.deny') }}\n </DouButton>\n <DouButton v-if=\"allowAlways\" size=\"sm\" variant=\"outline\" @click=\"emit('decide', 'always')\">\n {{ t('chat.allowAlways') }}\n </DouButton>\n <DouButton\n size=\"sm\"\n :tone=\"tone === 'danger' ? 'danger' : 'neutral'\"\n @click=\"emit('decide', 'approve')\"\n >\n {{ approveText ?? t('chat.approve') }}\n </DouButton>\n </div>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"chat-confirm.js","names":["_sfc_main"],"sources":["../../../src/components/chat-confirm/chat-confirm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { CheckIcon, CloseIcon, ShieldIcon, UndoIcon } from '@dou-ui/icons'\nimport { computed, nextTick, ref, useId, watch } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useStatusCheck } from '../../utils/status-check'\nimport { DouButton } from '../button'\nimport { useLocale } from '../config-provider/use-config'\nimport type { ChatConfirmEmits, ChatConfirmProps, ChatConfirmSlots } from './chat-confirm'\n\ndefineOptions({ name: 'DouChatConfirm' })\n\nconst props = withDefaults(defineProps<ChatConfirmProps>(), {\n status: 'waiting',\n allowAlways: false,\n tone: 'neutral',\n})\nconst emit = defineEmits<ChatConfirmEmits>()\nconst slots = defineSlots<ChatConfirmSlots>()\n\nconst ns = useNamespace('chat-confirm')\nconst { t } = useLocale()\nconst id = useId()\n\nconst hasTitle = computed(() => !!props.title || !!slots.title)\nconst waiting = computed(() => props.status === 'waiting')\n// How each answered or withdrawn request reads once it has collapsed.\nconst outcomes = {\n approved: { icon: CheckIcon, text: 'chat.approved' },\n denied: { icon: CloseIcon, text: 'chat.denied' },\n withdrawn: { icon: UndoIcon, text: 'chat.withdrawn' },\n} as const\nconst outcome = computed(() =>\n Object.hasOwn(outcomes, props.status)\n ? outcomes[props.status as keyof typeof outcomes]\n : undefined,\n)\n\n// Answering or withdrawing removes the buttons; if focus was on one, keep it\n// on the card instead of losing it to the page. The watcher runs before the\n// DOM updates, while the focused button is still there to find.\nconst root = ref<HTMLElement>()\nwatch(\n () => props.status,\n (now, before) => {\n if (before !== 'waiting' || now === 'waiting') return\n if (!root.value?.contains(document.activeElement)) return\n void nextTick(() => root.value?.focus({ preventScroll: true }))\n },\n)\n\nconst statuses = ['waiting', 'approved', 'denied', 'withdrawn']\nuseStatusCheck('DouChatConfirm', () => [props.status], statuses, { pending: 'waiting' })\n</script>\n\n<template>\n <div\n ref=\"root\"\n :class=\"[ns.b(), ns.m(tone), ns.is(status)]\"\n role=\"group\"\n tabindex=\"-1\"\n :aria-labelledby=\"hasTitle ? `${id}-title` : undefined\"\n >\n <div :class=\"ns.e('header')\">\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <slot name=\"icon\"><ShieldIcon /></slot>\n </span>\n <div :class=\"ns.e('text')\">\n <div v-if=\"hasTitle\" :id=\"`${id}-title`\" :class=\"ns.e('title')\">\n <slot name=\"title\">{{ title }}</slot>\n </div>\n <div v-if=\"description\" :class=\"ns.e('description')\">{{ description }}</div>\n </div>\n <!-- always there, so screen readers announce the outcome when it appears -->\n <span :class=\"ns.e('result')\" role=\"status\">\n <template v-if=\"outcome\">\n <component :is=\"outcome.icon\" aria-hidden=\"true\" />\n {{ t(outcome.text) }}\n </template>\n </span>\n </div>\n <div v-if=\"slots.default\" :class=\"ns.e('detail')\"><slot /></div>\n <div v-if=\"waiting\" :class=\"ns.e('actions')\">\n <DouButton size=\"sm\" variant=\"outline\" @click=\"emit('decide', 'deny')\">\n {{ denyText ?? t('chat.deny') }}\n </DouButton>\n <DouButton v-if=\"allowAlways\" size=\"sm\" variant=\"outline\" @click=\"emit('decide', 'always')\">\n {{ t('chat.allowAlways') }}\n </DouButton>\n <DouButton\n size=\"sm\"\n :tone=\"tone === 'danger' ? 'danger' : 'neutral'\"\n @click=\"emit('decide', 'approve')\"\n >\n {{ approveText ?? t('chat.approve') }}\n </DouButton>\n </div>\n </div>\n</template>\n"],"mappings":""}
@@ -1,8 +1,9 @@
1
1
  import { useNamespace } from "../../utils/namespace.js";
2
2
  import { useLocale } from "../config-provider/use-config.js";
3
+ import { useStatusCheck } from "../../utils/status-check.js";
3
4
  import { DouButton } from "../button/index.js";
4
- import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, renderSlot, toDisplayString, unref, useId, useSlots, withCtx } from "vue";
5
- import { CheckIcon, CloseIcon, ShieldIcon } from "@dou-ui/icons";
5
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, normalizeClass, openBlock, ref, renderSlot, resolveDynamicComponent, toDisplayString, unref, useId, useSlots, watch, withCtx } from "vue";
6
+ import { CheckIcon, CloseIcon, ShieldIcon, UndoIcon } from "@dou-ui/icons";
6
7
  // src/components/chat-confirm/chat-confirm.vue?vue&type=script&setup=true&lang.ts
7
8
  var _hoisted_1 = ["aria-labelledby"];
8
9
  var _hoisted_2 = ["id"];
@@ -12,7 +13,7 @@ var chat_confirm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
12
13
  props: {
13
14
  title: {},
14
15
  description: {},
15
- status: { default: "pending" },
16
+ status: { default: "waiting" },
16
17
  allowAlways: {
17
18
  type: Boolean,
18
19
  default: false
@@ -30,15 +31,45 @@ var chat_confirm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
30
31
  const { t } = useLocale();
31
32
  const id = useId();
32
33
  const hasTitle = computed(() => !!props.title || !!slots.title);
33
- const pending = computed(() => props.status === "pending");
34
+ const waiting = computed(() => props.status === "waiting");
35
+ const outcomes = {
36
+ approved: {
37
+ icon: CheckIcon,
38
+ text: "chat.approved"
39
+ },
40
+ denied: {
41
+ icon: CloseIcon,
42
+ text: "chat.denied"
43
+ },
44
+ withdrawn: {
45
+ icon: UndoIcon,
46
+ text: "chat.withdrawn"
47
+ }
48
+ };
49
+ const outcome = computed(() => Object.hasOwn(outcomes, props.status) ? outcomes[props.status] : void 0);
50
+ const root = ref();
51
+ watch(() => props.status, (now, before) => {
52
+ if (before !== "waiting" || now === "waiting") return;
53
+ if (!root.value?.contains(document.activeElement)) return;
54
+ nextTick(() => root.value?.focus({ preventScroll: true }));
55
+ });
56
+ useStatusCheck("DouChatConfirm", () => [props.status], [
57
+ "waiting",
58
+ "approved",
59
+ "denied",
60
+ "withdrawn"
61
+ ], { pending: "waiting" });
34
62
  return (_ctx, _cache) => {
35
63
  return openBlock(), createElementBlock("div", {
64
+ ref_key: "root",
65
+ ref: root,
36
66
  class: normalizeClass([
37
67
  unref(ns).b(),
38
68
  unref(ns).m(__props.tone),
39
69
  unref(ns).is(__props.status)
40
70
  ]),
41
71
  role: "group",
72
+ tabindex: "-1",
42
73
  "aria-labelledby": hasTitle.value ? `${unref(id)}-title` : void 0
43
74
  }, [
44
75
  createElementVNode("div", { class: normalizeClass(unref(ns).e("header")) }, [
@@ -54,23 +85,16 @@ var chat_confirm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
54
85
  key: 1,
55
86
  class: normalizeClass(unref(ns).e("description"))
56
87
  }, toDisplayString(__props.description), 3)) : createCommentVNode("", true)], 2),
57
- !pending.value ? (openBlock(), createElementBlock("span", {
58
- key: 0,
88
+ createElementVNode("span", {
59
89
  class: normalizeClass(unref(ns).e("result")),
60
90
  role: "status"
61
- }, [__props.status === "approved" ? (openBlock(), createBlock(unref(CheckIcon), {
62
- key: 0,
63
- "aria-hidden": "true"
64
- })) : (openBlock(), createBlock(unref(CloseIcon), {
65
- key: 1,
66
- "aria-hidden": "true"
67
- })), createTextVNode(" " + toDisplayString(__props.status === "approved" ? unref(t)("chat.approved") : unref(t)("chat.denied")), 1)], 2)) : createCommentVNode("", true)
91
+ }, [outcome.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [(openBlock(), createBlock(resolveDynamicComponent(outcome.value.icon), { "aria-hidden": "true" })), createTextVNode(" " + toDisplayString(unref(t)(outcome.value.text)), 1)], 64)) : createCommentVNode("", true)], 2)
68
92
  ], 2),
69
93
  slots.default ? (openBlock(), createElementBlock("div", {
70
94
  key: 0,
71
95
  class: normalizeClass(unref(ns).e("detail"))
72
96
  }, [renderSlot(_ctx.$slots, "default")], 2)) : createCommentVNode("", true),
73
- pending.value ? (openBlock(), createElementBlock("div", {
97
+ waiting.value ? (openBlock(), createElementBlock("div", {
74
98
  key: 1,
75
99
  class: normalizeClass(unref(ns).e("actions"))
76
100
  }, [