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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. package/dist/components/button/button.js.map +1 -1
  2. package/dist/components/button/button.vue_vue_type_script_setup_true_lang.js +2 -1
  3. package/dist/components/button/button.vue_vue_type_script_setup_true_lang.js.map +1 -1
  4. package/dist/components/calendar-view/calendar-view.js.map +1 -1
  5. package/dist/components/calendar-view/calendar-view.vue_vue_type_script_setup_true_lang.js +7 -2
  6. package/dist/components/calendar-view/calendar-view.vue_vue_type_script_setup_true_lang.js.map +1 -1
  7. package/dist/components/card/card.js.map +1 -1
  8. package/dist/components/card/card.vue_vue_type_script_setup_true_lang.js +45 -19
  9. package/dist/components/card/card.vue_vue_type_script_setup_true_lang.js.map +1 -1
  10. package/dist/components/cascader/cascader.js.map +1 -1
  11. package/dist/components/cascader/cascader.vue_vue_type_script_setup_true_lang.js +3 -3
  12. package/dist/components/cascader/cascader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  13. package/dist/components/chat-artifact/chat-artifact.js.map +1 -1
  14. package/dist/components/chat-artifact/chat-artifact.vue_vue_type_script_setup_true_lang.js +8 -2
  15. package/dist/components/chat-artifact/chat-artifact.vue_vue_type_script_setup_true_lang.js.map +1 -1
  16. package/dist/components/chat-attachments/chat-attachments.js.map +1 -1
  17. package/dist/components/chat-attachments/chat-attachments.vue_vue_type_script_setup_true_lang.js +11 -2
  18. package/dist/components/chat-attachments/chat-attachments.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/components/chat-attachments/chat-attachments2.js.map +1 -1
  20. package/dist/components/chat-confirm/chat-confirm.js.map +1 -1
  21. package/dist/components/chat-confirm/chat-confirm.vue_vue_type_script_setup_true_lang.js +40 -17
  22. package/dist/components/chat-confirm/chat-confirm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  23. package/dist/components/chat-context-meter/chat-context-meter.vue_vue_type_script_setup_true_lang.js +2 -2
  24. package/dist/components/chat-context-meter/chat-context-meter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  25. package/dist/components/chat-context-meter/chat-context-meter2.js.map +1 -1
  26. package/dist/components/chat-input/chat-input.js.map +1 -1
  27. package/dist/components/chat-input/chat-input.vue_vue_type_script_setup_true_lang.js +75 -7
  28. package/dist/components/chat-input/chat-input.vue_vue_type_script_setup_true_lang.js.map +1 -1
  29. package/dist/components/chat-input/chat-input2.js.map +1 -1
  30. package/dist/components/chat-list/chat-list.js +9 -4
  31. package/dist/components/chat-list/chat-list.js.map +1 -1
  32. package/dist/components/chat-list/chat-list.vue_vue_type_script_setup_true_lang.js +34 -0
  33. package/dist/components/chat-list/chat-list.vue_vue_type_script_setup_true_lang.js.map +1 -1
  34. package/dist/components/chat-list/chat-list2.js +6 -0
  35. package/dist/components/chat-list/chat-list2.js.map +1 -0
  36. package/dist/components/chat-list/index.js +1 -1
  37. package/dist/components/chat-message/chat-message.js.map +1 -1
  38. package/dist/components/chat-message/chat-message.vue_vue_type_script_setup_true_lang.js +119 -39
  39. package/dist/components/chat-message/chat-message.vue_vue_type_script_setup_true_lang.js.map +1 -1
  40. package/dist/components/chat-message/chat-message2.js.map +1 -1
  41. package/dist/components/chat-message/style.js +6 -0
  42. package/dist/components/chat-plan/chat-plan.js +9 -4
  43. package/dist/components/chat-plan/chat-plan.js.map +1 -1
  44. package/dist/components/chat-plan/chat-plan.vue_vue_type_script_setup_true_lang.js +64 -32
  45. package/dist/components/chat-plan/chat-plan.vue_vue_type_script_setup_true_lang.js.map +1 -1
  46. package/dist/components/chat-plan/chat-plan2.js +6 -0
  47. package/dist/components/chat-plan/chat-plan2.js.map +1 -0
  48. package/dist/components/chat-plan/index.js +1 -1
  49. package/dist/components/chat-plan/style.js +1 -0
  50. package/dist/components/chat-question/chat-question.js +6 -0
  51. package/dist/components/chat-question/chat-question.js.map +1 -0
  52. package/dist/components/chat-question/chat-question.vue_vue_type_script_setup_true_lang.js +116 -0
  53. package/dist/components/chat-question/chat-question.vue_vue_type_script_setup_true_lang.js.map +1 -0
  54. package/dist/components/chat-question/index.js +7 -0
  55. package/dist/components/chat-question/index.js.map +1 -0
  56. package/dist/components/chat-question/style.d.ts +1 -0
  57. package/dist/components/chat-question/style.js +2 -0
  58. package/dist/components/chat-reasoning/chat-reasoning.js.map +1 -1
  59. package/dist/components/chat-reasoning/chat-reasoning.vue_vue_type_script_setup_true_lang.js +4 -4
  60. package/dist/components/chat-reasoning/chat-reasoning.vue_vue_type_script_setup_true_lang.js.map +1 -1
  61. package/dist/components/chat-sources/chat-citation.js.map +1 -1
  62. package/dist/components/chat-sources/chat-citation.vue_vue_type_script_setup_true_lang.js +52 -14
  63. package/dist/components/chat-sources/chat-citation.vue_vue_type_script_setup_true_lang.js.map +1 -1
  64. package/dist/components/chat-sources/chat-sources.js.map +1 -1
  65. package/dist/components/chat-sources/chat-sources.vue_vue_type_script_setup_true_lang.js +6 -4
  66. package/dist/components/chat-sources/chat-sources.vue_vue_type_script_setup_true_lang.js.map +1 -1
  67. package/dist/components/chat-sources/chat-sources2.js.map +1 -1
  68. package/dist/components/chat-sources/index.js +1 -1
  69. package/dist/components/chat-steps/chat-steps.js +9 -4
  70. package/dist/components/chat-steps/chat-steps.js.map +1 -1
  71. package/dist/components/chat-steps/chat-steps.vue_vue_type_script_setup_true_lang.js +20 -13
  72. package/dist/components/chat-steps/chat-steps.vue_vue_type_script_setup_true_lang.js.map +1 -1
  73. package/dist/components/chat-steps/chat-steps2.js +6 -0
  74. package/dist/components/chat-steps/chat-steps2.js.map +1 -0
  75. package/dist/components/chat-steps/index.js +1 -1
  76. package/dist/components/chat-steps/style.js +1 -0
  77. package/dist/components/chat-tool-call/chat-tool-call.js.map +1 -1
  78. package/dist/components/chat-tool-call/chat-tool-call.vue_vue_type_script_setup_true_lang.js +38 -12
  79. package/dist/components/chat-tool-call/chat-tool-call.vue_vue_type_script_setup_true_lang.js.map +1 -1
  80. package/dist/components/chat-tool-call/chat-tool-call2.js.map +1 -1
  81. package/dist/components/chat-tool-call/style.js +1 -0
  82. package/dist/components/code-block/code-block.js.map +1 -1
  83. package/dist/components/code-block/code-block.vue_vue_type_script_setup_true_lang.js +37 -5
  84. package/dist/components/code-block/code-block.vue_vue_type_script_setup_true_lang.js.map +1 -1
  85. package/dist/components/collapse/collapse-item.js.map +1 -1
  86. package/dist/components/collapse/collapse-item.vue_vue_type_script_setup_true_lang.js +2 -2
  87. package/dist/components/collapse/collapse-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  88. package/dist/components/collapse/collapse-transition.js +3 -1
  89. package/dist/components/collapse/collapse-transition.js.map +1 -1
  90. package/dist/components/collapse/index.js +1 -2
  91. package/dist/components/collapse/index.js.map +1 -1
  92. package/dist/components/color-mode/color-mode-button.js.map +1 -1
  93. package/dist/components/color-mode/color-mode-button.vue_vue_type_script_setup_true_lang.js +2 -2
  94. package/dist/components/color-mode/color-mode-button.vue_vue_type_script_setup_true_lang.js.map +1 -1
  95. package/dist/components/color-mode/color-mode-select.js.map +1 -1
  96. package/dist/components/color-mode/color-mode-select.vue_vue_type_script_setup_true_lang.js +2 -2
  97. package/dist/components/color-mode/color-mode-select.vue_vue_type_script_setup_true_lang.js.map +1 -1
  98. package/dist/components/color-mode/color-mode-switch.js.map +1 -1
  99. package/dist/components/color-mode/color-mode-switch.vue_vue_type_script_setup_true_lang.js +2 -2
  100. package/dist/components/color-mode/color-mode-switch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  101. package/dist/components/color-panel/color-panel.js.map +1 -1
  102. package/dist/components/color-panel/color-panel.vue_vue_type_script_setup_true_lang.js +5 -5
  103. package/dist/components/color-panel/color-panel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  104. package/dist/components/color-picker/color-picker.js.map +1 -1
  105. package/dist/components/color-picker/color-picker.vue_vue_type_script_setup_true_lang.js +2 -2
  106. package/dist/components/color-picker/color-picker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  107. package/dist/components/comment-thread/comment-thread.js.map +1 -1
  108. package/dist/components/comment-thread/comment-thread.vue_vue_type_script_setup_true_lang.js +19 -15
  109. package/dist/components/comment-thread/comment-thread.vue_vue_type_script_setup_true_lang.js.map +1 -1
  110. package/dist/components/comment-thread/style.js +2 -0
  111. package/dist/components/config-provider/use-config.js +5 -2
  112. package/dist/components/config-provider/use-config.js.map +1 -1
  113. package/dist/components/context-menu/context-menu.js.map +1 -1
  114. package/dist/components/context-menu/context-menu.vue_vue_type_script_setup_true_lang.js +26 -11
  115. package/dist/components/context-menu/context-menu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  116. package/dist/components/context-menu/index.js +2 -0
  117. package/dist/components/context-menu/index.js.map +1 -1
  118. package/dist/components/copy-button/copy-button.vue_vue_type_script_setup_true_lang.js +1 -1
  119. package/dist/components/descriptions/descriptions.js.map +1 -1
  120. package/dist/components/descriptions/descriptions.vue_vue_type_script_setup_true_lang.js +3 -1
  121. package/dist/components/descriptions/descriptions.vue_vue_type_script_setup_true_lang.js.map +1 -1
  122. package/dist/components/descriptions/descriptions2.js.map +1 -1
  123. package/dist/components/dialog/functional.js +3 -7
  124. package/dist/components/dialog/functional.js.map +1 -1
  125. package/dist/components/dialog/index.js +4 -3
  126. package/dist/components/dialog/index.js.map +1 -1
  127. package/dist/components/dropdown/dropdown-button.js.map +1 -1
  128. package/dist/components/dropdown/dropdown-button.vue_vue_type_script_setup_true_lang.js +5 -5
  129. package/dist/components/dropdown/dropdown-button.vue_vue_type_script_setup_true_lang.js.map +1 -1
  130. package/dist/components/dropdown/dropdown-group.js +6 -0
  131. package/dist/components/dropdown/dropdown-group.js.map +1 -0
  132. package/dist/components/dropdown/dropdown-group.vue_vue_type_script_setup_true_lang.js +42 -0
  133. package/dist/components/dropdown/dropdown-group.vue_vue_type_script_setup_true_lang.js.map +1 -0
  134. package/dist/components/dropdown/dropdown-item.js.map +1 -1
  135. package/dist/components/dropdown/dropdown-item.vue_vue_type_script_setup_true_lang.js +31 -9
  136. package/dist/components/dropdown/dropdown-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  137. package/dist/components/dropdown/dropdown-items.js.map +1 -1
  138. package/dist/components/dropdown/dropdown-items.vue_vue_type_script_setup_true_lang.js +77 -52
  139. package/dist/components/dropdown/dropdown-items.vue_vue_type_script_setup_true_lang.js.map +1 -1
  140. package/dist/components/dropdown/dropdown-radio-group.js.map +1 -1
  141. package/dist/components/dropdown/dropdown-radio-group.vue_vue_type_script_setup_true_lang.js +23 -5
  142. package/dist/components/dropdown/dropdown-radio-group.vue_vue_type_script_setup_true_lang.js.map +1 -1
  143. package/dist/components/dropdown/dropdown-sub.js.map +1 -1
  144. package/dist/components/dropdown/dropdown-sub.vue_vue_type_script_setup_true_lang.js +5 -4
  145. package/dist/components/dropdown/dropdown-sub.vue_vue_type_script_setup_true_lang.js.map +1 -1
  146. package/dist/components/dropdown/dropdown.js.map +1 -1
  147. package/dist/components/dropdown/dropdown.vue_vue_type_script_setup_true_lang.js +2 -1
  148. package/dist/components/dropdown/dropdown.vue_vue_type_script_setup_true_lang.js.map +1 -1
  149. package/dist/components/dropdown/dropdown2.js.map +1 -1
  150. package/dist/components/dropdown/index.js +4 -5
  151. package/dist/components/dropdown/index.js.map +1 -1
  152. package/dist/components/dropdown/item-components.js +11 -0
  153. package/dist/components/dropdown/item-components.js.map +1 -0
  154. package/dist/components/dropdown/menu-entries.js +14 -0
  155. package/dist/components/dropdown/menu-entries.js.map +1 -0
  156. package/dist/components/dropdown/menu-keys.js +1 -1
  157. package/dist/components/dropdown/menu-keys.js.map +1 -1
  158. package/dist/components/ellipsis/ellipsis.js.map +1 -1
  159. package/dist/components/ellipsis/ellipsis.vue_vue_type_script_setup_true_lang.js +2 -2
  160. package/dist/components/ellipsis/ellipsis.vue_vue_type_script_setup_true_lang.js.map +1 -1
  161. package/dist/components/image/image.js.map +1 -1
  162. package/dist/components/image/image.vue_vue_type_script_setup_true_lang.js +10 -1
  163. package/dist/components/image/image.vue_vue_type_script_setup_true_lang.js.map +1 -1
  164. package/dist/components/image-cropper/image-cropper.js.map +1 -1
  165. package/dist/components/image-cropper/image-cropper.vue_vue_type_script_setup_true_lang.js +10 -10
  166. package/dist/components/image-cropper/image-cropper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  167. package/dist/components/infinite-scroll/infinite-scroll.js.map +1 -1
  168. package/dist/components/infinite-scroll/infinite-scroll.vue_vue_type_script_setup_true_lang.js +2 -2
  169. package/dist/components/infinite-scroll/infinite-scroll.vue_vue_type_script_setup_true_lang.js.map +1 -1
  170. package/dist/components/input-date/segment-field.js.map +1 -1
  171. package/dist/components/input-date/segment-field.vue_vue_type_script_setup_true_lang.js +2 -2
  172. package/dist/components/input-date/segment-field.vue_vue_type_script_setup_true_lang.js.map +1 -1
  173. package/dist/components/input-date/style.js +1 -0
  174. package/dist/components/input-time/style.js +1 -0
  175. package/dist/components/layout/layout-aside-trigger.js.map +1 -1
  176. package/dist/components/layout/layout-aside-trigger.vue_vue_type_script_setup_true_lang.js +2 -2
  177. package/dist/components/layout/layout-aside-trigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  178. package/dist/components/layout/layout-aside.js.map +1 -1
  179. package/dist/components/layout/layout-aside.vue_vue_type_script_setup_true_lang.js +3 -3
  180. package/dist/components/layout/layout-aside.vue_vue_type_script_setup_true_lang.js.map +1 -1
  181. package/dist/components/layout/layout-footer.js.map +1 -1
  182. package/dist/components/layout/layout-footer.vue_vue_type_script_setup_true_lang.js +5 -1
  183. package/dist/components/layout/layout-footer.vue_vue_type_script_setup_true_lang.js.map +1 -1
  184. package/dist/components/layout/layout.js.map +1 -1
  185. package/dist/components/link/link.js.map +1 -1
  186. package/dist/components/link/link.vue_vue_type_script_setup_true_lang.js +116 -31
  187. package/dist/components/link/link.vue_vue_type_script_setup_true_lang.js.map +1 -1
  188. package/dist/components/markdown/index.js +9 -0
  189. package/dist/components/markdown/index.js.map +1 -0
  190. package/dist/components/markdown/markdown.js +6 -0
  191. package/dist/components/markdown/markdown.js.map +1 -0
  192. package/dist/components/markdown/markdown.vue_vue_type_script_setup_true_lang.js +225 -0
  193. package/dist/components/markdown/markdown.vue_vue_type_script_setup_true_lang.js.map +1 -0
  194. package/dist/components/markdown/parse-block.js +577 -0
  195. package/dist/components/markdown/parse-block.js.map +1 -0
  196. package/dist/components/markdown/parse-inline.js +626 -0
  197. package/dist/components/markdown/parse-inline.js.map +1 -0
  198. package/dist/components/markdown/parser.js +308 -0
  199. package/dist/components/markdown/parser.js.map +1 -0
  200. package/dist/components/markdown/render.js +424 -0
  201. package/dist/components/markdown/render.js.map +1 -0
  202. package/dist/components/markdown/style.d.ts +1 -0
  203. package/dist/components/markdown/style.js +10 -0
  204. package/dist/components/markdown/url.js +16 -0
  205. package/dist/components/markdown/url.js.map +1 -0
  206. package/dist/components/menu/menu-actions.js +65 -0
  207. package/dist/components/menu/menu-actions.js.map +1 -0
  208. package/dist/components/menu/menu-item.js.map +1 -1
  209. package/dist/components/menu/menu-item.vue_vue_type_script_setup_true_lang.js +52 -13
  210. package/dist/components/menu/menu-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  211. package/dist/components/menu/menu-list.js.map +1 -1
  212. package/dist/components/menu/menu-list.vue_vue_type_script_setup_true_lang.js +33 -18
  213. package/dist/components/menu/menu-list.vue_vue_type_script_setup_true_lang.js.map +1 -1
  214. package/dist/components/menu/menu-popup.js.map +1 -1
  215. package/dist/components/menu/menu-popup.vue_vue_type_script_setup_true_lang.js +60 -19
  216. package/dist/components/menu/menu-popup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  217. package/dist/components/menu/menu.js +17 -13
  218. package/dist/components/menu/menu.js.map +1 -1
  219. package/dist/components/menu/menu.vue_vue_type_script_setup_true_lang.js +9 -2
  220. package/dist/components/menu/menu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  221. package/dist/components/menu/menu2.js.map +1 -1
  222. package/dist/components/menubar/menubar.js.map +1 -1
  223. package/dist/components/node-graph/layout.js +251 -38
  224. package/dist/components/node-graph/layout.js.map +1 -1
  225. package/dist/components/node-graph/node-graph-legend.js.map +1 -1
  226. package/dist/components/node-graph/node-graph-legend.vue_vue_type_script_setup_true_lang.js +5 -5
  227. package/dist/components/node-graph/node-graph-legend.vue_vue_type_script_setup_true_lang.js.map +1 -1
  228. package/dist/components/node-graph/node-graph.js.map +1 -1
  229. package/dist/components/node-graph/node-graph.vue_vue_type_script_setup_true_lang.js +3 -3
  230. package/dist/components/node-graph/node-graph.vue_vue_type_script_setup_true_lang.js.map +1 -1
  231. package/dist/components/pagination/pagination-gap.js.map +1 -1
  232. package/dist/components/pagination/pagination-gap.vue_vue_type_script_setup_true_lang.js +2 -2
  233. package/dist/components/pagination/pagination-gap.vue_vue_type_script_setup_true_lang.js.map +1 -1
  234. package/dist/components/pagination/pagination.js.map +1 -1
  235. package/dist/components/pagination/pagination.vue_vue_type_script_setup_true_lang.js +7 -7
  236. package/dist/components/pagination/pagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  237. package/dist/components/popconfirm/index.js +2 -0
  238. package/dist/components/popconfirm/index.js.map +1 -1
  239. package/dist/components/popconfirm/popconfirm.js.map +1 -1
  240. package/dist/components/popconfirm/popconfirm.vue_vue_type_script_setup_true_lang.js +6 -2
  241. package/dist/components/popconfirm/popconfirm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  242. package/dist/components/popover/index.js +2 -0
  243. package/dist/components/popover/index.js.map +1 -1
  244. package/dist/components/popover/popover.js.map +1 -1
  245. package/dist/components/popover/popover.vue_vue_type_script_setup_true_lang.js +12 -5
  246. package/dist/components/popover/popover.vue_vue_type_script_setup_true_lang.js.map +1 -1
  247. package/dist/components/progress-group/progress-group.js.map +1 -1
  248. package/dist/components/progress-group/progress-group.vue_vue_type_script_setup_true_lang.js +11 -4
  249. package/dist/components/progress-group/progress-group.vue_vue_type_script_setup_true_lang.js.map +1 -1
  250. package/dist/components/qrcode/qrcode.js.map +1 -1
  251. package/dist/components/qrcode/qrcode.vue_vue_type_script_setup_true_lang.js +10 -2
  252. package/dist/components/qrcode/qrcode.vue_vue_type_script_setup_true_lang.js.map +1 -1
  253. package/dist/components/select/select.js.map +1 -1
  254. package/dist/components/select/select.vue_vue_type_script_setup_true_lang.js +2 -2
  255. package/dist/components/select/select.vue_vue_type_script_setup_true_lang.js.map +1 -1
  256. package/dist/components/slider/slider.js.map +1 -1
  257. package/dist/components/slider/slider.vue_vue_type_script_setup_true_lang.js +2 -2
  258. package/dist/components/slider/slider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  259. package/dist/components/status-dot/index.js +7 -0
  260. package/dist/components/status-dot/index.js.map +1 -0
  261. package/dist/components/status-dot/status-dot.js +26 -0
  262. package/dist/components/status-dot/status-dot.js.map +1 -0
  263. package/dist/components/status-dot/status-dot.vue_vue_type_script_lang.js +43 -0
  264. package/dist/components/status-dot/status-dot.vue_vue_type_script_lang.js.map +1 -0
  265. package/dist/components/status-dot/status-dot2.js +6 -0
  266. package/dist/components/status-dot/status-dot2.js.map +1 -0
  267. package/dist/components/status-dot/style.d.ts +1 -0
  268. package/dist/components/status-dot/style.js +2 -0
  269. package/dist/components/steps/steps.js.map +1 -1
  270. package/dist/components/steps/steps.vue_vue_type_script_setup_true_lang.js +6 -6
  271. package/dist/components/steps/steps.vue_vue_type_script_setup_true_lang.js.map +1 -1
  272. package/dist/components/table/table.js.map +1 -1
  273. package/dist/components/table/table.vue_vue_type_script_setup_true_lang.js +19 -14
  274. package/dist/components/table/table.vue_vue_type_script_setup_true_lang.js.map +1 -1
  275. package/dist/components/tabs/tab-panel.vue_vue_type_script_setup_true_lang.js +1 -0
  276. package/dist/components/tabs/tab-panel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  277. package/dist/components/tabs/tabs.js.map +1 -1
  278. package/dist/components/tabs/tabs.vue_vue_type_script_setup_true_lang.js +117 -47
  279. package/dist/components/tabs/tabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  280. package/dist/components/tabs/tabs2.js.map +1 -1
  281. package/dist/components/tag/tag.js.map +1 -1
  282. package/dist/components/tag/tag.vue_vue_type_script_setup_true_lang.js +21 -4
  283. package/dist/components/tag/tag.vue_vue_type_script_setup_true_lang.js.map +1 -1
  284. package/dist/components/timeline/style.js +1 -0
  285. package/dist/components/timeline/timeline-item.js.map +1 -1
  286. package/dist/components/timeline/timeline-item.vue_vue_type_script_setup_true_lang.js +6 -2
  287. package/dist/components/timeline/timeline-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  288. package/dist/components/toast/index.js +5 -4
  289. package/dist/components/toast/index.js.map +1 -1
  290. package/dist/components/toast/store.js +1 -9
  291. package/dist/components/toast/store.js.map +1 -1
  292. package/dist/components/tooltip/index.js +2 -0
  293. package/dist/components/tooltip/index.js.map +1 -1
  294. package/dist/components/tooltip/tooltip.js.map +1 -1
  295. package/dist/components/tooltip/tooltip.vue_vue_type_script_setup_true_lang.js +55 -8
  296. package/dist/components/tooltip/tooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  297. package/dist/components/tour/tour.js.map +1 -1
  298. package/dist/components/tour/tour.vue_vue_type_script_setup_true_lang.js +3 -3
  299. package/dist/components/tour/tour.vue_vue_type_script_setup_true_lang.js.map +1 -1
  300. package/dist/components/transfer/transfer-list.vue_vue_type_script_setup_true_lang.js +1 -1
  301. package/dist/components/tree/tree.vue_vue_type_script_setup_true_lang.js +1 -1
  302. package/dist/components/tree-select/tree-select.js.map +1 -1
  303. package/dist/components/tree-select/tree-select.vue_vue_type_script_setup_true_lang.js +3 -3
  304. package/dist/components/tree-select/tree-select.vue_vue_type_script_setup_true_lang.js.map +1 -1
  305. package/dist/components/upload/upload.vue_vue_type_script_setup_true_lang.js +2 -2
  306. package/dist/components/upload/upload.vue_vue_type_script_setup_true_lang.js.map +1 -1
  307. package/dist/components/upload/upload2.js.map +1 -1
  308. package/dist/components/user/user.js.map +1 -1
  309. package/dist/components/user/user.vue_vue_type_script_setup_true_lang.js +2 -2
  310. package/dist/components/user/user.vue_vue_type_script_setup_true_lang.js.map +1 -1
  311. package/dist/components/virtual-list/virtual-list.js +7 -1
  312. package/dist/components/virtual-list/virtual-list.js.map +1 -1
  313. package/dist/components/virtual-list/virtual-list.vue_vue_type_script_setup_true_lang.js +2 -7
  314. package/dist/components/virtual-list/virtual-list.vue_vue_type_script_setup_true_lang.js.map +1 -1
  315. package/dist/components/virtual-list/virtual-list2.js.map +1 -1
  316. package/dist/composables/use-popup.js +30 -5
  317. package/dist/composables/use-popup.js.map +1 -1
  318. package/dist/index.js +26 -19
  319. package/dist/index.js.map +1 -1
  320. package/dist/locale/en.js +14 -8
  321. package/dist/locale/en.js.map +1 -1
  322. package/dist/locale/zh-cn.js +14 -8
  323. package/dist/locale/zh-cn.js.map +1 -1
  324. package/dist/locale/zh-tw.js +14 -8
  325. package/dist/locale/zh-tw.js.map +1 -1
  326. package/dist/plugin.js +25 -14
  327. package/dist/plugin.js.map +1 -1
  328. package/dist/style.css +1 -1
  329. package/dist/types/components/button/button.d.ts +5 -1
  330. package/dist/types/components/calendar-view/calendar-view.d.ts +6 -0
  331. package/dist/types/components/calendar-view/calendar-view.vue.d.ts +1 -0
  332. package/dist/types/components/calendar-view/index.d.ts +3 -0
  333. package/dist/types/components/card/card.d.ts +6 -1
  334. package/dist/types/components/chat-artifact/chat-artifact.d.ts +2 -1
  335. package/dist/types/components/chat-attachments/chat-attachments.d.ts +2 -2
  336. package/dist/types/components/chat-confirm/chat-confirm.d.ts +7 -2
  337. package/dist/types/components/chat-input/chat-input.d.ts +33 -3
  338. package/dist/types/components/chat-input/chat-input.vue.d.ts +7 -0
  339. package/dist/types/components/chat-input/index.d.ts +20 -0
  340. package/dist/types/components/chat-list/chat-list.d.ts +19 -1
  341. package/dist/types/components/chat-list/index.d.ts +3 -3
  342. package/dist/types/components/chat-message/chat-message.d.ts +58 -5
  343. package/dist/types/components/chat-message/chat-message.vue.d.ts +7 -3
  344. package/dist/types/components/chat-message/index.d.ts +15 -4
  345. package/dist/types/components/chat-plan/chat-plan.d.ts +19 -2
  346. package/dist/types/components/chat-plan/chat-plan.vue.d.ts +2 -0
  347. package/dist/types/components/chat-plan/index.d.ts +6 -0
  348. package/dist/types/components/chat-question/chat-question.d.ts +43 -0
  349. package/dist/types/components/chat-question/chat-question.vue.d.ts +18 -0
  350. package/dist/types/components/chat-question/index.d.ts +43 -0
  351. package/dist/types/components/chat-sources/chat-sources.d.ts +6 -1
  352. package/dist/types/components/chat-steps/chat-steps.d.ts +10 -4
  353. package/dist/types/components/chat-steps/chat-steps.vue.d.ts +1 -1
  354. package/dist/types/components/chat-steps/index.d.ts +3 -3
  355. package/dist/types/components/chat-tool-call/chat-tool-call.d.ts +12 -3
  356. package/dist/types/components/chat-tool-call/chat-tool-call.vue.d.ts +1 -0
  357. package/dist/types/components/chat-tool-call/index.d.ts +3 -0
  358. package/dist/types/components/checkbox/index.d.ts +5 -5
  359. package/dist/types/components/code-block/code-block.d.ts +11 -0
  360. package/dist/types/components/code-block/code-block.vue.d.ts +3 -1
  361. package/dist/types/components/code-block/index.d.ts +9 -3
  362. package/dist/types/components/collapse/collapse-transition.d.ts +2 -7
  363. package/dist/types/components/collapse/collapse.vue.d.ts +1 -1
  364. package/dist/types/components/collapse/index.d.ts +5 -6
  365. package/dist/types/components/comment-thread/comment-thread.d.ts +6 -0
  366. package/dist/types/components/comment-thread/comment-thread.vue.d.ts +1 -0
  367. package/dist/types/components/comment-thread/index.d.ts +3 -0
  368. package/dist/types/components/context-menu/context-menu.d.ts +37 -4
  369. package/dist/types/components/context-menu/context-menu.vue.d.ts +2 -0
  370. package/dist/types/components/context-menu/index.d.ts +5 -0
  371. package/dist/types/components/copy-button/copy-button.vue.d.ts +1 -1
  372. package/dist/types/components/copy-button/index.d.ts +1 -1
  373. package/dist/types/components/descriptions/descriptions.d.ts +9 -1
  374. package/dist/types/components/descriptions/descriptions.vue.d.ts +1 -0
  375. package/dist/types/components/descriptions/index.d.ts +3 -0
  376. package/dist/types/components/dialog/functional.d.ts +0 -3
  377. package/dist/types/components/dialog/index.d.ts +1 -1
  378. package/dist/types/components/dropdown/dropdown-group.vue.d.ts +13 -0
  379. package/dist/types/components/dropdown/dropdown-items.vue.d.ts +2 -2
  380. package/dist/types/components/dropdown/dropdown-radio-group.vue.d.ts +8 -4
  381. package/dist/types/components/dropdown/dropdown.d.ts +28 -6
  382. package/dist/types/components/dropdown/dropdown.vue.d.ts +1 -1
  383. package/dist/types/components/dropdown/index.d.ts +10 -81
  384. package/dist/types/components/dropdown/item-components.d.ts +103 -0
  385. package/dist/types/components/dropdown/menu-entries.d.ts +4 -0
  386. package/dist/types/components/image/image.d.ts +9 -0
  387. package/dist/types/components/index.d.ts +3 -0
  388. package/dist/types/components/layout/index.d.ts +12 -6
  389. package/dist/types/components/layout/layout-aside.vue.d.ts +1 -1
  390. package/dist/types/components/layout/layout-footer.vue.d.ts +4 -2
  391. package/dist/types/components/layout/layout.d.ts +4 -0
  392. package/dist/types/components/link/index.d.ts +3 -0
  393. package/dist/types/components/link/link.d.ts +24 -3
  394. package/dist/types/components/link/link.vue.d.ts +1 -0
  395. package/dist/types/components/markdown/index.d.ts +58 -0
  396. package/dist/types/components/markdown/markdown.d.ts +251 -0
  397. package/dist/types/components/markdown/markdown.vue.d.ts +22 -0
  398. package/dist/types/components/markdown/parse-block.d.ts +61 -0
  399. package/dist/types/components/markdown/parse-inline.d.ts +19 -0
  400. package/dist/types/components/markdown/parser.d.ts +22 -0
  401. package/dist/types/components/markdown/render.d.ts +84 -0
  402. package/dist/types/components/markdown/url.d.ts +10 -0
  403. package/dist/types/components/masonry/index.d.ts +3 -3
  404. package/dist/types/components/menu/index.d.ts +11 -3
  405. package/dist/types/components/menu/menu-actions.d.ts +26 -0
  406. package/dist/types/components/menu/menu-item.vue.d.ts +6 -0
  407. package/dist/types/components/menu/menu.d.ts +48 -5
  408. package/dist/types/components/menu/menu.vue.d.ts +4 -1
  409. package/dist/types/components/menubar/menubar.d.ts +1 -1
  410. package/dist/types/components/node-graph/layout.d.ts +42 -0
  411. package/dist/types/components/node-graph/node-graph.d.ts +1 -1
  412. package/dist/types/components/popover/index.d.ts +3 -3
  413. package/dist/types/components/popover/popover.vue.d.ts +1 -1
  414. package/dist/types/components/progress-group/index.d.ts +3 -0
  415. package/dist/types/components/progress-group/progress-group.d.ts +7 -0
  416. package/dist/types/components/progress-group/progress-group.vue.d.ts +1 -0
  417. package/dist/types/components/qrcode/index.d.ts +3 -0
  418. package/dist/types/components/qrcode/qrcode.d.ts +5 -0
  419. package/dist/types/components/qrcode/qrcode.vue.d.ts +1 -0
  420. package/dist/types/components/select/index.d.ts +3 -3
  421. package/dist/types/components/select/select.vue.d.ts +1 -1
  422. package/dist/types/components/sortable/index.d.ts +3 -3
  423. package/dist/types/components/status-dot/index.d.ts +51 -0
  424. package/dist/types/components/status-dot/status-dot.d.ts +46 -0
  425. package/dist/types/components/status-dot/status-dot.vue.d.ts +46 -0
  426. package/dist/types/components/steps/steps.d.ts +1 -1
  427. package/dist/types/components/switch/index.d.ts +3 -3
  428. package/dist/types/components/table/index.d.ts +4 -3
  429. package/dist/types/components/table/table.d.ts +6 -1
  430. package/dist/types/components/tabs/index.d.ts +3 -0
  431. package/dist/types/components/tabs/tabs.d.ts +16 -3
  432. package/dist/types/components/tabs/tabs.vue.d.ts +1 -0
  433. package/dist/types/components/timeline/index.d.ts +3 -3
  434. package/dist/types/components/timeline/timeline-item.vue.d.ts +1 -1
  435. package/dist/types/components/toast/index.d.ts +0 -2
  436. package/dist/types/components/toast/store.d.ts +0 -4
  437. package/dist/types/components/virtual-list/index.d.ts +3 -3
  438. package/dist/types/components/virtual-list/virtual-list.d.ts +2 -0
  439. package/dist/types/composables/use-popup.d.ts +15 -5
  440. package/dist/types/index.d.ts +1 -0
  441. package/dist/types/locale/types.d.ts +20 -7
  442. package/dist/types/utils/app-context.d.ts +14 -0
  443. package/dist/types/utils/only-child.d.ts +3 -1
  444. package/dist/types/utils/pointer.d.ts +5 -0
  445. package/dist/types/utils/safe-url.d.ts +14 -0
  446. package/dist/types/utils/status-check.d.ts +8 -0
  447. package/dist/utils/app-context.js +22 -0
  448. package/dist/utils/app-context.js.map +1 -0
  449. package/dist/utils/install.js +5 -0
  450. package/dist/utils/install.js.map +1 -1
  451. package/dist/utils/only-child.js +56 -5
  452. package/dist/utils/only-child.js.map +1 -1
  453. package/dist/utils/pointer.js +6 -1
  454. package/dist/utils/pointer.js.map +1 -1
  455. package/dist/utils/safe-url.js +57 -0
  456. package/dist/utils/safe-url.js.map +1 -0
  457. package/dist/utils/status-check.js +27 -0
  458. package/dist/utils/status-check.js.map +1 -0
  459. package/package.json +3 -3
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Returns `url` when it is safe to use as a link (`href`), otherwise `undefined`.
3
+ * http(s), mailto, tel, relative addresses and anchors pass; anything else,
4
+ * such as `javascript:` or `data:`, is dropped. Only for links: it also drops
5
+ * `data:` and `blob:`, which are fine in an image `src`.
6
+ */
7
+ export declare function safeUrl(url: string | undefined): string | undefined;
8
+ /** Whether a link should open in a new tab: not for `mailto:` and `tel:`, which hand off to an app. */
9
+ export declare function opensNewTab(url: string): boolean;
10
+ /**
11
+ * {@link safeUrl}, warning once while developing when an address is dropped.
12
+ * `component` names the component in the warning, e.g. `DouChatSources`.
13
+ */
14
+ export declare function checkedUrl(component: string, url: string | undefined): string | undefined;
@@ -0,0 +1,8 @@
1
+ /** Warn once per page with this message. Call only while developing. */
2
+ export declare function devWarn(message: string): void;
3
+ /**
4
+ * While developing, warn once about a `status` the component doesn't know,
5
+ * e.g. an old name in JSON from a server, where types can't catch it.
6
+ * `renamed` maps old names to the new ones to suggest.
7
+ */
8
+ export declare function useStatusCheck(component: string, statuses: () => readonly (string | undefined)[], known: readonly string[], renamed?: Record<string, string>): void;
@@ -0,0 +1,22 @@
1
+ // src/utils/app-context.ts
2
+ var installed = null;
3
+ /**
4
+ * Remembers the app whose locale and config what is rendered outside any
5
+ * component should take. `app.use(DouUI)`, installing `DouDialog` or
6
+ * `DouToastViewport`, and `provideGlobalConfig(config, app)` call it; the
7
+ * last one wins. Call it yourself to pick one of several apps.
8
+ */
9
+ function setInstalledAppContext(appContext) {
10
+ installed = appContext;
11
+ }
12
+ /**
13
+ * The context of the app DouUI was set up in (see `setInstalledAppContext`),
14
+ * for things rendered outside any component, e.g. by `dialog()`, `toast()`
15
+ * or `renderFlowSVG`, to take its locale and config; `null` before.
16
+ */
17
+ function installedAppContext() {
18
+ return installed;
19
+ }
20
+ export { installedAppContext, setInstalledAppContext };
21
+
22
+ //# sourceMappingURL=app-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-context.js","names":[],"sources":["../../src/utils/app-context.ts"],"sourcesContent":["import type { AppContext } from 'vue'\n\nlet installed: AppContext | null = null\n\n/**\n * Remembers the app whose locale and config what is rendered outside any\n * component should take. `app.use(DouUI)`, installing `DouDialog` or\n * `DouToastViewport`, and `provideGlobalConfig(config, app)` call it; the\n * last one wins. Call it yourself to pick one of several apps.\n */\nexport function setInstalledAppContext(appContext: AppContext | null) {\n installed = appContext\n}\n\n/**\n * The context of the app DouUI was set up in (see `setInstalledAppContext`),\n * for things rendered outside any component, e.g. by `dialog()`, `toast()`\n * or `renderFlowSVG`, to take its locale and config; `null` before.\n */\nexport function installedAppContext() {\n return installed\n}\n"],"mappings":";AAEA,IAAI,YAA+B;;;;;;;AAQnC,SAAgB,uBAAuB,YAA+B;CACpE,YAAY;AACd;;;;;;AAOA,SAAgB,sBAAsB;CACpC,OAAO;AACT"}
@@ -17,6 +17,11 @@ function withInstall(component) {
17
17
  * given. Each prop's default becomes a factory that looks up the
18
18
  * configured value first; Vue runs default factories inside the
19
19
  * component, so `inject` sees the nearest provider.
20
+ *
21
+ * 这一步发生在包装组件的模块里,按需引入时打包器只留下用到的模块。所以组件内部渲染
22
+ * 别的组件时,要引入包装过的那个(`import { DouSpinner } from '../spinner'`),
23
+ * 不要直接引入 `.vue`,否则单独用外层组件时里面那个读不到默认值。
24
+ * `utils/__tests__/nested-defaults.test.ts` 检查整个仓库都这样做。
20
25
  */
21
26
  function readConfiguredDefaults(component) {
22
27
  const { name, props } = component;
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","names":[],"sources":["../../src/utils/install.ts"],"sourcesContent":["import { hasInjectionContext, inject } from 'vue'\nimport type { App, ButtonHTMLAttributes, Component, HTMLAttributes, Plugin } from 'vue'\nimport { configProviderKey } from '../components/config-provider/config-provider'\n\ntype InstanceProps<I> = I extends { $props: infer P } ? P : {}\n\n/** 类型标记:记下组件原本的类型,`ComponentDefaults` 从这里取 props。只存在于类型里。 */\nexport declare const ownComponent: unique symbol\n\n/**\n * 组件在模板里可以写的属性:自己的 props 之外,再加上它转交给元素的原生属性和事件 `A`。\n * 与 props、事件同名的项以组件自己的为准。\n *\n * 只影响类型(例如开启 checkUnknownProps 时 `<DouInput placeholder=\"…\">` 不报错)。\n * 给模板看的构造签名放在前面,所以 `InstanceType` 的 `$props` 也带着这些属性;\n * 要只看组件自己的 props,用各组件导出的 `XxxInstance`,`ComponentDefaults` 则经由 `ownComponent` 取原本的类型。\n */\nexport type WithAttributes<T, A> = T extends abstract new (...args: any) => infer I\n ? { new (...args: any[]): I & { $props: Omit<A, keyof InstanceProps<I>> } } & T & {\n readonly [ownComponent]?: T\n }\n : T\n\n/**\n * 渲染成按钮的组件转交的属性。不含 `type`:组件自己定好了按钮的类型(DouButton 用 `nativeType`),\n * 原生 `type` 会覆盖它,写成 `submit` 还会提交表单。\n */\nexport type ButtonAttributes = Omit<ButtonHTMLAttributes, 'type'>\n\n/**\n * 泛型组件的类型不能在导出时改写,改在 `defineProps` 里用交叉类型并上它,\n * 并在它前面加 `@vue-ignore` 注释让编译器跳过:这些属性在运行时仍是透传属性。\n * `Own` 是组件自己的 props,`Events` 是它自己的事件名,与它们同名的原生属性和事件以组件的为准。\n */\nexport type ForwardedAttributes<A, Own, Events extends string = never> = Omit<\n A,\n keyof Own | `on${Capitalize<Events>}`\n>\n\n/**\n * `A` 是组件转交的原生属性,默认是通用的 HTML 属性;\n * 把属性交给 `<input>` 的组件写 `InputHTMLAttributes`,不渲染元素的组件写 `{}`。\n */\nexport type WithInstall<T, A = HTMLAttributes> = WithAttributes<T, A> & Plugin\n\n/** Attach an `install` method so a component can be used with `app.use()`. */\nexport function withInstall<T extends Component, A = HTMLAttributes>(\n component: T,\n): WithInstall<T, A> {\n const target = component as unknown as WithInstall<T, A>\n target.install = (app: App) => {\n const { name } = component as { name?: string }\n if (!name) throw new Error('[dou-ui] component registered with app.use() must have a name')\n app.component(name, component)\n }\n readConfiguredDefaults(component)\n return target\n}\n\ntype PropOption = {\n type?: unknown\n default?: unknown\n skipFactory?: boolean\n}\n\n/**\n * Let `ConfigProvider`'s `defaults` fill in props the component wasn't\n * given. Each prop's default becomes a factory that looks up the\n * configured value first; Vue runs default factories inside the\n * component, so `inject` sees the nearest provider.\n */\nfunction readConfiguredDefaults(component: Component) {\n const { name, props } = component as { name?: string; props?: Record<string, PropOption | null> }\n if (!name || !props || Array.isArray(props)) return\n for (const [key, option] of Object.entries(props)) {\n const own: PropOption = option && typeof option === 'object' ? option : {}\n // a function-typed prop takes its default as the value itself, never as a factory\n if (own.type === Function || own.skipFactory) continue\n const hasDefault = 'default' in own\n const fallback = own.default\n const types = Array.isArray(own.type) ? own.type : [own.type]\n props[key] = {\n ...own,\n default(raw: Record<string, unknown>) {\n const config = hasInjectionContext() ? inject(configProviderKey, undefined) : undefined\n const configured = (config?.value.defaults as Record<string, Record<string, unknown>>)?.[\n name\n ]?.[key]\n if (configured !== undefined) return configured\n if (!hasDefault) return types.includes(Boolean) ? false : undefined\n return typeof fallback === 'function' ? fallback(raw) : fallback\n },\n }\n }\n}\n"],"mappings":";;;;AA8CA,SAAgB,YACd,WACmB;CACnB,MAAM,SAAS;CACf,OAAO,WAAW,QAAa;EAC7B,MAAM,EAAE,SAAS;EACjB,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,+DAA+D;EAC1F,IAAI,UAAU,MAAM,SAAS;CAC/B;CACA,uBAAuB,SAAS;CAChC,OAAO;AACT;;;;;;;AAcA,SAAS,uBAAuB,WAAsB;CACpD,MAAM,EAAE,MAAM,UAAU;CACxB,IAAI,CAAC,QAAQ,CAAC,SAAS,MAAM,QAAQ,KAAK,GAAG;CAC7C,KAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,KAAK,GAAG;EACjD,MAAM,MAAkB,UAAU,OAAO,WAAW,WAAW,SAAS,CAAC;EAEzE,IAAI,IAAI,SAAS,YAAY,IAAI,aAAa;EAC9C,MAAM,aAAa,aAAa;EAChC,MAAM,WAAW,IAAI;EACrB,MAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI;EAC5D,MAAM,OAAO;GACX,GAAG;GACH,QAAQ,KAA8B;IAEpC,MAAM,eADS,oBAAoB,IAAI,OAAO,mBAAmB,KAAA,CAAS,IAAI,KAAA,EAAA,EAClD,MAAM,SAAA,GAChC,KACD,GAAG;IACJ,IAAI,eAAe,KAAA,GAAW,OAAO;IACrC,IAAI,CAAC,YAAY,OAAO,MAAM,SAAS,OAAO,IAAI,QAAQ,KAAA;IAC1D,OAAO,OAAO,aAAa,aAAa,SAAS,GAAG,IAAI;GAC1D;EACF;CACF;AACF"}
1
+ {"version":3,"file":"install.js","names":[],"sources":["../../src/utils/install.ts"],"sourcesContent":["import { hasInjectionContext, inject } from 'vue'\nimport type { App, ButtonHTMLAttributes, Component, HTMLAttributes, Plugin } from 'vue'\nimport { configProviderKey } from '../components/config-provider/config-provider'\n\ntype InstanceProps<I> = I extends { $props: infer P } ? P : {}\n\n/** 类型标记:记下组件原本的类型,`ComponentDefaults` 从这里取 props。只存在于类型里。 */\nexport declare const ownComponent: unique symbol\n\n/**\n * 组件在模板里可以写的属性:自己的 props 之外,再加上它转交给元素的原生属性和事件 `A`。\n * 与 props、事件同名的项以组件自己的为准。\n *\n * 只影响类型(例如开启 checkUnknownProps 时 `<DouInput placeholder=\"…\">` 不报错)。\n * 给模板看的构造签名放在前面,所以 `InstanceType` 的 `$props` 也带着这些属性;\n * 要只看组件自己的 props,用各组件导出的 `XxxInstance`,`ComponentDefaults` 则经由 `ownComponent` 取原本的类型。\n */\nexport type WithAttributes<T, A> = T extends abstract new (...args: any) => infer I\n ? { new (...args: any[]): I & { $props: Omit<A, keyof InstanceProps<I>> } } & T & {\n readonly [ownComponent]?: T\n }\n : T\n\n/**\n * 渲染成按钮的组件转交的属性。不含 `type`:组件自己定好了按钮的类型(DouButton 用 `nativeType`),\n * 原生 `type` 会覆盖它,写成 `submit` 还会提交表单。\n */\nexport type ButtonAttributes = Omit<ButtonHTMLAttributes, 'type'>\n\n/**\n * 泛型组件的类型不能在导出时改写,改在 `defineProps` 里用交叉类型并上它,\n * 并在它前面加 `@vue-ignore` 注释让编译器跳过:这些属性在运行时仍是透传属性。\n * `Own` 是组件自己的 props,`Events` 是它自己的事件名,与它们同名的原生属性和事件以组件的为准。\n */\nexport type ForwardedAttributes<A, Own, Events extends string = never> = Omit<\n A,\n keyof Own | `on${Capitalize<Events>}`\n>\n\n/**\n * `A` 是组件转交的原生属性,默认是通用的 HTML 属性;\n * 把属性交给 `<input>` 的组件写 `InputHTMLAttributes`,不渲染元素的组件写 `{}`。\n */\nexport type WithInstall<T, A = HTMLAttributes> = WithAttributes<T, A> & Plugin\n\n/** Attach an `install` method so a component can be used with `app.use()`. */\nexport function withInstall<T extends Component, A = HTMLAttributes>(\n component: T,\n): WithInstall<T, A> {\n const target = component as unknown as WithInstall<T, A>\n target.install = (app: App) => {\n const { name } = component as { name?: string }\n if (!name) throw new Error('[dou-ui] component registered with app.use() must have a name')\n app.component(name, component)\n }\n readConfiguredDefaults(component)\n return target\n}\n\ntype PropOption = {\n type?: unknown\n default?: unknown\n skipFactory?: boolean\n}\n\n/**\n * Let `ConfigProvider`'s `defaults` fill in props the component wasn't\n * given. Each prop's default becomes a factory that looks up the\n * configured value first; Vue runs default factories inside the\n * component, so `inject` sees the nearest provider.\n *\n * 这一步发生在包装组件的模块里,按需引入时打包器只留下用到的模块。所以组件内部渲染\n * 别的组件时,要引入包装过的那个(`import { DouSpinner } from '../spinner'`),\n * 不要直接引入 `.vue`,否则单独用外层组件时里面那个读不到默认值。\n * `utils/__tests__/nested-defaults.test.ts` 检查整个仓库都这样做。\n */\nfunction readConfiguredDefaults(component: Component) {\n const { name, props } = component as { name?: string; props?: Record<string, PropOption | null> }\n if (!name || !props || Array.isArray(props)) return\n for (const [key, option] of Object.entries(props)) {\n const own: PropOption = option && typeof option === 'object' ? option : {}\n // a function-typed prop takes its default as the value itself, never as a factory\n if (own.type === Function || own.skipFactory) continue\n const hasDefault = 'default' in own\n const fallback = own.default\n const types = Array.isArray(own.type) ? own.type : [own.type]\n props[key] = {\n ...own,\n default(raw: Record<string, unknown>) {\n const config = hasInjectionContext() ? inject(configProviderKey, undefined) : undefined\n const configured = (config?.value.defaults as Record<string, Record<string, unknown>>)?.[\n name\n ]?.[key]\n if (configured !== undefined) return configured\n if (!hasDefault) return types.includes(Boolean) ? false : undefined\n return typeof fallback === 'function' ? fallback(raw) : fallback\n },\n }\n }\n}\n"],"mappings":";;;;AA8CA,SAAgB,YACd,WACmB;CACnB,MAAM,SAAS;CACf,OAAO,WAAW,QAAa;EAC7B,MAAM,EAAE,SAAS;EACjB,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,+DAA+D;EAC1F,IAAI,UAAU,MAAM,SAAS;CAC/B;CACA,uBAAuB,SAAS;CAChC,OAAO;AACT;;;;;;;;;;;;AAmBA,SAAS,uBAAuB,WAAsB;CACpD,MAAM,EAAE,MAAM,UAAU;CACxB,IAAI,CAAC,QAAQ,CAAC,SAAS,MAAM,QAAQ,KAAK,GAAG;CAC7C,KAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,KAAK,GAAG;EACjD,MAAM,MAAkB,UAAU,OAAO,WAAW,WAAW,SAAS,CAAC;EAEzE,IAAI,IAAI,SAAS,YAAY,IAAI,aAAa;EAC9C,MAAM,aAAa,aAAa;EAChC,MAAM,WAAW,IAAI;EACrB,MAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI;EAC5D,MAAM,OAAO;GACX,GAAG;GACH,QAAQ,KAA8B;IAEpC,MAAM,eADS,oBAAoB,IAAI,OAAO,mBAAmB,KAAA,CAAS,IAAI,KAAA,EAAA,EAClD,MAAM,SAAA,GAChC,KACD,GAAG;IACJ,IAAI,eAAe,KAAA,GAAW,OAAO;IACrC,IAAI,CAAC,YAAY,OAAO,MAAM,SAAS,OAAO,IAAI,QAAQ,KAAA;IAC1D,OAAO,OAAO,aAAa,aAAa,SAAS,GAAG,IAAI;GAC1D;EACF;CACF;AACF"}
@@ -1,4 +1,5 @@
1
- import { Comment, Fragment, Text, cloneVNode, defineComponent, h } from "vue";
1
+ import { devWarn } from "./status-check.js";
2
+ import { Comment, Fragment, Text, cloneVNode, defineComponent, getCurrentInstance, h, mergeProps, onMounted } from "vue";
2
3
  // src/utils/only-child.ts
3
4
  function firstElement(nodes) {
4
5
  for (const node of nodes) {
@@ -16,28 +17,78 @@ function firstElement(nodes) {
16
17
  }
17
18
  return null;
18
19
  }
19
- /** 属性和事件都转交给插槽里的元素,所以模板里可以写任何原生属性。 */
20
- var OnlyChild = defineComponent({
20
+ var triggerHosts = /* @__PURE__ */ new WeakSet();
21
+ /** Marks a component whose default slot is its trigger, rendered through `OnlyChild`. */
22
+ function forwardsTrigger(component) {
23
+ triggerHosts.add(component);
24
+ return component;
25
+ }
26
+ var DYNAMIC_SLOTS = 1024;
27
+ function passToTrigger(host, attrs) {
28
+ const slots = host.children;
29
+ const inner = slots?.default;
30
+ if (typeof inner !== "function") return host;
31
+ const { _: _compiled, $stable: _stable, ...rest } = slots;
32
+ const passed = cloneVNode(host);
33
+ passed.children = {
34
+ ...rest,
35
+ default: (...args) => [h(OnlyChildComponent, attrs, { default: () => inner(...args) })]
36
+ };
37
+ if (passed.patchFlag >= 0) passed.patchFlag |= DYNAMIC_SLOTS;
38
+ return passed;
39
+ }
40
+ /**
41
+ * Render the first element of the default slot, with the attributes and
42
+ * listeners given to this component merged onto it. Lets a floating
43
+ * component wire up its trigger without wrapping it in an extra element.
44
+ */
45
+ var OnlyChildComponent = defineComponent({
21
46
  name: "DouOnlyChild",
22
47
  inheritAttrs: false,
23
48
  setup(_, { slots, attrs }) {
49
+ const probe = useProbe(attrs);
24
50
  return () => {
25
51
  const child = firstElement(slots.default?.() ?? []);
26
52
  if (!child) return null;
53
+ const given = probe ? mergeProps(attrs, { onDouProbe: probe }) : attrs;
54
+ if (triggerHosts.has(child.type)) return passToTrigger(child, { ...given });
27
55
  const describedBy = [child.props?.["aria-describedby"], attrs["aria-describedby"]].filter(Boolean).join(" ") || void 0;
28
56
  return cloneVNode(child, {
29
- ...attrs,
57
+ ...given,
30
58
  "aria-describedby": describedBy
31
59
  }, true);
32
60
  };
33
61
  }
34
62
  });
63
+ function useProbe(attrs) {
64
+ if (process.env.NODE_ENV === "production") return void 0;
65
+ const instance = getCurrentInstance();
66
+ let reached = false;
67
+ onMounted(() => {
68
+ if (!Object.keys(attrs).some((key) => /^on[A-Z]/.test(key) && key !== "onDouProbe")) return;
69
+ const root = onlyChildElement(instance?.proxy);
70
+ if (!root) return;
71
+ const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);
72
+ let node = root;
73
+ for (let n = 0; node && n < 500; n++) {
74
+ node.dispatchEvent(new Event("dou-probe"));
75
+ if (reached) return;
76
+ node = walker.nextNode();
77
+ }
78
+ if (node) return;
79
+ const owner = (instance?.parent?.type)?.name ?? "DouOnlyChild";
80
+ devWarn(`[dou-ui] ${owner}: its trigger got none of its listeners. The component in the default slot keeps its attributes for something else, e.g. your own component whose root is a DouPopover or DouDropdown. Put ${owner} inside that component, right around the overlay, or wrap the slot in an element.`);
81
+ });
82
+ return () => reached = true;
83
+ }
84
+ /** 属性和事件都转交给插槽里的元素,所以模板里可以写任何原生属性。 */
85
+ var OnlyChild = OnlyChildComponent;
35
86
  /** The DOM element rendered by an `OnlyChild`, from its template ref. */
36
87
  function onlyChildElement(instance) {
37
88
  let node = instance?.$el;
38
89
  while (node && !(node instanceof Element)) node = node.nextSibling;
39
90
  return node ?? null;
40
91
  }
41
- export { OnlyChild, onlyChildElement };
92
+ export { OnlyChild, forwardsTrigger, onlyChildElement };
42
93
 
43
94
  //# sourceMappingURL=only-child.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"only-child.js","names":[],"sources":["../../src/utils/only-child.ts"],"sourcesContent":["import { Comment, Fragment, Text, cloneVNode, defineComponent, h } from 'vue'\nimport type { ComponentPublicInstance, HTMLAttributes, VNode } from 'vue'\nimport type { WithAttributes } from './install'\n\nfunction firstElement(nodes: VNode[]): VNode | null {\n for (const node of nodes) {\n if (node.type === Comment) continue\n if (node.type === Fragment) {\n const found = firstElement((node.children as VNode[]) ?? [])\n if (found) return found\n continue\n }\n if (node.type === Text) {\n if (!String(node.children).trim()) continue\n return h('span', null, node.children as string)\n }\n return node\n }\n return null\n}\n\n/**\n * Render the first element of the default slot, with the attributes and\n * listeners given to this component merged onto it. Lets a floating\n * component wire up its trigger without wrapping it in an extra element.\n */\nconst OnlyChildComponent = defineComponent({\n name: 'DouOnlyChild',\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n return () => {\n const child = firstElement(slots.default?.() ?? [])\n if (!child) return null\n // ids that describe the element are a list: the element's own stay with the ones given\n const own = child.props?.['aria-describedby'] as string | undefined\n const given = attrs['aria-describedby'] as string | undefined\n const describedBy = [own, given].filter(Boolean).join(' ') || undefined\n return cloneVNode(child, { ...attrs, 'aria-describedby': describedBy }, true)\n }\n },\n})\n\n/** 属性和事件都转交给插槽里的元素,所以模板里可以写任何原生属性。 */\nexport const OnlyChild = OnlyChildComponent as WithAttributes<\n typeof OnlyChildComponent,\n HTMLAttributes\n>\n\n/** The DOM element rendered by an `OnlyChild`, from its template ref. */\nexport function onlyChildElement(instance: ComponentPublicInstance | null | undefined) {\n let node = instance?.$el as Node | null | undefined\n while (node && !(node instanceof Element)) node = node.nextSibling\n return node ?? null\n}\n"],"mappings":";;AAIA,SAAS,aAAa,OAA8B;CAClD,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,KAAK,SAAS,SAAS;EAC3B,IAAI,KAAK,SAAS,UAAU;GAC1B,MAAM,QAAQ,aAAc,KAAK,YAAwB,CAAC,CAAC;GAC3D,IAAI,OAAO,OAAO;GAClB;EACF;EACA,IAAI,KAAK,SAAS,MAAM;GACtB,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,KAAK,GAAG;GACnC,OAAO,EAAE,QAAQ,MAAM,KAAK,QAAkB;EAChD;EACA,OAAO;CACT;CACA,OAAO;AACT;;AAwBA,IAAa,YAjBc,gBAAgB;CACzC,MAAM;CACN,cAAc;CACd,MAAM,GAAG,EAAE,OAAO,SAAS;EACzB,aAAa;GACX,MAAM,QAAQ,aAAa,MAAM,UAAU,KAAK,CAAC,CAAC;GAClD,IAAI,CAAC,OAAO,OAAO;GAInB,MAAM,cAAc,CAFR,MAAM,QAAQ,qBACZ,MAAM,mBACW,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,KAAK,KAAA;GAC9D,OAAO,WAAW,OAAO;IAAE,GAAG;IAAO,oBAAoB;GAAY,GAAG,IAAI;EAC9E;CACF;AACF,CAGyB;;AAMzB,SAAgB,iBAAiB,UAAsD;CACrF,IAAI,OAAO,UAAU;CACrB,OAAO,QAAQ,EAAE,gBAAgB,UAAU,OAAO,KAAK;CACvD,OAAO,QAAQ;AACjB"}
1
+ {"version":3,"file":"only-child.js","names":[],"sources":["../../src/utils/only-child.ts"],"sourcesContent":["import {\n Comment,\n Fragment,\n Text,\n cloneVNode,\n defineComponent,\n getCurrentInstance,\n h,\n mergeProps,\n onMounted,\n} from 'vue'\nimport type { Component, ComponentPublicInstance, HTMLAttributes, VNode } from 'vue'\nimport type { WithAttributes } from './install'\nimport { devWarn } from './status-check'\n\nfunction firstElement(nodes: VNode[]): VNode | null {\n for (const node of nodes) {\n if (node.type === Comment) continue\n if (node.type === Fragment) {\n const found = firstElement((node.children as VNode[]) ?? [])\n if (found) return found\n continue\n }\n if (node.type === Text) {\n if (!String(node.children).trim()) continue\n return h('span', null, node.children as string)\n }\n return node\n }\n return null\n}\n\n/*\n * Components whose default slot is their trigger (a tooltip, a popover, a\n * menu). Nested inside one another, each would hand its listeners to the\n * outer component, which keeps them for its own panel. So when the child\n * is one of these, the attributes go on to its slot instead and reach the\n * element both of them anchor to.\n */\nconst triggerHosts = new WeakSet<object>()\n\n/** Marks a component whose default slot is its trigger, rendered through `OnlyChild`. */\nexport function forwardsTrigger<T extends Component>(component: T): T {\n triggerHosts.add(component)\n return component\n}\n\n// PatchFlags.DYNAMIC_SLOTS: the replaced slot differs on every render\nconst DYNAMIC_SLOTS = 1 << 10\n\nfunction passToTrigger(host: VNode, attrs: Record<string, unknown>): VNode {\n const slots = host.children as Record<string, unknown> | null\n const inner = slots?.default\n if (typeof inner !== 'function') return host\n // without `_` and `$stable` the slots are taken as new on every render\n const { _: _compiled, $stable: _stable, ...rest } = slots!\n const passed = cloneVNode(host)\n passed.children = {\n ...rest,\n default: (...args: unknown[]) => [\n h(OnlyChildComponent, attrs, {\n default: () => (inner as (...a: unknown[]) => VNode[])(...args),\n }),\n ],\n }\n if (passed.patchFlag >= 0) passed.patchFlag |= DYNAMIC_SLOTS\n return passed\n}\n\n/**\n * Render the first element of the default slot, with the attributes and\n * listeners given to this component merged onto it. Lets a floating\n * component wire up its trigger without wrapping it in an extra element.\n */\nconst OnlyChildComponent = defineComponent({\n name: 'DouOnlyChild',\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const probe = useProbe(attrs)\n return () => {\n const child = firstElement(slots.default?.() ?? [])\n if (!child) return null\n // probes of the components around are kept: each checks its own listeners\n const given = probe ? mergeProps(attrs, { onDouProbe: probe }) : attrs\n if (triggerHosts.has(child.type as object)) return passToTrigger(child, { ...given })\n // ids that describe the element are a list: the element's own stay with the ones given\n const own = child.props?.['aria-describedby'] as string | undefined\n const theirs = attrs['aria-describedby'] as string | undefined\n const describedBy = [own, theirs].filter(Boolean).join(' ') || undefined\n return cloneVNode(child, { ...given, 'aria-describedby': describedBy }, true)\n }\n },\n})\n\n/*\n * While developing: check once that the listeners reached an element. A\n * component in the slot that keeps its attributes for something else\n * (say a wrapper whose root is a DouDropdown, which puts them on its\n * panel) leaves the trigger without them, and nothing else would say so.\n */\nfunction useProbe(attrs: Record<string, unknown>) {\n if (process.env.NODE_ENV === 'production') return undefined\n const instance = getCurrentInstance()\n let reached = false\n onMounted(() => {\n if (!Object.keys(attrs).some((key) => /^on[A-Z]/.test(key) && key !== 'onDouProbe')) return\n const root = onlyChildElement(instance?.proxy)\n if (!root) return\n // the listeners may sit on an element inside the root, not on the root itself\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT)\n let node: Node | null = root\n for (let n = 0; node && n < 500; n++) {\n node.dispatchEvent(new Event('dou-probe'))\n if (reached) return\n node = walker.nextNode()\n }\n // a trigger too large to look through is given the benefit of the doubt\n if (node) return\n const owner = (instance?.parent?.type as { name?: string } | undefined)?.name ?? 'DouOnlyChild'\n devWarn(\n `[dou-ui] ${owner}: its trigger got none of its listeners. The component in the default slot keeps its attributes for something else, e.g. your own component whose root is a DouPopover or DouDropdown. Put ${owner} inside that component, right around the overlay, or wrap the slot in an element.`,\n )\n })\n return () => (reached = true)\n}\n\n/** 属性和事件都转交给插槽里的元素,所以模板里可以写任何原生属性。 */\nexport const OnlyChild = OnlyChildComponent as WithAttributes<\n typeof OnlyChildComponent,\n HTMLAttributes\n>\n\n/** The DOM element rendered by an `OnlyChild`, from its template ref. */\nexport function onlyChildElement(instance: ComponentPublicInstance | null | undefined) {\n let node = instance?.$el as Node | null | undefined\n while (node && !(node instanceof Element)) node = node.nextSibling\n return node ?? null\n}\n"],"mappings":";;;AAeA,SAAS,aAAa,OAA8B;CAClD,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,KAAK,SAAS,SAAS;EAC3B,IAAI,KAAK,SAAS,UAAU;GAC1B,MAAM,QAAQ,aAAc,KAAK,YAAwB,CAAC,CAAC;GAC3D,IAAI,OAAO,OAAO;GAClB;EACF;EACA,IAAI,KAAK,SAAS,MAAM;GACtB,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,KAAK,GAAG;GACnC,OAAO,EAAE,QAAQ,MAAM,KAAK,QAAkB;EAChD;EACA,OAAO;CACT;CACA,OAAO;AACT;AASA,IAAM,+BAAe,IAAI,QAAgB;;AAGzC,SAAgB,gBAAqC,WAAiB;CACpE,aAAa,IAAI,SAAS;CAC1B,OAAO;AACT;AAGA,IAAM,gBAAgB;AAEtB,SAAS,cAAc,MAAa,OAAuC;CACzE,MAAM,QAAQ,KAAK;CACnB,MAAM,QAAQ,OAAO;CACrB,IAAI,OAAO,UAAU,YAAY,OAAO;CAExC,MAAM,EAAE,GAAG,WAAW,SAAS,SAAS,GAAG,SAAS;CACpD,MAAM,SAAS,WAAW,IAAI;CAC9B,OAAO,WAAW;EAChB,GAAG;EACH,UAAU,GAAG,SAAoB,CAC/B,EAAE,oBAAoB,OAAO,EAC3B,eAAgB,MAAuC,GAAG,IAAI,EAChE,CAAC,CACH;CACF;CACA,IAAI,OAAO,aAAa,GAAG,OAAO,aAAa;CAC/C,OAAO;AACT;;;;;;AAOA,IAAM,qBAAqB,gBAAgB;CACzC,MAAM;CACN,cAAc;CACd,MAAM,GAAG,EAAE,OAAO,SAAS;EACzB,MAAM,QAAQ,SAAS,KAAK;EAC5B,aAAa;GACX,MAAM,QAAQ,aAAa,MAAM,UAAU,KAAK,CAAC,CAAC;GAClD,IAAI,CAAC,OAAO,OAAO;GAEnB,MAAM,QAAQ,QAAQ,WAAW,OAAO,EAAE,YAAY,MAAM,CAAC,IAAI;GACjE,IAAI,aAAa,IAAI,MAAM,IAAc,GAAG,OAAO,cAAc,OAAO,EAAE,GAAG,MAAM,CAAC;GAIpF,MAAM,cAAc,CAFR,MAAM,QAAQ,qBACX,MAAM,mBACW,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,KAAK,KAAA;GAC/D,OAAO,WAAW,OAAO;IAAE,GAAG;IAAO,oBAAoB;GAAY,GAAG,IAAI;EAC9E;CACF;AACF,CAAC;AAQD,SAAS,SAAS,OAAgC;CAChD,IAAA,QAAA,IAAA,aAA6B,cAAc,OAAO,KAAA;CAClD,MAAM,WAAW,mBAAmB;CACpC,IAAI,UAAU;CACd,gBAAgB;EACd,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,MAAM,QAAQ,WAAW,KAAK,GAAG,KAAK,QAAQ,YAAY,GAAG;EACrF,MAAM,OAAO,iBAAiB,UAAU,KAAK;EAC7C,IAAI,CAAC,MAAM;EAEX,MAAM,SAAS,SAAS,iBAAiB,MAAM,WAAW,YAAY;EACtE,IAAI,OAAoB;EACxB,KAAK,IAAI,IAAI,GAAG,QAAQ,IAAI,KAAK,KAAK;GACpC,KAAK,cAAc,IAAI,MAAM,WAAW,CAAC;GACzC,IAAI,SAAS;GACb,OAAO,OAAO,SAAS;EACzB;EAEA,IAAI,MAAM;EACV,MAAM,SAAS,UAAU,QAAQ,KAAA,EAAwC,QAAQ;EACjF,QACE,YAAY,MAAM,6LAA6L,MAAM,kFACvN;CACF,CAAC;CACD,aAAc,UAAU;AAC1B;;AAGA,IAAa,YAAY;;AAMzB,SAAgB,iBAAiB,UAAsD;CACrF,IAAI,OAAO,UAAU;CACrB,OAAO,QAAQ,EAAE,gBAAgB,UAAU,OAAO,KAAK;CACvD,OAAO,QAAQ;AACjB"}
@@ -1,5 +1,10 @@
1
1
  // src/utils/pointer.ts
2
2
  /**
3
+ * Whether a pointer of this type can hover. Fingers and pens touch down
4
+ * where they act, and the enter and leave they send come with the press.
5
+ */
6
+ var hasHover = (pointerType) => pointerType !== "touch" && pointerType !== "pen";
7
+ /**
3
8
  * Keeps a touch on the drag it started, also when the element under the
4
9
  * finger is removed while it moves (the item moved to another list, a
5
10
  * virtual row scrolled out of view).
@@ -81,6 +86,6 @@ function holdPointer(event, root, onLost) {
81
86
  release
82
87
  };
83
88
  }
84
- export { holdPointer };
89
+ export { hasHover, holdPointer };
85
90
 
86
91
  //# sourceMappingURL=pointer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pointer.js","names":[],"sources":["../../src/utils/pointer.ts"],"sourcesContent":["/** A press that may turn into a drag; see `holdPointer`. */\nexport interface PointerHold {\n /** The drag has started: the touch stops scrolling and `root` captures the pointer. */\n grab(): void\n /** The press or the drag is over. */\n release(): void\n}\n\n/**\n * Keeps a touch on the drag it started, also when the element under the\n * finger is removed while it moves (the item moved to another list, a\n * virtual row scrolled out of view).\n *\n * Touch events keep going to the element the finger went down on, and a\n * removed element no longer passes them up to the page: nothing stops the\n * touch from scrolling, and the browser cancels the pointer to scroll\n * instead. So the element gets its own `touchmove` listener, next to one on\n * the window. Call this in `pointerdown`: it comes before `touchstart`, and\n * a touch can only be kept from scrolling when a listener on the window was\n * there as it started (one on the element alone is not seen in time). Call\n * `grab()` once the drag starts and `release()` when it ends.\n *\n * `root` is an element that stays in the page for the whole drag; it\n * captures the pointer, so its events go on without the element. Leave it\n * out when the element itself captures the pointer and is never removed.\n *\n * The hold also lets go by itself once the last finger is lifted, whether\n * or not the `pointerup` reached the code that would call `release()`\n * (Safari on iOS sends it to a removed element, where nothing hears it):\n * a hold that outlived its touch would keep the whole page from scrolling.\n * The drag is then cancelled the usual way: a `pointercancel` for the same\n * pointer goes out from the pressed element (or `root`, or the window, when\n * it is gone), so code that ends a drag on `pointercancel` ends it here too.\n * `onLost` is called after it.\n */\nexport function holdPointer(\n event: PointerEvent,\n root?: Element | null,\n onLost?: () => void,\n): PointerHold {\n // A mouse never scrolls the page by dragging.\n if (event.pointerType === 'mouse') return { grab() {}, release() {} }\n const target = event.target instanceof Element ? event.target : null\n let grabbed = false\n let held = true\n const block = (e: Event) => {\n if (grabbed && e.cancelable) e.preventDefault()\n }\n // After the pointer's own events, so a `pointerup` that did arrive ends the drag first.\n const end = (e: Event) => {\n if ((e as TouchEvent).touches?.length) return\n setTimeout(() => {\n if (!held) return\n release()\n const at = target?.isConnected ? target : root?.isConnected ? root : window\n at.dispatchEvent(\n new PointerEvent('pointercancel', {\n pointerId: event.pointerId,\n pointerType: event.pointerType,\n bubbles: true,\n }),\n )\n onLost?.()\n })\n }\n window.addEventListener('touchmove', block, { passive: false })\n target?.addEventListener('touchmove', block, { passive: false })\n for (const type of ['touchend', 'touchcancel']) {\n window.addEventListener(type, end, { passive: true })\n target?.addEventListener(type, end, { passive: true })\n }\n function release() {\n if (held) {\n held = false\n window.removeEventListener('touchmove', block)\n target?.removeEventListener('touchmove', block)\n for (const type of ['touchend', 'touchcancel']) {\n window.removeEventListener(type, end)\n target?.removeEventListener(type, end)\n }\n }\n if (!grabbed) return\n grabbed = false\n if (root?.isConnected && root.hasPointerCapture?.(event.pointerId))\n root.releasePointerCapture(event.pointerId)\n }\n return {\n grab() {\n if (grabbed || !held) return\n grabbed = true\n try {\n if (root?.isConnected) root.setPointerCapture?.(event.pointerId)\n } catch {\n // the pointer is already gone\n }\n },\n release,\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,SAAgB,YACd,OACA,MACA,QACa;CAEb,IAAI,MAAM,gBAAgB,SAAS,OAAO;EAAE,OAAO,CAAC;EAAG,UAAU,CAAC;CAAE;CACpE,MAAM,SAAS,MAAM,kBAAkB,UAAU,MAAM,SAAS;CAChE,IAAI,UAAU;CACd,IAAI,OAAO;CACX,MAAM,SAAS,MAAa;EAC1B,IAAI,WAAW,EAAE,YAAY,EAAE,eAAe;CAChD;CAEA,MAAM,OAAO,MAAa;EACxB,IAAK,EAAiB,SAAS,QAAQ;EACvC,iBAAiB;GACf,IAAI,CAAC,MAAM;GACX,QAAQ;GAER,CADW,QAAQ,cAAc,SAAS,MAAM,cAAc,OAAO,OAAA,CAClE,cACD,IAAI,aAAa,iBAAiB;IAChC,WAAW,MAAM;IACjB,aAAa,MAAM;IACnB,SAAS;GACX,CAAC,CACH;GACA,SAAS;EACX,CAAC;CACH;CACA,OAAO,iBAAiB,aAAa,OAAO,EAAE,SAAS,MAAM,CAAC;CAC9D,QAAQ,iBAAiB,aAAa,OAAO,EAAE,SAAS,MAAM,CAAC;CAC/D,KAAK,MAAM,QAAQ,CAAC,YAAY,aAAa,GAAG;EAC9C,OAAO,iBAAiB,MAAM,KAAK,EAAE,SAAS,KAAK,CAAC;EACpD,QAAQ,iBAAiB,MAAM,KAAK,EAAE,SAAS,KAAK,CAAC;CACvD;CACA,SAAS,UAAU;EACjB,IAAI,MAAM;GACR,OAAO;GACP,OAAO,oBAAoB,aAAa,KAAK;GAC7C,QAAQ,oBAAoB,aAAa,KAAK;GAC9C,KAAK,MAAM,QAAQ,CAAC,YAAY,aAAa,GAAG;IAC9C,OAAO,oBAAoB,MAAM,GAAG;IACpC,QAAQ,oBAAoB,MAAM,GAAG;GACvC;EACF;EACA,IAAI,CAAC,SAAS;EACd,UAAU;EACV,IAAI,MAAM,eAAe,KAAK,oBAAoB,MAAM,SAAS,GAC/D,KAAK,sBAAsB,MAAM,SAAS;CAC9C;CACA,OAAO;EACL,OAAO;GACL,IAAI,WAAW,CAAC,MAAM;GACtB,UAAU;GACV,IAAI;IACF,IAAI,MAAM,aAAa,KAAK,oBAAoB,MAAM,SAAS;GACjE,QAAQ,CAER;EACF;EACA;CACF;AACF"}
1
+ {"version":3,"file":"pointer.js","names":[],"sources":["../../src/utils/pointer.ts"],"sourcesContent":["/**\n * Whether a pointer of this type can hover. Fingers and pens touch down\n * where they act, and the enter and leave they send come with the press.\n */\nexport const hasHover = (pointerType: string) => pointerType !== 'touch' && pointerType !== 'pen'\n\n/** A press that may turn into a drag; see `holdPointer`. */\nexport interface PointerHold {\n /** The drag has started: the touch stops scrolling and `root` captures the pointer. */\n grab(): void\n /** The press or the drag is over. */\n release(): void\n}\n\n/**\n * Keeps a touch on the drag it started, also when the element under the\n * finger is removed while it moves (the item moved to another list, a\n * virtual row scrolled out of view).\n *\n * Touch events keep going to the element the finger went down on, and a\n * removed element no longer passes them up to the page: nothing stops the\n * touch from scrolling, and the browser cancels the pointer to scroll\n * instead. So the element gets its own `touchmove` listener, next to one on\n * the window. Call this in `pointerdown`: it comes before `touchstart`, and\n * a touch can only be kept from scrolling when a listener on the window was\n * there as it started (one on the element alone is not seen in time). Call\n * `grab()` once the drag starts and `release()` when it ends.\n *\n * `root` is an element that stays in the page for the whole drag; it\n * captures the pointer, so its events go on without the element. Leave it\n * out when the element itself captures the pointer and is never removed.\n *\n * The hold also lets go by itself once the last finger is lifted, whether\n * or not the `pointerup` reached the code that would call `release()`\n * (Safari on iOS sends it to a removed element, where nothing hears it):\n * a hold that outlived its touch would keep the whole page from scrolling.\n * The drag is then cancelled the usual way: a `pointercancel` for the same\n * pointer goes out from the pressed element (or `root`, or the window, when\n * it is gone), so code that ends a drag on `pointercancel` ends it here too.\n * `onLost` is called after it.\n */\nexport function holdPointer(\n event: PointerEvent,\n root?: Element | null,\n onLost?: () => void,\n): PointerHold {\n // A mouse never scrolls the page by dragging.\n if (event.pointerType === 'mouse') return { grab() {}, release() {} }\n const target = event.target instanceof Element ? event.target : null\n let grabbed = false\n let held = true\n const block = (e: Event) => {\n if (grabbed && e.cancelable) e.preventDefault()\n }\n // After the pointer's own events, so a `pointerup` that did arrive ends the drag first.\n const end = (e: Event) => {\n if ((e as TouchEvent).touches?.length) return\n setTimeout(() => {\n if (!held) return\n release()\n const at = target?.isConnected ? target : root?.isConnected ? root : window\n at.dispatchEvent(\n new PointerEvent('pointercancel', {\n pointerId: event.pointerId,\n pointerType: event.pointerType,\n bubbles: true,\n }),\n )\n onLost?.()\n })\n }\n window.addEventListener('touchmove', block, { passive: false })\n target?.addEventListener('touchmove', block, { passive: false })\n for (const type of ['touchend', 'touchcancel']) {\n window.addEventListener(type, end, { passive: true })\n target?.addEventListener(type, end, { passive: true })\n }\n function release() {\n if (held) {\n held = false\n window.removeEventListener('touchmove', block)\n target?.removeEventListener('touchmove', block)\n for (const type of ['touchend', 'touchcancel']) {\n window.removeEventListener(type, end)\n target?.removeEventListener(type, end)\n }\n }\n if (!grabbed) return\n grabbed = false\n if (root?.isConnected && root.hasPointerCapture?.(event.pointerId))\n root.releasePointerCapture(event.pointerId)\n }\n return {\n grab() {\n if (grabbed || !held) return\n grabbed = true\n try {\n if (root?.isConnected) root.setPointerCapture?.(event.pointerId)\n } catch {\n // the pointer is already gone\n }\n },\n release,\n }\n}\n"],"mappings":";;;;;AAIA,IAAa,YAAY,gBAAwB,gBAAgB,WAAW,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqC5F,SAAgB,YACd,OACA,MACA,QACa;CAEb,IAAI,MAAM,gBAAgB,SAAS,OAAO;EAAE,OAAO,CAAC;EAAG,UAAU,CAAC;CAAE;CACpE,MAAM,SAAS,MAAM,kBAAkB,UAAU,MAAM,SAAS;CAChE,IAAI,UAAU;CACd,IAAI,OAAO;CACX,MAAM,SAAS,MAAa;EAC1B,IAAI,WAAW,EAAE,YAAY,EAAE,eAAe;CAChD;CAEA,MAAM,OAAO,MAAa;EACxB,IAAK,EAAiB,SAAS,QAAQ;EACvC,iBAAiB;GACf,IAAI,CAAC,MAAM;GACX,QAAQ;GAER,CADW,QAAQ,cAAc,SAAS,MAAM,cAAc,OAAO,OAAA,CAClE,cACD,IAAI,aAAa,iBAAiB;IAChC,WAAW,MAAM;IACjB,aAAa,MAAM;IACnB,SAAS;GACX,CAAC,CACH;GACA,SAAS;EACX,CAAC;CACH;CACA,OAAO,iBAAiB,aAAa,OAAO,EAAE,SAAS,MAAM,CAAC;CAC9D,QAAQ,iBAAiB,aAAa,OAAO,EAAE,SAAS,MAAM,CAAC;CAC/D,KAAK,MAAM,QAAQ,CAAC,YAAY,aAAa,GAAG;EAC9C,OAAO,iBAAiB,MAAM,KAAK,EAAE,SAAS,KAAK,CAAC;EACpD,QAAQ,iBAAiB,MAAM,KAAK,EAAE,SAAS,KAAK,CAAC;CACvD;CACA,SAAS,UAAU;EACjB,IAAI,MAAM;GACR,OAAO;GACP,OAAO,oBAAoB,aAAa,KAAK;GAC7C,QAAQ,oBAAoB,aAAa,KAAK;GAC9C,KAAK,MAAM,QAAQ,CAAC,YAAY,aAAa,GAAG;IAC9C,OAAO,oBAAoB,MAAM,GAAG;IACpC,QAAQ,oBAAoB,MAAM,GAAG;GACvC;EACF;EACA,IAAI,CAAC,SAAS;EACd,UAAU;EACV,IAAI,MAAM,eAAe,KAAK,oBAAoB,MAAM,SAAS,GAC/D,KAAK,sBAAsB,MAAM,SAAS;CAC9C;CACA,OAAO;EACL,OAAO;GACL,IAAI,WAAW,CAAC,MAAM;GACtB,UAAU;GACV,IAAI;IACF,IAAI,MAAM,aAAa,KAAK,oBAAoB,MAAM,SAAS;GACjE,QAAQ,CAER;EACF;EACA;CACF;AACF"}
@@ -0,0 +1,57 @@
1
+ import { devWarn } from "./status-check.js";
2
+ // src/utils/safe-url.ts
3
+ var SAFE_SCHEMES = [
4
+ "http",
5
+ "https",
6
+ "mailto",
7
+ "tel"
8
+ ];
9
+ /**
10
+ * The scheme of `url` in lower case, such as `https`, or an empty string for a
11
+ * relative address or anchor. Control characters and whitespace are ignored,
12
+ * as browsers do, so `java\tscript:` reads as `javascript`.
13
+ */
14
+ function urlScheme(url) {
15
+ let compact = "";
16
+ for (const ch of url) {
17
+ const code = ch.charCodeAt(0);
18
+ if (code > 32 && (code < 127 || code > 159)) compact += ch;
19
+ }
20
+ const colon = compact.indexOf(":");
21
+ if (colon < 0) return "";
22
+ const cut = compact.search(/[/?#]/);
23
+ if (cut >= 0 && cut < colon) return "";
24
+ const scheme = compact.slice(0, colon);
25
+ return /^[a-z][a-z0-9+.-]*$/i.test(scheme) ? scheme.toLowerCase() : "";
26
+ }
27
+ /**
28
+ * Returns `url` when it is safe to use as a link (`href`), otherwise `undefined`.
29
+ * http(s), mailto, tel, relative addresses and anchors pass; anything else,
30
+ * such as `javascript:` or `data:`, is dropped. Only for links: it also drops
31
+ * `data:` and `blob:`, which are fine in an image `src`.
32
+ */
33
+ function safeUrl(url) {
34
+ if (!url) return void 0;
35
+ const scheme = urlScheme(url);
36
+ return scheme === "" || SAFE_SCHEMES.includes(scheme) ? url : void 0;
37
+ }
38
+ /** Whether a link should open in a new tab: not for `mailto:` and `tel:`, which hand off to an app. */
39
+ function opensNewTab(url) {
40
+ const scheme = urlScheme(url);
41
+ return scheme !== "mailto" && scheme !== "tel";
42
+ }
43
+ /**
44
+ * {@link safeUrl}, warning once while developing when an address is dropped.
45
+ * `component` names the component in the warning, e.g. `DouChatSources`.
46
+ */
47
+ function checkedUrl(component, url) {
48
+ const safe = safeUrl(url);
49
+ if (url && safe === void 0 && process.env.NODE_ENV !== "production") {
50
+ const shown = url.length > 60 ? `${url.slice(0, 60)}…` : url;
51
+ devWarn(`[dou-ui] ${component}: \`${shown}\` is not a safe url and is shown without a link. Use http(s), mailto, tel or a relative address.`);
52
+ }
53
+ return safe;
54
+ }
55
+ export { checkedUrl, opensNewTab, safeUrl };
56
+
57
+ //# sourceMappingURL=safe-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-url.js","names":[],"sources":["../../src/utils/safe-url.ts"],"sourcesContent":["import { devWarn } from './status-check'\n\nconst SAFE_SCHEMES = ['http', 'https', 'mailto', 'tel']\n\n/**\n * The scheme of `url` in lower case, such as `https`, or an empty string for a\n * relative address or anchor. Control characters and whitespace are ignored,\n * as browsers do, so `java\\tscript:` reads as `javascript`.\n */\nfunction urlScheme(url: string): string {\n let compact = ''\n for (const ch of url) {\n const code = ch.charCodeAt(0)\n if (code > 0x20 && (code < 0x7f || code > 0x9f)) compact += ch\n }\n const colon = compact.indexOf(':')\n if (colon < 0) return ''\n // a colon after a slash, `?` or `#` belongs to a relative path, not a scheme\n const cut = compact.search(/[/?#]/)\n if (cut >= 0 && cut < colon) return ''\n const scheme = compact.slice(0, colon)\n // not a scheme name, e.g. `2024:年报.html`: browsers read it as a relative path.\n // `compact` drops more characters than browsers do, so a bad character here is\n // in the original too.\n return /^[a-z][a-z0-9+.-]*$/i.test(scheme) ? scheme.toLowerCase() : ''\n}\n\n/**\n * Returns `url` when it is safe to use as a link (`href`), otherwise `undefined`.\n * http(s), mailto, tel, relative addresses and anchors pass; anything else,\n * such as `javascript:` or `data:`, is dropped. Only for links: it also drops\n * `data:` and `blob:`, which are fine in an image `src`.\n */\nexport function safeUrl(url: string | undefined): string | undefined {\n if (!url) return undefined\n const scheme = urlScheme(url)\n return scheme === '' || SAFE_SCHEMES.includes(scheme) ? url : undefined\n}\n\n/** Whether a link should open in a new tab: not for `mailto:` and `tel:`, which hand off to an app. */\nexport function opensNewTab(url: string): boolean {\n const scheme = urlScheme(url)\n return scheme !== 'mailto' && scheme !== 'tel'\n}\n\n/**\n * {@link safeUrl}, warning once while developing when an address is dropped.\n * `component` names the component in the warning, e.g. `DouChatSources`.\n */\nexport function checkedUrl(component: string, url: string | undefined): string | undefined {\n const safe = safeUrl(url)\n if (url && safe === undefined && process.env.NODE_ENV !== 'production') {\n const shown = url.length > 60 ? `${url.slice(0, 60)}…` : url\n devWarn(\n `[dou-ui] ${component}: \\`${shown}\\` is not a safe url and is shown without a link. Use http(s), mailto, tel or a relative address.`,\n )\n }\n return safe\n}\n"],"mappings":";;AAEA,IAAM,eAAe;CAAC;CAAQ;CAAS;CAAU;AAAK;;;;;;AAOtD,SAAS,UAAU,KAAqB;CACtC,IAAI,UAAU;CACd,KAAK,MAAM,MAAM,KAAK;EACpB,MAAM,OAAO,GAAG,WAAW,CAAC;EAC5B,IAAI,OAAO,OAAS,OAAO,OAAQ,OAAO,MAAO,WAAW;CAC9D;CACA,MAAM,QAAQ,QAAQ,QAAQ,GAAG;CACjC,IAAI,QAAQ,GAAG,OAAO;CAEtB,MAAM,MAAM,QAAQ,OAAO,OAAO;CAClC,IAAI,OAAO,KAAK,MAAM,OAAO,OAAO;CACpC,MAAM,SAAS,QAAQ,MAAM,GAAG,KAAK;CAIrC,OAAO,uBAAuB,KAAK,MAAM,IAAI,OAAO,YAAY,IAAI;AACtE;;;;;;;AAQA,SAAgB,QAAQ,KAA6C;CACnE,IAAI,CAAC,KAAK,OAAO,KAAA;CACjB,MAAM,SAAS,UAAU,GAAG;CAC5B,OAAO,WAAW,MAAM,aAAa,SAAS,MAAM,IAAI,MAAM,KAAA;AAChE;;AAGA,SAAgB,YAAY,KAAsB;CAChD,MAAM,SAAS,UAAU,GAAG;CAC5B,OAAO,WAAW,YAAY,WAAW;AAC3C;;;;;AAMA,SAAgB,WAAW,WAAmB,KAA6C;CACzF,MAAM,OAAO,QAAQ,GAAG;CACxB,IAAI,OAAO,SAAS,KAAA,KAAA,QAAA,IAAA,aAAsC,cAAc;EACtE,MAAM,QAAQ,IAAI,SAAS,KAAK,GAAG,IAAI,MAAM,GAAG,EAAE,EAAE,KAAK;EACzD,QACE,YAAY,UAAU,MAAM,MAAM,kGACpC;CACF;CACA,OAAO;AACT"}
@@ -0,0 +1,27 @@
1
+ import { watchEffect } from "vue";
2
+ // src/utils/status-check.ts
3
+ var warned = /* @__PURE__ */ new Set();
4
+ /** Warn once per page with this message. Call only while developing. */
5
+ function devWarn(message) {
6
+ if (warned.has(message)) return;
7
+ warned.add(message);
8
+ console.warn(message);
9
+ }
10
+ /**
11
+ * While developing, warn once about a `status` the component doesn't know,
12
+ * e.g. an old name in JSON from a server, where types can't catch it.
13
+ * `renamed` maps old names to the new ones to suggest.
14
+ */
15
+ function useStatusCheck(component, statuses, known, renamed = {}) {
16
+ if (process.env.NODE_ENV === "production") return;
17
+ watchEffect(() => {
18
+ for (const status of statuses()) {
19
+ if (status === void 0 || known.includes(status)) continue;
20
+ const hint = renamed[status] ? ` Use \`${renamed[status]}\`.` : "";
21
+ devWarn(`[dou-ui] ${component}: unknown status \`${status}\`, expected one of ${known.map((k) => `\`${k}\``).join(", ")}.${hint}`);
22
+ }
23
+ });
24
+ }
25
+ export { devWarn, useStatusCheck };
26
+
27
+ //# sourceMappingURL=status-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-check.js","names":[],"sources":["../../src/utils/status-check.ts"],"sourcesContent":["import { watchEffect } from 'vue'\n\n// one warning per component and value for the whole page, so a long list doesn't flood the console\nconst warned = new Set<string>()\n\n/** Warn once per page with this message. Call only while developing. */\nexport function devWarn(message: string) {\n if (warned.has(message)) return\n warned.add(message)\n console.warn(message)\n}\n\n/**\n * While developing, warn once about a `status` the component doesn't know,\n * e.g. an old name in JSON from a server, where types can't catch it.\n * `renamed` maps old names to the new ones to suggest.\n */\nexport function useStatusCheck(\n component: string,\n statuses: () => readonly (string | undefined)[],\n known: readonly string[],\n renamed: Record<string, string> = {},\n) {\n // The app's bundler replaces this, as for Vue's own warnings.\n if (process.env.NODE_ENV === 'production') return\n watchEffect(() => {\n for (const status of statuses()) {\n if (status === undefined || known.includes(status)) continue\n const hint = renamed[status] ? ` Use \\`${renamed[status]}\\`.` : ''\n devWarn(\n `[dou-ui] ${component}: unknown status \\`${status}\\`, expected one of ${known.map((k) => `\\`${k}\\``).join(', ')}.${hint}`,\n )\n }\n })\n}\n"],"mappings":";;AAGA,IAAM,yBAAS,IAAI,IAAY;;AAG/B,SAAgB,QAAQ,SAAiB;CACvC,IAAI,OAAO,IAAI,OAAO,GAAG;CACzB,OAAO,IAAI,OAAO;CAClB,QAAQ,KAAK,OAAO;AACtB;;;;;;AAOA,SAAgB,eACd,WACA,UACA,OACA,UAAkC,CAAC,GACnC;CAEA,IAAA,QAAA,IAAA,aAA6B,cAAc;CAC3C,kBAAkB;EAChB,KAAK,MAAM,UAAU,SAAS,GAAG;GAC/B,IAAI,WAAW,KAAA,KAAa,MAAM,SAAS,MAAM,GAAG;GACpD,MAAM,OAAO,QAAQ,UAAU,UAAU,QAAQ,QAAQ,OAAO;GAChE,QACE,YAAY,UAAU,qBAAqB,OAAO,sBAAsB,MAAM,KAAK,MAAM,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,GAAG,MACrH;EACF;CACF,CAAC;AACH"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dou-ui",
3
- "version": "0.1.0-alpha.2",
3
+ "version": "0.1.0-alpha.4",
4
4
  "description": "为自己打造的 Vue 3 组件库:简洁克制,样式与组件分离,内置无障碍支持",
5
5
  "keywords": [
6
6
  "vue",
@@ -49,8 +49,8 @@
49
49
  "vue": "^3.5.0"
50
50
  },
51
51
  "dependencies": {
52
- "@dou-ui/icons": "0.1.0-alpha.2",
53
- "@dou-ui/theme": "0.1.0-alpha.2"
52
+ "@dou-ui/icons": "0.1.0-alpha.4",
53
+ "@dou-ui/theme": "0.1.0-alpha.4"
54
54
  },
55
55
  "publishConfig": {
56
56
  "access": "public"