@xihan-ui/vue 1.0.0-alpha.3 → 1.0.0
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/CHANGELOG.md +2057 -0
- package/dist/backgrounds.d.ts.map +1 -1
- package/dist/backgrounds.js +1 -5
- package/dist/backgrounds.js.map +1 -1
- package/dist/behavior.d.ts +38 -0
- package/dist/behavior.d.ts.map +1 -0
- package/dist/behavior.js +74 -0
- package/dist/behavior.js.map +1 -0
- package/dist/components/accordion/accordion.d.ts +1 -1
- package/dist/components/accordion/context.js +2 -2
- package/dist/components/accordion/context.js.map +1 -1
- package/dist/components/affix/context.js +1 -1
- package/dist/components/affix/context.js.map +1 -1
- package/dist/components/alert/context.js +1 -1
- package/dist/components/alert/context.js.map +1 -1
- package/dist/components/anchor/anchor.d.ts +2 -2
- package/dist/components/anchor/context.js +1 -1
- package/dist/components/anchor/context.js.map +1 -1
- package/dist/components/avatar/context.js +1 -1
- package/dist/components/avatar/context.js.map +1 -1
- package/dist/components/avatar-group/context.js +1 -1
- package/dist/components/avatar-group/context.js.map +1 -1
- package/dist/components/back-top/back-top.d.ts +2 -2
- package/dist/components/back-top/context.js +1 -1
- package/dist/components/back-top/context.js.map +1 -1
- package/dist/components/badge/badge.d.ts +142 -50
- package/dist/components/badge/badge.d.ts.map +1 -1
- package/dist/components/badge/badge.js +67 -37
- package/dist/components/badge/badge.js.map +1 -1
- package/dist/components/badge/context.js +15 -0
- package/dist/components/badge/context.js.map +1 -0
- package/dist/components/breadcrumb/breadcrumb.d.ts +1 -1
- package/dist/components/breadcrumb/context.js +1 -1
- package/dist/components/breadcrumb/context.js.map +1 -1
- package/dist/components/button-group/button-group.d.ts +1 -1
- package/dist/components/calendar/context.js +2 -2
- package/dist/components/calendar/context.js.map +1 -1
- package/dist/components/card/card.d.ts +1 -1
- package/dist/components/card/context.js +1 -1
- package/dist/components/card/context.js.map +1 -1
- package/dist/components/carousel/context.js +1 -1
- package/dist/components/carousel/context.js.map +1 -1
- package/dist/components/cascader/cascader.d.ts +4 -4
- package/dist/components/cascader/cascader.d.ts.map +1 -1
- package/dist/components/cascader/cascader.js +14 -4
- package/dist/components/cascader/cascader.js.map +1 -1
- package/dist/components/cascader/context.js +2 -2
- package/dist/components/cascader/context.js.map +1 -1
- package/dist/components/cascader/use-cascader.js +1 -1
- package/dist/components/cascader/use-cascader.js.map +1 -1
- package/dist/components/checkbox-group/context.js +2 -2
- package/dist/components/checkbox-group/context.js.map +1 -1
- package/dist/components/clipboard/context.js +1 -1
- package/dist/components/clipboard/context.js.map +1 -1
- package/dist/components/collapsible/context.js +1 -1
- package/dist/components/collapsible/context.js.map +1 -1
- package/dist/components/color-picker/color-picker.d.ts +12 -3
- package/dist/components/color-picker/color-picker.d.ts.map +1 -1
- package/dist/components/color-picker/color-picker.js +7 -1
- package/dist/components/color-picker/color-picker.js.map +1 -1
- package/dist/components/color-picker/context.js +2 -2
- package/dist/components/color-picker/context.js.map +1 -1
- package/dist/components/color-picker/use-color-picker.js +1 -1
- package/dist/components/color-picker/use-color-picker.js.map +1 -1
- package/dist/components/combobox/combobox.d.ts +3 -3
- package/dist/components/combobox/combobox.d.ts.map +1 -1
- package/dist/components/combobox/combobox.js +10 -4
- package/dist/components/combobox/combobox.js.map +1 -1
- package/dist/components/combobox/context.js +3 -3
- package/dist/components/combobox/context.js.map +1 -1
- package/dist/components/combobox/use-combobox.js +1 -1
- package/dist/components/combobox/use-combobox.js.map +1 -1
- package/dist/components/composer/context.js +1 -1
- package/dist/components/composer/context.js.map +1 -1
- package/dist/components/context-menu/context-menu.d.ts +4 -4
- package/dist/components/context-menu/context-menu.d.ts.map +1 -1
- package/dist/components/context-menu/context-menu.js +3 -1
- package/dist/components/context-menu/context-menu.js.map +1 -1
- package/dist/components/context-menu/context.js +5 -5
- package/dist/components/context-menu/context.js.map +1 -1
- package/dist/components/context-menu/use-context-menu.js +1 -1
- package/dist/components/context-menu/use-context-menu.js.map +1 -1
- package/dist/components/date-field/context.js +1 -1
- package/dist/components/date-field/context.js.map +1 -1
- package/dist/components/date-field/date-field.d.ts +2 -2
- package/dist/components/date-picker/context.js +13 -4
- package/dist/components/date-picker/context.js.map +1 -1
- package/dist/components/date-picker/date-picker.d.ts +80 -44
- package/dist/components/date-picker/date-picker.d.ts.map +1 -1
- package/dist/components/date-picker/date-picker.js +68 -26
- package/dist/components/date-picker/date-picker.js.map +1 -1
- package/dist/components/date-picker/use-date-picker.js +1 -1
- package/dist/components/date-picker/use-date-picker.js.map +1 -1
- package/dist/components/descriptions/context.js +1 -1
- package/dist/components/descriptions/context.js.map +1 -1
- package/dist/components/dialog/context.js +1 -1
- package/dist/components/dialog/context.js.map +1 -1
- package/dist/components/dialog/dialog.d.ts +1 -1
- package/dist/components/drawer/context.js +1 -1
- package/dist/components/drawer/context.js.map +1 -1
- package/dist/components/drawer/drawer.d.ts +2 -2
- package/dist/components/dynamic-input/context.js +2 -2
- package/dist/components/dynamic-input/context.js.map +1 -1
- package/dist/components/editable/context.js +1 -1
- package/dist/components/editable/context.js.map +1 -1
- package/dist/components/empty-state/context.js +1 -1
- package/dist/components/empty-state/context.js.map +1 -1
- package/dist/components/field/context.d.ts +9 -0
- package/dist/components/field/context.d.ts.map +1 -0
- package/dist/components/field/context.js +6 -2
- package/dist/components/field/context.js.map +1 -1
- package/dist/components/field/field.d.ts +26 -2
- package/dist/components/field/field.d.ts.map +1 -1
- package/dist/components/field/field.js +15 -4
- package/dist/components/field/field.js.map +1 -1
- package/dist/components/field/use-field-control.d.ts +41 -0
- package/dist/components/field/use-field-control.d.ts.map +1 -0
- package/dist/components/field/use-field-control.js +77 -0
- package/dist/components/field/use-field-control.js.map +1 -0
- package/dist/components/fieldset/context.js +1 -1
- package/dist/components/fieldset/context.js.map +1 -1
- package/dist/components/file-upload/context.js +2 -2
- package/dist/components/file-upload/context.js.map +1 -1
- package/dist/components/flex/flex.d.ts +9 -0
- package/dist/components/flex/flex.d.ts.map +1 -1
- package/dist/components/flex/flex.js +4 -0
- package/dist/components/flex/flex.js.map +1 -1
- package/dist/components/float-button/context.js +1 -1
- package/dist/components/float-button/context.js.map +1 -1
- package/dist/components/float-button/float-button.d.ts +2 -2
- package/dist/components/floating-panel/context.js +1 -1
- package/dist/components/floating-panel/context.js.map +1 -1
- package/dist/components/floating-panel/floating-panel.d.ts +1 -1
- package/dist/components/form/context.js +2 -2
- package/dist/components/form/context.js.map +1 -1
- package/dist/components/grid/context.js +1 -1
- package/dist/components/grid/context.js.map +1 -1
- package/dist/components/heatmap/context.js +3 -3
- package/dist/components/heatmap/context.js.map +1 -1
- package/dist/components/heatmap/heatmap.d.ts +1 -1
- package/dist/components/hotkeys/hotkeys.d.ts +3 -1
- package/dist/components/hotkeys/hotkeys.d.ts.map +1 -1
- package/dist/components/hotkeys/hotkeys.js +7 -25
- package/dist/components/hotkeys/hotkeys.js.map +1 -1
- package/dist/components/hotkeys/use-hotkeys.d.ts +31 -0
- package/dist/components/hotkeys/use-hotkeys.d.ts.map +1 -0
- package/dist/components/hotkeys/use-hotkeys.js +60 -0
- package/dist/components/hotkeys/use-hotkeys.js.map +1 -0
- package/dist/components/hover-card/context.js +1 -1
- package/dist/components/hover-card/context.js.map +1 -1
- package/dist/components/hover-card/hover-card.d.ts +2 -2
- package/dist/components/hover-card/hover-card.d.ts.map +1 -1
- package/dist/components/hover-card/hover-card.js +3 -1
- package/dist/components/hover-card/hover-card.js.map +1 -1
- package/dist/components/hover-card/use-hover-card.js +1 -1
- package/dist/components/hover-card/use-hover-card.js.map +1 -1
- package/dist/components/icon/icon.d.ts +1 -1
- package/dist/components/icon-wrapper/icon-wrapper.d.ts +1 -1
- package/dist/components/image/context.js +1 -1
- package/dist/components/image/context.js.map +1 -1
- package/dist/components/image-cropper/context.js +1 -1
- package/dist/components/image-cropper/context.js.map +1 -1
- package/dist/components/image-cropper/image-cropper.d.ts +1 -1
- package/dist/components/image-viewer/context.js +1 -1
- package/dist/components/image-viewer/context.js.map +1 -1
- package/dist/components/image-viewer/image-viewer.d.ts +2 -2
- package/dist/components/infinite-scroll/context.js +1 -1
- package/dist/components/infinite-scroll/context.js.map +1 -1
- package/dist/components/infinite-scroll/infinite-scroll.d.ts +1 -1
- package/dist/components/json-viewer/json-viewer.d.ts +12 -3
- package/dist/components/json-viewer/json-viewer.d.ts.map +1 -1
- package/dist/components/json-viewer/json-viewer.js +23 -2
- package/dist/components/json-viewer/json-viewer.js.map +1 -1
- package/dist/components/layout/context.js +1 -1
- package/dist/components/layout/context.js.map +1 -1
- package/dist/components/list/context.js +1 -1
- package/dist/components/list/context.js.map +1 -1
- package/dist/components/list/list.d.ts +1 -1
- package/dist/components/listbox/context.js +3 -3
- package/dist/components/listbox/context.js.map +1 -1
- package/dist/components/loading-bar/context.js +1 -1
- package/dist/components/loading-bar/context.js.map +1 -1
- package/dist/components/log/context.js +1 -1
- package/dist/components/log/context.js.map +1 -1
- package/dist/components/marquee/context.js +1 -1
- package/dist/components/marquee/context.js.map +1 -1
- package/dist/components/mention/context.js +2 -2
- package/dist/components/mention/context.js.map +1 -1
- package/dist/components/mention/mention.d.ts +2 -2
- package/dist/components/mention/mention.d.ts.map +1 -1
- package/dist/components/mention/mention.js +10 -4
- package/dist/components/mention/mention.js.map +1 -1
- package/dist/components/mention/use-mention.js +1 -1
- package/dist/components/mention/use-mention.js.map +1 -1
- package/dist/components/menu/context.js +4 -4
- package/dist/components/menu/context.js.map +1 -1
- package/dist/components/menu/menu.d.ts +3 -3
- package/dist/components/menu/menu.d.ts.map +1 -1
- package/dist/components/menu/menu.js +3 -1
- package/dist/components/menu/menu.js.map +1 -1
- package/dist/components/menu/use-menu.js +1 -1
- package/dist/components/menu/use-menu.js.map +1 -1
- package/dist/components/menubar/context.js +6 -6
- package/dist/components/menubar/context.js.map +1 -1
- package/dist/components/menubar/menubar.d.ts +2 -2
- package/dist/components/menubar/menubar.js.map +1 -1
- package/dist/components/navigation-menu/context.js +1 -1
- package/dist/components/navigation-menu/context.js.map +1 -1
- package/dist/components/navigation-menu/navigation-menu.d.ts +1 -1
- package/dist/components/notification/context.d.ts +23 -0
- package/dist/components/notification/context.d.ts.map +1 -0
- package/dist/components/notification/context.js +28 -0
- package/dist/components/notification/context.js.map +1 -0
- package/dist/components/notification/notification.d.ts +249 -0
- package/dist/components/notification/notification.d.ts.map +1 -0
- package/dist/components/notification/notification.js +179 -0
- package/dist/components/notification/notification.js.map +1 -0
- package/dist/components/notification/use-notification.d.ts +14 -0
- package/dist/components/notification/use-notification.d.ts.map +1 -0
- package/dist/components/notification/use-notification.js +42 -0
- package/dist/components/notification/use-notification.js.map +1 -0
- package/dist/components/number-animation/number-animation.d.ts +1 -1
- package/dist/components/number-field/context.js +1 -1
- package/dist/components/number-field/context.js.map +1 -1
- package/dist/components/number-field/number-field.d.ts +3 -3
- package/dist/components/number-field/number-field.d.ts.map +1 -1
- package/dist/components/number-field/number-field.js +7 -1
- package/dist/components/number-field/number-field.js.map +1 -1
- package/dist/components/page-header/context.js +1 -1
- package/dist/components/page-header/context.js.map +1 -1
- package/dist/components/pagination/context.js +1 -1
- package/dist/components/pagination/context.js.map +1 -1
- package/dist/components/pagination/pagination.d.ts +60 -6
- package/dist/components/pagination/pagination.d.ts.map +1 -1
- package/dist/components/pagination/pagination.js +85 -5
- package/dist/components/pagination/pagination.js.map +1 -1
- package/dist/components/pagination/use-pagination.d.ts +12 -2
- package/dist/components/pagination/use-pagination.d.ts.map +1 -1
- package/dist/components/pagination/use-pagination.js +50 -5
- package/dist/components/pagination/use-pagination.js.map +1 -1
- package/dist/components/password-input/context.js +1 -1
- package/dist/components/password-input/context.js.map +1 -1
- package/dist/components/password-input/password-input.d.ts +2 -2
- package/dist/components/password-input/password-input.d.ts.map +1 -1
- package/dist/components/password-input/password-input.js +7 -1
- package/dist/components/password-input/password-input.js.map +1 -1
- package/dist/components/pin-input/context.js +1 -1
- package/dist/components/pin-input/context.js.map +1 -1
- package/dist/components/pin-input/pin-input.d.ts +1 -1
- package/dist/components/popconfirm/context.js +1 -1
- package/dist/components/popconfirm/context.js.map +1 -1
- package/dist/components/popconfirm/popconfirm.d.ts +1 -1
- package/dist/components/popover/context.js +1 -1
- package/dist/components/popover/context.js.map +1 -1
- package/dist/components/popover/popover.d.ts +2 -2
- package/dist/components/popover/popover.d.ts.map +1 -1
- package/dist/components/popover/popover.js +3 -1
- package/dist/components/popover/popover.js.map +1 -1
- package/dist/components/popover/use-popover.js +1 -1
- package/dist/components/popover/use-popover.js.map +1 -1
- package/dist/components/popselect/context.js +2 -2
- package/dist/components/popselect/context.js.map +1 -1
- package/dist/components/popselect/popselect.d.ts +3 -3
- package/dist/components/popselect/popselect.d.ts.map +1 -1
- package/dist/components/popselect/popselect.js +3 -1
- package/dist/components/popselect/popselect.js.map +1 -1
- package/dist/components/popselect/use-popselect.js +1 -1
- package/dist/components/popselect/use-popselect.js.map +1 -1
- package/dist/components/progress/progress.d.ts +1 -1
- package/dist/components/qr-code/context.js +1 -1
- package/dist/components/qr-code/context.js.map +1 -1
- package/dist/components/radio-group/context.js +2 -2
- package/dist/components/radio-group/context.js.map +1 -1
- package/dist/components/radio-group/radio-group.d.ts +1 -1
- package/dist/components/rating/context.js +1 -1
- package/dist/components/rating/context.js.map +1 -1
- package/dist/components/rating/rating.d.ts +2 -2
- package/dist/components/result/context.js +1 -1
- package/dist/components/result/context.js.map +1 -1
- package/dist/components/scroll-area/context.js +2 -2
- package/dist/components/scroll-area/context.js.map +1 -1
- package/dist/components/scroll-area/scroll-area.d.ts +1 -1
- package/dist/components/scrollbar/context.js +1 -1
- package/dist/components/scrollbar/context.js.map +1 -1
- package/dist/components/scrollbar/scrollbar.d.ts +1 -1
- package/dist/components/segmented/context.js +2 -2
- package/dist/components/segmented/context.js.map +1 -1
- package/dist/components/segmented/segmented.d.ts +1 -1
- package/dist/components/select/context.js +3 -3
- package/dist/components/select/context.js.map +1 -1
- package/dist/components/select/select.d.ts +3 -3
- package/dist/components/select/select.d.ts.map +1 -1
- package/dist/components/select/select.js +7 -3
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/side-nav/context.js +2 -2
- package/dist/components/side-nav/context.js.map +1 -1
- package/dist/components/side-nav/side-nav.d.ts +1 -1
- package/dist/components/signature-pad/context.js +1 -1
- package/dist/components/signature-pad/context.js.map +1 -1
- package/dist/components/skeleton/context.js +1 -1
- package/dist/components/skeleton/context.js.map +1 -1
- package/dist/components/slider/context.js +2 -2
- package/dist/components/slider/context.js.map +1 -1
- package/dist/components/slider/slider.d.ts +1 -1
- package/dist/components/space/context.js +1 -1
- package/dist/components/space/context.js.map +1 -1
- package/dist/components/space/space.d.ts +9 -0
- package/dist/components/space/space.d.ts.map +1 -1
- package/dist/components/space/space.js +4 -0
- package/dist/components/space/space.js.map +1 -1
- package/dist/components/spinner/context.js +1 -1
- package/dist/components/spinner/context.js.map +1 -1
- package/dist/components/spinner/spinner.d.ts +1 -1
- package/dist/components/splitter/context.js +1 -1
- package/dist/components/splitter/context.js.map +1 -1
- package/dist/components/statistic/context.js +1 -1
- package/dist/components/statistic/context.js.map +1 -1
- package/dist/components/statistic/statistic.d.ts +1 -1
- package/dist/components/steps/context.js +2 -2
- package/dist/components/steps/context.js.map +1 -1
- package/dist/components/steps/steps.d.ts +2 -2
- package/dist/components/table/context.js +4 -4
- package/dist/components/table/context.js.map +1 -1
- package/dist/components/table/table.d.ts +62 -3
- package/dist/components/table/table.d.ts.map +1 -1
- package/dist/components/table/table.js +37 -1
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/table/use-table.d.ts +1 -1
- package/dist/components/table/use-table.d.ts.map +1 -1
- package/dist/components/table/use-table.js +3 -2
- package/dist/components/table/use-table.js.map +1 -1
- package/dist/components/tabs/context.js +1 -1
- package/dist/components/tabs/context.js.map +1 -1
- package/dist/components/tabs/tabs.d.ts +1 -1
- package/dist/components/tag/context.js +1 -1
- package/dist/components/tag/context.js.map +1 -1
- package/dist/components/tag/use-tag.js +14 -2
- package/dist/components/tag/use-tag.js.map +1 -1
- package/dist/components/tags-input/context.js +2 -2
- package/dist/components/tags-input/context.js.map +1 -1
- package/dist/components/tags-input/tags-input.d.ts +3 -3
- package/dist/components/tags-input/tags-input.d.ts.map +1 -1
- package/dist/components/tags-input/tags-input.js +7 -1
- package/dist/components/tags-input/tags-input.js.map +1 -1
- package/dist/components/text-field/context.js +1 -1
- package/dist/components/text-field/context.js.map +1 -1
- package/dist/components/text-field/text-field.d.ts +1 -1
- package/dist/components/text-field/text-field.d.ts.map +1 -1
- package/dist/components/text-field/text-field.js +7 -3
- package/dist/components/text-field/text-field.js.map +1 -1
- package/dist/components/thread/context.d.ts +7 -0
- package/dist/components/thread/context.d.ts.map +1 -0
- package/dist/components/thread/context.js +1 -1
- package/dist/components/thread/context.js.map +1 -1
- package/dist/components/time-field/context.js +1 -1
- package/dist/components/time-field/context.js.map +1 -1
- package/dist/components/time-field/time-field.d.ts +2 -2
- package/dist/components/time-picker/context.js +2 -2
- package/dist/components/time-picker/context.js.map +1 -1
- package/dist/components/time-picker/time-picker.d.ts +5 -5
- package/dist/components/time-picker/time-picker.d.ts.map +1 -1
- package/dist/components/time-picker/time-picker.js +10 -1
- package/dist/components/time-picker/time-picker.js.map +1 -1
- package/dist/components/time-picker/use-time-picker.d.ts +1 -0
- package/dist/components/time-picker/use-time-picker.d.ts.map +1 -1
- package/dist/components/time-picker/use-time-picker.js +3 -0
- package/dist/components/time-picker/use-time-picker.js.map +1 -1
- package/dist/components/timeline/context.js +2 -2
- package/dist/components/timeline/context.js.map +1 -1
- package/dist/components/timeline/timeline.d.ts +1 -1
- package/dist/components/timer/context.js +1 -1
- package/dist/components/timer/context.js.map +1 -1
- package/dist/components/toast/context.js +1 -1
- package/dist/components/toast/context.js.map +1 -1
- package/dist/components/toast/toast.d.ts +3 -15
- package/dist/components/toast/toast.d.ts.map +1 -1
- package/dist/components/toast/toast.js +1 -12
- package/dist/components/toast/toast.js.map +1 -1
- package/dist/components/toast/use-toast.d.ts.map +1 -1
- package/dist/components/toast/use-toast.js +1 -7
- package/dist/components/toast/use-toast.js.map +1 -1
- package/dist/components/toggle-group/context.js +1 -1
- package/dist/components/toggle-group/context.js.map +1 -1
- package/dist/components/toggle-group/toggle-group.d.ts +10 -1
- package/dist/components/toggle-group/toggle-group.d.ts.map +1 -1
- package/dist/components/toggle-group/toggle-group.js +4 -0
- package/dist/components/toggle-group/toggle-group.js.map +1 -1
- package/dist/components/toolbar/context.js +1 -1
- package/dist/components/toolbar/context.js.map +1 -1
- package/dist/components/toolbar/toolbar.d.ts +1 -1
- package/dist/components/tooltip/context.js +1 -1
- package/dist/components/tooltip/context.js.map +1 -1
- package/dist/components/tooltip/tooltip.d.ts +2 -2
- package/dist/components/tour/context.js +1 -1
- package/dist/components/tour/context.js.map +1 -1
- package/dist/components/tour/tour.d.ts +2 -2
- package/dist/components/transfer/context.js +3 -3
- package/dist/components/transfer/context.js.map +1 -1
- package/dist/components/tree/context.js +2 -2
- package/dist/components/tree/context.js.map +1 -1
- package/dist/components/tree/tree.d.ts +20 -0
- package/dist/components/tree/tree.d.ts.map +1 -1
- package/dist/components/tree/tree.js +9 -0
- package/dist/components/tree/tree.js.map +1 -1
- package/dist/components/tree-select/context.js +2 -2
- package/dist/components/tree-select/context.js.map +1 -1
- package/dist/components/tree-select/tree-select.d.ts +3 -3
- package/dist/components/tree-select/tree-select.d.ts.map +1 -1
- package/dist/components/tree-select/tree-select.js +14 -4
- package/dist/components/tree-select/tree-select.js.map +1 -1
- package/dist/components/tree-select/use-tree-select.js +1 -1
- package/dist/components/tree-select/use-tree-select.js.map +1 -1
- package/dist/components/typography/context.js +1 -1
- package/dist/components/typography/context.js.map +1 -1
- package/dist/components/virtualizer/context.js +1 -1
- package/dist/components/virtualizer/context.js.map +1 -1
- package/dist/components/watermark/context.js +1 -1
- package/dist/components/watermark/context.js.map +1 -1
- package/dist/config/config.js +1 -1
- package/dist/config/config.js.map +1 -1
- package/dist/index.d.ts +16 -9
- package/dist/index.js +15 -8
- package/dist/package.js +1 -1
- package/dist/runtime/use-scrollbars.js +66 -0
- package/dist/runtime/use-scrollbars.js.map +1 -0
- package/dist/services/dialog-service.d.ts +33 -8
- package/dist/services/dialog-service.d.ts.map +1 -1
- package/dist/services/dialog-service.js +44 -20
- package/dist/services/dialog-service.js.map +1 -1
- package/dist/services/glyph.js +41 -1
- package/dist/services/glyph.js.map +1 -1
- package/dist/services/loading-bar-service.d.ts +46 -0
- package/dist/services/loading-bar-service.d.ts.map +1 -0
- package/dist/services/loading-bar-service.js +70 -0
- package/dist/services/loading-bar-service.js.map +1 -0
- package/dist/services/mount-host.js +35 -0
- package/dist/services/mount-host.js.map +1 -0
- package/dist/services/notification-service.d.ts +46 -0
- package/dist/services/notification-service.d.ts.map +1 -0
- package/dist/services/notification-service.js +91 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/services/service-config.js +16 -0
- package/dist/services/service-config.js.map +1 -0
- package/dist/services/toast-service.d.ts +20 -12
- package/dist/services/toast-service.d.ts.map +1 -1
- package/dist/services/toast-service.js +103 -50
- package/dist/services/toast-service.js.map +1 -1
- package/package.json +18 -14
- package/dist/components/toaster/context.js +0 -19
- package/dist/components/toaster/context.js.map +0 -1
- package/dist/components/toaster/toaster.d.ts +0 -135
- package/dist/components/toaster/toaster.d.ts.map +0 -1
- package/dist/components/toaster/toaster.js +0 -91
- package/dist/components/toaster/toaster.js.map +0 -1
- package/dist/components/toaster/use-toaster.d.ts +0 -15
- package/dist/components/toaster/use-toaster.d.ts.map +0 -1
- package/dist/components/toaster/use-toaster.js +0 -23
- package/dist/components/toaster/use-toaster.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/listbox/context.ts"],"sourcesContent":["import type { ListboxItemGroupProps, ListboxItemProps } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport type { ListboxContext } from './use-listbox'\nimport { inject, provide } from 'vue'\n\n/** 条目自报的值与禁用,供 item-text / item-indicator 这类子部件复用同一份声明。 */\nexport interface ListboxItemContext {\n item: ComputedRef<ListboxItemProps>\n}\n\n/** 分组自报的身份,供分组标题取到同一个值(标题的 id 由它派生)。 */\nexport interface ListboxItemGroupContext {\n group: ComputedRef<ListboxItemGroupProps>\n}\n\nconst KEY: InjectionKey<ListboxContext> = Symbol('xh-listbox')\nconst ITEM_KEY: InjectionKey<ListboxItemContext> = Symbol('xh-listbox-item')\nconst GROUP_KEY: InjectionKey<ListboxItemGroupContext> = Symbol('xh-listbox-item-group')\n\nexport function provideListbox(ctx: ListboxContext): void {\n provide(KEY, ctx)\n}\n\nexport function useListboxContext(): ListboxContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Listbox 部件必须用在 XhListboxRoot 内')\n return ctx\n}\n\nexport function provideListboxItem(ctx: ListboxItemContext): void {\n provide(ITEM_KEY, ctx)\n}\n\nexport function useListboxItemContext(): ListboxItemContext {\n const ctx = inject(ITEM_KEY, null)\n if (!ctx)\n throw new Error('[xh] Listbox 条目子部件必须用在 XhListboxItem 内')\n return ctx\n}\n\nexport function provideListboxItemGroup(ctx: ListboxItemGroupContext): void {\n provide(GROUP_KEY, ctx)\n}\n\nexport function useListboxItemGroupContext(): ListboxItemGroupContext {\n const ctx = inject(GROUP_KEY, null)\n if (!ctx)\n throw new Error('[xh] Listbox 分组标题必须用在 XhListboxItemGroup 内')\n return ctx\n}\n"],"mappings":";;AAeA,MAAM,MAAoC,OAAO,YAAY;
|
|
1
|
+
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/listbox/context.ts"],"sourcesContent":["import type { ListboxItemGroupProps, ListboxItemProps } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport type { ListboxContext } from './use-listbox'\nimport { inject, provide } from 'vue'\n\n/** 条目自报的值与禁用,供 item-text / item-indicator 这类子部件复用同一份声明。 */\nexport interface ListboxItemContext {\n item: ComputedRef<ListboxItemProps>\n}\n\n/** 分组自报的身份,供分组标题取到同一个值(标题的 id 由它派生)。 */\nexport interface ListboxItemGroupContext {\n group: ComputedRef<ListboxItemGroupProps>\n}\n\nconst KEY: InjectionKey<ListboxContext> = Symbol.for('xh-listbox')\nconst ITEM_KEY: InjectionKey<ListboxItemContext> = Symbol.for('xh-listbox-item')\nconst GROUP_KEY: InjectionKey<ListboxItemGroupContext> = Symbol.for('xh-listbox-item-group')\n\nexport function provideListbox(ctx: ListboxContext): void {\n provide(KEY, ctx)\n}\n\nexport function useListboxContext(): ListboxContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Listbox 部件必须用在 XhListboxRoot 内')\n return ctx\n}\n\nexport function provideListboxItem(ctx: ListboxItemContext): void {\n provide(ITEM_KEY, ctx)\n}\n\nexport function useListboxItemContext(): ListboxItemContext {\n const ctx = inject(ITEM_KEY, null)\n if (!ctx)\n throw new Error('[xh] Listbox 条目子部件必须用在 XhListboxItem 内')\n return ctx\n}\n\nexport function provideListboxItemGroup(ctx: ListboxItemGroupContext): void {\n provide(GROUP_KEY, ctx)\n}\n\nexport function useListboxItemGroupContext(): ListboxItemGroupContext {\n const ctx = inject(GROUP_KEY, null)\n if (!ctx)\n throw new Error('[xh] Listbox 分组标题必须用在 XhListboxItemGroup 内')\n return ctx\n}\n"],"mappings":";;AAeA,MAAM,MAAoC,OAAO,IAAI,YAAY;AACjE,MAAM,WAA6C,OAAO,IAAI,iBAAiB;AAC/E,MAAM,YAAmD,OAAO,IAAI,uBAAuB;AAE3F,SAAgB,eAAe,KAA2B;CACxD,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,oBAAoC;CAClD,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,qCAAqC;CACvD,OAAO;AACT;AAEA,SAAgB,mBAAmB,KAA+B;CAChE,QAAQ,UAAU,GAAG;AACvB;AAEA,SAAgB,wBAA4C;CAC1D,MAAM,MAAM,OAAO,UAAU,IAAI;CACjC,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,wCAAwC;CAC1D,OAAO;AACT;AAEA,SAAgB,wBAAwB,KAAoC;CAC1E,QAAQ,WAAW,GAAG;AACxB;AAEA,SAAgB,6BAAsD;CACpE,MAAM,MAAM,OAAO,WAAW,IAAI;CAClC,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,4CAA4C;CAC9D,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/loading-bar/context.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\nimport type { LoadingBarContext } from './use-loading-bar'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<LoadingBarContext> = Symbol('xh-loading-bar')\n\nexport function provideLoadingBar(ctx: LoadingBarContext): void {\n provide(KEY, ctx)\n}\n\nexport function useLoadingBarContext(): LoadingBarContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] LoadingBar 部件必须用在 XhLoadingBarRoot 内')\n return ctx\n}\n"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/loading-bar/context.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\nimport type { LoadingBarContext } from './use-loading-bar'\nimport { inject, provide } from 'vue'\n\n// 全局符号注册表:模块被打包或热更新成两份时,Symbol('x') 会是两个不同的键,\n// provide 与 inject 各拿一个,部件当场抛「必须用在 XhLoadingBarRoot 内」——整棵子树白屏。\n// Symbol.for 按字符串查同一个键,两份模块也对得上\nconst KEY: InjectionKey<LoadingBarContext> = Symbol.for('xh-loading-bar')\n\nexport function provideLoadingBar(ctx: LoadingBarContext): void {\n provide(KEY, ctx)\n}\n\nexport function useLoadingBarContext(): LoadingBarContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] LoadingBar 部件必须用在 XhLoadingBarRoot 内')\n return ctx\n}\n"],"mappings":";;AAOA,MAAM,MAAuC,OAAO,IAAI,gBAAgB;AAExE,SAAgB,kBAAkB,KAA8B;CAC9D,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,uBAA0C;CACxD,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,2CAA2C;CAC7D,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/log/context.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\nimport type { LogContext } from './use-log'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<LogContext> = Symbol('xh-log')\n\nexport function provideLog(ctx: LogContext): void {\n provide(KEY, ctx)\n}\n\nexport function useLogContext(): LogContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Log 部件必须用在 XhLogRoot 内')\n return ctx\n}\n"],"mappings":";;AAIA,MAAM,MAAgC,OAAO,QAAQ;
|
|
1
|
+
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/log/context.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\nimport type { LogContext } from './use-log'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<LogContext> = Symbol.for('xh-log')\n\nexport function provideLog(ctx: LogContext): void {\n provide(KEY, ctx)\n}\n\nexport function useLogContext(): LogContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Log 部件必须用在 XhLogRoot 内')\n return ctx\n}\n"],"mappings":";;AAIA,MAAM,MAAgC,OAAO,IAAI,QAAQ;AAEzD,SAAgB,WAAW,KAAuB;CAChD,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,gBAA4B;CAC1C,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,6BAA6B;CAC/C,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/marquee/context.ts"],"sourcesContent":["import type { MarqueeApi } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport { inject, provide } from 'vue'\n\nexport interface MarqueeContext {\n api: ComputedRef<MarqueeApi>\n}\n\nconst KEY: InjectionKey<MarqueeContext> = Symbol('xh-marquee')\n\nexport function provideMarquee(ctx: MarqueeContext): void {\n provide(KEY, ctx)\n}\n\nexport function useMarqueeContext(): MarqueeContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Marquee 部件必须用在 XhMarqueeRoot 内')\n return ctx\n}\n"],"mappings":";;AAQA,MAAM,MAAoC,OAAO,YAAY;
|
|
1
|
+
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/marquee/context.ts"],"sourcesContent":["import type { MarqueeApi } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport { inject, provide } from 'vue'\n\nexport interface MarqueeContext {\n api: ComputedRef<MarqueeApi>\n}\n\nconst KEY: InjectionKey<MarqueeContext> = Symbol.for('xh-marquee')\n\nexport function provideMarquee(ctx: MarqueeContext): void {\n provide(KEY, ctx)\n}\n\nexport function useMarqueeContext(): MarqueeContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Marquee 部件必须用在 XhMarqueeRoot 内')\n return ctx\n}\n"],"mappings":";;AAQA,MAAM,MAAoC,OAAO,IAAI,YAAY;AAEjE,SAAgB,eAAe,KAA2B;CACxD,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,oBAAoC;CAClD,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,qCAAqC;CACvD,OAAO;AACT"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { inject, provide } from "vue";
|
|
2
2
|
//#region src/components/mention/context.ts
|
|
3
|
-
const KEY = Symbol("xh-mention");
|
|
4
|
-
const ITEM_KEY = Symbol("xh-mention-item");
|
|
3
|
+
const KEY = Symbol.for("xh-mention");
|
|
4
|
+
const ITEM_KEY = Symbol.for("xh-mention-item");
|
|
5
5
|
function provideMention(ctx) {
|
|
6
6
|
provide(KEY, ctx);
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/mention/context.ts"],"sourcesContent":["import type { MentionItemProps } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport type { MentionContext } from './use-mention'\nimport { inject, provide } from 'vue'\n\n/** 候选自报的值与禁用,供 item-text 复用同一份声明。 */\nexport interface MentionItemContext {\n item: ComputedRef<MentionItemProps>\n}\n\nconst KEY: InjectionKey<MentionContext> = Symbol('xh-mention')\nconst ITEM_KEY: InjectionKey<MentionItemContext> = Symbol('xh-mention-item')\n\nexport function provideMention(ctx: MentionContext): void {\n provide(KEY, ctx)\n}\n\nexport function useMentionContext(): MentionContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Mention 部件必须用在 XhMentionRoot 内')\n return ctx\n}\n\nexport function provideMentionItem(ctx: MentionItemContext): void {\n provide(ITEM_KEY, ctx)\n}\n\nexport function useMentionItemContext(): MentionItemContext {\n const ctx = inject(ITEM_KEY, null)\n if (!ctx)\n throw new Error('[xh] Mention 候选子部件必须用在 XhMentionItem 内')\n return ctx\n}\n"],"mappings":";;AAUA,MAAM,MAAoC,OAAO,YAAY;
|
|
1
|
+
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/mention/context.ts"],"sourcesContent":["import type { MentionItemProps } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport type { MentionContext } from './use-mention'\nimport { inject, provide } from 'vue'\n\n/** 候选自报的值与禁用,供 item-text 复用同一份声明。 */\nexport interface MentionItemContext {\n item: ComputedRef<MentionItemProps>\n}\n\nconst KEY: InjectionKey<MentionContext> = Symbol.for('xh-mention')\nconst ITEM_KEY: InjectionKey<MentionItemContext> = Symbol.for('xh-mention-item')\n\nexport function provideMention(ctx: MentionContext): void {\n provide(KEY, ctx)\n}\n\nexport function useMentionContext(): MentionContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Mention 部件必须用在 XhMentionRoot 内')\n return ctx\n}\n\nexport function provideMentionItem(ctx: MentionItemContext): void {\n provide(ITEM_KEY, ctx)\n}\n\nexport function useMentionItemContext(): MentionItemContext {\n const ctx = inject(ITEM_KEY, null)\n if (!ctx)\n throw new Error('[xh] Mention 候选子部件必须用在 XhMentionItem 内')\n return ctx\n}\n"],"mappings":";;AAUA,MAAM,MAAoC,OAAO,IAAI,YAAY;AACjE,MAAM,WAA6C,OAAO,IAAI,iBAAiB;AAE/E,SAAgB,eAAe,KAA2B;CACxD,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,oBAAoC;CAClD,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,qCAAqC;CACvD,OAAO;AACT;AAEA,SAAgB,mBAAmB,KAA+B;CAChE,QAAQ,UAAU,GAAG;AACvB;AAEA,SAAgB,wBAA4C;CAC1D,MAAM,MAAM,OAAO,UAAU,IAAI;CACjC,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,wCAAwC;CAC1D,OAAO;AACT"}
|
|
@@ -126,14 +126,14 @@ declare const XhMentionRoot: import("vue").DefineComponent<import("vue").Extract
|
|
|
126
126
|
"onQuery-change"?: ((_details: import("@xihan-ui/headless").MentionQueryChangeDetails) => any) | undefined;
|
|
127
127
|
}>, {
|
|
128
128
|
invalid: boolean;
|
|
129
|
-
size: Size;
|
|
130
129
|
value: string;
|
|
131
130
|
collection: MentionNode[];
|
|
132
131
|
defaultValue: string;
|
|
133
132
|
tone: Tone;
|
|
133
|
+
size: Size;
|
|
134
134
|
disabled: boolean;
|
|
135
|
-
translations: MentionTranslations;
|
|
136
135
|
offset: number;
|
|
136
|
+
translations: MentionTranslations;
|
|
137
137
|
variant: ControlVariant;
|
|
138
138
|
readOnly: boolean;
|
|
139
139
|
loop: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mention.d.ts","names":[],"sources":["../../../src/components/mention/mention.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"mention.d.ts","names":[],"sources":["../../../src/components/mention/mention.ts"],"mappings":";;;;;KAWK,eAAe;;KAGR,uBAAuB,KACjC;cAUW,6BAAa,8BAAA;;IAIa,MAAA;;;;IACN,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;IAQT,MAAA,SAAS;;;;;;;;IAEN,MAAA,SAAS;;;;IACd,MAAA,SAAS;;;;IACZ,MAAA,SAAS;;;;IACT,MAAA,SAAS;;;;;;EAIN,iBAAA,UAAA,UAAU;EACV,iBAAA,UAAA,UAAU;EAChB,SAAA,UAAA,UAAU;EACL,gBAAA,UAAA,UAAU;EACX,iBAAA,QAAA,UAAU;;;IAtBA,MAAA;;;;IACN,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;IAQT,MAAA,SAAS;;;;;;;;IAEN,MAAA,SAAS;;;;IACd,MAAA,SAAS;;;;IACZ,MAAA,SAAS;;;;IACT,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;EAWvB,WAAC,OAAO,yBAAyB;;EAEpC,QAAC,OAAO,oBAAoB;kCAyCrC;cAEW,8BAAc,8BAAA;;;;;;IAOD,MAAA,SAAS;;;;;;;;;;;IAAT,MAAA,SAAS;;;;;qCAcjC;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAgB9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAY3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,6BAAa,8BAAA;;;;;;;;;;;;;;;;;;;;;;qCAkBxB;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAO5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { withXhConfig } from "../../config/config.js";
|
|
2
|
+
import { useScrollbars } from "../../runtime/use-scrollbars.js";
|
|
3
|
+
import { useFieldLabelWiring, useFieldStateWiring } from "../field/use-field-control.js";
|
|
2
4
|
import { provideMention, provideMentionItem, useMentionContext, useMentionItemContext } from "./context.js";
|
|
3
5
|
import { useMention } from "./use-mention.js";
|
|
4
6
|
import { Teleport, computed, defineComponent, h, mergeProps, onMounted, onUnmounted, onUpdated, watch } from "vue";
|
|
@@ -106,13 +108,16 @@ as: {
|
|
|
106
108
|
default: "textarea"
|
|
107
109
|
} },
|
|
108
110
|
setup(props) {
|
|
111
|
+
const fieldWiring = useFieldStateWiring();
|
|
112
|
+
const fieldLabel = useFieldLabelWiring();
|
|
109
113
|
const ctx = useMentionContext();
|
|
110
|
-
return () => h(props.as, {
|
|
114
|
+
return () => h(props.as, fieldLabel.value({
|
|
111
115
|
...ctx.api.value.getInputProps({ as: props.as }),
|
|
112
116
|
ref: (el) => {
|
|
113
117
|
ctx.inputRef.value = el;
|
|
114
|
-
}
|
|
115
|
-
|
|
118
|
+
},
|
|
119
|
+
...fieldWiring.value
|
|
120
|
+
}));
|
|
116
121
|
}
|
|
117
122
|
});
|
|
118
123
|
const XhMentionPositioner = defineComponent({
|
|
@@ -120,12 +125,13 @@ const XhMentionPositioner = defineComponent({
|
|
|
120
125
|
inheritAttrs: false,
|
|
121
126
|
setup(_, { slots, attrs }) {
|
|
122
127
|
const ctx = useMentionContext();
|
|
128
|
+
const bars = useScrollbars({ scrollable: () => ctx.contentRef.value });
|
|
123
129
|
return () => h(Teleport, { to: ctx.portalTarget.value }, [h("div", {
|
|
124
130
|
...mergeProps(ctx.api.value.getPositionerProps(), attrs),
|
|
125
131
|
ref: (el) => {
|
|
126
132
|
ctx.positionerRef.value = el;
|
|
127
133
|
}
|
|
128
|
-
}, slots.default?.())]);
|
|
134
|
+
}, [...slots.default?.() ?? [], ...bars.render()])]);
|
|
129
135
|
}
|
|
130
136
|
});
|
|
131
137
|
const XhMentionContent = defineComponent({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mention.js","names":[],"sources":["../../../src/components/mention/mention.ts"],"sourcesContent":["import type { MentionApi, MentionInputEl, MentionInputHost, MentionItemProps, MentionNode, MentionNodeMeta, MentionSchema, MentionTranslations } from '@xihan-ui/headless'\nimport type { ControlVariant, Placement, Size, Tone } from '@xihan-ui/kernel'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { computed, defineComponent, h, mergeProps, onMounted, onUnmounted, onUpdated, Teleport, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { provideMention, provideMentionItem, useMentionContext, useMentionItemContext } from './context'\nimport { useMention } from './use-mention'\n\ntype MentionProps = MentionSchema['props']\n\n/** 默认插槽的载荷:浮层开合、正文与查询串、高亮候选,以及改写正文与收起浮层的句柄。 */\nexport type MentionRootSlotProps = Pick<\n MentionApi,\n | 'open'\n | 'value'\n | 'query'\n | 'activePrefix'\n | 'highlightedValue'\n | 'setValue'\n | 'close'\n>\n\nexport const XhMentionRoot = defineComponent({\n name: 'XhMentionRoot',\n // 有 connect 兜底的 prop 一律 default: undefined\n props: {\n prefix: { type: [String, Array] as PropType<string | string[]>, default: undefined },\n collection: { type: Array as PropType<MentionNode[]>, default: undefined },\n value: { type: String, default: undefined },\n defaultValue: { type: String, default: undefined },\n disabled: Boolean,\n readOnly: Boolean,\n invalid: Boolean,\n placeholder: { type: String, default: undefined },\n loop: { type: Boolean, default: undefined },\n placement: { type: String as PropType<Placement>, default: undefined },\n offset: { type: Number, default: undefined },\n translations: { type: Object as PropType<MentionTranslations>, default: undefined },\n variant: { type: String as PropType<ControlVariant>, default: undefined },\n tone: { type: String as PropType<Tone>, default: undefined },\n size: { type: String as PropType<Size>, default: undefined },\n },\n // *-change 携带 details 对象,update:* 携带裸值\n emits: {\n 'value-change': (_details: PayloadOf<MentionProps, 'onValueChange'>) => true,\n 'query-change': (_details: PayloadOf<MentionProps, 'onQueryChange'>) => true,\n 'select': (_details: PayloadOf<MentionProps, 'onSelect'>) => true,\n 'open-change': (_details: PayloadOf<MentionProps, 'onOpenChange'>) => true,\n 'update:value': (_value: PayloadOf<MentionProps, 'onValueChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: MentionRootSlotProps) => VNode[]\n /** 铺开 collection 时每条候选的文本插槽。 */\n item?: (props: MentionNodeMeta) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: MentionProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyQuery: MentionProps['onQueryChange'] = details => emit('query-change', details)\n const notifySelect: MentionProps['onSelect'] = details => emit('select', details)\n const notifyOpen: MentionProps['onOpenChange'] = details => emit('open-change', details)\n\n const ctx = useMention(withXhConfig('mention', props) as MentionProps, {\n onValueChange: notifyValue,\n onQueryChange: notifyQuery,\n onSelect: notifySelect,\n onOpenChange: notifyOpen,\n })\n provideMention(ctx)\n\n // 首帧结算一次候选条数,之后的增删由条目自己上报\n onMounted(ctx.syncItems)\n onUpdated(ctx.syncItems)\n\n return () => h(\n 'div',\n ctx.api.value.getRootProps() as Record<string, unknown>,\n slots.default\n ? slots.default({\n open: ctx.api.value.open,\n value: ctx.api.value.value,\n query: ctx.api.value.query,\n activePrefix: ctx.api.value.activePrefix,\n highlightedValue: ctx.api.value.highlightedValue,\n setValue: ctx.api.value.setValue,\n close: ctx.api.value.close,\n })\n : props.collection\n ? renderDefaultTree(ctx.api.value.collection, slots.item)\n : [],\n )\n },\n})\n\nexport const XhMentionInput = defineComponent({\n name: 'XhMentionInput',\n props: {\n /**\n * 输入框渲染成哪个标签,默认 textarea。\n * 写 input 即单行宿主:connect 随之补上 type、role 与 aria-expanded。\n */\n as: { type: String as PropType<MentionInputHost>, default: 'textarea' },\n },\n setup(props) {\n const ctx = useMentionContext()\n return () => h(props.as, {\n ...ctx.api.value.getInputProps({ as: props.as }) as Record<string, unknown>,\n ref: (el: unknown) => { ctx.inputRef.value = el as MentionInputEl },\n })\n },\n})\n\nexport const XhMentionPositioner = defineComponent({\n name: 'XhMentionPositioner',\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useMentionContext()\n // 定位层搬到 portal 落点,逃开祖先的层叠上下文\n return () => h(Teleport, { to: ctx.portalTarget.value }, [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, slots.default?.()),\n ])\n },\n})\n\nexport const XhMentionContent = defineComponent({\n name: 'XhMentionContent',\n setup(_, { slots }) {\n const ctx = useMentionContext()\n return () => h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhMentionItem = defineComponent({\n name: 'XhMentionItem',\n props: {\n value: { type: String, required: true },\n // 缺省交给 connect 回 collection 里查,写死 false 会盖掉数据里的禁用\n disabled: { type: Boolean, default: undefined },\n },\n setup(props, { slots }) {\n const ctx = useMentionContext()\n const item = computed<MentionItemProps>(() => ({ value: props.value, disabled: props.disabled }))\n provideMentionItem({ item })\n // 候选的进出与改名由条目自己上报,机器据此结算条数并摘掉悬空高亮\n onMounted(ctx.syncItems)\n onUnmounted(ctx.syncItems)\n // 节点就地复用时数量不变但身份换了,需按 value 另行上报\n watch(() => props.value, ctx.syncItems)\n return () => h('div', ctx.api.value.getItemProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhMentionItemText = defineComponent({\n name: 'XhMentionItemText',\n setup(_, { slots }) {\n const ctx = useMentionContext()\n const { item } = useMentionItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 没写默认插槽时按 collection 铺开的整套结构,作者只交数据。\n * 与手写部件产出的 DOM 完全一致,要改结构就写默认插槽,行为不变。\n * 过滤仍归调用方:collection 就是此刻该显示的那几条候选。\n */\nfunction renderDefaultTree(\n collection: readonly MentionNodeMeta[],\n itemSlot?: (node: MentionNodeMeta) => VNode[],\n): VNode[] {\n return [\n h(XhMentionInput),\n h(XhMentionPositioner, null, () => [\n h(XhMentionContent, null, () => collection.map(node =>\n h(XhMentionItem, { key: node.value, value: node.value }, () => [\n h(XhMentionItemText, null, () => itemSlot?.(node) ?? node.label),\n ]),\n )),\n ]),\n ]\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mention.js","names":[],"sources":["../../../src/components/mention/mention.ts"],"sourcesContent":["import type { MentionApi, MentionInputEl, MentionInputHost, MentionItemProps, MentionNode, MentionNodeMeta, MentionSchema, MentionTranslations } from '@xihan-ui/headless'\nimport type { ControlVariant, Placement, Size, Tone } from '@xihan-ui/kernel'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { computed, defineComponent, h, mergeProps, onMounted, onUnmounted, onUpdated, Teleport, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { useFieldLabelWiring, useFieldStateWiring } from '../field/use-field-control'\nimport { provideMention, provideMentionItem, useMentionContext, useMentionItemContext } from './context'\nimport { useMention } from './use-mention'\n\ntype MentionProps = MentionSchema['props']\n\n/** 默认插槽的载荷:浮层开合、正文与查询串、高亮候选,以及改写正文与收起浮层的句柄。 */\nexport type MentionRootSlotProps = Pick<\n MentionApi,\n | 'open'\n | 'value'\n | 'query'\n | 'activePrefix'\n | 'highlightedValue'\n | 'setValue'\n | 'close'\n>\n\nexport const XhMentionRoot = defineComponent({\n name: 'XhMentionRoot',\n // 有 connect 兜底的 prop 一律 default: undefined\n props: {\n prefix: { type: [String, Array] as PropType<string | string[]>, default: undefined },\n collection: { type: Array as PropType<MentionNode[]>, default: undefined },\n value: { type: String, default: undefined },\n defaultValue: { type: String, default: undefined },\n disabled: Boolean,\n readOnly: Boolean,\n invalid: Boolean,\n placeholder: { type: String, default: undefined },\n loop: { type: Boolean, default: undefined },\n placement: { type: String as PropType<Placement>, default: undefined },\n offset: { type: Number, default: undefined },\n translations: { type: Object as PropType<MentionTranslations>, default: undefined },\n variant: { type: String as PropType<ControlVariant>, default: undefined },\n tone: { type: String as PropType<Tone>, default: undefined },\n size: { type: String as PropType<Size>, default: undefined },\n },\n // *-change 携带 details 对象,update:* 携带裸值\n emits: {\n 'value-change': (_details: PayloadOf<MentionProps, 'onValueChange'>) => true,\n 'query-change': (_details: PayloadOf<MentionProps, 'onQueryChange'>) => true,\n 'select': (_details: PayloadOf<MentionProps, 'onSelect'>) => true,\n 'open-change': (_details: PayloadOf<MentionProps, 'onOpenChange'>) => true,\n 'update:value': (_value: PayloadOf<MentionProps, 'onValueChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: MentionRootSlotProps) => VNode[]\n /** 铺开 collection 时每条候选的文本插槽。 */\n item?: (props: MentionNodeMeta) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: MentionProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyQuery: MentionProps['onQueryChange'] = details => emit('query-change', details)\n const notifySelect: MentionProps['onSelect'] = details => emit('select', details)\n const notifyOpen: MentionProps['onOpenChange'] = details => emit('open-change', details)\n\n const ctx = useMention(withXhConfig('mention', props) as MentionProps, {\n onValueChange: notifyValue,\n onQueryChange: notifyQuery,\n onSelect: notifySelect,\n onOpenChange: notifyOpen,\n })\n provideMention(ctx)\n\n // 首帧结算一次候选条数,之后的增删由条目自己上报\n onMounted(ctx.syncItems)\n onUpdated(ctx.syncItems)\n\n return () => h(\n 'div',\n ctx.api.value.getRootProps() as Record<string, unknown>,\n slots.default\n ? slots.default({\n open: ctx.api.value.open,\n value: ctx.api.value.value,\n query: ctx.api.value.query,\n activePrefix: ctx.api.value.activePrefix,\n highlightedValue: ctx.api.value.highlightedValue,\n setValue: ctx.api.value.setValue,\n close: ctx.api.value.close,\n })\n : props.collection\n ? renderDefaultTree(ctx.api.value.collection, slots.item)\n : [],\n )\n },\n})\n\nexport const XhMentionInput = defineComponent({\n name: 'XhMentionInput',\n props: {\n /**\n * 输入框渲染成哪个标签,默认 textarea。\n * 写 input 即单行宿主:connect 随之补上 type、role 与 aria-expanded。\n */\n as: { type: String as PropType<MentionInputHost>, default: 'textarea' },\n },\n setup(props) {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useMentionContext()\n return () => h(props.as, fieldLabel.value({\n ...ctx.api.value.getInputProps({ as: props.as }) as Record<string, unknown>,\n ref: (el: unknown) => { ctx.inputRef.value = el as MentionInputEl },\n ...fieldWiring.value,\n }))\n },\n})\n\nexport const XhMentionPositioner = defineComponent({\n name: 'XhMentionPositioner',\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useMentionContext()\n // 候选列表的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner\n const bars = useScrollbars({ scrollable: () => ctx.contentRef.value })\n // 定位层搬到 portal 落点,逃开祖先的层叠上下文\n return () => h(Teleport, { to: ctx.portalTarget.value }, [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, [...(slots.default?.() ?? []), ...bars.render()]),\n ])\n },\n})\n\nexport const XhMentionContent = defineComponent({\n name: 'XhMentionContent',\n setup(_, { slots }) {\n const ctx = useMentionContext()\n return () => h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhMentionItem = defineComponent({\n name: 'XhMentionItem',\n props: {\n value: { type: String, required: true },\n // 缺省交给 connect 回 collection 里查,写死 false 会盖掉数据里的禁用\n disabled: { type: Boolean, default: undefined },\n },\n setup(props, { slots }) {\n const ctx = useMentionContext()\n const item = computed<MentionItemProps>(() => ({ value: props.value, disabled: props.disabled }))\n provideMentionItem({ item })\n // 候选的进出与改名由条目自己上报,机器据此结算条数并摘掉悬空高亮\n onMounted(ctx.syncItems)\n onUnmounted(ctx.syncItems)\n // 节点就地复用时数量不变但身份换了,需按 value 另行上报\n watch(() => props.value, ctx.syncItems)\n return () => h('div', ctx.api.value.getItemProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhMentionItemText = defineComponent({\n name: 'XhMentionItemText',\n setup(_, { slots }) {\n const ctx = useMentionContext()\n const { item } = useMentionItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 没写默认插槽时按 collection 铺开的整套结构,作者只交数据。\n * 与手写部件产出的 DOM 完全一致,要改结构就写默认插槽,行为不变。\n * 过滤仍归调用方:collection 就是此刻该显示的那几条候选。\n */\nfunction renderDefaultTree(\n collection: readonly MentionNodeMeta[],\n itemSlot?: (node: MentionNodeMeta) => VNode[],\n): VNode[] {\n return [\n h(XhMentionInput),\n h(XhMentionPositioner, null, () => [\n h(XhMentionContent, null, () => collection.map(node =>\n h(XhMentionItem, { key: node.value, value: node.value }, () => [\n h(XhMentionItemText, null, () => itemSlot?.(node) ?? node.label),\n ]),\n )),\n ]),\n ]\n}\n"],"mappings":"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"}
|
|
@@ -28,7 +28,7 @@ function useMention(props, handlers = {}) {
|
|
|
28
28
|
const registerLayer = () => config.layerRegistry.register({
|
|
29
29
|
kind: "popover",
|
|
30
30
|
node: () => contentRef.value,
|
|
31
|
-
branches: () => [inputRef.value].filter(Boolean),
|
|
31
|
+
branches: () => [inputRef.value, positionerRef.value].filter(Boolean),
|
|
32
32
|
isModal: () => false,
|
|
33
33
|
setModal: () => {},
|
|
34
34
|
surfaces: () => []
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-mention.js","names":[],"sources":["../../../src/components/mention/use-mention.ts"],"sourcesContent":["import type { MentionApi, MentionInputEl, MentionSchema } from '@xihan-ui/headless'\nimport type { Cleanup, Layer, RuntimeConfig } from '@xihan-ui/kernel'\nimport type { Service } from '@xihan-ui/machine'\nimport type { ComputedRef, Ref } from 'vue'\nimport { connectMention, mentionMachine } from '@xihan-ui/headless'\nimport { createRuntimeConfig, createScope } from '@xihan-ui/kernel'\nimport { createPositionEngine } from '@xihan-ui/position'\nimport { computed, nextTick, ref } from 'vue'\nimport { useXhConfig } from '../../config/config'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { useOverlayExit } from '../../runtime/use-overlay-exit'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\nexport interface MentionContext {\n /** 机器实例,供部件直接上报 DOM 侧事实。 */\n service: Service<MentionSchema>\n api: ComputedRef<MentionApi>\n /** 输入宿主,textarea 或 input;由 XhMentionInput 的 as 决定渲染成哪个。 */\n inputRef: Ref<MentionInputEl | null>\n positionerRef: Ref<HTMLElement | null>\n contentRef: Ref<HTMLElement | null>\n /** 此刻该不该渲染:退场动画播完之前仍为真。 */\n visible: Ref<boolean>\n /** 浮层搬到哪儿:全局配置的容器 > 运行时的浮层落点 > body。 */\n portalTarget: ComputedRef<string | Element>\n /** 上报候选集合可能变了;同一拍里多次调用只上报一次。 */\n syncItems: () => void\n}\n\nexport function useMention(\n props: MentionSchema['props'],\n handlers: Pick<MentionSchema['props'], 'onValueChange' | 'onQueryChange' | 'onSelect' | 'onOpenChange'> = {},\n): MentionContext {\n const xhConfig = useXhConfig()\n const inputRef = ref<MentionInputEl | null>(null)\n const positionerRef = ref<HTMLElement | null>(null)\n const contentRef = ref<HTMLElement | null>(null)\n\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n const service = useMachine(mentionMachine, () => ({ ...props, ...handlers }), scope)\n\n // 服务端没有 DOM、也就没有退场:config 传 null 时闸门退化成「跟着展开态」\n let config: RuntimeConfig | null = null\n\n if (typeof document !== 'undefined') {\n config = createRuntimeConfig({ scope, idGenerator: idGen })\n\n // 只提供注册函数,实际入栈出栈由机器的 trackLayer 效应按展开态驱动\n const registerLayer = (): { layer: Layer, dispose: Cleanup } => config!.layerRegistry.register({\n kind: 'popover',\n node: () => contentRef.value,\n //
|
|
1
|
+
{"version":3,"file":"use-mention.js","names":[],"sources":["../../../src/components/mention/use-mention.ts"],"sourcesContent":["import type { MentionApi, MentionInputEl, MentionSchema } from '@xihan-ui/headless'\nimport type { Cleanup, Layer, RuntimeConfig } from '@xihan-ui/kernel'\nimport type { Service } from '@xihan-ui/machine'\nimport type { ComputedRef, Ref } from 'vue'\nimport { connectMention, mentionMachine } from '@xihan-ui/headless'\nimport { createRuntimeConfig, createScope } from '@xihan-ui/kernel'\nimport { createPositionEngine } from '@xihan-ui/position'\nimport { computed, nextTick, ref } from 'vue'\nimport { useXhConfig } from '../../config/config'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { useOverlayExit } from '../../runtime/use-overlay-exit'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\nexport interface MentionContext {\n /** 机器实例,供部件直接上报 DOM 侧事实。 */\n service: Service<MentionSchema>\n api: ComputedRef<MentionApi>\n /** 输入宿主,textarea 或 input;由 XhMentionInput 的 as 决定渲染成哪个。 */\n inputRef: Ref<MentionInputEl | null>\n positionerRef: Ref<HTMLElement | null>\n contentRef: Ref<HTMLElement | null>\n /** 此刻该不该渲染:退场动画播完之前仍为真。 */\n visible: Ref<boolean>\n /** 浮层搬到哪儿:全局配置的容器 > 运行时的浮层落点 > body。 */\n portalTarget: ComputedRef<string | Element>\n /** 上报候选集合可能变了;同一拍里多次调用只上报一次。 */\n syncItems: () => void\n}\n\nexport function useMention(\n props: MentionSchema['props'],\n handlers: Pick<MentionSchema['props'], 'onValueChange' | 'onQueryChange' | 'onSelect' | 'onOpenChange'> = {},\n): MentionContext {\n const xhConfig = useXhConfig()\n const inputRef = ref<MentionInputEl | null>(null)\n const positionerRef = ref<HTMLElement | null>(null)\n const contentRef = ref<HTMLElement | null>(null)\n\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n const service = useMachine(mentionMachine, () => ({ ...props, ...handlers }), scope)\n\n // 服务端没有 DOM、也就没有退场:config 传 null 时闸门退化成「跟着展开态」\n let config: RuntimeConfig | null = null\n\n if (typeof document !== 'undefined') {\n config = createRuntimeConfig({ scope, idGenerator: idGen })\n\n // 只提供注册函数,实际入栈出栈由机器的 trackLayer 效应按展开态驱动\n const registerLayer = (): { layer: Layer, dispose: Cleanup } => config!.layerRegistry.register({\n kind: 'popover',\n node: () => contentRef.value,\n // 输入框记为本层分支:在正文里打字、点击都算层内交互,不该把浮层点没。\n // 浮层壳一并记上:候选列表之外还浮着自绘滚动条,按住它拖动不该把列表消解掉\n branches: () => [inputRef.value, positionerRef.value].filter(Boolean) as Element[],\n isModal: () => false,\n setModal: () => {},\n surfaces: () => [],\n })\n\n // 定位引擎由适配器注入,机器只经端口驱动;锚点就是输入框本身\n service.refs.set('config', config!)\n service.refs.set('registerLayer', registerLayer)\n service.refs.set('position', createPositionEngine())\n service.refs.set('getFloatingEl', () => positionerRef.value)\n service.refs.set('getContentEl', () => contentRef.value)\n service.refs.set('getInputEl', () => inputRef.value)\n }\n\n // 合并到下一拍统一上报,同时等待 DOM 落定\n let syncScheduled = false\n const syncItems = (): void => {\n if (syncScheduled)\n return\n syncScheduled = true\n void nextTick(() => {\n syncScheduled = false\n if (service.getStatus() === 'Started')\n service.send({ type: 'ITEMS.SYNC' })\n })\n }\n\n const api = computed(() => connectMention(service, vueNormalize))\n // 退场闸门:收起从跟着 open 走,改成跟着 presence 走\n const visible = useOverlayExit({ config, isOpen: () => api.value.open, contentRef })\n // 全局配置写了容器就用它,否则落到运行时那个单一浮层落点;没有 DOM 时才回到 body\n const portalTarget = computed<string | Element>(() => xhConfig.value.portalContainer?.() ?? config?.portalContainer() ?? 'body')\n\n return { visible, service, api, inputRef, positionerRef, contentRef, portalTarget, syncItems }\n}\n"],"mappings":";;;;;;;;;;AA8BA,SAAgB,WACd,OACA,WAA0G,CAAC,GAC3F;CAChB,MAAM,WAAW,YAAY;CAC7B,MAAM,WAAW,IAA2B,IAAI;CAChD,MAAM,gBAAgB,IAAwB,IAAI;CAClD,MAAM,aAAa,IAAwB,IAAI;CAE/C,MAAM,QAAQ,qBAAqB;CACnC,MAAM,QAAQ,YAAY,MAAM,KAAK;CACrC,MAAM,UAAU,WAAW,uBAAuB;EAAE,GAAG;EAAO,GAAG;CAAS,IAAI,KAAK;CAGnF,IAAI,SAA+B;CAEnC,IAAI,OAAO,aAAa,aAAa;EACnC,SAAS,oBAAoB;GAAE;GAAO,aAAa;EAAM,CAAC;EAG1D,MAAM,sBAA0D,OAAQ,cAAc,SAAS;GAC7F,MAAM;GACN,YAAY,WAAW;GAGvB,gBAAgB,CAAC,SAAS,OAAO,cAAc,KAAK,CAAC,CAAC,OAAO,OAAO;GACpE,eAAe;GACf,gBAAgB,CAAC;GACjB,gBAAgB,CAAC;EACnB,CAAC;EAGD,QAAQ,KAAK,IAAI,UAAU,MAAO;EAClC,QAAQ,KAAK,IAAI,iBAAiB,aAAa;EAC/C,QAAQ,KAAK,IAAI,YAAY,qBAAqB,CAAC;EACnD,QAAQ,KAAK,IAAI,uBAAuB,cAAc,KAAK;EAC3D,QAAQ,KAAK,IAAI,sBAAsB,WAAW,KAAK;EACvD,QAAQ,KAAK,IAAI,oBAAoB,SAAS,KAAK;CACrD;CAGA,IAAI,gBAAgB;CACpB,MAAM,kBAAwB;EAC5B,IAAI,eACF;EACF,gBAAgB;EAChB,eAAoB;GAClB,gBAAgB;GAChB,IAAI,QAAQ,UAAU,MAAM,WAC1B,QAAQ,KAAK,EAAE,MAAM,aAAa,CAAC;EACvC,CAAC;CACH;CAEA,MAAM,MAAM,eAAe,eAAe,SAAS,YAAY,CAAC;CAMhE,OAAO;EAAE,SAJO,eAAe;GAAE;GAAQ,cAAc,IAAI,MAAM;GAAM;EAAW,CAInE;EAAG;EAAS;EAAK;EAAU;EAAe;EAAY,cAFhD,eAAiC,SAAS,MAAM,kBAAkB,KAAK,QAAQ,gBAAgB,KAAK,MAEzC;EAAG;CAAU;AAC/F"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { inject, provide } from "vue";
|
|
2
2
|
//#region src/components/menu/context.ts
|
|
3
|
-
const KEY = Symbol("xh-menu");
|
|
3
|
+
const KEY = Symbol.for("xh-menu");
|
|
4
4
|
function provideMenu(ctx) {
|
|
5
5
|
provide(KEY, ctx);
|
|
6
6
|
}
|
|
@@ -9,7 +9,7 @@ function useMenuContext() {
|
|
|
9
9
|
if (!ctx) throw new Error("[xh] Menu 部件必须用在 XhMenuRoot 内");
|
|
10
10
|
return ctx;
|
|
11
11
|
}
|
|
12
|
-
const GROUP_KEY = Symbol("xh-menu-group");
|
|
12
|
+
const GROUP_KEY = Symbol.for("xh-menu-group");
|
|
13
13
|
function provideMenuGroup(ctx) {
|
|
14
14
|
provide(GROUP_KEY, ctx);
|
|
15
15
|
}
|
|
@@ -18,7 +18,7 @@ function useMenuGroupContext() {
|
|
|
18
18
|
if (!ctx) throw new Error("[xh] Menu 分组标题必须用在 XhMenuGroup 内");
|
|
19
19
|
return ctx;
|
|
20
20
|
}
|
|
21
|
-
const CHAIN_KEY = Symbol("xh-menu-chain");
|
|
21
|
+
const CHAIN_KEY = Symbol.for("xh-menu-chain");
|
|
22
22
|
function provideMenuChain(chain) {
|
|
23
23
|
provide(CHAIN_KEY, chain);
|
|
24
24
|
}
|
|
@@ -27,7 +27,7 @@ function useMenuChain() {
|
|
|
27
27
|
if (!chain) throw new Error("[xh] MenuSub 必须用在 XhMenuRoot 内");
|
|
28
28
|
return chain;
|
|
29
29
|
}
|
|
30
|
-
const SUB_KEY = Symbol("xh-menu-sub");
|
|
30
|
+
const SUB_KEY = Symbol.for("xh-menu-sub");
|
|
31
31
|
function provideMenuSub(handle) {
|
|
32
32
|
provide(SUB_KEY, handle);
|
|
33
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/menu/context.ts"],"sourcesContent":["import type { MenuGroupProps } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport type { MenuContext } from './use-menu'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<MenuContext> = Symbol('xh-menu')\n\nexport function provideMenu(ctx: MenuContext): void {\n provide(KEY, ctx)\n}\n\nexport function useMenuContext(): MenuContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Menu 部件必须用在 XhMenuRoot 内')\n return ctx\n}\n\n/** 分组自报的身份,供分组标题取到同一个值(标题的 id 由它派生)。 */\nexport interface MenuGroupContext {\n group: ComputedRef<MenuGroupProps>\n}\n\nconst GROUP_KEY: InjectionKey<MenuGroupContext> = Symbol('xh-menu-group')\n\nexport function provideMenuGroup(ctx: MenuGroupContext): void {\n provide(GROUP_KEY, ctx)\n}\n\nexport function useMenuGroupContext(): MenuGroupContext {\n const ctx = inject(GROUP_KEY, null)\n if (!ctx)\n throw new Error('[xh] Menu 分组标题必须用在 XhMenuGroup 内')\n return ctx\n}\n\n/** 选中链:任意层级的选中都汇到根——先发根的 select,再关根,各级子层随父关闭级联收起。 */\nexport interface MenuChain {\n notifySelect: (details: { value: string }) => void\n}\n\nconst CHAIN_KEY: InjectionKey<MenuChain> = Symbol('xh-menu-chain')\n\nexport function provideMenuChain(chain: MenuChain): void {\n provide(CHAIN_KEY, chain)\n}\n\nexport function useMenuChain(): MenuChain {\n const chain = inject(CHAIN_KEY, null)\n if (!chain)\n throw new Error('[xh] MenuSub 必须用在 XhMenuRoot 内')\n return chain\n}\n\n/** 子菜单触发条目要同时够到父菜单与本子菜单,这里存父层句柄与它在父层里的身份。 */\nexport interface MenuSubHandle {\n parent: MenuContext\n value: string\n disabled?: boolean\n}\n\nconst SUB_KEY: InjectionKey<MenuSubHandle> = Symbol('xh-menu-sub')\n\nexport function provideMenuSub(handle: MenuSubHandle): void {\n provide(SUB_KEY, handle)\n}\n\nexport function useMenuSubContext(): MenuSubHandle {\n const handle = inject(SUB_KEY, null)\n if (!handle)\n throw new Error('[xh] MenuSubTrigger 必须用在 XhMenuSub 内')\n return handle\n}\n"],"mappings":";;AAKA,MAAM,MAAiC,OAAO,SAAS;
|
|
1
|
+
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/menu/context.ts"],"sourcesContent":["import type { MenuGroupProps } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport type { MenuContext } from './use-menu'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<MenuContext> = Symbol.for('xh-menu')\n\nexport function provideMenu(ctx: MenuContext): void {\n provide(KEY, ctx)\n}\n\nexport function useMenuContext(): MenuContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Menu 部件必须用在 XhMenuRoot 内')\n return ctx\n}\n\n/** 分组自报的身份,供分组标题取到同一个值(标题的 id 由它派生)。 */\nexport interface MenuGroupContext {\n group: ComputedRef<MenuGroupProps>\n}\n\nconst GROUP_KEY: InjectionKey<MenuGroupContext> = Symbol.for('xh-menu-group')\n\nexport function provideMenuGroup(ctx: MenuGroupContext): void {\n provide(GROUP_KEY, ctx)\n}\n\nexport function useMenuGroupContext(): MenuGroupContext {\n const ctx = inject(GROUP_KEY, null)\n if (!ctx)\n throw new Error('[xh] Menu 分组标题必须用在 XhMenuGroup 内')\n return ctx\n}\n\n/** 选中链:任意层级的选中都汇到根——先发根的 select,再关根,各级子层随父关闭级联收起。 */\nexport interface MenuChain {\n notifySelect: (details: { value: string }) => void\n}\n\nconst CHAIN_KEY: InjectionKey<MenuChain> = Symbol.for('xh-menu-chain')\n\nexport function provideMenuChain(chain: MenuChain): void {\n provide(CHAIN_KEY, chain)\n}\n\nexport function useMenuChain(): MenuChain {\n const chain = inject(CHAIN_KEY, null)\n if (!chain)\n throw new Error('[xh] MenuSub 必须用在 XhMenuRoot 内')\n return chain\n}\n\n/** 子菜单触发条目要同时够到父菜单与本子菜单,这里存父层句柄与它在父层里的身份。 */\nexport interface MenuSubHandle {\n parent: MenuContext\n value: string\n disabled?: boolean\n}\n\nconst SUB_KEY: InjectionKey<MenuSubHandle> = Symbol.for('xh-menu-sub')\n\nexport function provideMenuSub(handle: MenuSubHandle): void {\n provide(SUB_KEY, handle)\n}\n\nexport function useMenuSubContext(): MenuSubHandle {\n const handle = inject(SUB_KEY, null)\n if (!handle)\n throw new Error('[xh] MenuSubTrigger 必须用在 XhMenuSub 内')\n return handle\n}\n"],"mappings":";;AAKA,MAAM,MAAiC,OAAO,IAAI,SAAS;AAE3D,SAAgB,YAAY,KAAwB;CAClD,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,iBAA8B;CAC5C,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,+BAA+B;CACjD,OAAO;AACT;AAOA,MAAM,YAA4C,OAAO,IAAI,eAAe;AAE5E,SAAgB,iBAAiB,KAA6B;CAC5D,QAAQ,WAAW,GAAG;AACxB;AAEA,SAAgB,sBAAwC;CACtD,MAAM,MAAM,OAAO,WAAW,IAAI;CAClC,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,kCAAkC;CACpD,OAAO;AACT;AAOA,MAAM,YAAqC,OAAO,IAAI,eAAe;AAErE,SAAgB,iBAAiB,OAAwB;CACvD,QAAQ,WAAW,KAAK;AAC1B;AAEA,SAAgB,eAA0B;CACxC,MAAM,QAAQ,OAAO,WAAW,IAAI;CACpC,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,gCAAgC;CAClD,OAAO;AACT;AASA,MAAM,UAAuC,OAAO,IAAI,aAAa;AAErE,SAAgB,eAAe,QAA6B;CAC1D,QAAQ,SAAS,MAAM;AACzB;AAEA,SAAgB,oBAAmC;CACjD,MAAM,SAAS,OAAO,SAAS,IAAI;CACnC,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,sCAAsC;CACxD,OAAO;AACT"}
|
|
@@ -119,13 +119,13 @@ declare const XhMenuRoot: import("vue").DefineComponent<import("vue").ExtractPro
|
|
|
119
119
|
"onOpen-change"?: ((_details: import("@xihan-ui/headless").MenuOpenChangeDetails) => any) | undefined;
|
|
120
120
|
"onUpdate:open"?: ((_open: boolean) => any) | undefined;
|
|
121
121
|
}>, {
|
|
122
|
-
size: Size;
|
|
123
122
|
collection: MenuNode[];
|
|
124
123
|
dir: Direction;
|
|
125
124
|
tone: Tone;
|
|
125
|
+
size: Size;
|
|
126
|
+
offset: number;
|
|
126
127
|
open: boolean;
|
|
127
128
|
defaultOpen: boolean;
|
|
128
|
-
offset: number;
|
|
129
129
|
loop: boolean;
|
|
130
130
|
placement: Placement;
|
|
131
131
|
openOnHover: boolean;
|
|
@@ -292,10 +292,10 @@ declare const XhMenuSub: import("vue").DefineComponent<import("vue").ExtractProp
|
|
|
292
292
|
default: undefined;
|
|
293
293
|
};
|
|
294
294
|
}>> & Readonly<{}>, {
|
|
295
|
-
size: Size;
|
|
296
295
|
collection: MenuNode[];
|
|
297
296
|
dir: Direction;
|
|
298
297
|
tone: Tone;
|
|
298
|
+
size: Size;
|
|
299
299
|
disabled: boolean;
|
|
300
300
|
offset: number;
|
|
301
301
|
loop: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.d.ts","names":[],"sources":["../../../src/components/menu/menu.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"menu.d.ts","names":[],"sources":["../../../src/components/menu/menu.ts"],"mappings":";;;;;KAWK,YAAY;;KAGL,oBAAoB,KAAK;cAExB,0BAAU,8BAAA;;IAIU,MAAA,SAAS;;;;;;;;;IAGT,MAAA,SAAS;;;;;;;;;;;;IAGf,MAAA,SAAS;;;;IACR,MAAA,SAAS;;;;IACT,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;EAYP,gBAAA,UAAA,UAAU;EACf,SAAA,UAAA,UAAU;EACR,gBAAA,OAAA,UAAU;;;IAtBJ,MAAA,SAAS;;;;;;;;;IAGT,MAAA,SAAS;;;;;;;;;;;;IAGf,MAAA,SAAS;;;;IACR,MAAA,SAAS;;;;IACT,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBvB,WAAC,OAAO,sBAAsB;EAC9B,gBAAM;EACT,QAAC,MAAM,iBAAiB;kCAuBjC;cAEW,6BAAa,8BAAA;;;;;;;;;;qCAuBxB;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAgB3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,6BAAa,0BAAA,oBAAA,4BAAA;;8BAYxB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,0BAAU,8BAAA;;;;;;;;;;;;;;;;;;;;;;qCAmCrB;;KAGU,mBAAmB,KAAK;;;;;cAMvB,yBAAS,8BAAA;;;;;;;;;;;IAMW,MAAA,SAAS;;;;IACT,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;IAMf,MAAA,SAAS;;;;;IAER,MAAA,SAAS;;;;;IAET,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;IAXJ,MAAA,SAAS;;;;IACT,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;IAMf,MAAA,SAAS;;;;;IAER,MAAA,SAAS;;;;;IAET,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;EAIvB,WAAC,OAAO,qBAAqB;kCA2BzC;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAgB3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,2BAAW,8BAAA;;;;;;;;;;;;MAWtB,oDAAA;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAO3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+BAAe,0BAAA,oBAAA,4BAAA;;8BAM1B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,2BAAW,0BAAA,oBAAA,4BAAA;;8BAMtB,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { useScrollbars } from "../../runtime/use-scrollbars.js";
|
|
1
2
|
import { mergeIntoChild } from "../../runtime/as-child.js";
|
|
2
3
|
import { provideMenu, provideMenuChain, provideMenuGroup, provideMenuSub, useMenuChain, useMenuContext, useMenuGroupContext, useMenuSubContext } from "./context.js";
|
|
3
4
|
import { useMenu } from "./use-menu.js";
|
|
@@ -110,12 +111,13 @@ const XhMenuPositioner = defineComponent({
|
|
|
110
111
|
inheritAttrs: false,
|
|
111
112
|
setup(_, { slots, attrs }) {
|
|
112
113
|
const ctx = useMenuContext();
|
|
114
|
+
const bars = useScrollbars({ scrollable: () => ctx.contentRef.value });
|
|
113
115
|
return () => h(Teleport, { to: ctx.portalTarget.value }, [h("div", {
|
|
114
116
|
...mergeProps(ctx.api.value.getPositionerProps(), attrs),
|
|
115
117
|
ref: (el) => {
|
|
116
118
|
ctx.positionerRef.value = el;
|
|
117
119
|
}
|
|
118
|
-
}, slots.default?.())]);
|
|
120
|
+
}, [...slots.default?.() ?? [], ...bars.render()])]);
|
|
119
121
|
}
|
|
120
122
|
});
|
|
121
123
|
const XhMenuContent = defineComponent({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.js","names":["mergeVueProps","mergeProps"],"sources":["../../../src/components/menu/menu.ts"],"sourcesContent":["import type { MenuApi, MenuGroupProps, MenuNode, MenuNodeMeta, MenuSchema } from '@xihan-ui/headless'\nimport type { Direction, Placement, Size, Tone } from '@xihan-ui/kernel'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { mergeProps } from '@xihan-ui/kernel'\nimport { computed, defineComponent, h, mergeProps as mergeVueProps, onBeforeUnmount, ref, Teleport, watch } from 'vue'\nimport { mergeIntoChild } from '../../runtime/as-child'\nimport { provideMenu, provideMenuChain, provideMenuGroup, provideMenuSub, useMenuChain, useMenuContext, useMenuGroupContext, useMenuSubContext } from './context'\nimport { useMenu } from './use-menu'\n\ntype MenuProps = MenuSchema['props']\n\n/** 默认插槽的载荷:展开态与改展开的动作。 */\nexport type MenuRootSlotProps = Pick<MenuApi, 'open' | 'setOpen'>\n\nexport const XhMenuRoot = defineComponent({\n name: 'XhMenuRoot',\n // 缺省值由 connect 给出,这里一律 default: undefined\n props: {\n collection: { type: Array as PropType<MenuNode[]>, default: undefined },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n placement: { type: String as PropType<Placement>, default: undefined },\n offset: { type: Number, default: undefined },\n loop: { type: Boolean, default: undefined },\n dir: { type: String as PropType<Direction>, default: undefined },\n tone: { type: String as PropType<Tone>, default: undefined },\n size: { type: String as PropType<Size>, default: undefined },\n openOnHover: { type: Boolean, default: undefined },\n hoverOpenDelay: { type: Number, default: undefined },\n hoverCloseDelay: { type: Number, default: undefined },\n /**\n * 只交 collection 时,触发器插槽给的那个节点直接当触发器用,不再外包一颗 <button>。\n * 摆部件的写法有 XhMenuTrigger 自己的 asChild,这个 prop 是给代铺那条路的同一个能力。\n */\n triggerAsChild: Boolean,\n },\n // open-change 携带 { open }、select 携带 { value },update:open 携带裸布尔\n emits: {\n 'open-change': (_details: PayloadOf<MenuProps, 'onOpenChange'>) => true,\n 'select': (_details: PayloadOf<MenuProps, 'onSelect'>) => true,\n 'update:open': (_open: PayloadOf<MenuProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: MenuRootSlotProps) => VNode[]\n trigger?: () => VNode[]\n item?: (node: MenuNodeMeta) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyOpen: MenuProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const notifySelect: MenuProps['onSelect'] = details => emit('select', details)\n const ctx = useMenu(props as MenuProps, notifyOpen, notifySelect)\n provideMenu(ctx)\n // 任意层级子菜单的选中都汇到根:先发根的 select 再关根,各级随父关闭级联收起\n provideMenuChain({\n notifySelect: (details) => {\n emit('select', details)\n ctx.api.value.setOpen(false)\n },\n })\n return () => (slots.default\n ? slots.default({ open: ctx.api.value.open, setOpen: ctx.api.value.setOpen })\n : props.collection\n ? renderDefaultTree(ctx.api.value.collection, slots.trigger?.() ?? null, slots.item, props.triggerAsChild)\n : [])\n },\n})\n\nexport const XhMenuTrigger = defineComponent({\n name: 'XhMenuTrigger',\n props: {\n /** 借用作者的子节点当触发器,不再渲染自己的包裹元素;子节点须恰好一个。 */\n asChild: Boolean,\n },\n setup(props, { slots }) {\n const ctx = useMenuContext()\n return () => {\n const attrs = {\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }\n const children = slots.default?.()\n // asChild:把触发器属性合到作者的节点上,不再自己渲染包裹元素\n if (props.asChild) {\n const merged = mergeIntoChild(children, attrs, 'menu')\n if (merged)\n return merged\n }\n return h('button', attrs, children)\n }\n },\n})\n\nexport const XhMenuPositioner = defineComponent({\n name: 'XhMenuPositioner',\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useMenuContext()\n // 定位层搬到 portal 落点,逃开祖先的层叠上下文\n return () => h(Teleport, { to: ctx.portalTarget.value }, [\n h('div', {\n ...mergeVueProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, slots.default?.()),\n ])\n },\n})\n\nexport const XhMenuContent = defineComponent({\n name: 'XhMenuContent',\n setup(_, { slots }) {\n const ctx = useMenuContext()\n return () => h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhMenuItem = defineComponent({\n name: 'XhMenuItem',\n props: {\n value: { type: String, required: true },\n // 缺省交给 connect 回 collection 里查,写死 false 会盖掉数据里的禁用\n disabled: { type: Boolean, default: undefined },\n },\n setup(props, { slots }) {\n const ctx = useMenuContext()\n // 本条目持有焦点时,value 变更按新值重报焦点条目,卸载时上报焦点丢失\n const itemEl = ref<HTMLElement | null>(null)\n watch(() => props.value, (next, prev) => {\n if (next === prev)\n return\n const svc = ctx.service\n if (svc.getStatus() !== 'Started')\n return\n if (itemEl.value && svc.scope.getActiveElement() === itemEl.value)\n svc.send({ type: 'ITEM.FOCUS', value: next })\n })\n onBeforeUnmount(() => {\n const { service } = ctx\n // 根已停机时不再送事件\n if (service.getStatus() !== 'Started')\n return\n // 按「本节点当下正持有焦点」判定,不按 value 比对\n if (itemEl.value && service.scope.getActiveElement() === itemEl.value)\n service.send({ type: 'ITEM.LOST' })\n })\n return () => h(\n 'div',\n { ...ctx.api.value.getItemProps({ value: props.value, disabled: props.disabled }) as Record<string, unknown>, ref: itemEl },\n slots.default?.(),\n )\n },\n})\n\n/** 默认插槽的载荷:本层子菜单的展开态与改展开的动作。 */\nexport type MenuSubSlotProps = Pick<MenuApi, 'open' | 'setOpen'>\n\n/**\n * 子菜单:内部再跑一台 menu 机器(submenu 模式),触发条目由 XhMenuSubTrigger\n * 渲染成「父菜单条目 + 本子菜单触发器」的双重身份。本身不渲染节点。\n */\nexport const XhMenuSub = defineComponent({\n name: 'XhMenuSub',\n props: {\n /** 它在父菜单里的条目身份。 */\n value: { type: String, required: true },\n disabled: { type: Boolean, default: undefined },\n collection: { type: Array as PropType<MenuNode[]>, default: undefined },\n placement: { type: String as PropType<Placement>, default: undefined },\n offset: { type: Number, default: undefined },\n loop: { type: Boolean, default: undefined },\n openOnHover: { type: Boolean, default: undefined },\n hoverOpenDelay: { type: Number, default: undefined },\n /** 文字方向;缺省继承父层。子层被搬到浮层落点,继承不到父层的方向。 */\n dir: { type: String as PropType<Direction>, default: undefined },\n /** 语气;缺省继承父层。子层是浮层落点下的同级节点,CSS 私有槽继承不到。 */\n tone: { type: String as PropType<Tone>, default: undefined },\n /** 尺寸;缺省继承父层,理由同 tone。 */\n size: { type: String as PropType<Size>, default: undefined },\n hoverCloseDelay: { type: Number, default: undefined },\n },\n slots: Object as SlotsType<{\n default?: (props: MenuSubSlotProps) => VNode[]\n }>,\n setup(props, { slots }) {\n const parent = useMenuContext()\n const chain = useMenuChain()\n const ctx = useMenu(\n {\n ...props,\n submenu: true,\n dir: props.dir ?? parent.service.prop('dir'),\n tone: props.tone ?? parent.service.prop('tone'),\n size: props.size ?? parent.service.prop('size'),\n } as MenuProps,\n undefined,\n // 子层的选中汇到根:根发 select 并关根,各级随父关闭级联收起\n details => chain.notifySelect(details),\n )\n // 覆盖菜单上下文:本子树内的部件都归子机器\n provideMenu(ctx)\n provideMenuSub({ parent, value: props.value, disabled: props.disabled })\n // 父层收起(Escape、外点、选中)时本层跟着收,层层传导\n watch(() => parent.api.value.open, (open) => {\n if (!open)\n ctx.api.value.setOpen(false)\n })\n return () => slots.default?.({ open: ctx.api.value.open, setOpen: ctx.api.value.setOpen })\n },\n})\n\nexport const XhMenuSubTrigger = defineComponent({\n name: 'XhMenuSubTrigger',\n setup(_, { slots }) {\n const sub = useMenuSubContext()\n const ctx = useMenuContext()\n return () => h('div', {\n ...mergeProps(\n sub.parent.api.value.getItemProps({ value: sub.value, disabled: sub.disabled }) as Record<string, unknown>,\n ctx.api.value.getSubmenuTriggerProps({ value: sub.value, disabled: sub.disabled }) as Record<string, unknown>,\n ),\n // 子菜单的定位锚点就是这一条\n ref: (el: unknown) => {\n ctx.triggerRef.value = el as HTMLElement\n },\n }, slots.default?.())\n },\n})\n\nexport const XhMenuGroup = defineComponent({\n name: 'XhMenuGroup',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useMenuContext()\n const group = computed<MenuGroupProps>(() => ({ value: props.value }))\n provideMenuGroup({ group })\n return () => h('div', ctx.api.value.getGroupProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhMenuGroupLabel = defineComponent({\n name: 'XhMenuGroupLabel',\n setup(_, { slots }) {\n const ctx = useMenuContext()\n const { group } = useMenuGroupContext()\n return () => h('span', ctx.api.value.getGroupLabelProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhMenuSeparator = defineComponent({\n name: 'XhMenuSeparator',\n setup() {\n const ctx = useMenuContext()\n return () => h('div', ctx.api.value.getSeparatorProps() as Record<string, unknown>)\n },\n})\n\nexport const XhMenuArrow = defineComponent({\n name: 'XhMenuArrow',\n setup() {\n const ctx = useMenuContext()\n return () => h('div', ctx.api.value.getArrowProps() as Record<string, unknown>)\n },\n})\n\n/**\n * 没写默认插槽时按 collection 铺开的整套结构,作者只交数据。\n * 与手写部件产出的 DOM 完全一致,要改结构就写默认插槽,行为不变。\n * 触发器内容归作者,由 trigger 插槽承载;条目内容缺省是 label,可由 item 插槽接管。\n */\nfunction renderDefaultTree(\n collection: readonly MenuNodeMeta[],\n trigger: (VNode | string)[] | null,\n itemSlot?: (node: MenuNodeMeta) => VNode[],\n triggerAsChild?: boolean,\n): VNode[] {\n return [\n h(XhMenuTrigger, { asChild: triggerAsChild }, () => trigger ?? []),\n h(XhMenuPositioner, null, () => [\n h(XhMenuContent, null, () => collection.flatMap((node, index) => [\n // 首条上的标记不产出分隔线:菜单开头不留一道空隔\n ...(index > 0 && node.separatorBefore ? [h(XhMenuSeparator, { key: `separator:${node.value}` })] : []),\n h(XhMenuItem, { key: node.value, value: node.value }, () => itemSlot?.(node) ?? node.label),\n ])),\n ]),\n ]\n}\n"],"mappings":";;;;;;AAeA,MAAa,aAAa,gBAAgB;CACxC,MAAM;CAEN,OAAO;EACL,YAAY;GAAE,MAAM;GAA+B,SAAS,KAAA;EAAU;EACtE,MAAM;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC1C,aAAa;EACb,WAAW;GAAE,MAAM;GAA+B,SAAS,KAAA;EAAU;EACrE,QAAQ;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EAC3C,MAAM;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC1C,KAAK;GAAE,MAAM;GAA+B,SAAS,KAAA;EAAU;EAC/D,MAAM;GAAE,MAAM;GAA0B,SAAS,KAAA;EAAU;EAC3D,MAAM;GAAE,MAAM;GAA0B,SAAS,KAAA;EAAU;EAC3D,aAAa;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EACjD,gBAAgB;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EACnD,iBAAiB;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;;;;;EAKpD,gBAAgB;CAClB;CAEA,OAAO;EACL,gBAAgB,aAAmD;EACnE,WAAW,aAA+C;EAC1D,gBAAgB,UAAwD;CAC1E;CACA,OAAO;CAKP,MAAM,OAAO,EAAE,OAAO,QAAQ;EAC5B,MAAM,cAAyC,YAAY;GACzD,KAAK,eAAe,OAAO;GAC3B,KAAK,eAAe,QAAQ,IAAI;EAClC;EACA,MAAM,gBAAsC,YAAW,KAAK,UAAU,OAAO;EAC7E,MAAM,MAAM,QAAQ,OAAoB,YAAY,YAAY;EAChE,YAAY,GAAG;EAEf,iBAAiB,EACf,eAAe,YAAY;GACzB,KAAK,UAAU,OAAO;GACtB,IAAI,IAAI,MAAM,QAAQ,KAAK;EAC7B,EACF,CAAC;EACD,aAAc,MAAM,UAChB,MAAM,QAAQ;GAAE,MAAM,IAAI,IAAI,MAAM;GAAM,SAAS,IAAI,IAAI,MAAM;EAAQ,CAAC,IAC1E,MAAM,aACJ,kBAAkB,IAAI,IAAI,MAAM,YAAY,MAAM,UAAU,KAAK,MAAM,MAAM,MAAM,MAAM,cAAc,IACvG,CAAC;CACT;AACF,CAAC;AAED,MAAa,gBAAgB,gBAAgB;CAC3C,MAAM;CACN,OAAO;;AAEL,SAAS,QACX;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,eAAe;EAC3B,aAAa;GACX,MAAM,QAAQ;IACZ,GAAG,IAAI,IAAI,MAAM,gBAAgB;IACjC,MAAM,OAAgB;KAAE,IAAI,WAAW,QAAQ;IAAkB;GACnE;GACA,MAAM,WAAW,MAAM,UAAU;GAEjC,IAAI,MAAM,SAAS;IACjB,MAAM,SAAS,eAAe,UAAU,OAAO,MAAM;IACrD,IAAI,QACF,OAAO;GACX;GACA,OAAO,EAAE,UAAU,OAAO,QAAQ;EACpC;CACF;AACF,CAAC;AAED,MAAa,mBAAmB,gBAAgB;CAC9C,MAAM;CAEN,cAAc;CACd,MAAM,GAAG,EAAE,OAAO,SAAS;EACzB,MAAM,MAAM,eAAe;EAE3B,aAAa,EAAE,UAAU,EAAE,IAAI,IAAI,aAAa,MAAM,GAAG,CACvD,EAAE,OAAO;GACP,GAAGA,WAAc,IAAI,IAAI,MAAM,mBAAmB,GAA8B,KAAK;GACrF,MAAM,OAAgB;IAAE,IAAI,cAAc,QAAQ;GAAkB;EACtE,GAAG,MAAM,UAAU,CAAC,CACtB,CAAC;CACH;AACF,CAAC;AAED,MAAa,gBAAgB,gBAAgB;CAC3C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,eAAe;EAC3B,aAAa,EAAE,OAAO;GACpB,GAAG,IAAI,IAAI,MAAM,gBAAgB;GAGjC,OAAO,IAAI,QAAQ,QAAQ,KAAA,IAAY,EAAE,SAAS,OAAO;GACzD,MAAM,OAAgB;IAAE,IAAI,WAAW,QAAQ;GAAkB;EACnE,GAAG,MAAM,UAAU,CAAC;CACtB;AACF,CAAC;AAED,MAAa,aAAa,gBAAgB;CACxC,MAAM;CACN,OAAO;EACL,OAAO;GAAE,MAAM;GAAQ,UAAU;EAAK;EAEtC,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;CAChD;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,eAAe;EAE3B,MAAM,SAAS,IAAwB,IAAI;EAC3C,YAAY,MAAM,QAAQ,MAAM,SAAS;GACvC,IAAI,SAAS,MACX;GACF,MAAM,MAAM,IAAI;GAChB,IAAI,IAAI,UAAU,MAAM,WACtB;GACF,IAAI,OAAO,SAAS,IAAI,MAAM,iBAAiB,MAAM,OAAO,OAC1D,IAAI,KAAK;IAAE,MAAM;IAAc,OAAO;GAAK,CAAC;EAChD,CAAC;EACD,sBAAsB;GACpB,MAAM,EAAE,YAAY;GAEpB,IAAI,QAAQ,UAAU,MAAM,WAC1B;GAEF,IAAI,OAAO,SAAS,QAAQ,MAAM,iBAAiB,MAAM,OAAO,OAC9D,QAAQ,KAAK,EAAE,MAAM,YAAY,CAAC;EACtC,CAAC;EACD,aAAa,EACX,OACA;GAAE,GAAG,IAAI,IAAI,MAAM,aAAa;IAAE,OAAO,MAAM;IAAO,UAAU,MAAM;GAAS,CAAC;GAA8B,KAAK;EAAO,GAC1H,MAAM,UAAU,CAClB;CACF;AACF,CAAC;;;;;AASD,MAAa,YAAY,gBAAgB;CACvC,MAAM;CACN,OAAO;;EAEL,OAAO;GAAE,MAAM;GAAQ,UAAU;EAAK;EACtC,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC9C,YAAY;GAAE,MAAM;GAA+B,SAAS,KAAA;EAAU;EACtE,WAAW;GAAE,MAAM;GAA+B,SAAS,KAAA;EAAU;EACrE,QAAQ;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EAC3C,MAAM;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC1C,aAAa;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EACjD,gBAAgB;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;;EAEnD,KAAK;GAAE,MAAM;GAA+B,SAAS,KAAA;EAAU;;EAE/D,MAAM;GAAE,MAAM;GAA0B,SAAS,KAAA;EAAU;;EAE3D,MAAM;GAAE,MAAM;GAA0B,SAAS,KAAA;EAAU;EAC3D,iBAAiB;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;CACtD;CACA,OAAO;CAGP,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,SAAS,eAAe;EAC9B,MAAM,QAAQ,aAAa;EAC3B,MAAM,MAAM,QACV;GACE,GAAG;GACH,SAAS;GACT,KAAK,MAAM,OAAO,OAAO,QAAQ,KAAK,KAAK;GAC3C,MAAM,MAAM,QAAQ,OAAO,QAAQ,KAAK,MAAM;GAC9C,MAAM,MAAM,QAAQ,OAAO,QAAQ,KAAK,MAAM;EAChD,GACA,KAAA,IAEA,YAAW,MAAM,aAAa,OAAO,CACvC;EAEA,YAAY,GAAG;EACf,eAAe;GAAE;GAAQ,OAAO,MAAM;GAAO,UAAU,MAAM;EAAS,CAAC;EAEvE,YAAY,OAAO,IAAI,MAAM,OAAO,SAAS;GAC3C,IAAI,CAAC,MACH,IAAI,IAAI,MAAM,QAAQ,KAAK;EAC/B,CAAC;EACD,aAAa,MAAM,UAAU;GAAE,MAAM,IAAI,IAAI,MAAM;GAAM,SAAS,IAAI,IAAI,MAAM;EAAQ,CAAC;CAC3F;AACF,CAAC;AAED,MAAa,mBAAmB,gBAAgB;CAC9C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,kBAAkB;EAC9B,MAAM,MAAM,eAAe;EAC3B,aAAa,EAAE,OAAO;GACpB,GAAGC,aACD,IAAI,OAAO,IAAI,MAAM,aAAa;IAAE,OAAO,IAAI;IAAO,UAAU,IAAI;GAAS,CAAC,GAC9E,IAAI,IAAI,MAAM,uBAAuB;IAAE,OAAO,IAAI;IAAO,UAAU,IAAI;GAAS,CAAC,CACnF;GAEA,MAAM,OAAgB;IACpB,IAAI,WAAW,QAAQ;GACzB;EACF,GAAG,MAAM,UAAU,CAAC;CACtB;AACF,CAAC;AAED,MAAa,cAAc,gBAAgB;CACzC,MAAM;CACN,OAAO,EACL,OAAO;EAAE,MAAM;EAAQ,UAAU;CAAK,EACxC;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,eAAe;EAC3B,MAAM,QAAQ,gBAAgC,EAAE,OAAO,MAAM,MAAM,EAAE;EACrE,iBAAiB,EAAE,MAAM,CAAC;EAC1B,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,cAAc,MAAM,KAAK,GAA8B,MAAM,UAAU,CAAC;CAC9G;AACF,CAAC;AAED,MAAa,mBAAmB,gBAAgB;CAC9C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,eAAe;EAC3B,MAAM,EAAE,UAAU,oBAAoB;EACtC,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,mBAAmB,MAAM,KAAK,GAA8B,MAAM,UAAU,CAAC;CACpH;AACF,CAAC;AAED,MAAa,kBAAkB,gBAAgB;CAC7C,MAAM;CACN,QAAQ;EACN,MAAM,MAAM,eAAe;EAC3B,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,kBAAkB,CAA4B;CACpF;AACF,CAAC;AAED,MAAa,cAAc,gBAAgB;CACzC,MAAM;CACN,QAAQ;EACN,MAAM,MAAM,eAAe;EAC3B,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,cAAc,CAA4B;CAChF;AACF,CAAC;;;;;;AAOD,SAAS,kBACP,YACA,SACA,UACA,gBACS;CACT,OAAO,CACL,EAAE,eAAe,EAAE,SAAS,eAAe,SAAS,WAAW,CAAC,CAAC,GACjE,EAAE,kBAAkB,YAAY,CAC9B,EAAE,eAAe,YAAY,WAAW,SAAS,MAAM,UAAU,CAE/D,GAAI,QAAQ,KAAK,KAAK,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,KAAK,aAAa,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,GACpG,EAAE,YAAY;EAAE,KAAK,KAAK;EAAO,OAAO,KAAK;CAAM,SAAS,WAAW,IAAI,KAAK,KAAK,KAAK,CAC5F,CAAC,CAAC,CACJ,CAAC,CACH;AACF"}
|
|
1
|
+
{"version":3,"file":"menu.js","names":["mergeVueProps","mergeProps"],"sources":["../../../src/components/menu/menu.ts"],"sourcesContent":["import type { MenuApi, MenuGroupProps, MenuNode, MenuNodeMeta, MenuSchema } from '@xihan-ui/headless'\nimport type { Direction, Placement, Size, Tone } from '@xihan-ui/kernel'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { mergeProps } from '@xihan-ui/kernel'\nimport { computed, defineComponent, h, mergeProps as mergeVueProps, onBeforeUnmount, ref, Teleport, watch } from 'vue'\nimport { mergeIntoChild } from '../../runtime/as-child'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { provideMenu, provideMenuChain, provideMenuGroup, provideMenuSub, useMenuChain, useMenuContext, useMenuGroupContext, useMenuSubContext } from './context'\nimport { useMenu } from './use-menu'\n\ntype MenuProps = MenuSchema['props']\n\n/** 默认插槽的载荷:展开态与改展开的动作。 */\nexport type MenuRootSlotProps = Pick<MenuApi, 'open' | 'setOpen'>\n\nexport const XhMenuRoot = defineComponent({\n name: 'XhMenuRoot',\n // 缺省值由 connect 给出,这里一律 default: undefined\n props: {\n collection: { type: Array as PropType<MenuNode[]>, default: undefined },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n placement: { type: String as PropType<Placement>, default: undefined },\n offset: { type: Number, default: undefined },\n loop: { type: Boolean, default: undefined },\n dir: { type: String as PropType<Direction>, default: undefined },\n tone: { type: String as PropType<Tone>, default: undefined },\n size: { type: String as PropType<Size>, default: undefined },\n openOnHover: { type: Boolean, default: undefined },\n hoverOpenDelay: { type: Number, default: undefined },\n hoverCloseDelay: { type: Number, default: undefined },\n /**\n * 只交 collection 时,触发器插槽给的那个节点直接当触发器用,不再外包一颗 <button>。\n * 摆部件的写法有 XhMenuTrigger 自己的 asChild,这个 prop 是给代铺那条路的同一个能力。\n */\n triggerAsChild: Boolean,\n },\n // open-change 携带 { open }、select 携带 { value },update:open 携带裸布尔\n emits: {\n 'open-change': (_details: PayloadOf<MenuProps, 'onOpenChange'>) => true,\n 'select': (_details: PayloadOf<MenuProps, 'onSelect'>) => true,\n 'update:open': (_open: PayloadOf<MenuProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: MenuRootSlotProps) => VNode[]\n trigger?: () => VNode[]\n item?: (node: MenuNodeMeta) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyOpen: MenuProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const notifySelect: MenuProps['onSelect'] = details => emit('select', details)\n const ctx = useMenu(props as MenuProps, notifyOpen, notifySelect)\n provideMenu(ctx)\n // 任意层级子菜单的选中都汇到根:先发根的 select 再关根,各级随父关闭级联收起\n provideMenuChain({\n notifySelect: (details) => {\n emit('select', details)\n ctx.api.value.setOpen(false)\n },\n })\n return () => (slots.default\n ? slots.default({ open: ctx.api.value.open, setOpen: ctx.api.value.setOpen })\n : props.collection\n ? renderDefaultTree(ctx.api.value.collection, slots.trigger?.() ?? null, slots.item, props.triggerAsChild)\n : [])\n },\n})\n\nexport const XhMenuTrigger = defineComponent({\n name: 'XhMenuTrigger',\n props: {\n /** 借用作者的子节点当触发器,不再渲染自己的包裹元素;子节点须恰好一个。 */\n asChild: Boolean,\n },\n setup(props, { slots }) {\n const ctx = useMenuContext()\n return () => {\n const attrs = {\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }\n const children = slots.default?.()\n // asChild:把触发器属性合到作者的节点上,不再自己渲染包裹元素\n if (props.asChild) {\n const merged = mergeIntoChild(children, attrs, 'menu')\n if (merged)\n return merged\n }\n return h('button', attrs, children)\n }\n },\n})\n\nexport const XhMenuPositioner = defineComponent({\n name: 'XhMenuPositioner',\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useMenuContext()\n // 条目列表的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner\n const bars = useScrollbars({ scrollable: () => ctx.contentRef.value })\n // 定位层搬到 portal 落点,逃开祖先的层叠上下文\n return () => h(Teleport, { to: ctx.portalTarget.value }, [\n h('div', {\n ...mergeVueProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, [...(slots.default?.() ?? []), ...bars.render()]),\n ])\n },\n})\n\nexport const XhMenuContent = defineComponent({\n name: 'XhMenuContent',\n setup(_, { slots }) {\n const ctx = useMenuContext()\n return () => h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhMenuItem = defineComponent({\n name: 'XhMenuItem',\n props: {\n value: { type: String, required: true },\n // 缺省交给 connect 回 collection 里查,写死 false 会盖掉数据里的禁用\n disabled: { type: Boolean, default: undefined },\n },\n setup(props, { slots }) {\n const ctx = useMenuContext()\n // 本条目持有焦点时,value 变更按新值重报焦点条目,卸载时上报焦点丢失\n const itemEl = ref<HTMLElement | null>(null)\n watch(() => props.value, (next, prev) => {\n if (next === prev)\n return\n const svc = ctx.service\n if (svc.getStatus() !== 'Started')\n return\n if (itemEl.value && svc.scope.getActiveElement() === itemEl.value)\n svc.send({ type: 'ITEM.FOCUS', value: next })\n })\n onBeforeUnmount(() => {\n const { service } = ctx\n // 根已停机时不再送事件\n if (service.getStatus() !== 'Started')\n return\n // 按「本节点当下正持有焦点」判定,不按 value 比对\n if (itemEl.value && service.scope.getActiveElement() === itemEl.value)\n service.send({ type: 'ITEM.LOST' })\n })\n return () => h(\n 'div',\n { ...ctx.api.value.getItemProps({ value: props.value, disabled: props.disabled }) as Record<string, unknown>, ref: itemEl },\n slots.default?.(),\n )\n },\n})\n\n/** 默认插槽的载荷:本层子菜单的展开态与改展开的动作。 */\nexport type MenuSubSlotProps = Pick<MenuApi, 'open' | 'setOpen'>\n\n/**\n * 子菜单:内部再跑一台 menu 机器(submenu 模式),触发条目由 XhMenuSubTrigger\n * 渲染成「父菜单条目 + 本子菜单触发器」的双重身份。本身不渲染节点。\n */\nexport const XhMenuSub = defineComponent({\n name: 'XhMenuSub',\n props: {\n /** 它在父菜单里的条目身份。 */\n value: { type: String, required: true },\n disabled: { type: Boolean, default: undefined },\n collection: { type: Array as PropType<MenuNode[]>, default: undefined },\n placement: { type: String as PropType<Placement>, default: undefined },\n offset: { type: Number, default: undefined },\n loop: { type: Boolean, default: undefined },\n openOnHover: { type: Boolean, default: undefined },\n hoverOpenDelay: { type: Number, default: undefined },\n /** 文字方向;缺省继承父层。子层被搬到浮层落点,继承不到父层的方向。 */\n dir: { type: String as PropType<Direction>, default: undefined },\n /** 语气;缺省继承父层。子层是浮层落点下的同级节点,CSS 私有槽继承不到。 */\n tone: { type: String as PropType<Tone>, default: undefined },\n /** 尺寸;缺省继承父层,理由同 tone。 */\n size: { type: String as PropType<Size>, default: undefined },\n hoverCloseDelay: { type: Number, default: undefined },\n },\n slots: Object as SlotsType<{\n default?: (props: MenuSubSlotProps) => VNode[]\n }>,\n setup(props, { slots }) {\n const parent = useMenuContext()\n const chain = useMenuChain()\n const ctx = useMenu(\n {\n ...props,\n submenu: true,\n dir: props.dir ?? parent.service.prop('dir'),\n tone: props.tone ?? parent.service.prop('tone'),\n size: props.size ?? parent.service.prop('size'),\n } as MenuProps,\n undefined,\n // 子层的选中汇到根:根发 select 并关根,各级随父关闭级联收起\n details => chain.notifySelect(details),\n )\n // 覆盖菜单上下文:本子树内的部件都归子机器\n provideMenu(ctx)\n provideMenuSub({ parent, value: props.value, disabled: props.disabled })\n // 父层收起(Escape、外点、选中)时本层跟着收,层层传导\n watch(() => parent.api.value.open, (open) => {\n if (!open)\n ctx.api.value.setOpen(false)\n })\n return () => slots.default?.({ open: ctx.api.value.open, setOpen: ctx.api.value.setOpen })\n },\n})\n\nexport const XhMenuSubTrigger = defineComponent({\n name: 'XhMenuSubTrigger',\n setup(_, { slots }) {\n const sub = useMenuSubContext()\n const ctx = useMenuContext()\n return () => h('div', {\n ...mergeProps(\n sub.parent.api.value.getItemProps({ value: sub.value, disabled: sub.disabled }) as Record<string, unknown>,\n ctx.api.value.getSubmenuTriggerProps({ value: sub.value, disabled: sub.disabled }) as Record<string, unknown>,\n ),\n // 子菜单的定位锚点就是这一条\n ref: (el: unknown) => {\n ctx.triggerRef.value = el as HTMLElement\n },\n }, slots.default?.())\n },\n})\n\nexport const XhMenuGroup = defineComponent({\n name: 'XhMenuGroup',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useMenuContext()\n const group = computed<MenuGroupProps>(() => ({ value: props.value }))\n provideMenuGroup({ group })\n return () => h('div', ctx.api.value.getGroupProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhMenuGroupLabel = defineComponent({\n name: 'XhMenuGroupLabel',\n setup(_, { slots }) {\n const ctx = useMenuContext()\n const { group } = useMenuGroupContext()\n return () => h('span', ctx.api.value.getGroupLabelProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhMenuSeparator = defineComponent({\n name: 'XhMenuSeparator',\n setup() {\n const ctx = useMenuContext()\n return () => h('div', ctx.api.value.getSeparatorProps() as Record<string, unknown>)\n },\n})\n\nexport const XhMenuArrow = defineComponent({\n name: 'XhMenuArrow',\n setup() {\n const ctx = useMenuContext()\n return () => h('div', ctx.api.value.getArrowProps() as Record<string, unknown>)\n },\n})\n\n/**\n * 没写默认插槽时按 collection 铺开的整套结构,作者只交数据。\n * 与手写部件产出的 DOM 完全一致,要改结构就写默认插槽,行为不变。\n * 触发器内容归作者,由 trigger 插槽承载;条目内容缺省是 label,可由 item 插槽接管。\n */\nfunction renderDefaultTree(\n collection: readonly MenuNodeMeta[],\n trigger: (VNode | string)[] | null,\n itemSlot?: (node: MenuNodeMeta) => VNode[],\n triggerAsChild?: boolean,\n): VNode[] {\n return [\n h(XhMenuTrigger, { asChild: triggerAsChild }, () => trigger ?? []),\n h(XhMenuPositioner, null, () => [\n h(XhMenuContent, null, () => collection.flatMap((node, index) => [\n // 首条上的标记不产出分隔线:菜单开头不留一道空隔\n ...(index > 0 && node.separatorBefore ? [h(XhMenuSeparator, { key: `separator:${node.value}` })] : []),\n h(XhMenuItem, { key: node.value, value: node.value }, () => itemSlot?.(node) ?? node.label),\n ])),\n ]),\n ]\n}\n"],"mappings":"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"}
|
|
@@ -29,7 +29,7 @@ function useMenu(props, onOpenChange, onSelect) {
|
|
|
29
29
|
const registerLayer = () => config.layerRegistry.register({
|
|
30
30
|
kind: "popover",
|
|
31
31
|
node: () => contentRef.value,
|
|
32
|
-
branches: () => [triggerRef.value].filter(Boolean),
|
|
32
|
+
branches: () => [triggerRef.value, positionerRef.value].filter(Boolean),
|
|
33
33
|
isModal: () => false,
|
|
34
34
|
setModal: () => {},
|
|
35
35
|
surfaces: () => []
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-menu.js","names":[],"sources":["../../../src/components/menu/use-menu.ts"],"sourcesContent":["import type { MenuApi, MenuSchema } from '@xihan-ui/headless'\nimport type { Cleanup, Layer, RuntimeConfig } from '@xihan-ui/kernel'\nimport type { Service } from '@xihan-ui/machine'\nimport type { ComputedRef, Ref } from 'vue'\nimport { connectMenu, menuMachine } from '@xihan-ui/headless'\nimport { createRuntimeConfig, createScope } from '@xihan-ui/kernel'\nimport { createPositionEngine } from '@xihan-ui/position'\nimport { computed, ref } from 'vue'\nimport { useXhConfig } from '../../config/config'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { useOverlayExit } from '../../runtime/use-overlay-exit'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\nexport interface MenuContext {\n service: Service<MenuSchema>\n api: ComputedRef<MenuApi>\n triggerRef: Ref<HTMLElement | null>\n positionerRef: Ref<HTMLElement | null>\n contentRef: Ref<HTMLElement | null>\n /** 此刻该不该渲染:退场动画播完之前仍为真。 */\n visible: Ref<boolean>\n /** 浮层搬到哪儿:全局配置的容器 > 运行时的浮层落点 > body。 */\n portalTarget: ComputedRef<string | Element>\n}\n\nexport function useMenu(\n props: MenuSchema['props'],\n onOpenChange?: MenuSchema['props']['onOpenChange'],\n onSelect?: MenuSchema['props']['onSelect'],\n): MenuContext {\n const xhConfig = useXhConfig()\n const triggerRef = ref<HTMLElement | null>(null)\n const positionerRef = ref<HTMLElement | null>(null)\n const contentRef = ref<HTMLElement | null>(null)\n\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n const service = useMachine(menuMachine, () => ({ ...props, onOpenChange, onSelect }), scope)\n\n // 服务端没有 DOM、也就没有退场:config 传 null 时闸门退化成「跟着展开态」\n let config: RuntimeConfig | null = null\n\n if (typeof document !== 'undefined') {\n config = createRuntimeConfig({ scope, idGenerator: idGen })\n\n // 只提供注册函数,入栈出栈由机器的 trackLayer 效应按展开态驱动\n const registerLayer = (): { layer: Layer, dispose: Cleanup } => config!.layerRegistry.register({\n kind: 'popover',\n node: () => contentRef.value,\n // trigger
|
|
1
|
+
{"version":3,"file":"use-menu.js","names":[],"sources":["../../../src/components/menu/use-menu.ts"],"sourcesContent":["import type { MenuApi, MenuSchema } from '@xihan-ui/headless'\nimport type { Cleanup, Layer, RuntimeConfig } from '@xihan-ui/kernel'\nimport type { Service } from '@xihan-ui/machine'\nimport type { ComputedRef, Ref } from 'vue'\nimport { connectMenu, menuMachine } from '@xihan-ui/headless'\nimport { createRuntimeConfig, createScope } from '@xihan-ui/kernel'\nimport { createPositionEngine } from '@xihan-ui/position'\nimport { computed, ref } from 'vue'\nimport { useXhConfig } from '../../config/config'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { useOverlayExit } from '../../runtime/use-overlay-exit'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\nexport interface MenuContext {\n service: Service<MenuSchema>\n api: ComputedRef<MenuApi>\n triggerRef: Ref<HTMLElement | null>\n positionerRef: Ref<HTMLElement | null>\n contentRef: Ref<HTMLElement | null>\n /** 此刻该不该渲染:退场动画播完之前仍为真。 */\n visible: Ref<boolean>\n /** 浮层搬到哪儿:全局配置的容器 > 运行时的浮层落点 > body。 */\n portalTarget: ComputedRef<string | Element>\n}\n\nexport function useMenu(\n props: MenuSchema['props'],\n onOpenChange?: MenuSchema['props']['onOpenChange'],\n onSelect?: MenuSchema['props']['onSelect'],\n): MenuContext {\n const xhConfig = useXhConfig()\n const triggerRef = ref<HTMLElement | null>(null)\n const positionerRef = ref<HTMLElement | null>(null)\n const contentRef = ref<HTMLElement | null>(null)\n\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n const service = useMachine(menuMachine, () => ({ ...props, onOpenChange, onSelect }), scope)\n\n // 服务端没有 DOM、也就没有退场:config 传 null 时闸门退化成「跟着展开态」\n let config: RuntimeConfig | null = null\n\n if (typeof document !== 'undefined') {\n config = createRuntimeConfig({ scope, idGenerator: idGen })\n\n // 只提供注册函数,入栈出栈由机器的 trackLayer 效应按展开态驱动\n const registerLayer = (): { layer: Layer, dispose: Cleanup } => config!.layerRegistry.register({\n kind: 'popover',\n node: () => contentRef.value,\n // trigger 记为本层分支,点它算层内交互;\n // 浮层壳一并记上:条目列表之外还浮着自绘滚动条,按住它拖动不该把菜单消解掉\n branches: () => [triggerRef.value, positionerRef.value].filter(Boolean) as Element[],\n isModal: () => false,\n setModal: () => {},\n surfaces: () => [],\n })\n\n // 定位引擎由适配器注入,机器只经端口驱动\n service.refs.set('config', config!)\n service.refs.set('registerLayer', registerLayer)\n service.refs.set('position', createPositionEngine())\n service.refs.set('getAnchorEl', () => triggerRef.value)\n service.refs.set('getFloatingEl', () => positionerRef.value)\n service.refs.set('getContentEl', () => contentRef.value)\n }\n\n const api = computed(() => connectMenu(service, vueNormalize))\n // 退场闸门:收起从跟着 open 走,改成跟着 presence 走\n const visible = useOverlayExit({ config, isOpen: () => api.value.open, contentRef })\n // 全局配置写了容器就用它,否则落到运行时那个单一浮层落点;没有 DOM 时才回到 body\n const portalTarget = computed<string | Element>(() => xhConfig.value.portalContainer?.() ?? config?.portalContainer() ?? 'body')\n\n return { visible, service, api, triggerRef, positionerRef, contentRef, portalTarget }\n}\n"],"mappings":";;;;;;;;;;AA0BA,SAAgB,QACd,OACA,cACA,UACa;CACb,MAAM,WAAW,YAAY;CAC7B,MAAM,aAAa,IAAwB,IAAI;CAC/C,MAAM,gBAAgB,IAAwB,IAAI;CAClD,MAAM,aAAa,IAAwB,IAAI;CAE/C,MAAM,QAAQ,qBAAqB;CACnC,MAAM,QAAQ,YAAY,MAAM,KAAK;CACrC,MAAM,UAAU,WAAW,oBAAoB;EAAE,GAAG;EAAO;EAAc;CAAS,IAAI,KAAK;CAG3F,IAAI,SAA+B;CAEnC,IAAI,OAAO,aAAa,aAAa;EACnC,SAAS,oBAAoB;GAAE;GAAO,aAAa;EAAM,CAAC;EAG1D,MAAM,sBAA0D,OAAQ,cAAc,SAAS;GAC7F,MAAM;GACN,YAAY,WAAW;GAGvB,gBAAgB,CAAC,WAAW,OAAO,cAAc,KAAK,CAAC,CAAC,OAAO,OAAO;GACtE,eAAe;GACf,gBAAgB,CAAC;GACjB,gBAAgB,CAAC;EACnB,CAAC;EAGD,QAAQ,KAAK,IAAI,UAAU,MAAO;EAClC,QAAQ,KAAK,IAAI,iBAAiB,aAAa;EAC/C,QAAQ,KAAK,IAAI,YAAY,qBAAqB,CAAC;EACnD,QAAQ,KAAK,IAAI,qBAAqB,WAAW,KAAK;EACtD,QAAQ,KAAK,IAAI,uBAAuB,cAAc,KAAK;EAC3D,QAAQ,KAAK,IAAI,sBAAsB,WAAW,KAAK;CACzD;CAEA,MAAM,MAAM,eAAe,YAAY,SAAS,YAAY,CAAC;CAM7D,OAAO;EAAE,SAJO,eAAe;GAAE;GAAQ,cAAc,IAAI,MAAM;GAAM;EAAW,CAInE;EAAG;EAAS;EAAK;EAAY;EAAe;EAAY,cAFlD,eAAiC,SAAS,MAAM,kBAAkB,KAAK,QAAQ,gBAAgB,KAAK,MAEvC;CAAE;AACtF"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { inject, provide } from "vue";
|
|
2
2
|
//#region src/components/menubar/context.ts
|
|
3
|
-
const KEY = Symbol("xh-menubar");
|
|
4
|
-
const MENU_KEY = Symbol("xh-menubar-menu");
|
|
5
|
-
const ITEM_KEY = Symbol("xh-menubar-item");
|
|
6
|
-
const GROUP_KEY = Symbol("xh-menubar-group");
|
|
3
|
+
const KEY = Symbol.for("xh-menubar");
|
|
4
|
+
const MENU_KEY = Symbol.for("xh-menubar-menu");
|
|
5
|
+
const ITEM_KEY = Symbol.for("xh-menubar-item");
|
|
6
|
+
const GROUP_KEY = Symbol.for("xh-menubar-group");
|
|
7
7
|
function provideMenubar(ctx) {
|
|
8
8
|
provide(KEY, ctx);
|
|
9
9
|
}
|
|
@@ -35,7 +35,7 @@ function useMenubarGroupContext() {
|
|
|
35
35
|
if (!ctx) throw new Error("[xh] Menubar 分组标题必须用在 XhMenubarGroup 内");
|
|
36
36
|
return ctx;
|
|
37
37
|
}
|
|
38
|
-
const CHAIN_KEY = Symbol("xh-menubar-chain");
|
|
38
|
+
const CHAIN_KEY = Symbol.for("xh-menubar-chain");
|
|
39
39
|
function provideMenubarChain(chain) {
|
|
40
40
|
provide(CHAIN_KEY, chain);
|
|
41
41
|
}
|
|
@@ -44,7 +44,7 @@ function useMenubarChain() {
|
|
|
44
44
|
if (!chain) throw new Error("[xh] MenubarSub 必须用在 XhMenubarRoot 内");
|
|
45
45
|
return chain;
|
|
46
46
|
}
|
|
47
|
-
const SUB_KEY = Symbol("xh-menubar-sub");
|
|
47
|
+
const SUB_KEY = Symbol.for("xh-menubar-sub");
|
|
48
48
|
function provideMenubarSub(handle) {
|
|
49
49
|
provide(SUB_KEY, handle);
|
|
50
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/menubar/context.ts"],"sourcesContent":["import type { MenubarContentProps, MenubarGroupProps, MenubarItemProps, MenubarSelectDetails } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport type { MenubarContext } from './use-menubar'\nimport { inject, provide } from 'vue'\n\n/** 某一项菜单自报的身份,供它的 positioner / content 取到同一个值(两者与 trigger 靠它互相认领)。 */\nexport interface MenubarMenuContext {\n menu: ComputedRef<MenubarContentProps>\n}\n\n/** 条目自报的值与禁用,供 item-text / item-indicator 这类子部件复用同一份声明。 */\nexport interface MenubarItemContext {\n item: ComputedRef<MenubarItemProps>\n}\n\n/** 分组自报的身份,供分组标题取到同一个值(标题的 id 由它派生)。 */\nexport interface MenubarGroupContext {\n group: ComputedRef<MenubarGroupProps>\n}\n\nconst KEY: InjectionKey<MenubarContext> = Symbol('xh-menubar')\nconst MENU_KEY: InjectionKey<MenubarMenuContext> = Symbol('xh-menubar-menu')\nconst ITEM_KEY: InjectionKey<MenubarItemContext> = Symbol('xh-menubar-item')\nconst GROUP_KEY: InjectionKey<MenubarGroupContext> = Symbol('xh-menubar-group')\n\nexport function provideMenubar(ctx: MenubarContext): void {\n provide(KEY, ctx)\n}\n\nexport function useMenubarContext(): MenubarContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Menubar 部件必须用在 XhMenubarRoot 内')\n return ctx\n}\n\nexport function provideMenubarMenu(ctx: MenubarMenuContext): void {\n provide(MENU_KEY, ctx)\n}\n\n/** 取所属那一项的身份,不在 positioner 内时返回 null(此时 content 须自带 value)。 */\nexport function useMenubarMenuContext(): MenubarMenuContext | null {\n return inject(MENU_KEY, null)\n}\n\nexport function provideMenubarItem(ctx: MenubarItemContext): void {\n provide(ITEM_KEY, ctx)\n}\n\nexport function useMenubarItemContext(): MenubarItemContext {\n const ctx = inject(ITEM_KEY, null)\n if (!ctx)\n throw new Error('[xh] Menubar 条目子部件必须用在 XhMenubarItem 内')\n return ctx\n}\n\nexport function provideMenubarGroup(ctx: MenubarGroupContext): void {\n provide(GROUP_KEY, ctx)\n}\n\nexport function useMenubarGroupContext(): MenubarGroupContext {\n const ctx = inject(GROUP_KEY, null)\n if (!ctx)\n throw new Error('[xh] Menubar 分组标题必须用在 XhMenubarGroup 内')\n return ctx\n}\n\n/** 选中链:子菜单任意层级的选中都汇到根——先发根的 select,再关根,各级随父关闭级联收起。 */\nexport interface MenubarChain {\n notifySelect: (details: MenubarSelectDetails) => void\n}\n\nconst CHAIN_KEY: InjectionKey<MenubarChain> = Symbol('xh-menubar-chain')\n\nexport function provideMenubarChain(chain: MenubarChain): void {\n provide(CHAIN_KEY, chain)\n}\n\nexport function useMenubarChain(): MenubarChain {\n const chain = inject(CHAIN_KEY, null)\n if (!chain)\n throw new Error('[xh] MenubarSub 必须用在 XhMenubarRoot 内')\n return chain\n}\n\n/** 子菜单触发条目要同时够到父菜单栏与本子菜单,这里存父层句柄与它在父层里的身份。 */\nexport interface MenubarSubHandle {\n parent: MenubarContext\n value: string\n disabled?: boolean\n}\n\nconst SUB_KEY: InjectionKey<MenubarSubHandle> = Symbol('xh-menubar-sub')\n\nexport function provideMenubarSub(handle: MenubarSubHandle): void {\n provide(SUB_KEY, handle)\n}\n\nexport function useMenubarSubContext(): MenubarSubHandle {\n const handle = inject(SUB_KEY, null)\n if (!handle)\n throw new Error('[xh] MenubarSubTrigger 必须用在 XhMenubarSub 内')\n return handle\n}\n"],"mappings":";;AAoBA,MAAM,MAAoC,OAAO,YAAY;
|
|
1
|
+
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/menubar/context.ts"],"sourcesContent":["import type { MenubarContentProps, MenubarGroupProps, MenubarItemProps, MenubarSelectDetails } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport type { MenubarContext } from './use-menubar'\nimport { inject, provide } from 'vue'\n\n/** 某一项菜单自报的身份,供它的 positioner / content 取到同一个值(两者与 trigger 靠它互相认领)。 */\nexport interface MenubarMenuContext {\n menu: ComputedRef<MenubarContentProps>\n}\n\n/** 条目自报的值与禁用,供 item-text / item-indicator 这类子部件复用同一份声明。 */\nexport interface MenubarItemContext {\n item: ComputedRef<MenubarItemProps>\n}\n\n/** 分组自报的身份,供分组标题取到同一个值(标题的 id 由它派生)。 */\nexport interface MenubarGroupContext {\n group: ComputedRef<MenubarGroupProps>\n}\n\nconst KEY: InjectionKey<MenubarContext> = Symbol.for('xh-menubar')\nconst MENU_KEY: InjectionKey<MenubarMenuContext> = Symbol.for('xh-menubar-menu')\nconst ITEM_KEY: InjectionKey<MenubarItemContext> = Symbol.for('xh-menubar-item')\nconst GROUP_KEY: InjectionKey<MenubarGroupContext> = Symbol.for('xh-menubar-group')\n\nexport function provideMenubar(ctx: MenubarContext): void {\n provide(KEY, ctx)\n}\n\nexport function useMenubarContext(): MenubarContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Menubar 部件必须用在 XhMenubarRoot 内')\n return ctx\n}\n\nexport function provideMenubarMenu(ctx: MenubarMenuContext): void {\n provide(MENU_KEY, ctx)\n}\n\n/** 取所属那一项的身份,不在 positioner 内时返回 null(此时 content 须自带 value)。 */\nexport function useMenubarMenuContext(): MenubarMenuContext | null {\n return inject(MENU_KEY, null)\n}\n\nexport function provideMenubarItem(ctx: MenubarItemContext): void {\n provide(ITEM_KEY, ctx)\n}\n\nexport function useMenubarItemContext(): MenubarItemContext {\n const ctx = inject(ITEM_KEY, null)\n if (!ctx)\n throw new Error('[xh] Menubar 条目子部件必须用在 XhMenubarItem 内')\n return ctx\n}\n\nexport function provideMenubarGroup(ctx: MenubarGroupContext): void {\n provide(GROUP_KEY, ctx)\n}\n\nexport function useMenubarGroupContext(): MenubarGroupContext {\n const ctx = inject(GROUP_KEY, null)\n if (!ctx)\n throw new Error('[xh] Menubar 分组标题必须用在 XhMenubarGroup 内')\n return ctx\n}\n\n/** 选中链:子菜单任意层级的选中都汇到根——先发根的 select,再关根,各级随父关闭级联收起。 */\nexport interface MenubarChain {\n notifySelect: (details: MenubarSelectDetails) => void\n}\n\nconst CHAIN_KEY: InjectionKey<MenubarChain> = Symbol.for('xh-menubar-chain')\n\nexport function provideMenubarChain(chain: MenubarChain): void {\n provide(CHAIN_KEY, chain)\n}\n\nexport function useMenubarChain(): MenubarChain {\n const chain = inject(CHAIN_KEY, null)\n if (!chain)\n throw new Error('[xh] MenubarSub 必须用在 XhMenubarRoot 内')\n return chain\n}\n\n/** 子菜单触发条目要同时够到父菜单栏与本子菜单,这里存父层句柄与它在父层里的身份。 */\nexport interface MenubarSubHandle {\n parent: MenubarContext\n value: string\n disabled?: boolean\n}\n\nconst SUB_KEY: InjectionKey<MenubarSubHandle> = Symbol.for('xh-menubar-sub')\n\nexport function provideMenubarSub(handle: MenubarSubHandle): void {\n provide(SUB_KEY, handle)\n}\n\nexport function useMenubarSubContext(): MenubarSubHandle {\n const handle = inject(SUB_KEY, null)\n if (!handle)\n throw new Error('[xh] MenubarSubTrigger 必须用在 XhMenubarSub 内')\n return handle\n}\n"],"mappings":";;AAoBA,MAAM,MAAoC,OAAO,IAAI,YAAY;AACjE,MAAM,WAA6C,OAAO,IAAI,iBAAiB;AAC/E,MAAM,WAA6C,OAAO,IAAI,iBAAiB;AAC/E,MAAM,YAA+C,OAAO,IAAI,kBAAkB;AAElF,SAAgB,eAAe,KAA2B;CACxD,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,oBAAoC;CAClD,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,qCAAqC;CACvD,OAAO;AACT;AAEA,SAAgB,mBAAmB,KAA+B;CAChE,QAAQ,UAAU,GAAG;AACvB;;AAGA,SAAgB,wBAAmD;CACjE,OAAO,OAAO,UAAU,IAAI;AAC9B;AAEA,SAAgB,mBAAmB,KAA+B;CAChE,QAAQ,UAAU,GAAG;AACvB;AAEA,SAAgB,wBAA4C;CAC1D,MAAM,MAAM,OAAO,UAAU,IAAI;CACjC,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,wCAAwC;CAC1D,OAAO;AACT;AAEA,SAAgB,oBAAoB,KAAgC;CAClE,QAAQ,WAAW,GAAG;AACxB;AAEA,SAAgB,yBAA8C;CAC5D,MAAM,MAAM,OAAO,WAAW,IAAI;CAClC,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,wCAAwC;CAC1D,OAAO;AACT;AAOA,MAAM,YAAwC,OAAO,IAAI,kBAAkB;AAE3E,SAAgB,oBAAoB,OAA2B;CAC7D,QAAQ,WAAW,KAAK;AAC1B;AAEA,SAAgB,kBAAgC;CAC9C,MAAM,QAAQ,OAAO,WAAW,IAAI;CACpC,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,sCAAsC;CACxD,OAAO;AACT;AASA,MAAM,UAA0C,OAAO,IAAI,gBAAgB;AAE3E,SAAgB,kBAAkB,QAAgC;CAChE,QAAQ,SAAS,MAAM;AACzB;AAEA,SAAgB,uBAAyC;CACvD,MAAM,SAAS,OAAO,SAAS,IAAI;CACnC,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,4CAA4C;CAC9D,OAAO;AACT"}
|
|
@@ -116,13 +116,13 @@ declare const XhMenubarRoot: import("vue").DefineComponent<import("vue").Extract
|
|
|
116
116
|
"onValue-change"?: ((_details: import("@xihan-ui/headless").MenubarValueChangeDetails) => any) | undefined;
|
|
117
117
|
"onUpdate:value"?: ((_value: string | null) => any) | undefined;
|
|
118
118
|
}>, {
|
|
119
|
-
size: Size;
|
|
120
119
|
value: string | null;
|
|
121
120
|
collection: MenubarNode[];
|
|
122
121
|
defaultValue: string | null;
|
|
123
122
|
orientation: Orientation;
|
|
124
123
|
dir: Direction;
|
|
125
124
|
tone: Tone;
|
|
125
|
+
size: Size;
|
|
126
126
|
disabled: boolean;
|
|
127
127
|
offset: number;
|
|
128
128
|
loop: boolean;
|
|
@@ -342,9 +342,9 @@ declare const XhMenubarSub: import("vue").DefineComponent<import("vue").ExtractP
|
|
|
342
342
|
default: undefined;
|
|
343
343
|
};
|
|
344
344
|
}>> & Readonly<{}>, {
|
|
345
|
-
size: Size;
|
|
346
345
|
dir: Direction;
|
|
347
346
|
tone: Tone;
|
|
347
|
+
size: Size;
|
|
348
348
|
disabled: boolean;
|
|
349
349
|
offset: number;
|
|
350
350
|
loop: boolean;
|