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.
- package/dist/components/button/button.js.map +1 -1
- package/dist/components/button/button.vue_vue_type_script_setup_true_lang.js +2 -1
- package/dist/components/button/button.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/calendar-view/calendar-view.js.map +1 -1
- package/dist/components/calendar-view/calendar-view.vue_vue_type_script_setup_true_lang.js +7 -2
- package/dist/components/calendar-view/calendar-view.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/cascader/cascader.js.map +1 -1
- package/dist/components/cascader/cascader.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/components/cascader/cascader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/chat-artifact/chat-artifact.js.map +1 -1
- package/dist/components/chat-artifact/chat-artifact.vue_vue_type_script_setup_true_lang.js +8 -2
- package/dist/components/chat-artifact/chat-artifact.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/chat-attachments/chat-attachments.js.map +1 -1
- package/dist/components/chat-attachments/chat-attachments.vue_vue_type_script_setup_true_lang.js +11 -2
- package/dist/components/chat-attachments/chat-attachments.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/chat-attachments/chat-attachments2.js.map +1 -1
- package/dist/components/chat-confirm/chat-confirm.js.map +1 -1
- package/dist/components/chat-confirm/chat-confirm.vue_vue_type_script_setup_true_lang.js +38 -14
- package/dist/components/chat-confirm/chat-confirm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/chat-context-meter/chat-context-meter.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/chat-context-meter/chat-context-meter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/chat-context-meter/chat-context-meter2.js.map +1 -1
- package/dist/components/chat-message/chat-message.js.map +1 -1
- package/dist/components/chat-message/chat-message.vue_vue_type_script_setup_true_lang.js +88 -33
- package/dist/components/chat-message/chat-message.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/chat-message/chat-message2.js.map +1 -1
- package/dist/components/chat-message/style.js +5 -0
- package/dist/components/chat-plan/chat-plan.js +9 -4
- package/dist/components/chat-plan/chat-plan.js.map +1 -1
- package/dist/components/chat-plan/chat-plan.vue_vue_type_script_setup_true_lang.js +64 -32
- package/dist/components/chat-plan/chat-plan.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/chat-plan/chat-plan2.js +6 -0
- package/dist/components/chat-plan/chat-plan2.js.map +1 -0
- package/dist/components/chat-plan/index.js +1 -1
- package/dist/components/chat-plan/style.js +1 -0
- package/dist/components/chat-reasoning/chat-reasoning.js.map +1 -1
- package/dist/components/chat-reasoning/chat-reasoning.vue_vue_type_script_setup_true_lang.js +4 -4
- package/dist/components/chat-reasoning/chat-reasoning.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/chat-sources/chat-citation.js.map +1 -1
- package/dist/components/chat-sources/chat-citation.vue_vue_type_script_setup_true_lang.js +52 -14
- package/dist/components/chat-sources/chat-citation.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/chat-sources/chat-sources.js.map +1 -1
- package/dist/components/chat-sources/chat-sources.vue_vue_type_script_setup_true_lang.js +6 -4
- package/dist/components/chat-sources/chat-sources.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/chat-sources/chat-sources2.js.map +1 -1
- package/dist/components/chat-sources/index.js +1 -1
- package/dist/components/chat-steps/chat-steps.js +9 -4
- package/dist/components/chat-steps/chat-steps.js.map +1 -1
- package/dist/components/chat-steps/chat-steps.vue_vue_type_script_setup_true_lang.js +20 -13
- package/dist/components/chat-steps/chat-steps.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/chat-steps/chat-steps2.js +6 -0
- package/dist/components/chat-steps/chat-steps2.js.map +1 -0
- package/dist/components/chat-steps/index.js +1 -1
- package/dist/components/chat-steps/style.js +1 -0
- package/dist/components/chat-tool-call/chat-tool-call.js.map +1 -1
- package/dist/components/chat-tool-call/chat-tool-call.vue_vue_type_script_setup_true_lang.js +38 -12
- package/dist/components/chat-tool-call/chat-tool-call.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/chat-tool-call/chat-tool-call2.js.map +1 -1
- package/dist/components/chat-tool-call/style.js +1 -0
- package/dist/components/code-block/code-block.js.map +1 -1
- package/dist/components/code-block/code-block.vue_vue_type_script_setup_true_lang.js +37 -5
- package/dist/components/code-block/code-block.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/collapse/collapse-item.js.map +1 -1
- package/dist/components/collapse/collapse-item.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/collapse/collapse-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/collapse/collapse-transition.js +3 -1
- package/dist/components/collapse/collapse-transition.js.map +1 -1
- package/dist/components/collapse/index.js +1 -2
- package/dist/components/collapse/index.js.map +1 -1
- package/dist/components/color-mode/color-mode-button.js.map +1 -1
- package/dist/components/color-mode/color-mode-button.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/color-mode/color-mode-button.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/color-mode/color-mode-select.js.map +1 -1
- package/dist/components/color-mode/color-mode-select.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/color-mode/color-mode-select.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/color-mode/color-mode-switch.js.map +1 -1
- package/dist/components/color-mode/color-mode-switch.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/color-mode/color-mode-switch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/color-panel/color-panel.js.map +1 -1
- package/dist/components/color-panel/color-panel.vue_vue_type_script_setup_true_lang.js +5 -5
- package/dist/components/color-panel/color-panel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/color-picker/color-picker.js.map +1 -1
- package/dist/components/color-picker/color-picker.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/color-picker/color-picker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/comment-thread/comment-thread.js.map +1 -1
- package/dist/components/comment-thread/comment-thread.vue_vue_type_script_setup_true_lang.js +15 -15
- package/dist/components/comment-thread/comment-thread.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/comment-thread/style.js +2 -0
- package/dist/components/context-menu/context-menu.js.map +1 -1
- package/dist/components/context-menu/context-menu.vue_vue_type_script_setup_true_lang.js +26 -11
- package/dist/components/context-menu/context-menu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/context-menu/index.js +2 -0
- package/dist/components/context-menu/index.js.map +1 -1
- package/dist/components/copy-button/copy-button.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/descriptions/descriptions.js.map +1 -1
- package/dist/components/descriptions/descriptions.vue_vue_type_script_setup_true_lang.js +3 -1
- package/dist/components/descriptions/descriptions.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/descriptions/descriptions2.js.map +1 -1
- package/dist/components/dropdown/dropdown-button.js.map +1 -1
- package/dist/components/dropdown/dropdown-button.vue_vue_type_script_setup_true_lang.js +5 -5
- package/dist/components/dropdown/dropdown-button.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/dropdown/dropdown-group.js +6 -0
- package/dist/components/dropdown/dropdown-group.js.map +1 -0
- package/dist/components/dropdown/dropdown-group.vue_vue_type_script_setup_true_lang.js +42 -0
- package/dist/components/dropdown/dropdown-group.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/dropdown/dropdown-item.js.map +1 -1
- package/dist/components/dropdown/dropdown-item.vue_vue_type_script_setup_true_lang.js +31 -9
- package/dist/components/dropdown/dropdown-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/dropdown/dropdown-items.js.map +1 -1
- package/dist/components/dropdown/dropdown-items.vue_vue_type_script_setup_true_lang.js +77 -52
- package/dist/components/dropdown/dropdown-items.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/dropdown/dropdown-radio-group.js.map +1 -1
- package/dist/components/dropdown/dropdown-radio-group.vue_vue_type_script_setup_true_lang.js +23 -5
- package/dist/components/dropdown/dropdown-radio-group.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/dropdown/dropdown-sub.js.map +1 -1
- package/dist/components/dropdown/dropdown-sub.vue_vue_type_script_setup_true_lang.js +5 -4
- package/dist/components/dropdown/dropdown-sub.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/dropdown/dropdown.js.map +1 -1
- package/dist/components/dropdown/dropdown.vue_vue_type_script_setup_true_lang.js +2 -1
- package/dist/components/dropdown/dropdown.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/dropdown/dropdown2.js.map +1 -1
- package/dist/components/dropdown/index.js +4 -5
- package/dist/components/dropdown/index.js.map +1 -1
- package/dist/components/dropdown/item-components.js +11 -0
- package/dist/components/dropdown/item-components.js.map +1 -0
- package/dist/components/dropdown/menu-entries.js +14 -0
- package/dist/components/dropdown/menu-entries.js.map +1 -0
- package/dist/components/dropdown/menu-keys.js +1 -1
- package/dist/components/dropdown/menu-keys.js.map +1 -1
- package/dist/components/ellipsis/ellipsis.js.map +1 -1
- package/dist/components/ellipsis/ellipsis.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/ellipsis/ellipsis.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/image-cropper/image-cropper.js.map +1 -1
- package/dist/components/image-cropper/image-cropper.vue_vue_type_script_setup_true_lang.js +10 -10
- package/dist/components/image-cropper/image-cropper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/infinite-scroll/infinite-scroll.js.map +1 -1
- package/dist/components/infinite-scroll/infinite-scroll.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/infinite-scroll/infinite-scroll.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/input-date/segment-field.js.map +1 -1
- package/dist/components/input-date/segment-field.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/input-date/segment-field.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/input-date/style.js +1 -0
- package/dist/components/input-time/style.js +1 -0
- package/dist/components/layout/layout-aside-trigger.js.map +1 -1
- package/dist/components/layout/layout-aside-trigger.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/layout/layout-aside-trigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/layout/layout-aside.js.map +1 -1
- package/dist/components/layout/layout-aside.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/components/layout/layout-aside.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/layout/layout-footer.js.map +1 -1
- package/dist/components/layout/layout-footer.vue_vue_type_script_setup_true_lang.js +5 -1
- package/dist/components/layout/layout-footer.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/layout/layout.js.map +1 -1
- package/dist/components/markdown/index.js +9 -0
- package/dist/components/markdown/index.js.map +1 -0
- package/dist/components/markdown/markdown.js +6 -0
- package/dist/components/markdown/markdown.js.map +1 -0
- package/dist/components/markdown/markdown.vue_vue_type_script_setup_true_lang.js +225 -0
- package/dist/components/markdown/markdown.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/markdown/parse-block.js +577 -0
- package/dist/components/markdown/parse-block.js.map +1 -0
- package/dist/components/markdown/parse-inline.js +626 -0
- package/dist/components/markdown/parse-inline.js.map +1 -0
- package/dist/components/markdown/parser.js +308 -0
- package/dist/components/markdown/parser.js.map +1 -0
- package/dist/components/markdown/render.js +424 -0
- package/dist/components/markdown/render.js.map +1 -0
- package/dist/components/markdown/style.d.ts +1 -0
- package/dist/components/markdown/style.js +10 -0
- package/dist/components/markdown/url.js +16 -0
- package/dist/components/markdown/url.js.map +1 -0
- package/dist/components/menu/menu-item.js.map +1 -1
- package/dist/components/menu/menu-item.vue_vue_type_script_setup_true_lang.js +3 -2
- package/dist/components/menu/menu-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/menu/menu-list.js.map +1 -1
- package/dist/components/menu/menu-list.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/menu/menu-list.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/menu/menu-popup.js.map +1 -1
- package/dist/components/menu/menu-popup.vue_vue_type_script_setup_true_lang.js +33 -21
- package/dist/components/menu/menu-popup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/menu/menu.js +16 -13
- package/dist/components/menu/menu.js.map +1 -1
- package/dist/components/menu/menu.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/components/menu/menu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/menu/menu2.js.map +1 -1
- package/dist/components/menubar/menubar.js.map +1 -1
- package/dist/components/node-graph/layout.js +136 -31
- package/dist/components/node-graph/layout.js.map +1 -1
- package/dist/components/node-graph/node-graph-legend.js.map +1 -1
- package/dist/components/node-graph/node-graph-legend.vue_vue_type_script_setup_true_lang.js +5 -5
- package/dist/components/node-graph/node-graph-legend.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/node-graph/node-graph.js.map +1 -1
- package/dist/components/node-graph/node-graph.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/components/node-graph/node-graph.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/pagination/pagination-gap.js.map +1 -1
- package/dist/components/pagination/pagination-gap.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/pagination/pagination-gap.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/pagination/pagination.js.map +1 -1
- package/dist/components/pagination/pagination.vue_vue_type_script_setup_true_lang.js +7 -7
- package/dist/components/pagination/pagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/popconfirm/index.js +2 -0
- package/dist/components/popconfirm/index.js.map +1 -1
- package/dist/components/popconfirm/popconfirm.js.map +1 -1
- package/dist/components/popconfirm/popconfirm.vue_vue_type_script_setup_true_lang.js +6 -2
- package/dist/components/popconfirm/popconfirm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/popover/index.js +2 -0
- package/dist/components/popover/index.js.map +1 -1
- package/dist/components/popover/popover.js.map +1 -1
- package/dist/components/popover/popover.vue_vue_type_script_setup_true_lang.js +12 -5
- package/dist/components/popover/popover.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/progress-group/progress-group.js.map +1 -1
- package/dist/components/progress-group/progress-group.vue_vue_type_script_setup_true_lang.js +11 -4
- package/dist/components/progress-group/progress-group.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/qrcode/qrcode.js.map +1 -1
- package/dist/components/qrcode/qrcode.vue_vue_type_script_setup_true_lang.js +10 -2
- package/dist/components/qrcode/qrcode.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/select/select.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/select/select.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/slider/slider.js.map +1 -1
- package/dist/components/slider/slider.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/slider/slider.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/status-dot/index.js +7 -0
- package/dist/components/status-dot/index.js.map +1 -0
- package/dist/components/status-dot/status-dot.js +26 -0
- package/dist/components/status-dot/status-dot.js.map +1 -0
- package/dist/components/status-dot/status-dot.vue_vue_type_script_lang.js +43 -0
- package/dist/components/status-dot/status-dot.vue_vue_type_script_lang.js.map +1 -0
- package/dist/components/status-dot/status-dot2.js +6 -0
- package/dist/components/status-dot/status-dot2.js.map +1 -0
- package/dist/components/status-dot/style.d.ts +1 -0
- package/dist/components/status-dot/style.js +2 -0
- package/dist/components/steps/steps.js.map +1 -1
- package/dist/components/steps/steps.vue_vue_type_script_setup_true_lang.js +6 -6
- package/dist/components/steps/steps.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/table/table.vue_vue_type_script_setup_true_lang.js +19 -14
- package/dist/components/table/table.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tabs/tab-panel.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/tabs/tab-panel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tabs/tabs.js.map +1 -1
- package/dist/components/tabs/tabs.vue_vue_type_script_setup_true_lang.js +117 -47
- package/dist/components/tabs/tabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tabs/tabs2.js.map +1 -1
- package/dist/components/tag/tag.js.map +1 -1
- package/dist/components/tag/tag.vue_vue_type_script_setup_true_lang.js +21 -4
- package/dist/components/tag/tag.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/timeline/style.js +1 -0
- package/dist/components/timeline/timeline-item.js.map +1 -1
- package/dist/components/timeline/timeline-item.vue_vue_type_script_setup_true_lang.js +6 -2
- package/dist/components/timeline/timeline-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tooltip/index.js +2 -0
- package/dist/components/tooltip/index.js.map +1 -1
- package/dist/components/tooltip/tooltip.js.map +1 -1
- package/dist/components/tooltip/tooltip.vue_vue_type_script_setup_true_lang.js +55 -8
- package/dist/components/tooltip/tooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tour/tour.js.map +1 -1
- package/dist/components/tour/tour.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/components/tour/tour.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/transfer/transfer-list.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/tree/tree.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/tree-select/tree-select.js.map +1 -1
- package/dist/components/tree-select/tree-select.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/components/tree-select/tree-select.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/upload/upload.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/upload/upload.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/upload/upload2.js.map +1 -1
- package/dist/components/user/user.js.map +1 -1
- package/dist/components/user/user.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/user/user.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/composables/use-popup.js +30 -5
- package/dist/composables/use-popup.js.map +1 -1
- package/dist/index.js +23 -17
- package/dist/index.js.map +1 -1
- package/dist/locale/en.js +13 -8
- package/dist/locale/en.js.map +1 -1
- package/dist/locale/zh-cn.js +13 -8
- package/dist/locale/zh-cn.js.map +1 -1
- package/dist/locale/zh-tw.js +13 -8
- package/dist/locale/zh-tw.js.map +1 -1
- package/dist/plugin.js +21 -14
- package/dist/plugin.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/components/button/button.d.ts +5 -1
- package/dist/types/components/calendar-view/calendar-view.d.ts +6 -0
- package/dist/types/components/calendar-view/calendar-view.vue.d.ts +1 -0
- package/dist/types/components/calendar-view/index.d.ts +3 -0
- package/dist/types/components/chat-artifact/chat-artifact.d.ts +2 -1
- package/dist/types/components/chat-attachments/chat-attachments.d.ts +2 -2
- package/dist/types/components/chat-confirm/chat-confirm.d.ts +7 -2
- package/dist/types/components/chat-list/index.d.ts +3 -3
- package/dist/types/components/chat-message/chat-message.d.ts +26 -3
- package/dist/types/components/chat-message/chat-message.vue.d.ts +4 -3
- package/dist/types/components/chat-message/index.d.ts +7 -4
- package/dist/types/components/chat-plan/chat-plan.d.ts +19 -2
- package/dist/types/components/chat-plan/chat-plan.vue.d.ts +2 -0
- package/dist/types/components/chat-plan/index.d.ts +6 -0
- package/dist/types/components/chat-sources/chat-sources.d.ts +6 -1
- package/dist/types/components/chat-steps/chat-steps.d.ts +10 -4
- package/dist/types/components/chat-steps/chat-steps.vue.d.ts +1 -1
- package/dist/types/components/chat-steps/index.d.ts +3 -3
- package/dist/types/components/chat-tool-call/chat-tool-call.d.ts +12 -3
- package/dist/types/components/chat-tool-call/chat-tool-call.vue.d.ts +1 -0
- package/dist/types/components/chat-tool-call/index.d.ts +3 -0
- package/dist/types/components/checkbox/index.d.ts +5 -5
- package/dist/types/components/code-block/code-block.d.ts +11 -0
- package/dist/types/components/code-block/code-block.vue.d.ts +3 -1
- package/dist/types/components/code-block/index.d.ts +9 -3
- package/dist/types/components/collapse/collapse-transition.d.ts +2 -7
- package/dist/types/components/collapse/collapse.vue.d.ts +1 -1
- package/dist/types/components/collapse/index.d.ts +5 -6
- package/dist/types/components/context-menu/context-menu.d.ts +37 -4
- package/dist/types/components/context-menu/context-menu.vue.d.ts +2 -0
- package/dist/types/components/context-menu/index.d.ts +5 -0
- package/dist/types/components/copy-button/copy-button.vue.d.ts +1 -1
- package/dist/types/components/copy-button/index.d.ts +1 -1
- package/dist/types/components/descriptions/descriptions.d.ts +9 -1
- package/dist/types/components/descriptions/descriptions.vue.d.ts +1 -0
- package/dist/types/components/descriptions/index.d.ts +3 -0
- package/dist/types/components/dropdown/dropdown-group.vue.d.ts +13 -0
- package/dist/types/components/dropdown/dropdown-items.vue.d.ts +2 -2
- package/dist/types/components/dropdown/dropdown-radio-group.vue.d.ts +8 -4
- package/dist/types/components/dropdown/dropdown.d.ts +28 -6
- package/dist/types/components/dropdown/dropdown.vue.d.ts +1 -1
- package/dist/types/components/dropdown/index.d.ts +10 -81
- package/dist/types/components/dropdown/item-components.d.ts +103 -0
- package/dist/types/components/dropdown/menu-entries.d.ts +4 -0
- package/dist/types/components/index.d.ts +2 -0
- package/dist/types/components/layout/index.d.ts +12 -6
- package/dist/types/components/layout/layout-aside.vue.d.ts +1 -1
- package/dist/types/components/layout/layout-footer.vue.d.ts +4 -2
- package/dist/types/components/layout/layout.d.ts +4 -0
- package/dist/types/components/markdown/index.d.ts +58 -0
- package/dist/types/components/markdown/markdown.d.ts +251 -0
- package/dist/types/components/markdown/markdown.vue.d.ts +22 -0
- package/dist/types/components/markdown/parse-block.d.ts +61 -0
- package/dist/types/components/markdown/parse-inline.d.ts +19 -0
- package/dist/types/components/markdown/parser.d.ts +22 -0
- package/dist/types/components/markdown/render.d.ts +84 -0
- package/dist/types/components/markdown/url.d.ts +10 -0
- package/dist/types/components/masonry/index.d.ts +3 -3
- package/dist/types/components/menu/index.d.ts +8 -3
- package/dist/types/components/menu/menu.d.ts +16 -5
- package/dist/types/components/menu/menu.vue.d.ts +3 -1
- package/dist/types/components/menubar/menubar.d.ts +1 -1
- package/dist/types/components/node-graph/layout.d.ts +16 -0
- package/dist/types/components/node-graph/node-graph.d.ts +1 -1
- package/dist/types/components/popover/index.d.ts +3 -3
- package/dist/types/components/popover/popover.vue.d.ts +1 -1
- package/dist/types/components/progress-group/index.d.ts +3 -0
- package/dist/types/components/progress-group/progress-group.d.ts +7 -0
- package/dist/types/components/progress-group/progress-group.vue.d.ts +1 -0
- package/dist/types/components/qrcode/index.d.ts +3 -0
- package/dist/types/components/qrcode/qrcode.d.ts +5 -0
- package/dist/types/components/qrcode/qrcode.vue.d.ts +1 -0
- package/dist/types/components/sortable/index.d.ts +3 -3
- package/dist/types/components/status-dot/index.d.ts +51 -0
- package/dist/types/components/status-dot/status-dot.d.ts +46 -0
- package/dist/types/components/status-dot/status-dot.vue.d.ts +46 -0
- package/dist/types/components/steps/steps.d.ts +1 -1
- package/dist/types/components/switch/index.d.ts +3 -3
- package/dist/types/components/table/index.d.ts +4 -3
- package/dist/types/components/table/table.d.ts +6 -1
- package/dist/types/components/tabs/index.d.ts +3 -0
- package/dist/types/components/tabs/tabs.d.ts +16 -3
- package/dist/types/components/tabs/tabs.vue.d.ts +1 -0
- package/dist/types/components/timeline/index.d.ts +3 -3
- package/dist/types/components/timeline/timeline-item.vue.d.ts +1 -1
- package/dist/types/components/virtual-list/index.d.ts +3 -3
- package/dist/types/composables/use-popup.d.ts +15 -5
- package/dist/types/locale/types.d.ts +18 -7
- package/dist/types/utils/only-child.d.ts +3 -1
- package/dist/types/utils/pointer.d.ts +5 -0
- package/dist/types/utils/safe-url.d.ts +14 -0
- package/dist/types/utils/status-check.d.ts +8 -0
- package/dist/utils/install.js +5 -0
- package/dist/utils/install.js.map +1 -1
- package/dist/utils/only-child.js +56 -5
- package/dist/utils/only-child.js.map +1 -1
- package/dist/utils/pointer.js +6 -1
- package/dist/utils/pointer.js.map +1 -1
- package/dist/utils/safe-url.js +57 -0
- package/dist/utils/safe-url.js.map +1 -0
- package/dist/utils/status-check.js +27 -0
- package/dist/utils/status-check.js.map +1 -0
- package/package.json +3 -3
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useNamespace } from "../../utils/namespace.js";
|
|
2
|
-
import {
|
|
2
|
+
import { DouCollapseTransition } from "./collapse-transition.js";
|
|
3
3
|
import { collapseKey } from "./collapse.js";
|
|
4
4
|
import { computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, inject, normalizeClass, openBlock, ref, renderSlot, toDisplayString, unref, useId, useSlots, vShow, watch, withCtx, withDirectives } from "vue";
|
|
5
5
|
import { ChevronRightIcon } from "@dou-ui/icons";
|
|
@@ -57,7 +57,7 @@ var collapse_item_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
|
|
|
57
57
|
}, [createVNode(unref(ChevronRightIcon), { class: normalizeClass(unref(ns).e("arrow")) }, null, 8, ["class"]), createElementVNode("span", { class: normalizeClass(unref(ns).e("title")) }, [renderSlot(_ctx.$slots, "title", { open: open.value }, () => [createTextVNode(toDisplayString(__props.title ?? __props.value), 1)])], 2)], 10, _hoisted_2), slots.extra ? (openBlock(), createElementBlock("div", {
|
|
58
58
|
key: 0,
|
|
59
59
|
class: normalizeClass(unref(ns).e("extra"))
|
|
60
|
-
}, [renderSlot(_ctx.$slots, "extra")], 2)) : createCommentVNode("", true)], 10, _hoisted_1), createVNode(unref(
|
|
60
|
+
}, [renderSlot(_ctx.$slots, "extra")], 2)) : createCommentVNode("", true)], 10, _hoisted_1), createVNode(unref(DouCollapseTransition), null, {
|
|
61
61
|
default: withCtx(() => [withDirectives(createElementVNode("div", {
|
|
62
62
|
id: `${unref(id)}-panel`,
|
|
63
63
|
role: "region",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collapse-item.vue_vue_type_script_setup_true_lang.js","names":["_useSlots","_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_createVNode","_renderSlot","_createTextVNode","_toDisplayString","_createCommentVNode","_withCtx","_withDirectives","_vShow"],"sources":["../../../src/components/collapse/collapse-item.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ChevronRightIcon } from '@dou-ui/icons'\nimport { computed, inject, ref, useId, watch } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { collapseKey } from './collapse'\nimport { CollapseTransition } from './collapse-transition'\nimport type { CollapseItemProps, CollapseItemSlots } from './collapse'\n\ndefineOptions({ name: 'DouCollapseItem' })\n\nconst props = withDefaults(defineProps<CollapseItemProps>(), { disabled: false })\nconst slots = defineSlots<CollapseItemSlots>()\n\nconst ns = useNamespace('collapse')\nconst collapse = inject(collapseKey, undefined)\nconst id = useId()\n\nconst open = computed(() => !!collapse?.open.value.includes(props.value))\n\n// Render the content the first time the item opens, then keep it.\nconst visited = ref(open.value)\nwatch(open, (value) => {\n if (value) visited.value = true\n})\n\nfunction toggle() {\n if (!props.disabled) collapse?.toggle(props.value)\n}\n</script>\n\n<template>\n <div :class=\"[ns.e('item'), ns.is('open', open), ns.is('disabled', disabled)]\">\n <div role=\"heading\" :aria-level=\"collapse?.headingLevel.value ?? 3\" :class=\"ns.e('header')\">\n <button\n :id=\"`${id}-header`\"\n type=\"button\"\n :class=\"ns.e('trigger')\"\n :aria-expanded=\"open\"\n :aria-controls=\"`${id}-panel`\"\n :aria-disabled=\"disabled || undefined\"\n @click=\"toggle\"\n >\n <ChevronRightIcon :class=\"ns.e('arrow')\" />\n <span :class=\"ns.e('title')\">\n <slot name=\"title\" :open=\"open\">{{ title ?? value }}</slot>\n </span>\n </button>\n <div v-if=\"slots.extra\" :class=\"ns.e('extra')\"><slot name=\"extra\" /></div>\n </div>\n <CollapseTransition>\n <div\n v-show=\"open\"\n :id=\"`${id}-panel`\"\n role=\"region\"\n :class=\"ns.e('panel')\"\n :aria-labelledby=\"`${id}-header`\"\n >\n <div :class=\"ns.e('content')\"><slot v-if=\"visited\" /></div>\n </div>\n </CollapseTransition>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;EAUA,MAAM,QAAQ;EACd,MAAM,QAAQA,SAAA;EAEd,MAAM,KAAK,aAAa,UAAU;EAClC,MAAM,WAAW,OAAO,aAAa,KAAA,CAAS;EAC9C,MAAM,KAAK,MAAM;EAEjB,MAAM,OAAO,eAAe,CAAC,CAAC,UAAU,KAAK,MAAM,SAAS,MAAM,KAAK,CAAC;EAGxE,MAAM,UAAU,IAAI,KAAK,KAAK;EAC9B,MAAM,OAAO,UAAU;GACrB,IAAI,OAAO,QAAQ,QAAQ;EAC7B,CAAC;EAED,SAAS,SAAS;GAChB,IAAI,CAAC,MAAM,UAAU,UAAU,OAAO,MAAM,KAAK;EACnD;;GAIE,OAAAC,UAAA,GAAAC,mBA6BM,OAAA,EA7BA,OAAKC,eAAA;IAAGC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA;IAAUA,MAAA,EAAA,CAAE,CAAC,GAAE,QAAS,KAAA,KAAI;IAAGA,MAAA,EAAA,CAAE,CAAC,GAAE,YAAa,QAAA,QAAQ;GAAA,CAAA,E,IACzEC,mBAgBM,OAAA;IAhBD,MAAK;IAAW,cAAYD,MAAA,QAAA,CAAQ,EAAE,aAAa,SAAK;IAAQ,OAAKD,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,QAAA,CAAA;G,IAC9EC,mBAaS,UAAA;IAZN,IAAE,GAAKD,MAAA,EAAA,EAAE;IACV,MAAK;IACJ,OAAKD,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,SAAA,CAAA;IACX,iBAAe,KAAA;IACf,iBAAa,GAAKA,MAAA,EAAA,EAAE;IACpB,iBAAe,QAAA,YAAY,KAAA;IAC3B,SAAO;G,IAERE,YAA2CF,MAAA,gBAAA,GAAA,EAAxB,OAAKD,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA,E,wBAC9BC,mBAEO,QAAA,EAFA,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA,E,IAChBG,WAA2D,KAAA,QAAA,SAAA,EAAvC,MAAM,KAAA,MAAI,SAA6B,CAAxBC,gBAAAC,gBAAA,QAAA,SAAS,QAAA,KAAK,GAAA,CAAA,C,2BAG1C,MAAM,SAAjBR,UAAA,GAAAC,mBAA0E,OAAA;;IAAjD,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA;G,IAAWG,WAAqB,KAAA,QAAA,OAAA,C,yDAEtED,YAUqBF,
|
|
1
|
+
{"version":3,"file":"collapse-item.vue_vue_type_script_setup_true_lang.js","names":["_useSlots","_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_createVNode","_renderSlot","_createTextVNode","_toDisplayString","_createCommentVNode","CollapseTransition","_withCtx","_withDirectives","_vShow"],"sources":["../../../src/components/collapse/collapse-item.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ChevronRightIcon } from '@dou-ui/icons'\nimport { computed, inject, ref, useId, watch } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { collapseKey } from './collapse'\nimport { DouCollapseTransition as CollapseTransition } from './collapse-transition'\nimport type { CollapseItemProps, CollapseItemSlots } from './collapse'\n\ndefineOptions({ name: 'DouCollapseItem' })\n\nconst props = withDefaults(defineProps<CollapseItemProps>(), { disabled: false })\nconst slots = defineSlots<CollapseItemSlots>()\n\nconst ns = useNamespace('collapse')\nconst collapse = inject(collapseKey, undefined)\nconst id = useId()\n\nconst open = computed(() => !!collapse?.open.value.includes(props.value))\n\n// Render the content the first time the item opens, then keep it.\nconst visited = ref(open.value)\nwatch(open, (value) => {\n if (value) visited.value = true\n})\n\nfunction toggle() {\n if (!props.disabled) collapse?.toggle(props.value)\n}\n</script>\n\n<template>\n <div :class=\"[ns.e('item'), ns.is('open', open), ns.is('disabled', disabled)]\">\n <div role=\"heading\" :aria-level=\"collapse?.headingLevel.value ?? 3\" :class=\"ns.e('header')\">\n <button\n :id=\"`${id}-header`\"\n type=\"button\"\n :class=\"ns.e('trigger')\"\n :aria-expanded=\"open\"\n :aria-controls=\"`${id}-panel`\"\n :aria-disabled=\"disabled || undefined\"\n @click=\"toggle\"\n >\n <ChevronRightIcon :class=\"ns.e('arrow')\" />\n <span :class=\"ns.e('title')\">\n <slot name=\"title\" :open=\"open\">{{ title ?? value }}</slot>\n </span>\n </button>\n <div v-if=\"slots.extra\" :class=\"ns.e('extra')\"><slot name=\"extra\" /></div>\n </div>\n <CollapseTransition>\n <div\n v-show=\"open\"\n :id=\"`${id}-panel`\"\n role=\"region\"\n :class=\"ns.e('panel')\"\n :aria-labelledby=\"`${id}-header`\"\n >\n <div :class=\"ns.e('content')\"><slot v-if=\"visited\" /></div>\n </div>\n </CollapseTransition>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;EAUA,MAAM,QAAQ;EACd,MAAM,QAAQA,SAAA;EAEd,MAAM,KAAK,aAAa,UAAU;EAClC,MAAM,WAAW,OAAO,aAAa,KAAA,CAAS;EAC9C,MAAM,KAAK,MAAM;EAEjB,MAAM,OAAO,eAAe,CAAC,CAAC,UAAU,KAAK,MAAM,SAAS,MAAM,KAAK,CAAC;EAGxE,MAAM,UAAU,IAAI,KAAK,KAAK;EAC9B,MAAM,OAAO,UAAU;GACrB,IAAI,OAAO,QAAQ,QAAQ;EAC7B,CAAC;EAED,SAAS,SAAS;GAChB,IAAI,CAAC,MAAM,UAAU,UAAU,OAAO,MAAM,KAAK;EACnD;;GAIE,OAAAC,UAAA,GAAAC,mBA6BM,OAAA,EA7BA,OAAKC,eAAA;IAAGC,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA;IAAUA,MAAA,EAAA,CAAE,CAAC,GAAE,QAAS,KAAA,KAAI;IAAGA,MAAA,EAAA,CAAE,CAAC,GAAE,YAAa,QAAA,QAAQ;GAAA,CAAA,E,IACzEC,mBAgBM,OAAA;IAhBD,MAAK;IAAW,cAAYD,MAAA,QAAA,CAAQ,EAAE,aAAa,SAAK;IAAQ,OAAKD,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,QAAA,CAAA;G,IAC9EC,mBAaS,UAAA;IAZN,IAAE,GAAKD,MAAA,EAAA,EAAE;IACV,MAAK;IACJ,OAAKD,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,SAAA,CAAA;IACX,iBAAe,KAAA;IACf,iBAAa,GAAKA,MAAA,EAAA,EAAE;IACpB,iBAAe,QAAA,YAAY,KAAA;IAC3B,SAAO;G,IAERE,YAA2CF,MAAA,gBAAA,GAAA,EAAxB,OAAKD,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA,E,wBAC9BC,mBAEO,QAAA,EAFA,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA,E,IAChBG,WAA2D,KAAA,QAAA,SAAA,EAAvC,MAAM,KAAA,MAAI,SAA6B,CAAxBC,gBAAAC,gBAAA,QAAA,SAAS,QAAA,KAAK,GAAA,CAAA,C,2BAG1C,MAAM,SAAjBR,UAAA,GAAAC,mBAA0E,OAAA;;IAAjD,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA;G,IAAWG,WAAqB,KAAA,QAAA,OAAA,C,yDAEtED,YAUqBF,MAAAO,qBAAA,GAAA,MAAA;IATnB,SAAAC,cAQM,CARNC,eAAAR,mBAQM,OAAA;KANH,IAAE,GAAKD,MAAA,EAAA,EAAE;KACV,MAAK;KACJ,OAAKD,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA;KACX,mBAAe,GAAKA,MAAA,EAAA,EAAE;I,IAEvBC,mBAA2D,OAAA,EAArD,OAAKF,eAAEC,MAAA,EAAA,CAAE,CAAC,EAAC,SAAA,CAAA,E,IAAyB,QAAA,QAAZG,WAAuB,KAAA,QAAA,WAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,I,sDAN7C,CAAAO,OAAA,KAAA,KAAI,C"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { withInstall } from "../../utils/install.js";
|
|
1
2
|
import { Transition, defineComponent, h } from "vue";
|
|
2
3
|
// src/components/collapse/collapse-transition.ts
|
|
3
4
|
var reset = (el) => {
|
|
@@ -37,6 +38,7 @@ var CollapseTransition = defineComponent({
|
|
|
37
38
|
onLeaveCancelled: reset
|
|
38
39
|
}, slots)
|
|
39
40
|
});
|
|
40
|
-
|
|
41
|
+
var DouCollapseTransition = withInstall(CollapseTransition);
|
|
42
|
+
export { DouCollapseTransition };
|
|
41
43
|
|
|
42
44
|
//# sourceMappingURL=collapse-transition.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collapse-transition.js","names":[],"sources":["../../../src/components/collapse/collapse-transition.ts"],"sourcesContent":["import { Transition, defineComponent, h } from 'vue'\n\nconst reset = (el: Element) => {\n const style = (el as HTMLElement).style\n style.height = ''\n style.overflow = ''\n}\n\n/**\n * Animate an element's height between zero and its natural size. Used by\n * every disclosure (collapse items, menu submenus) so they move alike, and\n * exported as `DouCollapseTransition` for content of your own.\n */\
|
|
1
|
+
{"version":3,"file":"collapse-transition.js","names":[],"sources":["../../../src/components/collapse/collapse-transition.ts"],"sourcesContent":["import { Transition, defineComponent, h } from 'vue'\nimport { withInstall } from '../../utils/install'\n\nconst reset = (el: Element) => {\n const style = (el as HTMLElement).style\n style.height = ''\n style.overflow = ''\n}\n\n/**\n * Animate an element's height between zero and its natural size. Used by\n * every disclosure (collapse items, menu submenus) so they move alike, and\n * exported as `DouCollapseTransition` for content of your own.\n */\nconst CollapseTransition = defineComponent({\n name: 'DouCollapseTransition',\n setup:\n (_, { slots }) =>\n () =>\n h(\n Transition,\n {\n name: 'dou-collapse',\n onBeforeEnter(el) {\n const style = (el as HTMLElement).style\n style.height = '0'\n style.overflow = 'hidden'\n },\n onEnter(el) {\n ;(el as HTMLElement).style.height = `${el.scrollHeight}px`\n },\n onAfterEnter: reset,\n onEnterCancelled: reset,\n onBeforeLeave(el) {\n const style = (el as HTMLElement).style\n style.height = `${el.scrollHeight}px`\n style.overflow = 'hidden'\n },\n onLeave(el) {\n // read layout so the browser starts from the measured height\n void (el as HTMLElement).offsetHeight\n ;(el as HTMLElement).style.height = '0'\n },\n onAfterLeave: reset,\n onLeaveCancelled: reset,\n },\n slots,\n ),\n})\n\n// 在这里包装而不是在 index 里:别的组件直接从这个模块取,按需引入时也能读到默认值\nexport const DouCollapseTransition = withInstall(CollapseTransition)\n"],"mappings":";;;AAGA,IAAM,SAAS,OAAgB;CAC7B,MAAM,QAAS,GAAmB;CAClC,MAAM,SAAS;CACf,MAAM,WAAW;AACnB;;;;;;AAOA,IAAM,qBAAqB,gBAAgB;CACzC,MAAM;CACN,QACG,GAAG,EAAE,kBAEJ,EACE,YACA;EACE,MAAM;EACN,cAAc,IAAI;GAChB,MAAM,QAAS,GAAmB;GAClC,MAAM,SAAS;GACf,MAAM,WAAW;EACnB;EACA,QAAQ,IAAI;GACT,GAAoB,MAAM,SAAS,GAAG,GAAG,aAAa;EACzD;EACA,cAAc;EACd,kBAAkB;EAClB,cAAc,IAAI;GAChB,MAAM,QAAS,GAAmB;GAClC,MAAM,SAAS,GAAG,GAAG,aAAa;GAClC,MAAM,WAAW;EACnB;EACA,QAAQ,IAAI;GAEV,GAAyB;GACxB,GAAoB,MAAM,SAAS;EACtC;EACA,cAAc;EACd,kBAAkB;CACpB,GACA,KACF;AACN,CAAC;AAGD,IAAa,wBAAwB,YAAY,kBAAkB"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { withInstall } from "../../utils/install.js";
|
|
2
|
-
import {
|
|
2
|
+
import { DouCollapseTransition } from "./collapse-transition.js";
|
|
3
3
|
import collapse_default from "./collapse2.js";
|
|
4
4
|
import collapse_item_default from "./collapse-item.js";
|
|
5
5
|
// src/components/collapse/index.ts
|
|
6
6
|
var DouCollapse = withInstall(collapse_default);
|
|
7
7
|
var DouCollapseItem = withInstall(collapse_item_default);
|
|
8
|
-
var DouCollapseTransition = withInstall(CollapseTransition);
|
|
9
8
|
export { DouCollapse, DouCollapse as default, DouCollapseItem, DouCollapseTransition };
|
|
10
9
|
|
|
11
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["Collapse","CollapseItem"],"sources":["../../../src/components/collapse/index.ts"],"sourcesContent":["import { withInstall } from '../../utils/install'\nimport Collapse from './collapse.vue'\nimport CollapseItem from './collapse-item.vue'\nimport {
|
|
1
|
+
{"version":3,"file":"index.js","names":["Collapse","CollapseItem"],"sources":["../../../src/components/collapse/index.ts"],"sourcesContent":["import { withInstall } from '../../utils/install'\nimport Collapse from './collapse.vue'\nimport CollapseItem from './collapse-item.vue'\nimport { DouCollapseTransition } from './collapse-transition'\n\nexport const DouCollapse = withInstall(Collapse)\nexport const DouCollapseItem = withInstall(CollapseItem)\nexport { DouCollapseTransition }\nexport default DouCollapse\n\nexport type * from './collapse'\nexport type CollapseInstance = InstanceType<typeof Collapse>\nexport type CollapseItemInstance = InstanceType<typeof CollapseItem>\n\ndeclare module 'vue' {\n export interface GlobalComponents {\n DouCollapse: typeof DouCollapse\n DouCollapseItem: typeof DouCollapseItem\n DouCollapseTransition: typeof DouCollapseTransition\n }\n}\n"],"mappings":";;;;;AAKA,IAAa,cAAc,YAAYA,gBAAQ;AAC/C,IAAa,kBAAkB,YAAYC,qBAAY"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color-mode-button.js","names":["_sfc_main"],"sources":["../../../src/components/color-mode/color-mode-button.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { MoonIcon, SunIcon } from '@dou-ui/icons'\nimport { onMounted, ref } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport DouButton from '../button
|
|
1
|
+
{"version":3,"file":"color-mode-button.js","names":["_sfc_main"],"sources":["../../../src/components/color-mode/color-mode-button.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { MoonIcon, SunIcon } from '@dou-ui/icons'\nimport { onMounted, ref } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { DouButton } from '../button'\nimport { useLocale } from '../config-provider/use-config'\nimport { useColorMode } from './use-color-mode'\nimport type { ColorModeButtonProps } from './color-mode'\n\ndefineOptions({ name: 'DouColorModeButton' })\n\nwithDefaults(defineProps<ColorModeButtonProps>(), { variant: 'ghost' })\n\nconst ns = useNamespace('color-mode-button')\nconst { t } = useLocale()\nconst { isDark } = useColorMode()\n\n// The server cannot know the mode, so the icon waits for the browser.\nconst mounted = ref(false)\nonMounted(() => (mounted.value = true))\n</script>\n\n<template>\n <DouButton\n :class=\"[ns.b(), ns.is('pending', !mounted)]\"\n :size=\"size\"\n :variant=\"variant\"\n :aria-label=\"t(mounted && isDark ? 'colorMode.toLight' : 'colorMode.toDark')\"\n @click=\"isDark = !isDark\"\n >\n <template #leading>\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <MoonIcon v-if=\"mounted && isDark\" />\n <SunIcon v-else-if=\"mounted\" />\n </span>\n </template>\n </DouButton>\n</template>\n"],"mappings":""}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useNamespace } from "../../utils/namespace.js";
|
|
2
2
|
import { useLocale } from "../config-provider/use-config.js";
|
|
3
|
-
import
|
|
3
|
+
import { DouButton } from "../button/index.js";
|
|
4
4
|
import { useColorMode } from "./use-color-mode.js";
|
|
5
5
|
import { createBlock, createCommentVNode, createElementVNode, defineComponent, normalizeClass, onMounted, openBlock, ref, unref, withCtx } from "vue";
|
|
6
6
|
import { MoonIcon, SunIcon } from "@dou-ui/icons";
|
|
@@ -19,7 +19,7 @@ var color_mode_button_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
|
|
|
19
19
|
const mounted = ref(false);
|
|
20
20
|
onMounted(() => mounted.value = true);
|
|
21
21
|
return (_ctx, _cache) => {
|
|
22
|
-
return openBlock(), createBlock(
|
|
22
|
+
return openBlock(), createBlock(unref(DouButton), {
|
|
23
23
|
class: normalizeClass([unref(ns).b(), unref(ns).is("pending", !mounted.value)]),
|
|
24
24
|
size: __props.size,
|
|
25
25
|
variant: __props.variant,
|
package/dist/components/color-mode/color-mode-button.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color-mode-button.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","
|
|
1
|
+
{"version":3,"file":"color-mode-button.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_unref","_normalizeClass","_withCtx","_createElementVNode","_createCommentVNode"],"sources":["../../../src/components/color-mode/color-mode-button.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { MoonIcon, SunIcon } from '@dou-ui/icons'\nimport { onMounted, ref } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { DouButton } from '../button'\nimport { useLocale } from '../config-provider/use-config'\nimport { useColorMode } from './use-color-mode'\nimport type { ColorModeButtonProps } from './color-mode'\n\ndefineOptions({ name: 'DouColorModeButton' })\n\nwithDefaults(defineProps<ColorModeButtonProps>(), { variant: 'ghost' })\n\nconst ns = useNamespace('color-mode-button')\nconst { t } = useLocale()\nconst { isDark } = useColorMode()\n\n// The server cannot know the mode, so the icon waits for the browser.\nconst mounted = ref(false)\nonMounted(() => (mounted.value = true))\n</script>\n\n<template>\n <DouButton\n :class=\"[ns.b(), ns.is('pending', !mounted)]\"\n :size=\"size\"\n :variant=\"variant\"\n :aria-label=\"t(mounted && isDark ? 'colorMode.toLight' : 'colorMode.toDark')\"\n @click=\"isDark = !isDark\"\n >\n <template #leading>\n <span :class=\"ns.e('icon')\" aria-hidden=\"true\">\n <MoonIcon v-if=\"mounted && isDark\" />\n <SunIcon v-else-if=\"mounted\" />\n </span>\n </template>\n </DouButton>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;EAaA,MAAM,KAAK,aAAa,mBAAmB;EAC3C,MAAM,EAAE,MAAM,UAAU;EACxB,MAAM,EAAE,WAAW,aAAa;EAGhC,MAAM,UAAU,IAAI,KAAK;EACzB,gBAAiB,QAAQ,QAAQ,IAAK;;GAIpC,OAAAA,UAAA,GAAAC,YAaYC,MAAA,SAAA,GAAA;IAZT,OAAKC,eAAA,CAAGD,MAAA,EAAA,CAAE,CAAC,EAAC,GAAIA,MAAA,EAAA,CAAE,CAAC,GAAE,WAAA,CAAa,QAAA,KAAO,CAAA,CAAA;IACzC,MAAM,QAAA;IACN,SAAS,QAAA;IACT,cAAYA,MAAA,CAAA,CAAC,CAAC,QAAA,SAAWA,MAAA,MAAA,IAAM,sBAAA,kBAAA;IAC/B,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,OAAA,QAAM,CAAIA,MAAA,MAAA;;IAEP,SAAOE,cAIT,CAHPC,mBAGO,QAAA;KAHA,OAAKF,eAAED,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA;KAAU,eAAY;I,IACtB,QAAA,SAAWA,MAAA,MAAA,KAA3BF,UAAA,GAAAC,YAAqCC,MAAA,QAAA,GAAA,EAAA,KAAA,EAAA,CAAA,KACjB,QAAA,SAApBF,UAAA,GAAAC,YAA+BC,MAAA,OAAA,GAAA,EAAA,KAAA,EAAA,CAAA,K"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color-mode-select.js","names":["_sfc_main"],"sources":["../../../src/components/color-mode/color-mode-select.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { MonitorIcon, MoonIcon, SunIcon } from '@dou-ui/icons'\nimport { computed, onMounted, ref } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport DouSelect from '../select
|
|
1
|
+
{"version":3,"file":"color-mode-select.js","names":["_sfc_main"],"sources":["../../../src/components/color-mode/color-mode-select.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { MonitorIcon, MoonIcon, SunIcon } from '@dou-ui/icons'\nimport { computed, onMounted, ref } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport { DouSelect } from '../select'\nimport type { SelectValue } from '../select/select'\nimport { useColorMode } from './use-color-mode'\nimport type { ColorMode, ColorModeSelectProps } from './color-mode'\n\ndefineOptions({ name: 'DouColorModeSelect' })\n\ndefineProps<ColorModeSelectProps>()\n\nconst ns = useNamespace('color-mode-select')\nconst { t } = useLocale()\nconst { mode } = useColorMode()\n\nconst icons = { light: SunIcon, dark: MoonIcon, system: MonitorIcon }\nconst options = computed(() =>\n (['light', 'dark', 'system'] as const).map((value) => ({\n value,\n label: t(`colorMode.${value}`),\n })),\n)\n\n// The server renders the initial mode; the browser's choice shows once mounted.\nconst mounted = ref(false)\nonMounted(() => (mounted.value = true))\nconst shown = computed<ColorMode | undefined>(() => (mounted.value ? mode.value : undefined))\n\nfunction onChange(value: SelectValue | SelectValue[] | null | undefined) {\n if (value === 'light' || value === 'dark' || value === 'system') mode.value = value\n}\n</script>\n\n<template>\n <DouSelect\n :class=\"ns.b()\"\n :model-value=\"shown\"\n :options=\"options\"\n :size=\"size\"\n :disabled=\"disabled\"\n :placeholder=\"t('colorMode.label')\"\n :aria-label=\"t('colorMode.label')\"\n @update:model-value=\"onChange\"\n >\n <template #prefix>\n <component :is=\"icons[shown ?? 'system']\" :class=\"ns.e('icon')\" />\n </template>\n <template #option=\"{ option }\">\n <span :class=\"ns.e('option')\">\n <component :is=\"icons[option.value as ColorMode]\" :class=\"ns.e('icon')\" />\n <span :class=\"ns.e('label')\">{{ option.label }}</span>\n </span>\n </template>\n </DouSelect>\n</template>\n"],"mappings":""}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useNamespace } from "../../utils/namespace.js";
|
|
2
2
|
import { useLocale } from "../config-provider/use-config.js";
|
|
3
3
|
import { useColorMode } from "./use-color-mode.js";
|
|
4
|
-
import
|
|
4
|
+
import { DouSelect } from "../select/index.js";
|
|
5
5
|
import { computed, createBlock, createElementVNode, defineComponent, normalizeClass, onMounted, openBlock, ref, resolveDynamicComponent, toDisplayString, unref, withCtx } from "vue";
|
|
6
6
|
import { MonitorIcon, MoonIcon, SunIcon } from "@dou-ui/icons";
|
|
7
7
|
// src/components/color-mode/color-mode-select.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -36,7 +36,7 @@ var color_mode_select_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
|
|
|
36
36
|
if (value === "light" || value === "dark" || value === "system") mode.value = value;
|
|
37
37
|
}
|
|
38
38
|
return (_ctx, _cache) => {
|
|
39
|
-
return openBlock(), createBlock(
|
|
39
|
+
return openBlock(), createBlock(unref(DouSelect), {
|
|
40
40
|
class: normalizeClass(unref(ns).b()),
|
|
41
41
|
"model-value": shown.value,
|
|
42
42
|
options: options.value,
|
package/dist/components/color-mode/color-mode-select.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color-mode-select.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","
|
|
1
|
+
{"version":3,"file":"color-mode-select.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_unref","_normalizeClass","_withCtx","_resolveDynamicComponent","_createElementVNode","_toDisplayString"],"sources":["../../../src/components/color-mode/color-mode-select.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { MonitorIcon, MoonIcon, SunIcon } from '@dou-ui/icons'\nimport { computed, onMounted, ref } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport { DouSelect } from '../select'\nimport type { SelectValue } from '../select/select'\nimport { useColorMode } from './use-color-mode'\nimport type { ColorMode, ColorModeSelectProps } from './color-mode'\n\ndefineOptions({ name: 'DouColorModeSelect' })\n\ndefineProps<ColorModeSelectProps>()\n\nconst ns = useNamespace('color-mode-select')\nconst { t } = useLocale()\nconst { mode } = useColorMode()\n\nconst icons = { light: SunIcon, dark: MoonIcon, system: MonitorIcon }\nconst options = computed(() =>\n (['light', 'dark', 'system'] as const).map((value) => ({\n value,\n label: t(`colorMode.${value}`),\n })),\n)\n\n// The server renders the initial mode; the browser's choice shows once mounted.\nconst mounted = ref(false)\nonMounted(() => (mounted.value = true))\nconst shown = computed<ColorMode | undefined>(() => (mounted.value ? mode.value : undefined))\n\nfunction onChange(value: SelectValue | SelectValue[] | null | undefined) {\n if (value === 'light' || value === 'dark' || value === 'system') mode.value = value\n}\n</script>\n\n<template>\n <DouSelect\n :class=\"ns.b()\"\n :model-value=\"shown\"\n :options=\"options\"\n :size=\"size\"\n :disabled=\"disabled\"\n :placeholder=\"t('colorMode.label')\"\n :aria-label=\"t('colorMode.label')\"\n @update:model-value=\"onChange\"\n >\n <template #prefix>\n <component :is=\"icons[shown ?? 'system']\" :class=\"ns.e('icon')\" />\n </template>\n <template #option=\"{ option }\">\n <span :class=\"ns.e('option')\">\n <component :is=\"icons[option.value as ColorMode]\" :class=\"ns.e('icon')\" />\n <span :class=\"ns.e('label')\">{{ option.label }}</span>\n </span>\n </template>\n </DouSelect>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;EAcA,MAAM,KAAK,aAAa,mBAAmB;EAC3C,MAAM,EAAE,MAAM,UAAU;EACxB,MAAM,EAAE,SAAS,aAAa;EAE9B,MAAM,QAAQ;GAAE,OAAO;GAAS,MAAM;GAAU,QAAQ;EAAY;EACpE,MAAM,UAAU,eACb;GAAC;GAAS;GAAQ;EAAQ,CAAC,CAAW,KAAK,WAAW;GACrD;GACA,OAAO,EAAE,aAAa,OAAO;EAC/B,EAAE,CACJ;EAGA,MAAM,UAAU,IAAI,KAAK;EACzB,gBAAiB,QAAQ,QAAQ,IAAK;EACtC,MAAM,QAAQ,eAAuC,QAAQ,QAAQ,KAAK,QAAQ,KAAA,CAAU;EAE5F,SAAS,SAAS,OAAuD;GACvE,IAAI,UAAU,WAAW,UAAU,UAAU,UAAU,UAAU,KAAK,QAAQ;EAChF;;GAIE,OAAAA,UAAA,GAAAC,YAmBYC,MAAA,SAAA,GAAA;IAlBT,OAAKC,eAAED,MAAA,EAAA,CAAE,CAAC,EAAC,CAAA;IACX,eAAa,MAAA;IACb,SAAS,QAAA;IACT,MAAM,QAAA;IACN,UAAU,QAAA;IACV,aAAaA,MAAA,CAAA,CAAC,CAAA,iBAAA;IACd,cAAYA,MAAA,CAAA,CAAC,CAAA,iBAAA;IACb,uBAAoB;;IAEV,QAAME,cACmD,EAAlEJ,UAAA,GAAAC,YAAkEI,wBAAlD,MAAM,MAAA,SAAK,SAAA,GAAA,EAAgB,OAAKF,eAAED,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA,E;IAE7C,QAAME,SAIR,EAJY,aAAM,CACzBE,mBAGO,QAAA,EAHA,OAAKH,eAAED,MAAA,EAAA,CAAE,CAAC,EAAC,QAAA,CAAA,E,KAChBF,UAAA,GAAAC,YAA0EI,wBAA1D,MAAM,OAAO,MAAK,GAAA,EAAiB,OAAKF,eAAED,MAAA,EAAA,CAAE,CAAC,EAAC,MAAA,CAAA,E,yBAC9DI,mBAAsD,QAAA,EAA/C,OAAKH,eAAED,MAAA,EAAA,CAAE,CAAC,EAAC,OAAA,CAAA,EAAc,GAAAK,gBAAA,OAAO,KAAK,GAAA,CAAA,C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color-mode-switch.js","names":["_sfc_main"],"sources":["../../../src/components/color-mode/color-mode-switch.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onMounted, ref } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport DouSwitch from '../switch
|
|
1
|
+
{"version":3,"file":"color-mode-switch.js","names":["_sfc_main"],"sources":["../../../src/components/color-mode/color-mode-switch.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onMounted, ref } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport { DouSwitch } from '../switch'\nimport { useColorMode } from './use-color-mode'\nimport type { ColorModeSwitchProps, ColorModeSwitchSlots } from './color-mode'\n\ndefineOptions({ name: 'DouColorModeSwitch' })\n\ndefineProps<ColorModeSwitchProps>()\nconst slots = defineSlots<ColorModeSwitchSlots>()\n\nconst ns = useNamespace('color-mode-switch')\nconst { t } = useLocale()\nconst { isDark } = useColorMode()\n\n// Off on the server and in the first client render, then the real mode.\nconst mounted = ref(false)\nonMounted(() => (mounted.value = true))\n</script>\n\n<template>\n <DouSwitch\n :class=\"ns.b()\"\n :model-value=\"mounted && isDark\"\n :size=\"size\"\n :disabled=\"disabled\"\n :aria-label=\"t('colorMode.dark')\"\n @update:model-value=\"isDark = $event\"\n >\n <template v-if=\"slots.default\" #default><slot /></template>\n </DouSwitch>\n</template>\n"],"mappings":""}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useNamespace } from "../../utils/namespace.js";
|
|
2
2
|
import { useLocale } from "../config-provider/use-config.js";
|
|
3
3
|
import { useColorMode } from "./use-color-mode.js";
|
|
4
|
-
import
|
|
4
|
+
import { DouSwitch } from "../switch/index.js";
|
|
5
5
|
import { createBlock, createSlots, defineComponent, normalizeClass, onMounted, openBlock, ref, renderSlot, unref, useSlots, withCtx } from "vue";
|
|
6
6
|
// src/components/color-mode/color-mode-switch.vue?vue&type=script&setup=true&lang.ts
|
|
7
7
|
var color_mode_switch_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
@@ -19,7 +19,7 @@ var color_mode_switch_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
|
|
|
19
19
|
const mounted = ref(false);
|
|
20
20
|
onMounted(() => mounted.value = true);
|
|
21
21
|
return (_ctx, _cache) => {
|
|
22
|
-
return openBlock(), createBlock(
|
|
22
|
+
return openBlock(), createBlock(unref(DouSwitch), {
|
|
23
23
|
class: normalizeClass(unref(ns).b()),
|
|
24
24
|
"model-value": mounted.value && unref(isDark),
|
|
25
25
|
size: __props.size,
|
package/dist/components/color-mode/color-mode-switch.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color-mode-switch.vue_vue_type_script_setup_true_lang.js","names":["_useSlots","_openBlock","_createBlock","
|
|
1
|
+
{"version":3,"file":"color-mode-switch.vue_vue_type_script_setup_true_lang.js","names":["_useSlots","_openBlock","_createBlock","_unref","_normalizeClass","_createSlots","_withCtx","_renderSlot"],"sources":["../../../src/components/color-mode/color-mode-switch.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onMounted, ref } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport { DouSwitch } from '../switch'\nimport { useColorMode } from './use-color-mode'\nimport type { ColorModeSwitchProps, ColorModeSwitchSlots } from './color-mode'\n\ndefineOptions({ name: 'DouColorModeSwitch' })\n\ndefineProps<ColorModeSwitchProps>()\nconst slots = defineSlots<ColorModeSwitchSlots>()\n\nconst ns = useNamespace('color-mode-switch')\nconst { t } = useLocale()\nconst { isDark } = useColorMode()\n\n// Off on the server and in the first client render, then the real mode.\nconst mounted = ref(false)\nonMounted(() => (mounted.value = true))\n</script>\n\n<template>\n <DouSwitch\n :class=\"ns.b()\"\n :model-value=\"mounted && isDark\"\n :size=\"size\"\n :disabled=\"disabled\"\n :aria-label=\"t('colorMode.dark')\"\n @update:model-value=\"isDark = $event\"\n >\n <template v-if=\"slots.default\" #default><slot /></template>\n </DouSwitch>\n</template>\n"],"mappings":";;;;;;;;;;;;;;EAWA,MAAM,QAAQA,SAAA;EAEd,MAAM,KAAK,aAAa,mBAAmB;EAC3C,MAAM,EAAE,MAAM,UAAU;EACxB,MAAM,EAAE,WAAW,aAAa;EAGhC,MAAM,UAAU,IAAI,KAAK;EACzB,gBAAiB,QAAQ,QAAQ,IAAK;;GAIpC,OAAAC,UAAA,GAAAC,YASYC,MAAA,SAAA,GAAA;IART,OAAKC,eAAED,MAAA,EAAA,CAAE,CAAC,EAAC,CAAA;IACX,eAAa,QAAA,SAAWA,MAAA,MAAA;IACxB,MAAM,QAAA;IACN,UAAU,QAAA;IACV,cAAYA,MAAA,CAAA,CAAC,CAAA,gBAAA;IACb,uBAAkB,OAAA,OAAA,OAAA,MAAA,WAAE,OAAA,QAAS;G,0BAEd,MAAM,U;IAAU,MAAA;IAAQ,IAAAG,cAAQ,CAARC,WAAQ,KAAA,QAAA,SAAA,C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color-panel.js","names":["_sfc_main"],"sources":["../../../src/components/color-panel/color-panel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, useTemplateRef, watch } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport { DouFieldGroup } from '../field-group'\nimport { useFormDisabled, useFormItem } from '../form/use-form-item'\nimport DouInputComponent from '../input/input.vue'\nimport type { InputHTMLAttributes } from 'vue'\nimport type { WithAttributes } from '../../utils/install'\nimport DouSelect from '../select/select.vue'\nimport { ALPHA, CHANNELS, formatLabel } from '../color-picker/channels'\nimport type { Channel } from '../color-picker/channels'\nimport {\n COLOR_FORMATS,\n clamp,\n coordsIn,\n formatColor,\n hueIndex,\n hueOf,\n isAchromatic,\n parseColor,\n toCss,\n} from '../color-picker/color'\nimport type { Color, ColorFormat, ColorSpace, Coords } from '../color-picker/color'\nimport type { ColorPanelExpose, ColorPanelMode, ColorPanelProps } from './color-panel'\n\n// 让模板里也能写这个组件转交的原生属性\nconst DouInput = DouInputComponent as WithAttributes<typeof DouInputComponent, InputHTMLAttributes>\n\ndefineOptions({ name: 'DouColorPanel' })\n\nconst props = withDefaults(defineProps<ColorPanelProps>(), {\n format: 'hex',\n panel: 'square',\n gamut: 'srgb',\n showAlpha: false,\n presets: () => [],\n showInput: true,\n bordered: true,\n disabled: false,\n})\nconst model = defineModel<string | null>()\nconst emit = defineEmits<{ change: [value: string | null] }>()\n\nconst ns = useNamespace('color-panel')\nconst { t } = useLocale()\nconst { formItem } = useFormItem()\nconst disabled = useFormDisabled(() => props.disabled)\nconst rootRef = useTemplateRef<HTMLElement>('root')\n\n/* the panels */\n\nconst panels = computed<ColorPanelMode[]>(() => {\n const list = Array.isArray(props.panel) ? props.panel : [props.panel]\n return list.length ? [...new Set(list)] : ['square']\n})\nconst active = ref<ColorPanelMode>(panels.value[0]!)\nwatch(panels, (list) => {\n if (!list.includes(active.value)) active.value = list[0]!\n})\n/** The space the active panel edits in: the square and the wheel are HSV. */\nconst space = computed<ColorSpace>(() =>\n active.value === 'square' || active.value === 'wheel' ? 'hsv' : active.value,\n)\nconst panelLabel = (panel: ColorPanelMode) =>\n panel === 'square'\n ? t('colorPicker.panelSquare')\n : panel === 'wheel'\n ? t('colorPicker.panelWheel')\n : formatLabel(panel)\n\n/* the color */\n\nconst options = computed(() => ({ alpha: props.showAlpha, gamut: props.gamut }))\nconst print = (value: Color, format: ColorFormat = props.format) =>\n formatColor(value, format, options.value)\n\n// The panel keeps the color in the space it edits in, so a channel the\n// value cannot show (the hue of a gray, the chroma the gamut mapping\n// cuts) stays where the user put it.\nconst fallback = (): Color => ({ space: 'hsv', coords: [0, 0, 0], alpha: 1 })\nconst color = ref<Color>(fallback())\n\n/** Bring a color into the panel's space, keeping the current hue for a gray. */\nfunction adopt(next: Color, hue = hueOf(color.value)): Color {\n const target = space.value\n if (next.space === target) return { ...next, coords: [...next.coords] }\n const coords = coordsIn(next, target, props.gamut)\n const index = hueIndex(target)\n const result: Color = { space: target, coords: [...coords], alpha: next.alpha }\n if (index !== undefined && hue !== undefined && isAchromatic(result)) result.coords[index] = hue\n return result\n}\n\ncolor.value = adopt(parseColor(model.value ?? '') ?? fallback())\nwatch(model, (value) => {\n const parsed = value ? parseColor(value) : null\n if (!parsed || print(parsed) === print(color.value)) return\n color.value = adopt(parsed)\n})\nwatch(space, () => (color.value = adopt(color.value)))\n\nfunction set(next: Color) {\n color.value = props.showAlpha ? next : { ...next, alpha: 1 }\n model.value = print(color.value)\n}\nfunction setCoord(index: number, value: number) {\n const coords: Coords = [...color.value.coords]\n coords[index] = value\n set({ ...color.value, coords })\n}\nconst setAlpha = (alpha: number) => set({ ...color.value, alpha: clamp(alpha) })\n\nconst opaque = computed(() => toCss({ ...color.value, alpha: 1 }, props.gamut))\nconst current = computed(() => toCss(color.value, props.gamut, props.showAlpha))\n\n/** The color settled: tell the listeners and the form. */\nfunction settle() {\n emit('change', print(color.value))\n formItem?.trigger('change')\n}\n\n/* dragging */\n\n/** Follow the pointer, passing its position within the target as 0–1 (unclamped). */\nfunction drag(event: PointerEvent, apply: (x: number, y: number) => void) {\n if (event.button !== 0) return\n const target = event.currentTarget as HTMLElement\n const rect = target.getBoundingClientRect()\n const at = (e: PointerEvent) =>\n apply((e.clientX - rect.left) / (rect.width || 1), (e.clientY - rect.top) / (rect.height || 1))\n at(event)\n target.focus()\n target.setPointerCapture?.(event.pointerId)\n const move = (e: PointerEvent) => at(e)\n const up = () => {\n settle()\n target.removeEventListener('pointermove', move)\n target.removeEventListener('pointerup', up)\n target.removeEventListener('pointercancel', up)\n }\n target.addEventListener('pointermove', move)\n target.addEventListener('pointerup', up)\n target.addEventListener('pointercancel', up)\n}\n\nconst hsv = computed(() => color.value.coords)\nconst onAreaDown = (event: PointerEvent) =>\n drag(event, (x, y) => set({ ...color.value, coords: [hsv.value[0], clamp(x), clamp(1 - y)] }))\nconst onWheelDown = (event: PointerEvent) =>\n drag(event, (x, y) => {\n const [dx, dy] = [x - 0.5, y - 0.5]\n const h = ((Math.atan2(dy, dx) * 180) / Math.PI + 360) % 360\n set({ ...color.value, coords: [h, clamp(Math.hypot(dx, dy) * 2), hsv.value[2]] })\n })\nconst onChannelDown = (event: PointerEvent, index: number, channel: Channel) =>\n drag(event, (x) => setCoord(index, channel.min + clamp(x) * (channel.max - channel.min)))\nconst onAlphaDown = (event: PointerEvent) => drag(event, (x) => setAlpha(clamp(x)))\n\n/** The direction an arrow key moves a value, and how far: 1%, or 10% with Shift. */\nfunction arrow(event: KeyboardEvent) {\n const dx = event.key === 'ArrowRight' ? 1 : event.key === 'ArrowLeft' ? -1 : 0\n const dy = event.key === 'ArrowUp' ? 1 : event.key === 'ArrowDown' ? -1 : 0\n if (dx || dy) event.preventDefault()\n return { dx, dy, step: (event.shiftKey ? 10 : 1) / 100 }\n}\n\nfunction onAreaKeydown(event: KeyboardEvent) {\n const { dx, dy, step } = arrow(event)\n if (!dx && !dy) return\n const [h, s, v] = hsv.value\n set({ ...color.value, coords: [h, clamp(s + dx * step), clamp(v + dy * step)] })\n settle()\n}\nfunction onWheelKeydown(event: KeyboardEvent) {\n const { dx, dy, step } = arrow(event)\n if (!dx && !dy) return\n const [h, s, v] = hsv.value\n set({ ...color.value, coords: [(h + dx * step * 360 + 360) % 360, clamp(s + dy * step), v] })\n settle()\n}\nfunction onChannelKeydown(event: KeyboardEvent, index: number, channel: Channel) {\n const { dx, dy, step } = arrow(event)\n if (!dx && !dy) return\n const next = color.value.coords[index]! + (dx || dy) * step * (channel.max - channel.min)\n setCoord(index, clamp(next, channel.min, channel.max))\n settle()\n}\nfunction onAlphaKeydown(event: KeyboardEvent) {\n const { dx, dy, step } = arrow(event)\n if (!dx && !dy) return\n setAlpha(color.value.alpha + (dx || dy) * step)\n settle()\n}\n\n/* what the panels draw */\n\nconst percent = (value: number) => Math.round(value * 100)\nconst position = (value: number, channel: Channel) =>\n `${((value - channel.min) / (channel.max - channel.min)) * 100}%`\nconst pure = computed(() => toCss({ space: 'hsv', coords: [hsv.value[0], 1, 1], alpha: 1 }))\nconst bright = computed(() =>\n toCss({ space: 'hsv', coords: [hsv.value[0], hsv.value[1], 1], alpha: 1 }),\n)\nconst wheelThumb = computed(() => {\n const [h, s] = hsv.value\n const rad = (h * Math.PI) / 180\n return { left: `${50 + 50 * s * Math.cos(rad)}%`, top: `${50 + 50 * s * Math.sin(rad)}%` }\n})\n\nconst channels = computed(() => CHANNELS[space.value])\n/** Each channel's track: the color as that channel runs its range, the others held. */\nconst tracks = computed(() =>\n channels.value.map((channel, index) => {\n const isHue = channel.name === 'hue'\n const steps = space.value === 'rgb' ? 1 : isHue ? 12 : 16\n const stops = Array.from({ length: steps + 1 }, (_, k) => {\n const coords: Coords = [...color.value.coords]\n coords[index] = channel.min + ((channel.max - channel.min) * k) / steps\n return toCss({ space: space.value, coords, alpha: 1 }, props.gamut)\n })\n return `linear-gradient(to right, ${stops.join(', ')})`\n }),\n)\n\nconst display = (value: number, channel: Channel) =>\n String(Number((value * channel.scale).toFixed(channel.digits)) || 0)\nconst valueText = (value: number, channel: Channel) =>\n `${display(value, channel)}${channel.unit ?? ''}`\n\nfunction onChannelInput(event: Event, index: number, channel: Channel) {\n const input = event.target as HTMLInputElement\n const next = parseFloat(input.value)\n if (Number.isFinite(next)) {\n const coord = clamp(next / channel.scale, channel.min, channel.max)\n if (index < 0) setAlpha(coord)\n else setCoord(index, coord)\n settle()\n }\n input.value = display(index < 0 ? color.value.alpha : color.value.coords[index]!, channel)\n}\n\n/* the text box */\n\n// The text box can show the color in any format; it starts at `format`.\nconst textFormat = ref<ColorFormat>(props.format)\nconst formatOptions = COLOR_FORMATS.map((format) => ({ value: format, label: formatLabel(format) }))\nwatch(\n () => props.format,\n (format) => (textFormat.value = format),\n)\n/** The format's arguments only: the menu in front of the box names the format. */\nconst shown = computed(() => {\n const full = print(color.value, textFormat.value)\n return textFormat.value === 'hex' ? full : full.slice(full.indexOf('(') + 1, -1)\n})\nconst text = ref('')\nwatch(shown, (value) => (text.value = value), { immediate: true })\nfunction onTextCommit() {\n const typed = text.value.trim()\n const parsed =\n parseColor(typed) ??\n (textFormat.value === 'hex' ? null : parseColor(`${textFormat.value}(${typed})`))\n if (!parsed) {\n text.value = shown.value\n return\n }\n const before = print(color.value)\n set(adopt(parsed, hueOf(parsed) ?? hueOf(color.value)))\n if (print(color.value) !== before) settle()\n}\n\nfunction pickPreset(preset: string) {\n const parsed = parseColor(preset)\n if (!parsed) return\n set(adopt(parsed))\n settle()\n}\nconst presetValue = (preset: string) => {\n const parsed = parseColor(preset)\n return parsed ? print(parsed) : preset\n}\nconst presetCss = (preset: string) => {\n const parsed = parseColor(preset)\n return parsed ? toCss(parsed, props.gamut, true) : undefined\n}\n\nconst printed = computed(() => {\n const parsed = model.value ? parseColor(model.value) : null\n return parsed ? print(parsed) : ''\n})\n\nfunction focus() {\n rootRef.value?.querySelector<HTMLElement>('[role=\"slider\"]')?.focus()\n}\n\ndefineExpose<ColorPanelExpose>({ focus })\n</script>\n\n<template>\n <div\n ref=\"root\"\n :class=\"[ns.b(), ns.is('bordered', bordered), ns.is('disabled', disabled)]\"\n :inert=\"disabled || undefined\"\n :aria-disabled=\"disabled || undefined\"\n >\n <div\n v-if=\"panels.length > 1\"\n :class=\"ns.e('tabs')\"\n role=\"group\"\n :aria-label=\"t('colorPicker.panels')\"\n >\n <button\n v-for=\"item in panels\"\n :key=\"item\"\n type=\"button\"\n :class=\"[ns.e('tab'), ns.is('active', item === active)]\"\n :aria-pressed=\"item === active\"\n @click=\"active = item\"\n >\n {{ panelLabel(item) }}\n </button>\n </div>\n\n <template v-if=\"active === 'square'\">\n <div\n role=\"slider\"\n tabindex=\"0\"\n :class=\"ns.e('area')\"\n :style=\"{ backgroundColor: pure }\"\n :aria-label=\"t('colorPicker.area')\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuenow=\"percent(hsv[1])\"\n :aria-valuetext=\"t('colorPicker.areaValue', { s: percent(hsv[1]), v: percent(hsv[2]) })\"\n @pointerdown=\"onAreaDown\"\n @keydown=\"onAreaKeydown\"\n >\n <span\n :class=\"ns.e('thumb')\"\n :style=\"{\n left: `${hsv[1] * 100}%`,\n top: `${(1 - hsv[2]) * 100}%`,\n backgroundColor: opaque,\n }\"\n />\n </div>\n </template>\n\n <template v-else-if=\"active === 'wheel'\">\n <div\n role=\"slider\"\n tabindex=\"0\"\n :class=\"ns.e('wheel')\"\n :style=\"{ '--dou-color-panel-dim': 1 - hsv[2] }\"\n :aria-label=\"t('colorPicker.wheel')\"\n aria-valuemin=\"0\"\n aria-valuemax=\"360\"\n :aria-valuenow=\"Math.round(hsv[0])\"\n :aria-valuetext=\"t('colorPicker.wheelValue', { h: Math.round(hsv[0]), s: percent(hsv[1]) })\"\n @pointerdown=\"onWheelDown\"\n @keydown=\"onWheelKeydown\"\n >\n <span :class=\"ns.e('thumb')\" :style=\"{ ...wheelThumb, backgroundColor: opaque }\" />\n </div>\n </template>\n\n <template v-else>\n <span :class=\"[ns.e('swatch'), ns.e('bar')]\" aria-hidden=\"true\">\n <span :style=\"{ backgroundColor: current }\" />\n </span>\n <div :class=\"ns.e('channels')\">\n <div\n v-for=\"(channel, index) in channels\"\n :key=\"`${space}-${index}`\"\n :class=\"ns.e('channel')\"\n >\n <span :class=\"ns.e('label')\" aria-hidden=\"true\">{{ channel.label }}</span>\n <div\n role=\"slider\"\n tabindex=\"0\"\n :class=\"ns.e('track')\"\n :style=\"{ '--dou-color-panel-track': tracks[index] }\"\n :aria-label=\"t(`colorPicker.${channel.name}`)\"\n :aria-valuemin=\"display(channel.min, channel)\"\n :aria-valuemax=\"display(channel.max, channel)\"\n :aria-valuenow=\"display(color.coords[index]!, channel)\"\n :aria-valuetext=\"valueText(color.coords[index]!, channel)\"\n @pointerdown=\"onChannelDown($event, index, channel)\"\n @keydown=\"onChannelKeydown($event, index, channel)\"\n >\n <span\n :class=\"ns.e('thumb')\"\n :style=\"{\n left: position(color.coords[index]!, channel),\n backgroundColor: opaque,\n }\"\n />\n </div>\n <input\n :class=\"ns.e('number')\"\n type=\"text\"\n inputmode=\"decimal\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n tabindex=\"-1\"\n :aria-label=\"t(`colorPicker.${channel.name}`)\"\n :value=\"display(color.coords[index]!, channel)\"\n @change=\"onChannelInput($event, index, channel)\"\n @keydown.enter.prevent=\"onChannelInput($event, index, channel)\"\n @keydown.up.down=\"onChannelKeydown($event, index, channel)\"\n />\n </div>\n <div v-if=\"showAlpha\" :class=\"ns.e('channel')\">\n <span :class=\"ns.e('label')\" aria-hidden=\"true\">{{ ALPHA.label }}</span>\n <div\n role=\"slider\"\n tabindex=\"0\"\n :class=\"[ns.e('track'), ns.e('alpha')]\"\n :style=\"{ '--dou-color-panel-opaque': opaque }\"\n :aria-label=\"t('colorPicker.alpha')\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuenow=\"percent(color.alpha)\"\n :aria-valuetext=\"`${percent(color.alpha)}%`\"\n @pointerdown=\"onAlphaDown\"\n @keydown=\"onAlphaKeydown\"\n >\n <span\n :class=\"ns.e('thumb')\"\n :style=\"{ left: `${color.alpha * 100}%`, backgroundColor: current }\"\n />\n </div>\n <input\n :class=\"ns.e('number')\"\n type=\"text\"\n inputmode=\"decimal\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n tabindex=\"-1\"\n :aria-label=\"t('colorPicker.alpha')\"\n :value=\"display(color.alpha, ALPHA)\"\n @change=\"onChannelInput($event, -1, ALPHA)\"\n @keydown.enter.prevent=\"onChannelInput($event, -1, ALPHA)\"\n @keydown.up.down=\"onAlphaKeydown\"\n />\n </div>\n </div>\n </template>\n\n <div v-if=\"active === 'square' || active === 'wheel'\" :class=\"ns.e('controls')\">\n <div :class=\"ns.e('sliders')\">\n <div\n v-if=\"active === 'square'\"\n role=\"slider\"\n tabindex=\"0\"\n :class=\"[ns.e('track'), ns.e('hue')]\"\n :aria-label=\"t('colorPicker.hue')\"\n aria-valuemin=\"0\"\n aria-valuemax=\"360\"\n :aria-valuenow=\"Math.round(hsv[0])\"\n @pointerdown=\"onChannelDown($event, 0, CHANNELS.hsv[0])\"\n @keydown=\"onChannelKeydown($event, 0, CHANNELS.hsv[0])\"\n >\n <span\n :class=\"ns.e('thumb')\"\n :style=\"{ left: `${(hsv[0] / 360) * 100}%`, backgroundColor: pure }\"\n />\n </div>\n <div\n v-else\n role=\"slider\"\n tabindex=\"0\"\n :class=\"[ns.e('track'), ns.e('value')]\"\n :style=\"{ '--dou-color-panel-bright': bright }\"\n :aria-label=\"t('colorPicker.brightness')\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuenow=\"percent(hsv[2])\"\n :aria-valuetext=\"`${percent(hsv[2])}%`\"\n @pointerdown=\"onChannelDown($event, 2, CHANNELS.hsv[2])\"\n @keydown=\"onChannelKeydown($event, 2, CHANNELS.hsv[2])\"\n >\n <span\n :class=\"ns.e('thumb')\"\n :style=\"{ left: `${hsv[2] * 100}%`, backgroundColor: opaque }\"\n />\n </div>\n <div\n v-if=\"showAlpha\"\n role=\"slider\"\n tabindex=\"0\"\n :class=\"[ns.e('track'), ns.e('alpha')]\"\n :style=\"{ '--dou-color-panel-opaque': opaque }\"\n :aria-label=\"t('colorPicker.alpha')\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuenow=\"percent(color.alpha)\"\n :aria-valuetext=\"`${percent(color.alpha)}%`\"\n @pointerdown=\"onAlphaDown\"\n @keydown=\"onAlphaKeydown\"\n >\n <span\n :class=\"ns.e('thumb')\"\n :style=\"{ left: `${color.alpha * 100}%`, backgroundColor: current }\"\n />\n </div>\n </div>\n <span :class=\"[ns.e('swatch'), ns.e('preview')]\" aria-hidden=\"true\">\n <span :style=\"{ backgroundColor: current }\" />\n </span>\n </div>\n\n <DouFieldGroup v-if=\"showInput\" :class=\"ns.e('entry')\" size=\"sm\" block>\n <DouSelect\n :model-value=\"textFormat\"\n :class=\"ns.e('format')\"\n :options=\"formatOptions\"\n :aria-label=\"t('colorPicker.format')\"\n @update:model-value=\"textFormat = $event as ColorFormat\"\n />\n <DouInput\n v-model=\"text\"\n :class=\"[ns.e('text'), ns.is('hex', textFormat === 'hex')]\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n :aria-label=\"t('colorPicker.text')\"\n @change=\"onTextCommit\"\n @keydown.enter.prevent=\"onTextCommit\"\n />\n </DouFieldGroup>\n <div\n v-if=\"presets.length\"\n :class=\"ns.e('presets')\"\n role=\"group\"\n :aria-label=\"t('colorPicker.presets')\"\n >\n <button\n v-for=\"preset in presets\"\n :key=\"preset\"\n type=\"button\"\n :class=\"[ns.e('preset'), ns.is('selected', presetValue(preset) === printed)]\"\n :aria-label=\"preset\"\n :aria-pressed=\"presetValue(preset) === printed\"\n @click=\"pickPreset(preset)\"\n >\n <span :style=\"{ backgroundColor: presetCss(preset) }\" />\n </button>\n </div>\n </div>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"color-panel.js","names":["_sfc_main"],"sources":["../../../src/components/color-panel/color-panel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, useTemplateRef, watch } from 'vue'\nimport { useNamespace } from '../../utils/namespace'\nimport { useLocale } from '../config-provider/use-config'\nimport { DouFieldGroup } from '../field-group'\nimport { useFormDisabled, useFormItem } from '../form/use-form-item'\nimport { DouInput as DouInputComponent } from '../input'\nimport type { InputHTMLAttributes } from 'vue'\nimport type { WithAttributes } from '../../utils/install'\nimport { DouSelect } from '../select'\nimport { ALPHA, CHANNELS, formatLabel } from '../color-picker/channels'\nimport type { Channel } from '../color-picker/channels'\nimport {\n COLOR_FORMATS,\n clamp,\n coordsIn,\n formatColor,\n hueIndex,\n hueOf,\n isAchromatic,\n parseColor,\n toCss,\n} from '../color-picker/color'\nimport type { Color, ColorFormat, ColorSpace, Coords } from '../color-picker/color'\nimport type { ColorPanelExpose, ColorPanelMode, ColorPanelProps } from './color-panel'\n\n// 让模板里也能写这个组件转交的原生属性\nconst DouInput = DouInputComponent as WithAttributes<typeof DouInputComponent, InputHTMLAttributes>\n\ndefineOptions({ name: 'DouColorPanel' })\n\nconst props = withDefaults(defineProps<ColorPanelProps>(), {\n format: 'hex',\n panel: 'square',\n gamut: 'srgb',\n showAlpha: false,\n presets: () => [],\n showInput: true,\n bordered: true,\n disabled: false,\n})\nconst model = defineModel<string | null>()\nconst emit = defineEmits<{ change: [value: string | null] }>()\n\nconst ns = useNamespace('color-panel')\nconst { t } = useLocale()\nconst { formItem } = useFormItem()\nconst disabled = useFormDisabled(() => props.disabled)\nconst rootRef = useTemplateRef<HTMLElement>('root')\n\n/* the panels */\n\nconst panels = computed<ColorPanelMode[]>(() => {\n const list = Array.isArray(props.panel) ? props.panel : [props.panel]\n return list.length ? [...new Set(list)] : ['square']\n})\nconst active = ref<ColorPanelMode>(panels.value[0]!)\nwatch(panels, (list) => {\n if (!list.includes(active.value)) active.value = list[0]!\n})\n/** The space the active panel edits in: the square and the wheel are HSV. */\nconst space = computed<ColorSpace>(() =>\n active.value === 'square' || active.value === 'wheel' ? 'hsv' : active.value,\n)\nconst panelLabel = (panel: ColorPanelMode) =>\n panel === 'square'\n ? t('colorPicker.panelSquare')\n : panel === 'wheel'\n ? t('colorPicker.panelWheel')\n : formatLabel(panel)\n\n/* the color */\n\nconst options = computed(() => ({ alpha: props.showAlpha, gamut: props.gamut }))\nconst print = (value: Color, format: ColorFormat = props.format) =>\n formatColor(value, format, options.value)\n\n// The panel keeps the color in the space it edits in, so a channel the\n// value cannot show (the hue of a gray, the chroma the gamut mapping\n// cuts) stays where the user put it.\nconst fallback = (): Color => ({ space: 'hsv', coords: [0, 0, 0], alpha: 1 })\nconst color = ref<Color>(fallback())\n\n/** Bring a color into the panel's space, keeping the current hue for a gray. */\nfunction adopt(next: Color, hue = hueOf(color.value)): Color {\n const target = space.value\n if (next.space === target) return { ...next, coords: [...next.coords] }\n const coords = coordsIn(next, target, props.gamut)\n const index = hueIndex(target)\n const result: Color = { space: target, coords: [...coords], alpha: next.alpha }\n if (index !== undefined && hue !== undefined && isAchromatic(result)) result.coords[index] = hue\n return result\n}\n\ncolor.value = adopt(parseColor(model.value ?? '') ?? fallback())\nwatch(model, (value) => {\n const parsed = value ? parseColor(value) : null\n if (!parsed || print(parsed) === print(color.value)) return\n color.value = adopt(parsed)\n})\nwatch(space, () => (color.value = adopt(color.value)))\n\nfunction set(next: Color) {\n color.value = props.showAlpha ? next : { ...next, alpha: 1 }\n model.value = print(color.value)\n}\nfunction setCoord(index: number, value: number) {\n const coords: Coords = [...color.value.coords]\n coords[index] = value\n set({ ...color.value, coords })\n}\nconst setAlpha = (alpha: number) => set({ ...color.value, alpha: clamp(alpha) })\n\nconst opaque = computed(() => toCss({ ...color.value, alpha: 1 }, props.gamut))\nconst current = computed(() => toCss(color.value, props.gamut, props.showAlpha))\n\n/** The color settled: tell the listeners and the form. */\nfunction settle() {\n emit('change', print(color.value))\n formItem?.trigger('change')\n}\n\n/* dragging */\n\n/** Follow the pointer, passing its position within the target as 0–1 (unclamped). */\nfunction drag(event: PointerEvent, apply: (x: number, y: number) => void) {\n if (event.button !== 0) return\n const target = event.currentTarget as HTMLElement\n const rect = target.getBoundingClientRect()\n const at = (e: PointerEvent) =>\n apply((e.clientX - rect.left) / (rect.width || 1), (e.clientY - rect.top) / (rect.height || 1))\n at(event)\n target.focus()\n target.setPointerCapture?.(event.pointerId)\n const move = (e: PointerEvent) => at(e)\n const up = () => {\n settle()\n target.removeEventListener('pointermove', move)\n target.removeEventListener('pointerup', up)\n target.removeEventListener('pointercancel', up)\n }\n target.addEventListener('pointermove', move)\n target.addEventListener('pointerup', up)\n target.addEventListener('pointercancel', up)\n}\n\nconst hsv = computed(() => color.value.coords)\nconst onAreaDown = (event: PointerEvent) =>\n drag(event, (x, y) => set({ ...color.value, coords: [hsv.value[0], clamp(x), clamp(1 - y)] }))\nconst onWheelDown = (event: PointerEvent) =>\n drag(event, (x, y) => {\n const [dx, dy] = [x - 0.5, y - 0.5]\n const h = ((Math.atan2(dy, dx) * 180) / Math.PI + 360) % 360\n set({ ...color.value, coords: [h, clamp(Math.hypot(dx, dy) * 2), hsv.value[2]] })\n })\nconst onChannelDown = (event: PointerEvent, index: number, channel: Channel) =>\n drag(event, (x) => setCoord(index, channel.min + clamp(x) * (channel.max - channel.min)))\nconst onAlphaDown = (event: PointerEvent) => drag(event, (x) => setAlpha(clamp(x)))\n\n/** The direction an arrow key moves a value, and how far: 1%, or 10% with Shift. */\nfunction arrow(event: KeyboardEvent) {\n const dx = event.key === 'ArrowRight' ? 1 : event.key === 'ArrowLeft' ? -1 : 0\n const dy = event.key === 'ArrowUp' ? 1 : event.key === 'ArrowDown' ? -1 : 0\n if (dx || dy) event.preventDefault()\n return { dx, dy, step: (event.shiftKey ? 10 : 1) / 100 }\n}\n\nfunction onAreaKeydown(event: KeyboardEvent) {\n const { dx, dy, step } = arrow(event)\n if (!dx && !dy) return\n const [h, s, v] = hsv.value\n set({ ...color.value, coords: [h, clamp(s + dx * step), clamp(v + dy * step)] })\n settle()\n}\nfunction onWheelKeydown(event: KeyboardEvent) {\n const { dx, dy, step } = arrow(event)\n if (!dx && !dy) return\n const [h, s, v] = hsv.value\n set({ ...color.value, coords: [(h + dx * step * 360 + 360) % 360, clamp(s + dy * step), v] })\n settle()\n}\nfunction onChannelKeydown(event: KeyboardEvent, index: number, channel: Channel) {\n const { dx, dy, step } = arrow(event)\n if (!dx && !dy) return\n const next = color.value.coords[index]! + (dx || dy) * step * (channel.max - channel.min)\n setCoord(index, clamp(next, channel.min, channel.max))\n settle()\n}\nfunction onAlphaKeydown(event: KeyboardEvent) {\n const { dx, dy, step } = arrow(event)\n if (!dx && !dy) return\n setAlpha(color.value.alpha + (dx || dy) * step)\n settle()\n}\n\n/* what the panels draw */\n\nconst percent = (value: number) => Math.round(value * 100)\nconst position = (value: number, channel: Channel) =>\n `${((value - channel.min) / (channel.max - channel.min)) * 100}%`\nconst pure = computed(() => toCss({ space: 'hsv', coords: [hsv.value[0], 1, 1], alpha: 1 }))\nconst bright = computed(() =>\n toCss({ space: 'hsv', coords: [hsv.value[0], hsv.value[1], 1], alpha: 1 }),\n)\nconst wheelThumb = computed(() => {\n const [h, s] = hsv.value\n const rad = (h * Math.PI) / 180\n return { left: `${50 + 50 * s * Math.cos(rad)}%`, top: `${50 + 50 * s * Math.sin(rad)}%` }\n})\n\nconst channels = computed(() => CHANNELS[space.value])\n/** Each channel's track: the color as that channel runs its range, the others held. */\nconst tracks = computed(() =>\n channels.value.map((channel, index) => {\n const isHue = channel.name === 'hue'\n const steps = space.value === 'rgb' ? 1 : isHue ? 12 : 16\n const stops = Array.from({ length: steps + 1 }, (_, k) => {\n const coords: Coords = [...color.value.coords]\n coords[index] = channel.min + ((channel.max - channel.min) * k) / steps\n return toCss({ space: space.value, coords, alpha: 1 }, props.gamut)\n })\n return `linear-gradient(to right, ${stops.join(', ')})`\n }),\n)\n\nconst display = (value: number, channel: Channel) =>\n String(Number((value * channel.scale).toFixed(channel.digits)) || 0)\nconst valueText = (value: number, channel: Channel) =>\n `${display(value, channel)}${channel.unit ?? ''}`\n\nfunction onChannelInput(event: Event, index: number, channel: Channel) {\n const input = event.target as HTMLInputElement\n const next = parseFloat(input.value)\n if (Number.isFinite(next)) {\n const coord = clamp(next / channel.scale, channel.min, channel.max)\n if (index < 0) setAlpha(coord)\n else setCoord(index, coord)\n settle()\n }\n input.value = display(index < 0 ? color.value.alpha : color.value.coords[index]!, channel)\n}\n\n/* the text box */\n\n// The text box can show the color in any format; it starts at `format`.\nconst textFormat = ref<ColorFormat>(props.format)\nconst formatOptions = COLOR_FORMATS.map((format) => ({ value: format, label: formatLabel(format) }))\nwatch(\n () => props.format,\n (format) => (textFormat.value = format),\n)\n/** The format's arguments only: the menu in front of the box names the format. */\nconst shown = computed(() => {\n const full = print(color.value, textFormat.value)\n return textFormat.value === 'hex' ? full : full.slice(full.indexOf('(') + 1, -1)\n})\nconst text = ref('')\nwatch(shown, (value) => (text.value = value), { immediate: true })\nfunction onTextCommit() {\n const typed = text.value.trim()\n const parsed =\n parseColor(typed) ??\n (textFormat.value === 'hex' ? null : parseColor(`${textFormat.value}(${typed})`))\n if (!parsed) {\n text.value = shown.value\n return\n }\n const before = print(color.value)\n set(adopt(parsed, hueOf(parsed) ?? hueOf(color.value)))\n if (print(color.value) !== before) settle()\n}\n\nfunction pickPreset(preset: string) {\n const parsed = parseColor(preset)\n if (!parsed) return\n set(adopt(parsed))\n settle()\n}\nconst presetValue = (preset: string) => {\n const parsed = parseColor(preset)\n return parsed ? print(parsed) : preset\n}\nconst presetCss = (preset: string) => {\n const parsed = parseColor(preset)\n return parsed ? toCss(parsed, props.gamut, true) : undefined\n}\n\nconst printed = computed(() => {\n const parsed = model.value ? parseColor(model.value) : null\n return parsed ? print(parsed) : ''\n})\n\nfunction focus() {\n rootRef.value?.querySelector<HTMLElement>('[role=\"slider\"]')?.focus()\n}\n\ndefineExpose<ColorPanelExpose>({ focus })\n</script>\n\n<template>\n <div\n ref=\"root\"\n :class=\"[ns.b(), ns.is('bordered', bordered), ns.is('disabled', disabled)]\"\n :inert=\"disabled || undefined\"\n :aria-disabled=\"disabled || undefined\"\n >\n <div\n v-if=\"panels.length > 1\"\n :class=\"ns.e('tabs')\"\n role=\"group\"\n :aria-label=\"t('colorPicker.panels')\"\n >\n <button\n v-for=\"item in panels\"\n :key=\"item\"\n type=\"button\"\n :class=\"[ns.e('tab'), ns.is('active', item === active)]\"\n :aria-pressed=\"item === active\"\n @click=\"active = item\"\n >\n {{ panelLabel(item) }}\n </button>\n </div>\n\n <template v-if=\"active === 'square'\">\n <div\n role=\"slider\"\n tabindex=\"0\"\n :class=\"ns.e('area')\"\n :style=\"{ backgroundColor: pure }\"\n :aria-label=\"t('colorPicker.area')\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuenow=\"percent(hsv[1])\"\n :aria-valuetext=\"t('colorPicker.areaValue', { s: percent(hsv[1]), v: percent(hsv[2]) })\"\n @pointerdown=\"onAreaDown\"\n @keydown=\"onAreaKeydown\"\n >\n <span\n :class=\"ns.e('thumb')\"\n :style=\"{\n left: `${hsv[1] * 100}%`,\n top: `${(1 - hsv[2]) * 100}%`,\n backgroundColor: opaque,\n }\"\n />\n </div>\n </template>\n\n <template v-else-if=\"active === 'wheel'\">\n <div\n role=\"slider\"\n tabindex=\"0\"\n :class=\"ns.e('wheel')\"\n :style=\"{ '--dou-color-panel-dim': 1 - hsv[2] }\"\n :aria-label=\"t('colorPicker.wheel')\"\n aria-valuemin=\"0\"\n aria-valuemax=\"360\"\n :aria-valuenow=\"Math.round(hsv[0])\"\n :aria-valuetext=\"t('colorPicker.wheelValue', { h: Math.round(hsv[0]), s: percent(hsv[1]) })\"\n @pointerdown=\"onWheelDown\"\n @keydown=\"onWheelKeydown\"\n >\n <span :class=\"ns.e('thumb')\" :style=\"{ ...wheelThumb, backgroundColor: opaque }\" />\n </div>\n </template>\n\n <template v-else>\n <span :class=\"[ns.e('swatch'), ns.e('bar')]\" aria-hidden=\"true\">\n <span :style=\"{ backgroundColor: current }\" />\n </span>\n <div :class=\"ns.e('channels')\">\n <div\n v-for=\"(channel, index) in channels\"\n :key=\"`${space}-${index}`\"\n :class=\"ns.e('channel')\"\n >\n <span :class=\"ns.e('label')\" aria-hidden=\"true\">{{ channel.label }}</span>\n <div\n role=\"slider\"\n tabindex=\"0\"\n :class=\"ns.e('track')\"\n :style=\"{ '--dou-color-panel-track': tracks[index] }\"\n :aria-label=\"t(`colorPicker.${channel.name}`)\"\n :aria-valuemin=\"display(channel.min, channel)\"\n :aria-valuemax=\"display(channel.max, channel)\"\n :aria-valuenow=\"display(color.coords[index]!, channel)\"\n :aria-valuetext=\"valueText(color.coords[index]!, channel)\"\n @pointerdown=\"onChannelDown($event, index, channel)\"\n @keydown=\"onChannelKeydown($event, index, channel)\"\n >\n <span\n :class=\"ns.e('thumb')\"\n :style=\"{\n left: position(color.coords[index]!, channel),\n backgroundColor: opaque,\n }\"\n />\n </div>\n <input\n :class=\"ns.e('number')\"\n type=\"text\"\n inputmode=\"decimal\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n tabindex=\"-1\"\n :aria-label=\"t(`colorPicker.${channel.name}`)\"\n :value=\"display(color.coords[index]!, channel)\"\n @change=\"onChannelInput($event, index, channel)\"\n @keydown.enter.prevent=\"onChannelInput($event, index, channel)\"\n @keydown.up.down=\"onChannelKeydown($event, index, channel)\"\n />\n </div>\n <div v-if=\"showAlpha\" :class=\"ns.e('channel')\">\n <span :class=\"ns.e('label')\" aria-hidden=\"true\">{{ ALPHA.label }}</span>\n <div\n role=\"slider\"\n tabindex=\"0\"\n :class=\"[ns.e('track'), ns.e('alpha')]\"\n :style=\"{ '--dou-color-panel-opaque': opaque }\"\n :aria-label=\"t('colorPicker.alpha')\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuenow=\"percent(color.alpha)\"\n :aria-valuetext=\"`${percent(color.alpha)}%`\"\n @pointerdown=\"onAlphaDown\"\n @keydown=\"onAlphaKeydown\"\n >\n <span\n :class=\"ns.e('thumb')\"\n :style=\"{ left: `${color.alpha * 100}%`, backgroundColor: current }\"\n />\n </div>\n <input\n :class=\"ns.e('number')\"\n type=\"text\"\n inputmode=\"decimal\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n tabindex=\"-1\"\n :aria-label=\"t('colorPicker.alpha')\"\n :value=\"display(color.alpha, ALPHA)\"\n @change=\"onChannelInput($event, -1, ALPHA)\"\n @keydown.enter.prevent=\"onChannelInput($event, -1, ALPHA)\"\n @keydown.up.down=\"onAlphaKeydown\"\n />\n </div>\n </div>\n </template>\n\n <div v-if=\"active === 'square' || active === 'wheel'\" :class=\"ns.e('controls')\">\n <div :class=\"ns.e('sliders')\">\n <div\n v-if=\"active === 'square'\"\n role=\"slider\"\n tabindex=\"0\"\n :class=\"[ns.e('track'), ns.e('hue')]\"\n :aria-label=\"t('colorPicker.hue')\"\n aria-valuemin=\"0\"\n aria-valuemax=\"360\"\n :aria-valuenow=\"Math.round(hsv[0])\"\n @pointerdown=\"onChannelDown($event, 0, CHANNELS.hsv[0])\"\n @keydown=\"onChannelKeydown($event, 0, CHANNELS.hsv[0])\"\n >\n <span\n :class=\"ns.e('thumb')\"\n :style=\"{ left: `${(hsv[0] / 360) * 100}%`, backgroundColor: pure }\"\n />\n </div>\n <div\n v-else\n role=\"slider\"\n tabindex=\"0\"\n :class=\"[ns.e('track'), ns.e('value')]\"\n :style=\"{ '--dou-color-panel-bright': bright }\"\n :aria-label=\"t('colorPicker.brightness')\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuenow=\"percent(hsv[2])\"\n :aria-valuetext=\"`${percent(hsv[2])}%`\"\n @pointerdown=\"onChannelDown($event, 2, CHANNELS.hsv[2])\"\n @keydown=\"onChannelKeydown($event, 2, CHANNELS.hsv[2])\"\n >\n <span\n :class=\"ns.e('thumb')\"\n :style=\"{ left: `${hsv[2] * 100}%`, backgroundColor: opaque }\"\n />\n </div>\n <div\n v-if=\"showAlpha\"\n role=\"slider\"\n tabindex=\"0\"\n :class=\"[ns.e('track'), ns.e('alpha')]\"\n :style=\"{ '--dou-color-panel-opaque': opaque }\"\n :aria-label=\"t('colorPicker.alpha')\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n :aria-valuenow=\"percent(color.alpha)\"\n :aria-valuetext=\"`${percent(color.alpha)}%`\"\n @pointerdown=\"onAlphaDown\"\n @keydown=\"onAlphaKeydown\"\n >\n <span\n :class=\"ns.e('thumb')\"\n :style=\"{ left: `${color.alpha * 100}%`, backgroundColor: current }\"\n />\n </div>\n </div>\n <span :class=\"[ns.e('swatch'), ns.e('preview')]\" aria-hidden=\"true\">\n <span :style=\"{ backgroundColor: current }\" />\n </span>\n </div>\n\n <DouFieldGroup v-if=\"showInput\" :class=\"ns.e('entry')\" size=\"sm\" block>\n <DouSelect\n :model-value=\"textFormat\"\n :class=\"ns.e('format')\"\n :options=\"formatOptions\"\n :aria-label=\"t('colorPicker.format')\"\n @update:model-value=\"textFormat = $event as ColorFormat\"\n />\n <DouInput\n v-model=\"text\"\n :class=\"[ns.e('text'), ns.is('hex', textFormat === 'hex')]\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n :aria-label=\"t('colorPicker.text')\"\n @change=\"onTextCommit\"\n @keydown.enter.prevent=\"onTextCommit\"\n />\n </DouFieldGroup>\n <div\n v-if=\"presets.length\"\n :class=\"ns.e('presets')\"\n role=\"group\"\n :aria-label=\"t('colorPicker.presets')\"\n >\n <button\n v-for=\"preset in presets\"\n :key=\"preset\"\n type=\"button\"\n :class=\"[ns.e('preset'), ns.is('selected', presetValue(preset) === printed)]\"\n :aria-label=\"preset\"\n :aria-pressed=\"presetValue(preset) === printed\"\n @click=\"pickPreset(preset)\"\n >\n <span :style=\"{ backgroundColor: presetCss(preset) }\" />\n </button>\n </div>\n </div>\n</template>\n"],"mappings":""}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { useNamespace } from "../../utils/namespace.js";
|
|
2
2
|
import { useLocale } from "../config-provider/use-config.js";
|
|
3
3
|
import { useFormDisabled, useFormItem } from "../form/use-form-item.js";
|
|
4
|
-
import
|
|
5
|
-
import
|
|
4
|
+
import { DouInput } from "../input/index.js";
|
|
5
|
+
import { DouSelect } from "../select/index.js";
|
|
6
6
|
import { DouFieldGroup } from "../field-group/index.js";
|
|
7
7
|
import { ALPHA, CHANNELS, formatLabel } from "../color-picker/channels.js";
|
|
8
8
|
import { COLOR_FORMATS, clamp, coordsIn, formatColor, hueIndex, hueOf, isAchromatic, parseColor, toCss } from "../color-picker/color.js";
|
|
@@ -90,7 +90,7 @@ var color_panel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
|
|
|
90
90
|
}),
|
|
91
91
|
emits: /*@__PURE__*/ mergeModels(["change"], ["update:modelValue"]),
|
|
92
92
|
setup(__props, { expose: __expose, emit: __emit }) {
|
|
93
|
-
const DouInput =
|
|
93
|
+
const DouInput$1 = DouInput;
|
|
94
94
|
const props = __props;
|
|
95
95
|
const model = useModel(__props, "modelValue");
|
|
96
96
|
const emit = __emit;
|
|
@@ -597,7 +597,7 @@ var color_panel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
|
|
|
597
597
|
size: "sm",
|
|
598
598
|
block: ""
|
|
599
599
|
}, {
|
|
600
|
-
default: withCtx(() => [createVNode(
|
|
600
|
+
default: withCtx(() => [createVNode(unref(DouSelect), {
|
|
601
601
|
"model-value": textFormat.value,
|
|
602
602
|
class: normalizeClass(unref(ns).e("format")),
|
|
603
603
|
options: unref(formatOptions),
|
|
@@ -608,7 +608,7 @@ var color_panel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
|
|
|
608
608
|
"class",
|
|
609
609
|
"options",
|
|
610
610
|
"aria-label"
|
|
611
|
-
]), createVNode(unref(DouInput), {
|
|
611
|
+
]), createVNode(unref(DouInput$1), {
|
|
612
612
|
modelValue: text.value,
|
|
613
613
|
"onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => text.value = $event),
|
|
614
614
|
class: normalizeClass([unref(ns).e("text"), unref(ns).is("hex", textFormat.value === "hex")]),
|