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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color-panel.vue_vue_type_script_setup_true_lang.js","names":["DouInputComponent","_useModel","_openBlock","_createElementBlock","_normalizeClass","_unref","_Fragment","_renderList","_toDisplayString","_createCommentVNode","_normalizeStyle","_createElementVNode","_withKeys","_withModifiers","_createBlock","_withCtx","_createVNode","DouSelect"],"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":"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"}
|
|
1
|
+
{"version":3,"file":"color-panel.vue_vue_type_script_setup_true_lang.js","names":["DouInput","DouInputComponent","_useModel","_openBlock","_createElementBlock","_normalizeClass","_unref","_Fragment","_renderList","_toDisplayString","_createCommentVNode","_normalizeStyle","_createElementVNode","_withKeys","_withModifiers","_createBlock","_withCtx","_createVNode"],"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":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color-picker.js","names":["_sfc_main"],"sources":["../../../src/components/color-picker/color-picker.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ChevronDownIcon, CloseIcon } from '@dou-ui/icons'\nimport { computed, ref, useId, useTemplateRef, watch } from 'vue'\nimport { usePopup } from '../../composables/use-popup'\nimport { useNamespace } from '../../utils/namespace'\nimport { OnlyChild } from '../../utils/only-child'\nimport DouColorPanel from '../color-panel
|
|
1
|
+
{"version":3,"file":"color-picker.js","names":["_sfc_main"],"sources":["../../../src/components/color-picker/color-picker.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ChevronDownIcon, CloseIcon } from '@dou-ui/icons'\nimport { computed, ref, useId, useTemplateRef, watch } from 'vue'\nimport { usePopup } from '../../composables/use-popup'\nimport { useNamespace } from '../../utils/namespace'\nimport { OnlyChild } from '../../utils/only-child'\nimport { DouColorPanel } from '../color-panel'\nimport { useLocale } from '../config-provider/use-config'\nimport { useFormDisabled, useFormItem, useFormReadonly, useFormSize } from '../form/use-form-item'\nimport { formatColor, parseColor, toCss } from './color'\nimport type { ColorFormat } from './color'\nimport type { ColorPickerExpose, ColorPickerProps } from './color-picker'\nimport { useTeleport } from '../../utils/teleport'\n\ndefineOptions({ name: 'DouColorPicker', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<ColorPickerProps>(), {\n format: 'hex',\n panel: 'square',\n gamut: 'srgb',\n showAlpha: false,\n presets: () => [],\n showText: true,\n disabled: false,\n invalid: false,\n clearable: false,\n placement: 'bottom-start',\n teleport: undefined,\n})\nconst teleportTarget = useTeleport(() => props.teleport)\nconst model = defineModel<string | null>()\nconst emit = defineEmits<{ change: [value: string | null] }>()\n\nconst ns = useNamespace('color-picker')\nconst { t } = useLocale()\nconst { formItem } = useFormItem()\nconst size = useFormSize(() => props.size)\nconst disabled = useFormDisabled(() => props.disabled)\nconst readonly = useFormReadonly(() => props.readonly)\n// Read-only keeps the field focusable but never opens or changes it.\nconst locked = computed(() => disabled.value || readonly.value)\nconst invalid = computed(() => props.invalid || !!formItem?.invalid.value)\nconst panelId = `dou-color-picker-${useId()}-panel`\n\n/* the field */\n\nconst parsed = computed(() => (model.value ? parseColor(model.value) : null))\nconst printed = computed(() =>\n parsed.value\n ? formatColor(parsed.value, props.format, { alpha: props.showAlpha, gamut: props.gamut })\n : '',\n)\nconst swatch = computed(() =>\n parsed.value ? toCss(parsed.value, props.gamut, props.showAlpha) : undefined,\n)\n// Hold the field at the longest value of the format, so it does not\n// change width while dragging.\nconst FIELD_CHARS: Record<ColorFormat, number> = {\n hex: 9,\n rgb: 16,\n hsl: 20,\n hsv: 20,\n hwb: 20,\n lab: 24,\n lch: 23,\n oklab: 29,\n oklch: 26,\n}\nconst valueWidth = computed(() =>\n props.showText && model.value && props.format !== 'hex'\n ? { minWidth: `${FIELD_CHARS[props.format] + (props.showAlpha ? 8 : 0)}ch` }\n : undefined,\n)\n/* the popup */\n\nconst open = ref(false)\nconst popup = usePopup({\n open,\n trigger: 'manual',\n closeOnOutside: true,\n disabled: locked,\n placement: () => props.placement,\n offset: 4,\n})\nconst { triggerRef, panelRef, rendered, theme, placement, panelStyle } = popup\n\nlet openedWith: string | null | undefined\nwatch(open, (value) => {\n if (value) openedWith = model.value ?? null\n else if ((model.value ?? null) !== openedWith) {\n emit('change', model.value ?? null)\n formItem?.trigger('change')\n }\n})\n\nconst fieldRef = useTemplateRef<HTMLElement>('field')\nconst panelApi = useTemplateRef<InstanceType<typeof DouColorPanel>>('panelApi')\nfunction focus() {\n fieldRef.value?.focus()\n}\nfunction toggle() {\n if (locked.value) return\n open.value = !open.value\n}\n\nfunction onFieldKeydown(event: KeyboardEvent) {\n if (locked.value) return\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') {\n event.preventDefault()\n open.value = true\n requestAnimationFrame(() => panelApi.value?.focus())\n }\n}\n\nfunction onPanelKeydown(event: KeyboardEvent) {\n if (event.key !== 'Escape') return\n // An open format menu takes Escape for itself.\n if ((event.target as HTMLElement).closest('[aria-expanded=\"true\"]')) return\n event.preventDefault()\n open.value = false\n focus()\n}\n\nfunction clear() {\n model.value = null\n emit('change', null)\n formItem?.trigger('change')\n open.value = false\n focus()\n}\n\nconst showClear = computed(() => props.clearable && !locked.value && !!model.value)\n\ndefineExpose<ColorPickerExpose>({ focus, blur: () => fieldRef.value?.blur() })\n</script>\n\n<template>\n <OnlyChild ref=\"triggerRef\">\n <div\n ref=\"field\"\n v-bind=\"$attrs\"\n :id=\"formItem?.inputId\"\n role=\"button\"\n :tabindex=\"disabled ? -1 : 0\"\n aria-haspopup=\"dialog\"\n :aria-expanded=\"open\"\n :aria-controls=\"rendered ? panelId : undefined\"\n :aria-labelledby=\"formItem ? `${formItem.labelId} ${panelId}-value` : undefined\"\n :aria-describedby=\"formItem?.describedBy.value\"\n :aria-invalid=\"invalid || undefined\"\n :aria-disabled=\"disabled || undefined\"\n :aria-readonly=\"readonly || undefined\"\n :class=\"[\n ns.b(),\n 'dou-picker',\n `dou-picker--${size}`,\n ns.is('text', showText),\n ns.is('hex', format === 'hex'),\n ns.is('open', open),\n ns.is('disabled', disabled),\n ns.is('readonly', readonly),\n ns.is('invalid', invalid),\n ]\"\n @click=\"toggle\"\n @keydown=\"onFieldKeydown\"\n >\n <span :class=\"[ns.e('swatch'), ns.is('empty', !model)]\">\n <span :style=\"{ backgroundColor: swatch }\" />\n </span>\n <span\n :id=\"`${panelId}-value`\"\n :class=\"showText ? (model ? 'dou-picker__value' : 'dou-picker__placeholder') : ns.e('sr')\"\n :style=\"valueWidth\"\n >\n {{ model ? printed : (placeholder ?? t('colorPicker.placeholder')) }}\n </span>\n <button\n v-if=\"showClear\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"dou-picker__clear\"\n :aria-label=\"t('colorPicker.clear')\"\n @click.stop=\"clear\"\n >\n <CloseIcon />\n </button>\n <ChevronDownIcon v-if=\"showText\" class=\"dou-picker__arrow\" />\n </div>\n </OnlyChild>\n <Teleport v-if=\"rendered\" :to=\"teleportTarget.to\" :disabled=\"teleportTarget.disabled\">\n <Transition appear name=\"dou-floating\">\n <div\n v-show=\"open\"\n :id=\"panelId\"\n ref=\"panelRef\"\n role=\"dialog\"\n :aria-label=\"t('colorPicker.placeholder')\"\n :class=\"[ns.e('panel'), 'dou-picker-panel', 'dou-floating']\"\n :style=\"panelStyle\"\n :data-placement=\"placement\"\n :data-dou-theme=\"theme\"\n @keydown=\"onPanelKeydown\"\n >\n <DouColorPanel\n ref=\"panelApi\"\n v-model=\"model\"\n :format=\"format\"\n :panel=\"panel\"\n :gamut=\"gamut\"\n :show-alpha=\"showAlpha\"\n :presets=\"presets\"\n :bordered=\"false\"\n />\n </div>\n </Transition>\n </Teleport>\n</template>\n"],"mappings":""}
|
|
@@ -5,7 +5,7 @@ import { usePopup } from "../../composables/use-popup.js";
|
|
|
5
5
|
import { useFormDisabled, useFormItem, useFormReadonly, useFormSize } from "../form/use-form-item.js";
|
|
6
6
|
import { useTeleport } from "../../utils/teleport.js";
|
|
7
7
|
import { formatColor, parseColor, toCss } from "./color.js";
|
|
8
|
-
import
|
|
8
|
+
import { DouColorPanel } from "../color-panel/index.js";
|
|
9
9
|
import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, mergeModels, mergeProps, normalizeClass, normalizeStyle, openBlock, ref, toDisplayString, unref, useId, useModel, useTemplateRef, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
|
|
10
10
|
import { ChevronDownIcon, CloseIcon } from "@dou-ui/icons";
|
|
11
11
|
// src/components/color-picker/color-picker.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -230,7 +230,7 @@ var color_picker_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
|
|
|
230
230
|
"data-placement": unref(placement),
|
|
231
231
|
"data-dou-theme": unref(theme),
|
|
232
232
|
onKeydown: onPanelKeydown
|
|
233
|
-
}, [createVNode(
|
|
233
|
+
}, [createVNode(unref(DouColorPanel), {
|
|
234
234
|
ref_key: "panelApi",
|
|
235
235
|
ref: panelApi,
|
|
236
236
|
modelValue: model.value,
|
package/dist/components/color-picker/color-picker.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color-picker.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_useModel","_openBlock","_createElementBlock","_Fragment","_createVNode","_unref","_withCtx","_createElementVNode","_mergeProps","_normalizeClass","_normalizeStyle","_toDisplayString","_withModifiers","_createCommentVNode","_createBlock","_Teleport","_Transition","_withDirectives","DouColorPanel","_vShow"],"sources":["../../../src/components/color-picker/color-picker.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ChevronDownIcon, CloseIcon } from '@dou-ui/icons'\nimport { computed, ref, useId, useTemplateRef, watch } from 'vue'\nimport { usePopup } from '../../composables/use-popup'\nimport { useNamespace } from '../../utils/namespace'\nimport { OnlyChild } from '../../utils/only-child'\nimport DouColorPanel from '../color-panel/color-panel.vue'\nimport { useLocale } from '../config-provider/use-config'\nimport { useFormDisabled, useFormItem, useFormReadonly, useFormSize } from '../form/use-form-item'\nimport { formatColor, parseColor, toCss } from './color'\nimport type { ColorFormat } from './color'\nimport type { ColorPickerExpose, ColorPickerProps } from './color-picker'\nimport { useTeleport } from '../../utils/teleport'\n\ndefineOptions({ name: 'DouColorPicker', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<ColorPickerProps>(), {\n format: 'hex',\n panel: 'square',\n gamut: 'srgb',\n showAlpha: false,\n presets: () => [],\n showText: true,\n disabled: false,\n invalid: false,\n clearable: false,\n placement: 'bottom-start',\n teleport: undefined,\n})\nconst teleportTarget = useTeleport(() => props.teleport)\nconst model = defineModel<string | null>()\nconst emit = defineEmits<{ change: [value: string | null] }>()\n\nconst ns = useNamespace('color-picker')\nconst { t } = useLocale()\nconst { formItem } = useFormItem()\nconst size = useFormSize(() => props.size)\nconst disabled = useFormDisabled(() => props.disabled)\nconst readonly = useFormReadonly(() => props.readonly)\n// Read-only keeps the field focusable but never opens or changes it.\nconst locked = computed(() => disabled.value || readonly.value)\nconst invalid = computed(() => props.invalid || !!formItem?.invalid.value)\nconst panelId = `dou-color-picker-${useId()}-panel`\n\n/* the field */\n\nconst parsed = computed(() => (model.value ? parseColor(model.value) : null))\nconst printed = computed(() =>\n parsed.value\n ? formatColor(parsed.value, props.format, { alpha: props.showAlpha, gamut: props.gamut })\n : '',\n)\nconst swatch = computed(() =>\n parsed.value ? toCss(parsed.value, props.gamut, props.showAlpha) : undefined,\n)\n// Hold the field at the longest value of the format, so it does not\n// change width while dragging.\nconst FIELD_CHARS: Record<ColorFormat, number> = {\n hex: 9,\n rgb: 16,\n hsl: 20,\n hsv: 20,\n hwb: 20,\n lab: 24,\n lch: 23,\n oklab: 29,\n oklch: 26,\n}\nconst valueWidth = computed(() =>\n props.showText && model.value && props.format !== 'hex'\n ? { minWidth: `${FIELD_CHARS[props.format] + (props.showAlpha ? 8 : 0)}ch` }\n : undefined,\n)\n/* the popup */\n\nconst open = ref(false)\nconst popup = usePopup({\n open,\n trigger: 'manual',\n closeOnOutside: true,\n disabled: locked,\n placement: () => props.placement,\n offset: 4,\n})\nconst { triggerRef, panelRef, rendered, theme, placement, panelStyle } = popup\n\nlet openedWith: string | null | undefined\nwatch(open, (value) => {\n if (value) openedWith = model.value ?? null\n else if ((model.value ?? null) !== openedWith) {\n emit('change', model.value ?? null)\n formItem?.trigger('change')\n }\n})\n\nconst fieldRef = useTemplateRef<HTMLElement>('field')\nconst panelApi = useTemplateRef<InstanceType<typeof DouColorPanel>>('panelApi')\nfunction focus() {\n fieldRef.value?.focus()\n}\nfunction toggle() {\n if (locked.value) return\n open.value = !open.value\n}\n\nfunction onFieldKeydown(event: KeyboardEvent) {\n if (locked.value) return\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') {\n event.preventDefault()\n open.value = true\n requestAnimationFrame(() => panelApi.value?.focus())\n }\n}\n\nfunction onPanelKeydown(event: KeyboardEvent) {\n if (event.key !== 'Escape') return\n // An open format menu takes Escape for itself.\n if ((event.target as HTMLElement).closest('[aria-expanded=\"true\"]')) return\n event.preventDefault()\n open.value = false\n focus()\n}\n\nfunction clear() {\n model.value = null\n emit('change', null)\n formItem?.trigger('change')\n open.value = false\n focus()\n}\n\nconst showClear = computed(() => props.clearable && !locked.value && !!model.value)\n\ndefineExpose<ColorPickerExpose>({ focus, blur: () => fieldRef.value?.blur() })\n</script>\n\n<template>\n <OnlyChild ref=\"triggerRef\">\n <div\n ref=\"field\"\n v-bind=\"$attrs\"\n :id=\"formItem?.inputId\"\n role=\"button\"\n :tabindex=\"disabled ? -1 : 0\"\n aria-haspopup=\"dialog\"\n :aria-expanded=\"open\"\n :aria-controls=\"rendered ? panelId : undefined\"\n :aria-labelledby=\"formItem ? `${formItem.labelId} ${panelId}-value` : undefined\"\n :aria-describedby=\"formItem?.describedBy.value\"\n :aria-invalid=\"invalid || undefined\"\n :aria-disabled=\"disabled || undefined\"\n :aria-readonly=\"readonly || undefined\"\n :class=\"[\n ns.b(),\n 'dou-picker',\n `dou-picker--${size}`,\n ns.is('text', showText),\n ns.is('hex', format === 'hex'),\n ns.is('open', open),\n ns.is('disabled', disabled),\n ns.is('readonly', readonly),\n ns.is('invalid', invalid),\n ]\"\n @click=\"toggle\"\n @keydown=\"onFieldKeydown\"\n >\n <span :class=\"[ns.e('swatch'), ns.is('empty', !model)]\">\n <span :style=\"{ backgroundColor: swatch }\" />\n </span>\n <span\n :id=\"`${panelId}-value`\"\n :class=\"showText ? (model ? 'dou-picker__value' : 'dou-picker__placeholder') : ns.e('sr')\"\n :style=\"valueWidth\"\n >\n {{ model ? printed : (placeholder ?? t('colorPicker.placeholder')) }}\n </span>\n <button\n v-if=\"showClear\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"dou-picker__clear\"\n :aria-label=\"t('colorPicker.clear')\"\n @click.stop=\"clear\"\n >\n <CloseIcon />\n </button>\n <ChevronDownIcon v-if=\"showText\" class=\"dou-picker__arrow\" />\n </div>\n </OnlyChild>\n <Teleport v-if=\"rendered\" :to=\"teleportTarget.to\" :disabled=\"teleportTarget.disabled\">\n <Transition appear name=\"dou-floating\">\n <div\n v-show=\"open\"\n :id=\"panelId\"\n ref=\"panelRef\"\n role=\"dialog\"\n :aria-label=\"t('colorPicker.placeholder')\"\n :class=\"[ns.e('panel'), 'dou-picker-panel', 'dou-floating']\"\n :style=\"panelStyle\"\n :data-placement=\"placement\"\n :data-dou-theme=\"theme\"\n @keydown=\"onPanelKeydown\"\n >\n <DouColorPanel\n ref=\"panelApi\"\n v-model=\"model\"\n :format=\"format\"\n :panel=\"panel\"\n :gamut=\"gamut\"\n :show-alpha=\"showAlpha\"\n :presets=\"presets\"\n :bordered=\"false\"\n />\n </div>\n </Transition>\n </Teleport>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"color-picker.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_useModel","_openBlock","_createElementBlock","_Fragment","_createVNode","_unref","_withCtx","_createElementVNode","_mergeProps","_normalizeClass","_normalizeStyle","_toDisplayString","_withModifiers","_createCommentVNode","_createBlock","_Teleport","_Transition","_withDirectives","_vShow"],"sources":["../../../src/components/color-picker/color-picker.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ChevronDownIcon, CloseIcon } from '@dou-ui/icons'\nimport { computed, ref, useId, useTemplateRef, watch } from 'vue'\nimport { usePopup } from '../../composables/use-popup'\nimport { useNamespace } from '../../utils/namespace'\nimport { OnlyChild } from '../../utils/only-child'\nimport { DouColorPanel } from '../color-panel'\nimport { useLocale } from '../config-provider/use-config'\nimport { useFormDisabled, useFormItem, useFormReadonly, useFormSize } from '../form/use-form-item'\nimport { formatColor, parseColor, toCss } from './color'\nimport type { ColorFormat } from './color'\nimport type { ColorPickerExpose, ColorPickerProps } from './color-picker'\nimport { useTeleport } from '../../utils/teleport'\n\ndefineOptions({ name: 'DouColorPicker', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<ColorPickerProps>(), {\n format: 'hex',\n panel: 'square',\n gamut: 'srgb',\n showAlpha: false,\n presets: () => [],\n showText: true,\n disabled: false,\n invalid: false,\n clearable: false,\n placement: 'bottom-start',\n teleport: undefined,\n})\nconst teleportTarget = useTeleport(() => props.teleport)\nconst model = defineModel<string | null>()\nconst emit = defineEmits<{ change: [value: string | null] }>()\n\nconst ns = useNamespace('color-picker')\nconst { t } = useLocale()\nconst { formItem } = useFormItem()\nconst size = useFormSize(() => props.size)\nconst disabled = useFormDisabled(() => props.disabled)\nconst readonly = useFormReadonly(() => props.readonly)\n// Read-only keeps the field focusable but never opens or changes it.\nconst locked = computed(() => disabled.value || readonly.value)\nconst invalid = computed(() => props.invalid || !!formItem?.invalid.value)\nconst panelId = `dou-color-picker-${useId()}-panel`\n\n/* the field */\n\nconst parsed = computed(() => (model.value ? parseColor(model.value) : null))\nconst printed = computed(() =>\n parsed.value\n ? formatColor(parsed.value, props.format, { alpha: props.showAlpha, gamut: props.gamut })\n : '',\n)\nconst swatch = computed(() =>\n parsed.value ? toCss(parsed.value, props.gamut, props.showAlpha) : undefined,\n)\n// Hold the field at the longest value of the format, so it does not\n// change width while dragging.\nconst FIELD_CHARS: Record<ColorFormat, number> = {\n hex: 9,\n rgb: 16,\n hsl: 20,\n hsv: 20,\n hwb: 20,\n lab: 24,\n lch: 23,\n oklab: 29,\n oklch: 26,\n}\nconst valueWidth = computed(() =>\n props.showText && model.value && props.format !== 'hex'\n ? { minWidth: `${FIELD_CHARS[props.format] + (props.showAlpha ? 8 : 0)}ch` }\n : undefined,\n)\n/* the popup */\n\nconst open = ref(false)\nconst popup = usePopup({\n open,\n trigger: 'manual',\n closeOnOutside: true,\n disabled: locked,\n placement: () => props.placement,\n offset: 4,\n})\nconst { triggerRef, panelRef, rendered, theme, placement, panelStyle } = popup\n\nlet openedWith: string | null | undefined\nwatch(open, (value) => {\n if (value) openedWith = model.value ?? null\n else if ((model.value ?? null) !== openedWith) {\n emit('change', model.value ?? null)\n formItem?.trigger('change')\n }\n})\n\nconst fieldRef = useTemplateRef<HTMLElement>('field')\nconst panelApi = useTemplateRef<InstanceType<typeof DouColorPanel>>('panelApi')\nfunction focus() {\n fieldRef.value?.focus()\n}\nfunction toggle() {\n if (locked.value) return\n open.value = !open.value\n}\n\nfunction onFieldKeydown(event: KeyboardEvent) {\n if (locked.value) return\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') {\n event.preventDefault()\n open.value = true\n requestAnimationFrame(() => panelApi.value?.focus())\n }\n}\n\nfunction onPanelKeydown(event: KeyboardEvent) {\n if (event.key !== 'Escape') return\n // An open format menu takes Escape for itself.\n if ((event.target as HTMLElement).closest('[aria-expanded=\"true\"]')) return\n event.preventDefault()\n open.value = false\n focus()\n}\n\nfunction clear() {\n model.value = null\n emit('change', null)\n formItem?.trigger('change')\n open.value = false\n focus()\n}\n\nconst showClear = computed(() => props.clearable && !locked.value && !!model.value)\n\ndefineExpose<ColorPickerExpose>({ focus, blur: () => fieldRef.value?.blur() })\n</script>\n\n<template>\n <OnlyChild ref=\"triggerRef\">\n <div\n ref=\"field\"\n v-bind=\"$attrs\"\n :id=\"formItem?.inputId\"\n role=\"button\"\n :tabindex=\"disabled ? -1 : 0\"\n aria-haspopup=\"dialog\"\n :aria-expanded=\"open\"\n :aria-controls=\"rendered ? panelId : undefined\"\n :aria-labelledby=\"formItem ? `${formItem.labelId} ${panelId}-value` : undefined\"\n :aria-describedby=\"formItem?.describedBy.value\"\n :aria-invalid=\"invalid || undefined\"\n :aria-disabled=\"disabled || undefined\"\n :aria-readonly=\"readonly || undefined\"\n :class=\"[\n ns.b(),\n 'dou-picker',\n `dou-picker--${size}`,\n ns.is('text', showText),\n ns.is('hex', format === 'hex'),\n ns.is('open', open),\n ns.is('disabled', disabled),\n ns.is('readonly', readonly),\n ns.is('invalid', invalid),\n ]\"\n @click=\"toggle\"\n @keydown=\"onFieldKeydown\"\n >\n <span :class=\"[ns.e('swatch'), ns.is('empty', !model)]\">\n <span :style=\"{ backgroundColor: swatch }\" />\n </span>\n <span\n :id=\"`${panelId}-value`\"\n :class=\"showText ? (model ? 'dou-picker__value' : 'dou-picker__placeholder') : ns.e('sr')\"\n :style=\"valueWidth\"\n >\n {{ model ? printed : (placeholder ?? t('colorPicker.placeholder')) }}\n </span>\n <button\n v-if=\"showClear\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"dou-picker__clear\"\n :aria-label=\"t('colorPicker.clear')\"\n @click.stop=\"clear\"\n >\n <CloseIcon />\n </button>\n <ChevronDownIcon v-if=\"showText\" class=\"dou-picker__arrow\" />\n </div>\n </OnlyChild>\n <Teleport v-if=\"rendered\" :to=\"teleportTarget.to\" :disabled=\"teleportTarget.disabled\">\n <Transition appear name=\"dou-floating\">\n <div\n v-show=\"open\"\n :id=\"panelId\"\n ref=\"panelRef\"\n role=\"dialog\"\n :aria-label=\"t('colorPicker.placeholder')\"\n :class=\"[ns.e('panel'), 'dou-picker-panel', 'dou-floating']\"\n :style=\"panelStyle\"\n :data-placement=\"placement\"\n :data-dou-theme=\"theme\"\n @keydown=\"onPanelKeydown\"\n >\n <DouColorPanel\n ref=\"panelApi\"\n v-model=\"model\"\n :format=\"format\"\n :panel=\"panel\"\n :gamut=\"gamut\"\n :show-alpha=\"showAlpha\"\n :presets=\"presets\"\n :bordered=\"false\"\n />\n </div>\n </Transition>\n </Teleport>\n</template>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comment-thread.js","names":["_sfc_main"],"sources":["../../../src/components/comment-thread/comment-thread.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { CheckIcon, MoreHorizontalIcon, RotateCcwIcon } from '@dou-ui/icons'\nimport { computed, nextTick, onMounted, ref, useTemplateRef } from 'vue'\nimport type { TextareaHTMLAttributes } from 'vue'\nimport type { WithAttributes } from '../../utils/install'\nimport { isComposing } from '../../utils/keyboard'\nimport { useNamespace } from '../../utils/namespace'\nimport DouAvatar from '../avatar/avatar.vue'\nimport { DouButton } from '../button'\nimport { useLocale } from '../config-provider/use-config'\nimport DouDropdown from '../dropdown/dropdown.vue'\nimport DouDropdownItem from '../dropdown/dropdown-item.vue'\nimport DouRelativeTime from '../relative-time/relative-time.vue'\nimport DouTextareaComponent from '../textarea/textarea.vue'\nimport DouTooltip from '../tooltip/tooltip.vue'\nimport {\n applyCommentAction,\n createCommentId,\n type CommentAction,\n type CommentItem,\n type CommentThread,\n} from './comments'\nimport type {\n CommentThreadEmits,\n CommentThreadExpose,\n CommentThreadProps,\n CommentThreadSlots,\n} from './comment-thread'\n\n// 让模板里也能写这个组件转交的原生属性\nconst DouTextarea = DouTextareaComponent as WithAttributes<\n typeof DouTextareaComponent,\n TextareaHTMLAttributes\n>\n\ndefineOptions({ name: 'DouCommentThread' })\n\nconst props = withDefaults(defineProps<CommentThreadProps>(), {\n author: undefined,\n readonly: false,\n placeholder: undefined,\n autofocus: false,\n})\n// without `v-model:thread`, the thread is kept here\nconst thread = defineModel<CommentThread | null>('thread', { default: null })\nconst emit = defineEmits<{\n action: CommentThreadEmits['action']\n cancel: CommentThreadEmits['cancel']\n}>()\ndefineSlots<CommentThreadSlots>()\n\nconst ns = useNamespace('comment-thread')\nconst { t } = useLocale()\n\n/** A week: older comments show their date instead of \"3 days ago\". */\nconst WEEK = 7 * 24 * 3600 * 1000\n\nconst resolved = computed(() => thread.value?.resolved)\n/** Who may change things: nobody when read-only, or when no `author` says who is writing. */\nconst writer = computed(() => (props.readonly ? undefined : props.author))\nconst canWrite = computed(() => !!writer.value && !resolved.value)\n\nconst root = useTemplateRef<HTMLElement>('root')\n\nfunction act(action: CommentAction) {\n emit('action', action)\n if (action.type === 'create') thread.value = action.thread\n else if (thread.value) thread.value = applyCommentAction([thread.value], action)[0] ?? null\n void keepFocus()\n}\n\n/**\n * The button or box that held focus can go with a change (the edit box\n * once saved, the reply box once resolved): focus moves on to the reply\n * box, or the reopen button, instead of falling to the page.\n */\nasync function keepFocus() {\n await nextTick()\n const el = root.value\n const now = document.activeElement\n if (!el || (now && now !== document.body && !el.contains(now))) return\n if (now && now !== document.body && el.contains(now) && now.isConnected) return\n if (box.value) focus()\n else el.querySelector<HTMLElement>(`.${ns.e('status')} button`)?.focus({ preventScroll: true })\n}\n\nconst now = () => new Date().toISOString()\n\n// writing a new comment or a reply\nconst draft = ref('')\nconst box = useTemplateRef<InstanceType<typeof DouTextarea>>('box')\n\nfunction send() {\n const body = draft.value.trim()\n const author = writer.value\n if (!body || !author) return\n const comment: CommentItem = {\n id: createCommentId(),\n author: { ...author },\n body,\n createdAt: now(),\n }\n draft.value = ''\n if (thread.value) act({ type: 'reply', threadId: thread.value.id, comment })\n else act({ type: 'create', thread: { id: createCommentId(), comments: [comment] } })\n}\n\n/** A key handled here: not the page's too. */\nfunction handled(event: KeyboardEvent) {\n event.preventDefault()\n event.stopPropagation()\n}\n\nfunction onBoxKeydown(event: KeyboardEvent) {\n if (isComposing(event)) return\n if (event.key === 'Enter' && !event.shiftKey) {\n handled(event)\n send()\n } else if (event.key === 'Escape') {\n // an empty box lets Escape go on, to close the popover or drawer around\n if (draft.value) {\n handled(event)\n draft.value = ''\n } else emit('cancel')\n }\n}\n\n// changing a comment in place\nconst editing = ref<string | null>(null)\nconst editDraft = ref('')\nconst editBox = useTemplateRef<InstanceType<typeof DouTextarea>[]>('editBox')\n\nfunction startEdit(comment: CommentItem) {\n confirming.value = false\n editing.value = comment.id\n editDraft.value = comment.body\n void nextTick(() => {\n const el = editBox.value?.[0]?.textarea\n el?.focus()\n el?.setSelectionRange(el.value.length, el.value.length)\n })\n}\n\nfunction saveEdit() {\n const id = editing.value\n const body = editDraft.value.trim()\n if (!id || !thread.value || !body) return\n editing.value = null\n const before = thread.value.comments.find((comment) => comment.id === id)\n if (before?.body === body) return void keepFocus()\n act({ type: 'edit', threadId: thread.value.id, commentId: id, body, editedAt: now() })\n}\n\nfunction onEditKeydown(event: KeyboardEvent) {\n if (isComposing(event)) return\n if (event.key === 'Enter' && !event.shiftKey) {\n handled(event)\n saveEdit()\n } else if (event.key === 'Escape') {\n handled(event)\n editing.value = null\n void keepFocus()\n }\n}\n\n// deleting the first comment takes the thread with it: asked first\nconst confirming = ref(false)\n\nfunction onMenu(comment: CommentItem, index: number, value: unknown) {\n if (!thread.value) return\n if (value === 'edit') startEdit(comment)\n else if (value === 'delete') {\n if (index === 0) confirming.value = true\n else act({ type: 'delete', threadId: thread.value.id, commentId: comment.id })\n }\n}\n\nfunction removeThread() {\n if (!thread.value) return\n confirming.value = false\n act({ type: 'remove', threadId: thread.value.id })\n}\n\nfunction resolve() {\n const by = writer.value\n if (thread.value && by)\n act({ type: 'resolve', threadId: thread.value.id, by: { ...by }, at: now() })\n}\n\nfunction reopen() {\n if (thread.value) act({ type: 'reopen', threadId: thread.value.id })\n}\n\nconst placeholderText = computed(() =>\n thread.value\n ? t('commentThread.replyPlaceholder')\n : (props.placeholder ?? t('commentThread.placeholder')),\n)\n\nconst focus = () => box.value?.textarea?.focus({ preventScroll: true })\nonMounted(() => {\n if (props.autofocus) focus()\n})\ndefineExpose<CommentThreadExpose>({ focus })\n</script>\n\n<template>\n <div ref=\"root\" role=\"group\" :class=\"[ns.b(), { 'is-resolved': !!resolved, 'is-new': !thread }]\">\n <slot name=\"header\" />\n <div v-if=\"resolved\" :class=\"ns.e('status')\">\n <CheckIcon :class=\"ns.e('status-icon')\" />\n <span :class=\"ns.e('status-text')\">{{\n t('commentThread.resolvedBy', { name: resolved.by.name })\n }}</span>\n <DouButton v-if=\"writer\" variant=\"ghost\" size=\"sm\" @click=\"reopen\">\n <template #leading><RotateCcwIcon /></template>\n {{ t('commentThread.reopen') }}\n </DouButton>\n </div>\n <ol v-if=\"thread?.comments.length\" :class=\"ns.e('list')\">\n <li v-for=\"(comment, index) in thread.comments\" :key=\"comment.id\" :class=\"ns.e('comment')\">\n <div :class=\"ns.e('head')\">\n <DouAvatar\n :name=\"comment.author.name\"\n :src=\"comment.author.avatar\"\n size=\"sm\"\n :class=\"ns.e('avatar')\"\n />\n <span :class=\"ns.e('author')\">{{ comment.author.name }}</span>\n <DouRelativeTime\n :value=\"comment.createdAt\"\n short\n :absolute-after=\"WEEK\"\n :class=\"ns.e('time')\"\n />\n <span v-if=\"comment.editedAt\" :class=\"ns.e('edited')\">{{\n t('commentThread.edited')\n }}</span>\n <div v-if=\"writer\" :class=\"ns.e('actions')\">\n <DouTooltip v-if=\"index === 0 && !resolved\" :content=\"t('commentThread.resolve')\">\n <DouButton\n variant=\"ghost\"\n size=\"sm\"\n :aria-label=\"t('commentThread.resolve')\"\n @click=\"resolve\"\n >\n <CheckIcon />\n </DouButton>\n </DouTooltip>\n <DouDropdown\n v-if=\"comment.author.id === writer.id && !resolved\"\n placement=\"bottom-end\"\n @select=\"(value) => onMenu(comment, index, value)\"\n >\n <DouButton variant=\"ghost\" size=\"sm\" :aria-label=\"t('commentThread.more')\">\n <MoreHorizontalIcon />\n </DouButton>\n <template #menu>\n <DouDropdownItem value=\"edit\">{{ t('commentThread.edit') }}</DouDropdownItem>\n <DouDropdownItem value=\"delete\" tone=\"danger\">{{\n index === 0 ? t('commentThread.deleteThread') : t('commentThread.delete')\n }}</DouDropdownItem>\n </template>\n </DouDropdown>\n </div>\n </div>\n <div v-if=\"editing === comment.id\" :class=\"ns.e('editor')\">\n <DouTextarea\n ref=\"editBox\"\n v-model=\"editDraft\"\n :autosize=\"{ minRows: 1, maxRows: 8 }\"\n size=\"sm\"\n @keydown=\"onEditKeydown\"\n />\n <div :class=\"ns.e('buttons')\">\n <DouButton variant=\"ghost\" size=\"sm\" @click=\"editing = null\">{{\n t('commentThread.cancel')\n }}</DouButton>\n <DouButton\n variant=\"solid\"\n tone=\"primary\"\n size=\"sm\"\n :disabled=\"!editDraft.trim()\"\n @click=\"saveEdit\"\n >{{ t('commentThread.save') }}</DouButton\n >\n </div>\n </div>\n <p v-else :class=\"ns.e('body')\">{{ comment.body }}</p>\n <div v-if=\"index === 0 && confirming\" :class=\"ns.e('confirm')\" role=\"alert\">\n <span>{{ t('commentThread.deleteThreadConfirm') }}</span>\n <div :class=\"ns.e('buttons')\">\n <DouButton variant=\"ghost\" size=\"sm\" @click=\"confirming = false\">{{\n t('commentThread.cancel')\n }}</DouButton>\n <DouButton variant=\"solid\" tone=\"danger\" size=\"sm\" @click=\"removeThread\">{{\n t('commentThread.delete')\n }}</DouButton>\n </div>\n </div>\n </li>\n </ol>\n <div v-if=\"canWrite\" :class=\"ns.e('composer')\">\n <DouTextarea\n ref=\"box\"\n v-model=\"draft\"\n :autosize=\"{ minRows: 1, maxRows: 8 }\"\n :placeholder=\"placeholderText\"\n :aria-label=\"placeholderText\"\n size=\"sm\"\n @keydown=\"onBoxKeydown\"\n />\n <div v-if=\"draft || !thread\" :class=\"ns.e('buttons')\">\n <DouButton v-if=\"!thread\" variant=\"ghost\" size=\"sm\" @click=\"emit('cancel')\">{{\n t('commentThread.cancel')\n }}</DouButton>\n <DouButton\n variant=\"solid\"\n tone=\"primary\"\n size=\"sm\"\n :disabled=\"!draft.trim()\"\n @click=\"send\"\n >{{ t('commentThread.send') }}</DouButton\n >\n </div>\n </div>\n </div>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"comment-thread.js","names":["_sfc_main"],"sources":["../../../src/components/comment-thread/comment-thread.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { CheckIcon, MoreHorizontalIcon, RotateCcwIcon } from '@dou-ui/icons'\nimport { computed, nextTick, onMounted, ref, useTemplateRef } from 'vue'\nimport type { TextareaHTMLAttributes } from 'vue'\nimport type { WithAttributes } from '../../utils/install'\nimport { isComposing } from '../../utils/keyboard'\nimport { useNamespace } from '../../utils/namespace'\nimport { DouAvatar } from '../avatar'\nimport { DouButton } from '../button'\nimport { useLocale } from '../config-provider/use-config'\nimport { DouDropdown, DouDropdownItem } from '../dropdown'\nimport { DouRelativeTime } from '../relative-time'\nimport { DouTextarea as DouTextareaComponent } from '../textarea'\nimport { DouTooltip } from '../tooltip'\nimport {\n applyCommentAction,\n createCommentId,\n type CommentAction,\n type CommentItem,\n type CommentThread,\n} from './comments'\nimport type {\n CommentThreadEmits,\n CommentThreadExpose,\n CommentThreadProps,\n CommentThreadSlots,\n} from './comment-thread'\n\n// 让模板里也能写这个组件转交的原生属性\nconst DouTextarea = DouTextareaComponent as WithAttributes<\n typeof DouTextareaComponent,\n TextareaHTMLAttributes\n>\n\ndefineOptions({ name: 'DouCommentThread' })\n\nconst props = withDefaults(defineProps<CommentThreadProps>(), {\n author: undefined,\n readonly: false,\n placeholder: undefined,\n autofocus: false,\n})\n// without `v-model:thread`, the thread is kept here\nconst thread = defineModel<CommentThread | null>('thread', { default: null })\nconst emit = defineEmits<{\n action: CommentThreadEmits['action']\n cancel: CommentThreadEmits['cancel']\n}>()\ndefineSlots<CommentThreadSlots>()\n\nconst ns = useNamespace('comment-thread')\nconst { t } = useLocale()\n\n/** A week: older comments show their date instead of \"3 days ago\". */\nconst WEEK = 7 * 24 * 3600 * 1000\n\nconst resolved = computed(() => thread.value?.resolved)\n/** Who may change things: nobody when read-only, or when no `author` says who is writing. */\nconst writer = computed(() => (props.readonly ? undefined : props.author))\nconst canWrite = computed(() => !!writer.value && !resolved.value)\n\nconst root = useTemplateRef<HTMLElement>('root')\n\nfunction act(action: CommentAction) {\n emit('action', action)\n if (action.type === 'create') thread.value = action.thread\n else if (thread.value) thread.value = applyCommentAction([thread.value], action)[0] ?? null\n void keepFocus()\n}\n\n/**\n * The button or box that held focus can go with a change (the edit box\n * once saved, the reply box once resolved): focus moves on to the reply\n * box, or the reopen button, instead of falling to the page.\n */\nasync function keepFocus() {\n await nextTick()\n const el = root.value\n const now = document.activeElement\n if (!el || (now && now !== document.body && !el.contains(now))) return\n if (now && now !== document.body && el.contains(now) && now.isConnected) return\n if (box.value) focus()\n else el.querySelector<HTMLElement>(`.${ns.e('status')} button`)?.focus({ preventScroll: true })\n}\n\nconst now = () => new Date().toISOString()\n\n// writing a new comment or a reply\nconst draft = ref('')\nconst box = useTemplateRef<InstanceType<typeof DouTextarea>>('box')\n\nfunction send() {\n const body = draft.value.trim()\n const author = writer.value\n if (!body || !author) return\n const comment: CommentItem = {\n id: createCommentId(),\n author: { ...author },\n body,\n createdAt: now(),\n }\n draft.value = ''\n if (thread.value) act({ type: 'reply', threadId: thread.value.id, comment })\n else act({ type: 'create', thread: { id: createCommentId(), comments: [comment] } })\n}\n\n/** A key handled here: not the page's too. */\nfunction handled(event: KeyboardEvent) {\n event.preventDefault()\n event.stopPropagation()\n}\n\nfunction onBoxKeydown(event: KeyboardEvent) {\n if (isComposing(event)) return\n if (event.key === 'Enter' && !event.shiftKey) {\n handled(event)\n send()\n } else if (event.key === 'Escape') {\n // an empty box lets Escape go on, to close the popover or drawer around\n if (draft.value) {\n handled(event)\n draft.value = ''\n } else emit('cancel')\n }\n}\n\n// changing a comment in place\nconst editing = ref<string | null>(null)\nconst editDraft = ref('')\nconst editBox = useTemplateRef<InstanceType<typeof DouTextarea>[]>('editBox')\n\nfunction startEdit(comment: CommentItem) {\n confirming.value = false\n editing.value = comment.id\n editDraft.value = comment.body\n void nextTick(() => {\n const el = editBox.value?.[0]?.textarea\n el?.focus()\n el?.setSelectionRange(el.value.length, el.value.length)\n })\n}\n\nfunction saveEdit() {\n const id = editing.value\n const body = editDraft.value.trim()\n if (!id || !thread.value || !body) return\n editing.value = null\n const before = thread.value.comments.find((comment) => comment.id === id)\n if (before?.body === body) return void keepFocus()\n act({ type: 'edit', threadId: thread.value.id, commentId: id, body, editedAt: now() })\n}\n\nfunction onEditKeydown(event: KeyboardEvent) {\n if (isComposing(event)) return\n if (event.key === 'Enter' && !event.shiftKey) {\n handled(event)\n saveEdit()\n } else if (event.key === 'Escape') {\n handled(event)\n editing.value = null\n void keepFocus()\n }\n}\n\n// deleting the first comment takes the thread with it: asked first\nconst confirming = ref(false)\n\nfunction onMenu(comment: CommentItem, index: number, value: unknown) {\n if (!thread.value) return\n if (value === 'edit') startEdit(comment)\n else if (value === 'delete') {\n if (index === 0) confirming.value = true\n else act({ type: 'delete', threadId: thread.value.id, commentId: comment.id })\n }\n}\n\nfunction removeThread() {\n if (!thread.value) return\n confirming.value = false\n act({ type: 'remove', threadId: thread.value.id })\n}\n\nfunction resolve() {\n const by = writer.value\n if (thread.value && by)\n act({ type: 'resolve', threadId: thread.value.id, by: { ...by }, at: now() })\n}\n\nfunction reopen() {\n if (thread.value) act({ type: 'reopen', threadId: thread.value.id })\n}\n\nconst placeholderText = computed(() =>\n thread.value\n ? t('commentThread.replyPlaceholder')\n : (props.placeholder ?? t('commentThread.placeholder')),\n)\n\nconst focus = () => box.value?.textarea?.focus({ preventScroll: true })\nonMounted(() => {\n if (props.autofocus) focus()\n})\ndefineExpose<CommentThreadExpose>({ focus })\n</script>\n\n<template>\n <div ref=\"root\" role=\"group\" :class=\"[ns.b(), { 'is-resolved': !!resolved, 'is-new': !thread }]\">\n <slot name=\"header\" />\n <div v-if=\"resolved\" :class=\"ns.e('status')\">\n <CheckIcon :class=\"ns.e('status-icon')\" />\n <span :class=\"ns.e('status-text')\">{{\n t('commentThread.resolvedBy', { name: resolved.by.name })\n }}</span>\n <DouButton v-if=\"writer\" variant=\"ghost\" size=\"sm\" @click=\"reopen\">\n <template #leading><RotateCcwIcon /></template>\n {{ t('commentThread.reopen') }}\n </DouButton>\n </div>\n <ol v-if=\"thread?.comments.length\" :class=\"ns.e('list')\">\n <li v-for=\"(comment, index) in thread.comments\" :key=\"comment.id\" :class=\"ns.e('comment')\">\n <div :class=\"ns.e('head')\">\n <DouAvatar\n :name=\"comment.author.name\"\n :src=\"comment.author.avatar\"\n size=\"sm\"\n :class=\"ns.e('avatar')\"\n />\n <span :class=\"ns.e('author')\">{{ comment.author.name }}</span>\n <DouRelativeTime\n :value=\"comment.createdAt\"\n short\n :absolute-after=\"WEEK\"\n :class=\"ns.e('time')\"\n />\n <span v-if=\"comment.editedAt\" :class=\"ns.e('edited')\">{{\n t('commentThread.edited')\n }}</span>\n <div v-if=\"writer\" :class=\"ns.e('actions')\">\n <DouTooltip v-if=\"index === 0 && !resolved\" :content=\"t('commentThread.resolve')\">\n <DouButton\n variant=\"ghost\"\n size=\"sm\"\n :aria-label=\"t('commentThread.resolve')\"\n @click=\"resolve\"\n >\n <CheckIcon />\n </DouButton>\n </DouTooltip>\n <DouDropdown\n v-if=\"comment.author.id === writer.id && !resolved\"\n placement=\"bottom-end\"\n @select=\"(value) => onMenu(comment, index, value)\"\n >\n <DouButton variant=\"ghost\" size=\"sm\" :aria-label=\"t('commentThread.more')\">\n <MoreHorizontalIcon />\n </DouButton>\n <template #menu>\n <DouDropdownItem value=\"edit\">{{ t('commentThread.edit') }}</DouDropdownItem>\n <DouDropdownItem value=\"delete\" tone=\"danger\">{{\n index === 0 ? t('commentThread.deleteThread') : t('commentThread.delete')\n }}</DouDropdownItem>\n </template>\n </DouDropdown>\n </div>\n </div>\n <div v-if=\"editing === comment.id\" :class=\"ns.e('editor')\">\n <DouTextarea\n ref=\"editBox\"\n v-model=\"editDraft\"\n :autosize=\"{ minRows: 1, maxRows: 8 }\"\n size=\"sm\"\n @keydown=\"onEditKeydown\"\n />\n <div :class=\"ns.e('buttons')\">\n <DouButton variant=\"ghost\" size=\"sm\" @click=\"editing = null\">{{\n t('commentThread.cancel')\n }}</DouButton>\n <DouButton\n variant=\"solid\"\n tone=\"primary\"\n size=\"sm\"\n :disabled=\"!editDraft.trim()\"\n @click=\"saveEdit\"\n >{{ t('commentThread.save') }}</DouButton\n >\n </div>\n </div>\n <p v-else :class=\"ns.e('body')\">{{ comment.body }}</p>\n <div v-if=\"index === 0 && confirming\" :class=\"ns.e('confirm')\" role=\"alert\">\n <span>{{ t('commentThread.deleteThreadConfirm') }}</span>\n <div :class=\"ns.e('buttons')\">\n <DouButton variant=\"ghost\" size=\"sm\" @click=\"confirming = false\">{{\n t('commentThread.cancel')\n }}</DouButton>\n <DouButton variant=\"solid\" tone=\"danger\" size=\"sm\" @click=\"removeThread\">{{\n t('commentThread.delete')\n }}</DouButton>\n </div>\n </div>\n </li>\n </ol>\n <div v-if=\"canWrite\" :class=\"ns.e('composer')\">\n <DouTextarea\n ref=\"box\"\n v-model=\"draft\"\n :autosize=\"{ minRows: 1, maxRows: 8 }\"\n :placeholder=\"placeholderText\"\n :aria-label=\"placeholderText\"\n size=\"sm\"\n @keydown=\"onBoxKeydown\"\n />\n <div v-if=\"draft || !thread\" :class=\"ns.e('buttons')\">\n <DouButton v-if=\"!thread\" variant=\"ghost\" size=\"sm\" @click=\"emit('cancel')\">{{\n t('commentThread.cancel')\n }}</DouButton>\n <DouButton\n variant=\"solid\"\n tone=\"primary\"\n size=\"sm\"\n :disabled=\"!draft.trim()\"\n @click=\"send\"\n >{{ t('commentThread.send') }}</DouButton\n >\n </div>\n </div>\n </div>\n</template>\n"],"mappings":""}
|
package/dist/components/comment-thread/comment-thread.vue_vue_type_script_setup_true_lang.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { useNamespace } from "../../utils/namespace.js";
|
|
2
2
|
import { useLocale } from "../config-provider/use-config.js";
|
|
3
3
|
import { isComposing } from "../../utils/keyboard.js";
|
|
4
|
-
import
|
|
5
|
-
import
|
|
4
|
+
import { DouTextarea } from "../textarea/index.js";
|
|
5
|
+
import { DouAvatar } from "../avatar/index.js";
|
|
6
6
|
import { DouButton } from "../button/index.js";
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
7
|
+
import { DouDropdownItem } from "../dropdown/item-components.js";
|
|
8
|
+
import { DouTooltip } from "../tooltip/index.js";
|
|
9
|
+
import { DouRelativeTime } from "../relative-time/index.js";
|
|
10
|
+
import { DouDropdown } from "../dropdown/index.js";
|
|
11
11
|
import { applyCommentAction, createCommentId } from "./comments.js";
|
|
12
12
|
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, mergeModels, nextTick, normalizeClass, onMounted, openBlock, ref, renderList, renderSlot, toDisplayString, unref, useModel, useTemplateRef, withCtx } from "vue";
|
|
13
13
|
import { CheckIcon, MoreHorizontalIcon, RotateCcwIcon } from "@dou-ui/icons";
|
|
@@ -34,7 +34,7 @@ var comment_thread_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
|
|
|
34
34
|
}),
|
|
35
35
|
emits: /*@__PURE__*/ mergeModels(["action", "cancel"], ["update:thread"]),
|
|
36
36
|
setup(__props, { expose: __expose, emit: __emit }) {
|
|
37
|
-
const DouTextarea =
|
|
37
|
+
const DouTextarea$1 = DouTextarea;
|
|
38
38
|
const props = __props;
|
|
39
39
|
const thread = useModel(__props, "thread");
|
|
40
40
|
const emit = __emit;
|
|
@@ -227,7 +227,7 @@ var comment_thread_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
|
|
|
227
227
|
class: normalizeClass(unref(ns).e("comment"))
|
|
228
228
|
}, [
|
|
229
229
|
createElementVNode("div", { class: normalizeClass(unref(ns).e("head")) }, [
|
|
230
|
-
createVNode(
|
|
230
|
+
createVNode(unref(DouAvatar), {
|
|
231
231
|
name: comment.author.name,
|
|
232
232
|
src: comment.author.avatar,
|
|
233
233
|
size: "sm",
|
|
@@ -238,7 +238,7 @@ var comment_thread_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
|
|
|
238
238
|
"class"
|
|
239
239
|
]),
|
|
240
240
|
createElementVNode("span", { class: normalizeClass(unref(ns).e("author")) }, toDisplayString(comment.author.name), 3),
|
|
241
|
-
createVNode(
|
|
241
|
+
createVNode(unref(DouRelativeTime), {
|
|
242
242
|
value: comment.createdAt,
|
|
243
243
|
short: "",
|
|
244
244
|
"absolute-after": WEEK,
|
|
@@ -251,7 +251,7 @@ var comment_thread_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
|
|
|
251
251
|
writer.value ? (openBlock(), createElementBlock("div", {
|
|
252
252
|
key: 1,
|
|
253
253
|
class: normalizeClass(unref(ns).e("actions"))
|
|
254
|
-
}, [index === 0 && !resolved.value ? (openBlock(), createBlock(
|
|
254
|
+
}, [index === 0 && !resolved.value ? (openBlock(), createBlock(unref(DouTooltip), {
|
|
255
255
|
key: 0,
|
|
256
256
|
content: unref(t)("commentThread.resolve")
|
|
257
257
|
}, {
|
|
@@ -265,15 +265,15 @@ var comment_thread_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
|
|
|
265
265
|
_: 1
|
|
266
266
|
}, 8, ["aria-label"])]),
|
|
267
267
|
_: 1
|
|
268
|
-
}, 8, ["content"])) : createCommentVNode("", true), comment.author.id === writer.value.id && !resolved.value ? (openBlock(), createBlock(
|
|
268
|
+
}, 8, ["content"])) : createCommentVNode("", true), comment.author.id === writer.value.id && !resolved.value ? (openBlock(), createBlock(unref(DouDropdown), {
|
|
269
269
|
key: 1,
|
|
270
270
|
placement: "bottom-end",
|
|
271
271
|
onSelect: (value) => onMenu(comment, index, value)
|
|
272
272
|
}, {
|
|
273
|
-
menu: withCtx(() => [createVNode(
|
|
273
|
+
menu: withCtx(() => [createVNode(unref(DouDropdownItem), { value: "edit" }, {
|
|
274
274
|
default: withCtx(() => [createTextVNode(toDisplayString(unref(t)("commentThread.edit")), 1)]),
|
|
275
275
|
_: 1
|
|
276
|
-
}), createVNode(
|
|
276
|
+
}), createVNode(unref(DouDropdownItem), {
|
|
277
277
|
value: "delete",
|
|
278
278
|
tone: "danger"
|
|
279
279
|
}, {
|
|
@@ -294,7 +294,7 @@ var comment_thread_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
|
|
|
294
294
|
editing.value === comment.id ? (openBlock(), createElementBlock("div", {
|
|
295
295
|
key: 0,
|
|
296
296
|
class: normalizeClass(unref(ns).e("editor"))
|
|
297
|
-
}, [createVNode(unref(DouTextarea), {
|
|
297
|
+
}, [createVNode(unref(DouTextarea$1), {
|
|
298
298
|
ref_for: true,
|
|
299
299
|
ref_key: "editBox",
|
|
300
300
|
ref: editBox,
|
|
@@ -351,7 +351,7 @@ var comment_thread_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
|
|
|
351
351
|
canWrite.value ? (openBlock(), createElementBlock("div", {
|
|
352
352
|
key: 2,
|
|
353
353
|
class: normalizeClass(unref(ns).e("composer"))
|
|
354
|
-
}, [createVNode(unref(DouTextarea), {
|
|
354
|
+
}, [createVNode(unref(DouTextarea$1), {
|
|
355
355
|
ref_key: "box",
|
|
356
356
|
ref: box,
|
|
357
357
|
modelValue: draft.value,
|
package/dist/components/comment-thread/comment-thread.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comment-thread.vue_vue_type_script_setup_true_lang.js","names":["DouTextareaComponent","_useModel","_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot","_createVNode","_createElementVNode","_toDisplayString","_createBlock","_withCtx","_createTextVNode","_createCommentVNode","_Fragment","_renderList","DouAvatar","DouRelativeTime","DouTooltip","DouDropdown","DouDropdownItem"],"sources":["../../../src/components/comment-thread/comment-thread.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { CheckIcon, MoreHorizontalIcon, RotateCcwIcon } from '@dou-ui/icons'\nimport { computed, nextTick, onMounted, ref, useTemplateRef } from 'vue'\nimport type { TextareaHTMLAttributes } from 'vue'\nimport type { WithAttributes } from '../../utils/install'\nimport { isComposing } from '../../utils/keyboard'\nimport { useNamespace } from '../../utils/namespace'\nimport DouAvatar from '../avatar/avatar.vue'\nimport { DouButton } from '../button'\nimport { useLocale } from '../config-provider/use-config'\nimport DouDropdown from '../dropdown/dropdown.vue'\nimport DouDropdownItem from '../dropdown/dropdown-item.vue'\nimport DouRelativeTime from '../relative-time/relative-time.vue'\nimport DouTextareaComponent from '../textarea/textarea.vue'\nimport DouTooltip from '../tooltip/tooltip.vue'\nimport {\n applyCommentAction,\n createCommentId,\n type CommentAction,\n type CommentItem,\n type CommentThread,\n} from './comments'\nimport type {\n CommentThreadEmits,\n CommentThreadExpose,\n CommentThreadProps,\n CommentThreadSlots,\n} from './comment-thread'\n\n// 让模板里也能写这个组件转交的原生属性\nconst DouTextarea = DouTextareaComponent as WithAttributes<\n typeof DouTextareaComponent,\n TextareaHTMLAttributes\n>\n\ndefineOptions({ name: 'DouCommentThread' })\n\nconst props = withDefaults(defineProps<CommentThreadProps>(), {\n author: undefined,\n readonly: false,\n placeholder: undefined,\n autofocus: false,\n})\n// without `v-model:thread`, the thread is kept here\nconst thread = defineModel<CommentThread | null>('thread', { default: null })\nconst emit = defineEmits<{\n action: CommentThreadEmits['action']\n cancel: CommentThreadEmits['cancel']\n}>()\ndefineSlots<CommentThreadSlots>()\n\nconst ns = useNamespace('comment-thread')\nconst { t } = useLocale()\n\n/** A week: older comments show their date instead of \"3 days ago\". */\nconst WEEK = 7 * 24 * 3600 * 1000\n\nconst resolved = computed(() => thread.value?.resolved)\n/** Who may change things: nobody when read-only, or when no `author` says who is writing. */\nconst writer = computed(() => (props.readonly ? undefined : props.author))\nconst canWrite = computed(() => !!writer.value && !resolved.value)\n\nconst root = useTemplateRef<HTMLElement>('root')\n\nfunction act(action: CommentAction) {\n emit('action', action)\n if (action.type === 'create') thread.value = action.thread\n else if (thread.value) thread.value = applyCommentAction([thread.value], action)[0] ?? null\n void keepFocus()\n}\n\n/**\n * The button or box that held focus can go with a change (the edit box\n * once saved, the reply box once resolved): focus moves on to the reply\n * box, or the reopen button, instead of falling to the page.\n */\nasync function keepFocus() {\n await nextTick()\n const el = root.value\n const now = document.activeElement\n if (!el || (now && now !== document.body && !el.contains(now))) return\n if (now && now !== document.body && el.contains(now) && now.isConnected) return\n if (box.value) focus()\n else el.querySelector<HTMLElement>(`.${ns.e('status')} button`)?.focus({ preventScroll: true })\n}\n\nconst now = () => new Date().toISOString()\n\n// writing a new comment or a reply\nconst draft = ref('')\nconst box = useTemplateRef<InstanceType<typeof DouTextarea>>('box')\n\nfunction send() {\n const body = draft.value.trim()\n const author = writer.value\n if (!body || !author) return\n const comment: CommentItem = {\n id: createCommentId(),\n author: { ...author },\n body,\n createdAt: now(),\n }\n draft.value = ''\n if (thread.value) act({ type: 'reply', threadId: thread.value.id, comment })\n else act({ type: 'create', thread: { id: createCommentId(), comments: [comment] } })\n}\n\n/** A key handled here: not the page's too. */\nfunction handled(event: KeyboardEvent) {\n event.preventDefault()\n event.stopPropagation()\n}\n\nfunction onBoxKeydown(event: KeyboardEvent) {\n if (isComposing(event)) return\n if (event.key === 'Enter' && !event.shiftKey) {\n handled(event)\n send()\n } else if (event.key === 'Escape') {\n // an empty box lets Escape go on, to close the popover or drawer around\n if (draft.value) {\n handled(event)\n draft.value = ''\n } else emit('cancel')\n }\n}\n\n// changing a comment in place\nconst editing = ref<string | null>(null)\nconst editDraft = ref('')\nconst editBox = useTemplateRef<InstanceType<typeof DouTextarea>[]>('editBox')\n\nfunction startEdit(comment: CommentItem) {\n confirming.value = false\n editing.value = comment.id\n editDraft.value = comment.body\n void nextTick(() => {\n const el = editBox.value?.[0]?.textarea\n el?.focus()\n el?.setSelectionRange(el.value.length, el.value.length)\n })\n}\n\nfunction saveEdit() {\n const id = editing.value\n const body = editDraft.value.trim()\n if (!id || !thread.value || !body) return\n editing.value = null\n const before = thread.value.comments.find((comment) => comment.id === id)\n if (before?.body === body) return void keepFocus()\n act({ type: 'edit', threadId: thread.value.id, commentId: id, body, editedAt: now() })\n}\n\nfunction onEditKeydown(event: KeyboardEvent) {\n if (isComposing(event)) return\n if (event.key === 'Enter' && !event.shiftKey) {\n handled(event)\n saveEdit()\n } else if (event.key === 'Escape') {\n handled(event)\n editing.value = null\n void keepFocus()\n }\n}\n\n// deleting the first comment takes the thread with it: asked first\nconst confirming = ref(false)\n\nfunction onMenu(comment: CommentItem, index: number, value: unknown) {\n if (!thread.value) return\n if (value === 'edit') startEdit(comment)\n else if (value === 'delete') {\n if (index === 0) confirming.value = true\n else act({ type: 'delete', threadId: thread.value.id, commentId: comment.id })\n }\n}\n\nfunction removeThread() {\n if (!thread.value) return\n confirming.value = false\n act({ type: 'remove', threadId: thread.value.id })\n}\n\nfunction resolve() {\n const by = writer.value\n if (thread.value && by)\n act({ type: 'resolve', threadId: thread.value.id, by: { ...by }, at: now() })\n}\n\nfunction reopen() {\n if (thread.value) act({ type: 'reopen', threadId: thread.value.id })\n}\n\nconst placeholderText = computed(() =>\n thread.value\n ? t('commentThread.replyPlaceholder')\n : (props.placeholder ?? t('commentThread.placeholder')),\n)\n\nconst focus = () => box.value?.textarea?.focus({ preventScroll: true })\nonMounted(() => {\n if (props.autofocus) focus()\n})\ndefineExpose<CommentThreadExpose>({ focus })\n</script>\n\n<template>\n <div ref=\"root\" role=\"group\" :class=\"[ns.b(), { 'is-resolved': !!resolved, 'is-new': !thread }]\">\n <slot name=\"header\" />\n <div v-if=\"resolved\" :class=\"ns.e('status')\">\n <CheckIcon :class=\"ns.e('status-icon')\" />\n <span :class=\"ns.e('status-text')\">{{\n t('commentThread.resolvedBy', { name: resolved.by.name })\n }}</span>\n <DouButton v-if=\"writer\" variant=\"ghost\" size=\"sm\" @click=\"reopen\">\n <template #leading><RotateCcwIcon /></template>\n {{ t('commentThread.reopen') }}\n </DouButton>\n </div>\n <ol v-if=\"thread?.comments.length\" :class=\"ns.e('list')\">\n <li v-for=\"(comment, index) in thread.comments\" :key=\"comment.id\" :class=\"ns.e('comment')\">\n <div :class=\"ns.e('head')\">\n <DouAvatar\n :name=\"comment.author.name\"\n :src=\"comment.author.avatar\"\n size=\"sm\"\n :class=\"ns.e('avatar')\"\n />\n <span :class=\"ns.e('author')\">{{ comment.author.name }}</span>\n <DouRelativeTime\n :value=\"comment.createdAt\"\n short\n :absolute-after=\"WEEK\"\n :class=\"ns.e('time')\"\n />\n <span v-if=\"comment.editedAt\" :class=\"ns.e('edited')\">{{\n t('commentThread.edited')\n }}</span>\n <div v-if=\"writer\" :class=\"ns.e('actions')\">\n <DouTooltip v-if=\"index === 0 && !resolved\" :content=\"t('commentThread.resolve')\">\n <DouButton\n variant=\"ghost\"\n size=\"sm\"\n :aria-label=\"t('commentThread.resolve')\"\n @click=\"resolve\"\n >\n <CheckIcon />\n </DouButton>\n </DouTooltip>\n <DouDropdown\n v-if=\"comment.author.id === writer.id && !resolved\"\n placement=\"bottom-end\"\n @select=\"(value) => onMenu(comment, index, value)\"\n >\n <DouButton variant=\"ghost\" size=\"sm\" :aria-label=\"t('commentThread.more')\">\n <MoreHorizontalIcon />\n </DouButton>\n <template #menu>\n <DouDropdownItem value=\"edit\">{{ t('commentThread.edit') }}</DouDropdownItem>\n <DouDropdownItem value=\"delete\" tone=\"danger\">{{\n index === 0 ? t('commentThread.deleteThread') : t('commentThread.delete')\n }}</DouDropdownItem>\n </template>\n </DouDropdown>\n </div>\n </div>\n <div v-if=\"editing === comment.id\" :class=\"ns.e('editor')\">\n <DouTextarea\n ref=\"editBox\"\n v-model=\"editDraft\"\n :autosize=\"{ minRows: 1, maxRows: 8 }\"\n size=\"sm\"\n @keydown=\"onEditKeydown\"\n />\n <div :class=\"ns.e('buttons')\">\n <DouButton variant=\"ghost\" size=\"sm\" @click=\"editing = null\">{{\n t('commentThread.cancel')\n }}</DouButton>\n <DouButton\n variant=\"solid\"\n tone=\"primary\"\n size=\"sm\"\n :disabled=\"!editDraft.trim()\"\n @click=\"saveEdit\"\n >{{ t('commentThread.save') }}</DouButton\n >\n </div>\n </div>\n <p v-else :class=\"ns.e('body')\">{{ comment.body }}</p>\n <div v-if=\"index === 0 && confirming\" :class=\"ns.e('confirm')\" role=\"alert\">\n <span>{{ t('commentThread.deleteThreadConfirm') }}</span>\n <div :class=\"ns.e('buttons')\">\n <DouButton variant=\"ghost\" size=\"sm\" @click=\"confirming = false\">{{\n t('commentThread.cancel')\n }}</DouButton>\n <DouButton variant=\"solid\" tone=\"danger\" size=\"sm\" @click=\"removeThread\">{{\n t('commentThread.delete')\n }}</DouButton>\n </div>\n </div>\n </li>\n </ol>\n <div v-if=\"canWrite\" :class=\"ns.e('composer')\">\n <DouTextarea\n ref=\"box\"\n v-model=\"draft\"\n :autosize=\"{ minRows: 1, maxRows: 8 }\"\n :placeholder=\"placeholderText\"\n :aria-label=\"placeholderText\"\n size=\"sm\"\n @keydown=\"onBoxKeydown\"\n />\n <div v-if=\"draft || !thread\" :class=\"ns.e('buttons')\">\n <DouButton v-if=\"!thread\" variant=\"ghost\" size=\"sm\" @click=\"emit('cancel')\">{{\n t('commentThread.cancel')\n }}</DouButton>\n <DouButton\n variant=\"solid\"\n tone=\"primary\"\n size=\"sm\"\n :disabled=\"!draft.trim()\"\n @click=\"send\"\n >{{ t('commentThread.send') }}</DouButton\n >\n </div>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"comment-thread.vue_vue_type_script_setup_true_lang.js","names":["DouTextarea","DouTextareaComponent","_useModel","_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot","_createVNode","_createElementVNode","_toDisplayString","_createBlock","_withCtx","_createTextVNode","_createCommentVNode","_Fragment","_renderList"],"sources":["../../../src/components/comment-thread/comment-thread.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { CheckIcon, MoreHorizontalIcon, RotateCcwIcon } from '@dou-ui/icons'\nimport { computed, nextTick, onMounted, ref, useTemplateRef } from 'vue'\nimport type { TextareaHTMLAttributes } from 'vue'\nimport type { WithAttributes } from '../../utils/install'\nimport { isComposing } from '../../utils/keyboard'\nimport { useNamespace } from '../../utils/namespace'\nimport { DouAvatar } from '../avatar'\nimport { DouButton } from '../button'\nimport { useLocale } from '../config-provider/use-config'\nimport { DouDropdown, DouDropdownItem } from '../dropdown'\nimport { DouRelativeTime } from '../relative-time'\nimport { DouTextarea as DouTextareaComponent } from '../textarea'\nimport { DouTooltip } from '../tooltip'\nimport {\n applyCommentAction,\n createCommentId,\n type CommentAction,\n type CommentItem,\n type CommentThread,\n} from './comments'\nimport type {\n CommentThreadEmits,\n CommentThreadExpose,\n CommentThreadProps,\n CommentThreadSlots,\n} from './comment-thread'\n\n// 让模板里也能写这个组件转交的原生属性\nconst DouTextarea = DouTextareaComponent as WithAttributes<\n typeof DouTextareaComponent,\n TextareaHTMLAttributes\n>\n\ndefineOptions({ name: 'DouCommentThread' })\n\nconst props = withDefaults(defineProps<CommentThreadProps>(), {\n author: undefined,\n readonly: false,\n placeholder: undefined,\n autofocus: false,\n})\n// without `v-model:thread`, the thread is kept here\nconst thread = defineModel<CommentThread | null>('thread', { default: null })\nconst emit = defineEmits<{\n action: CommentThreadEmits['action']\n cancel: CommentThreadEmits['cancel']\n}>()\ndefineSlots<CommentThreadSlots>()\n\nconst ns = useNamespace('comment-thread')\nconst { t } = useLocale()\n\n/** A week: older comments show their date instead of \"3 days ago\". */\nconst WEEK = 7 * 24 * 3600 * 1000\n\nconst resolved = computed(() => thread.value?.resolved)\n/** Who may change things: nobody when read-only, or when no `author` says who is writing. */\nconst writer = computed(() => (props.readonly ? undefined : props.author))\nconst canWrite = computed(() => !!writer.value && !resolved.value)\n\nconst root = useTemplateRef<HTMLElement>('root')\n\nfunction act(action: CommentAction) {\n emit('action', action)\n if (action.type === 'create') thread.value = action.thread\n else if (thread.value) thread.value = applyCommentAction([thread.value], action)[0] ?? null\n void keepFocus()\n}\n\n/**\n * The button or box that held focus can go with a change (the edit box\n * once saved, the reply box once resolved): focus moves on to the reply\n * box, or the reopen button, instead of falling to the page.\n */\nasync function keepFocus() {\n await nextTick()\n const el = root.value\n const now = document.activeElement\n if (!el || (now && now !== document.body && !el.contains(now))) return\n if (now && now !== document.body && el.contains(now) && now.isConnected) return\n if (box.value) focus()\n else el.querySelector<HTMLElement>(`.${ns.e('status')} button`)?.focus({ preventScroll: true })\n}\n\nconst now = () => new Date().toISOString()\n\n// writing a new comment or a reply\nconst draft = ref('')\nconst box = useTemplateRef<InstanceType<typeof DouTextarea>>('box')\n\nfunction send() {\n const body = draft.value.trim()\n const author = writer.value\n if (!body || !author) return\n const comment: CommentItem = {\n id: createCommentId(),\n author: { ...author },\n body,\n createdAt: now(),\n }\n draft.value = ''\n if (thread.value) act({ type: 'reply', threadId: thread.value.id, comment })\n else act({ type: 'create', thread: { id: createCommentId(), comments: [comment] } })\n}\n\n/** A key handled here: not the page's too. */\nfunction handled(event: KeyboardEvent) {\n event.preventDefault()\n event.stopPropagation()\n}\n\nfunction onBoxKeydown(event: KeyboardEvent) {\n if (isComposing(event)) return\n if (event.key === 'Enter' && !event.shiftKey) {\n handled(event)\n send()\n } else if (event.key === 'Escape') {\n // an empty box lets Escape go on, to close the popover or drawer around\n if (draft.value) {\n handled(event)\n draft.value = ''\n } else emit('cancel')\n }\n}\n\n// changing a comment in place\nconst editing = ref<string | null>(null)\nconst editDraft = ref('')\nconst editBox = useTemplateRef<InstanceType<typeof DouTextarea>[]>('editBox')\n\nfunction startEdit(comment: CommentItem) {\n confirming.value = false\n editing.value = comment.id\n editDraft.value = comment.body\n void nextTick(() => {\n const el = editBox.value?.[0]?.textarea\n el?.focus()\n el?.setSelectionRange(el.value.length, el.value.length)\n })\n}\n\nfunction saveEdit() {\n const id = editing.value\n const body = editDraft.value.trim()\n if (!id || !thread.value || !body) return\n editing.value = null\n const before = thread.value.comments.find((comment) => comment.id === id)\n if (before?.body === body) return void keepFocus()\n act({ type: 'edit', threadId: thread.value.id, commentId: id, body, editedAt: now() })\n}\n\nfunction onEditKeydown(event: KeyboardEvent) {\n if (isComposing(event)) return\n if (event.key === 'Enter' && !event.shiftKey) {\n handled(event)\n saveEdit()\n } else if (event.key === 'Escape') {\n handled(event)\n editing.value = null\n void keepFocus()\n }\n}\n\n// deleting the first comment takes the thread with it: asked first\nconst confirming = ref(false)\n\nfunction onMenu(comment: CommentItem, index: number, value: unknown) {\n if (!thread.value) return\n if (value === 'edit') startEdit(comment)\n else if (value === 'delete') {\n if (index === 0) confirming.value = true\n else act({ type: 'delete', threadId: thread.value.id, commentId: comment.id })\n }\n}\n\nfunction removeThread() {\n if (!thread.value) return\n confirming.value = false\n act({ type: 'remove', threadId: thread.value.id })\n}\n\nfunction resolve() {\n const by = writer.value\n if (thread.value && by)\n act({ type: 'resolve', threadId: thread.value.id, by: { ...by }, at: now() })\n}\n\nfunction reopen() {\n if (thread.value) act({ type: 'reopen', threadId: thread.value.id })\n}\n\nconst placeholderText = computed(() =>\n thread.value\n ? t('commentThread.replyPlaceholder')\n : (props.placeholder ?? t('commentThread.placeholder')),\n)\n\nconst focus = () => box.value?.textarea?.focus({ preventScroll: true })\nonMounted(() => {\n if (props.autofocus) focus()\n})\ndefineExpose<CommentThreadExpose>({ focus })\n</script>\n\n<template>\n <div ref=\"root\" role=\"group\" :class=\"[ns.b(), { 'is-resolved': !!resolved, 'is-new': !thread }]\">\n <slot name=\"header\" />\n <div v-if=\"resolved\" :class=\"ns.e('status')\">\n <CheckIcon :class=\"ns.e('status-icon')\" />\n <span :class=\"ns.e('status-text')\">{{\n t('commentThread.resolvedBy', { name: resolved.by.name })\n }}</span>\n <DouButton v-if=\"writer\" variant=\"ghost\" size=\"sm\" @click=\"reopen\">\n <template #leading><RotateCcwIcon /></template>\n {{ t('commentThread.reopen') }}\n </DouButton>\n </div>\n <ol v-if=\"thread?.comments.length\" :class=\"ns.e('list')\">\n <li v-for=\"(comment, index) in thread.comments\" :key=\"comment.id\" :class=\"ns.e('comment')\">\n <div :class=\"ns.e('head')\">\n <DouAvatar\n :name=\"comment.author.name\"\n :src=\"comment.author.avatar\"\n size=\"sm\"\n :class=\"ns.e('avatar')\"\n />\n <span :class=\"ns.e('author')\">{{ comment.author.name }}</span>\n <DouRelativeTime\n :value=\"comment.createdAt\"\n short\n :absolute-after=\"WEEK\"\n :class=\"ns.e('time')\"\n />\n <span v-if=\"comment.editedAt\" :class=\"ns.e('edited')\">{{\n t('commentThread.edited')\n }}</span>\n <div v-if=\"writer\" :class=\"ns.e('actions')\">\n <DouTooltip v-if=\"index === 0 && !resolved\" :content=\"t('commentThread.resolve')\">\n <DouButton\n variant=\"ghost\"\n size=\"sm\"\n :aria-label=\"t('commentThread.resolve')\"\n @click=\"resolve\"\n >\n <CheckIcon />\n </DouButton>\n </DouTooltip>\n <DouDropdown\n v-if=\"comment.author.id === writer.id && !resolved\"\n placement=\"bottom-end\"\n @select=\"(value) => onMenu(comment, index, value)\"\n >\n <DouButton variant=\"ghost\" size=\"sm\" :aria-label=\"t('commentThread.more')\">\n <MoreHorizontalIcon />\n </DouButton>\n <template #menu>\n <DouDropdownItem value=\"edit\">{{ t('commentThread.edit') }}</DouDropdownItem>\n <DouDropdownItem value=\"delete\" tone=\"danger\">{{\n index === 0 ? t('commentThread.deleteThread') : t('commentThread.delete')\n }}</DouDropdownItem>\n </template>\n </DouDropdown>\n </div>\n </div>\n <div v-if=\"editing === comment.id\" :class=\"ns.e('editor')\">\n <DouTextarea\n ref=\"editBox\"\n v-model=\"editDraft\"\n :autosize=\"{ minRows: 1, maxRows: 8 }\"\n size=\"sm\"\n @keydown=\"onEditKeydown\"\n />\n <div :class=\"ns.e('buttons')\">\n <DouButton variant=\"ghost\" size=\"sm\" @click=\"editing = null\">{{\n t('commentThread.cancel')\n }}</DouButton>\n <DouButton\n variant=\"solid\"\n tone=\"primary\"\n size=\"sm\"\n :disabled=\"!editDraft.trim()\"\n @click=\"saveEdit\"\n >{{ t('commentThread.save') }}</DouButton\n >\n </div>\n </div>\n <p v-else :class=\"ns.e('body')\">{{ comment.body }}</p>\n <div v-if=\"index === 0 && confirming\" :class=\"ns.e('confirm')\" role=\"alert\">\n <span>{{ t('commentThread.deleteThreadConfirm') }}</span>\n <div :class=\"ns.e('buttons')\">\n <DouButton variant=\"ghost\" size=\"sm\" @click=\"confirming = false\">{{\n t('commentThread.cancel')\n }}</DouButton>\n <DouButton variant=\"solid\" tone=\"danger\" size=\"sm\" @click=\"removeThread\">{{\n t('commentThread.delete')\n }}</DouButton>\n </div>\n </div>\n </li>\n </ol>\n <div v-if=\"canWrite\" :class=\"ns.e('composer')\">\n <DouTextarea\n ref=\"box\"\n v-model=\"draft\"\n :autosize=\"{ minRows: 1, maxRows: 8 }\"\n :placeholder=\"placeholderText\"\n :aria-label=\"placeholderText\"\n size=\"sm\"\n @keydown=\"onBoxKeydown\"\n />\n <div v-if=\"draft || !thread\" :class=\"ns.e('buttons')\">\n <DouButton v-if=\"!thread\" variant=\"ghost\" size=\"sm\" @click=\"emit('cancel')\">{{\n t('commentThread.cancel')\n }}</DouButton>\n <DouButton\n variant=\"solid\"\n tone=\"primary\"\n size=\"sm\"\n :disabled=\"!draft.trim()\"\n @click=\"send\"\n >{{ t('commentThread.send') }}</DouButton\n >\n </div>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
|