@xihan-ui/vue 2.1.0 → 3.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 +1335 -0
- package/README.md +1 -1
- package/dist/components/accordion/accordion.d.ts +6 -0
- package/dist/components/accordion/accordion.d.ts.map +1 -1
- package/dist/components/accordion/accordion.js +4 -2
- package/dist/components/accordion/accordion.js.map +1 -1
- package/dist/components/alert/alert.d.ts +9 -0
- package/dist/components/alert/alert.d.ts.map +1 -1
- package/dist/components/alert/alert.js +4 -0
- package/dist/components/alert/alert.js.map +1 -1
- package/dist/components/anchor/anchor.d.ts +2 -2
- package/dist/components/anchor/anchor.d.ts.map +1 -1
- package/dist/components/anchor/anchor.js +2 -2
- package/dist/components/anchor/anchor.js.map +1 -1
- package/dist/components/anchor/use-anchor.d.ts +2 -2
- package/dist/components/anchor/use-anchor.js +3 -3
- package/dist/components/anchor/use-anchor.js.map +1 -1
- package/dist/components/approval/approval.d.ts +8 -1
- package/dist/components/approval/approval.d.ts.map +1 -1
- package/dist/components/approval/approval.js +10 -1
- package/dist/components/approval/approval.js.map +1 -1
- package/dist/components/avatar/avatar.d.ts +8 -0
- package/dist/components/avatar/avatar.d.ts.map +1 -1
- package/dist/components/avatar/avatar.js +3 -1
- package/dist/components/avatar/avatar.js.map +1 -1
- package/dist/components/avatar/use-avatar.d.ts.map +1 -1
- package/dist/components/avatar/use-avatar.js +3 -1
- package/dist/components/avatar/use-avatar.js.map +1 -1
- package/dist/components/back-top/use-back-top.d.ts.map +1 -1
- package/dist/components/back-top/use-back-top.js +3 -1
- package/dist/components/back-top/use-back-top.js.map +1 -1
- package/dist/components/badge/badge.d.ts +22 -0
- package/dist/components/badge/badge.d.ts.map +1 -1
- package/dist/components/badge/badge.js +11 -2
- package/dist/components/badge/badge.js.map +1 -1
- package/dist/components/breadcrumb/breadcrumb.d.ts +11 -1
- package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -1
- package/dist/components/breadcrumb/breadcrumb.js +28 -9
- package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
- package/dist/components/calendar-picker/calendar-picker.d.ts +16 -0
- package/dist/components/calendar-picker/calendar-picker.d.ts.map +1 -1
- package/dist/components/calendar-picker/calendar-picker.js +4 -0
- package/dist/components/calendar-picker/calendar-picker.js.map +1 -1
- package/dist/components/calendar-range-picker/calendar-range-picker.d.ts +16 -0
- package/dist/components/calendar-range-picker/calendar-range-picker.d.ts.map +1 -1
- package/dist/components/calendar-range-picker/calendar-range-picker.js +4 -0
- package/dist/components/calendar-range-picker/calendar-range-picker.js.map +1 -1
- package/dist/components/card/card.d.ts +37 -2
- package/dist/components/card/card.d.ts.map +1 -1
- package/dist/components/card/card.js +40 -2
- package/dist/components/card/card.js.map +1 -1
- package/dist/components/carousel/carousel.d.ts +7 -1
- package/dist/components/carousel/carousel.d.ts.map +1 -1
- package/dist/components/carousel/carousel.js +1 -0
- package/dist/components/carousel/carousel.js.map +1 -1
- package/dist/components/carousel/use-carousel.d.ts.map +1 -1
- package/dist/components/carousel/use-carousel.js +3 -1
- package/dist/components/carousel/use-carousel.js.map +1 -1
- package/dist/components/cartesian-chart/cartesian-chart.d.ts +262 -0
- package/dist/components/cartesian-chart/cartesian-chart.d.ts.map +1 -0
- package/dist/components/cartesian-chart/cartesian-chart.js +293 -0
- package/dist/components/cartesian-chart/cartesian-chart.js.map +1 -0
- package/dist/components/cartesian-chart/context.js +15 -0
- package/dist/components/cartesian-chart/context.js.map +1 -0
- package/dist/components/cartesian-chart/use-cartesian-chart.d.ts +21 -0
- package/dist/components/cartesian-chart/use-cartesian-chart.d.ts.map +1 -0
- package/dist/components/cartesian-chart/use-cartesian-chart.js +29 -0
- package/dist/components/cartesian-chart/use-cartesian-chart.js.map +1 -0
- package/dist/components/cascader/cascader.d.ts +64 -3
- package/dist/components/cascader/cascader.d.ts.map +1 -1
- package/dist/components/cascader/cascader.js +107 -7
- package/dist/components/cascader/cascader.js.map +1 -1
- package/dist/components/cascader/context.js +10 -1
- package/dist/components/cascader/context.js.map +1 -1
- package/dist/components/cascader/use-cascader.d.ts +2 -1
- package/dist/components/cascader/use-cascader.d.ts.map +1 -1
- package/dist/components/cascader/use-cascader.js +4 -1
- package/dist/components/cascader/use-cascader.js.map +1 -1
- package/dist/components/checkbox/checkbox.js +1 -1
- package/dist/components/checkbox-group/checkbox-group.d.ts +24 -3
- package/dist/components/checkbox-group/checkbox-group.d.ts.map +1 -1
- package/dist/components/checkbox-group/checkbox-group.js +20 -3
- package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
- package/dist/components/citation/citation.d.ts +211 -0
- package/dist/components/citation/citation.d.ts.map +1 -0
- package/dist/components/citation/citation.js +222 -0
- package/dist/components/citation/citation.js.map +1 -0
- package/dist/components/citation/context.d.ts +11 -0
- package/dist/components/citation/context.d.ts.map +1 -0
- package/dist/components/citation/context.js +24 -0
- package/dist/components/citation/context.js.map +1 -0
- package/dist/components/citation/use-citation.d.ts +19 -0
- package/dist/components/citation/use-citation.d.ts.map +1 -0
- package/dist/components/citation/use-citation.js +51 -0
- package/dist/components/citation/use-citation.js.map +1 -0
- package/dist/components/code-view/code-view.d.ts +21 -0
- package/dist/components/code-view/code-view.d.ts.map +1 -1
- package/dist/components/code-view/code-view.js +23 -4
- package/dist/components/code-view/code-view.js.map +1 -1
- package/dist/components/collapsible/collapsible.d.ts +6 -0
- package/dist/components/collapsible/collapsible.d.ts.map +1 -1
- package/dist/components/collapsible/collapsible.js +4 -2
- package/dist/components/collapsible/collapsible.js.map +1 -1
- package/dist/components/color-field/color-field.d.ts +2 -2
- package/dist/components/color-field/color-field.js +1 -1
- package/dist/components/color-field/color-field.js.map +1 -1
- package/dist/components/color-picker/color-picker.d.ts +41 -3
- package/dist/components/color-picker/color-picker.d.ts.map +1 -1
- package/dist/components/color-picker/color-picker.js +33 -4
- package/dist/components/color-picker/color-picker.js.map +1 -1
- package/dist/components/color-picker/use-color-picker.d.ts +3 -1
- package/dist/components/color-picker/use-color-picker.d.ts.map +1 -1
- package/dist/components/color-picker/use-color-picker.js +8 -2
- package/dist/components/color-picker/use-color-picker.js.map +1 -1
- package/dist/components/color-slider/color-slider.d.ts +2 -2
- package/dist/components/color-slider/color-slider.js +1 -1
- package/dist/components/color-slider/color-slider.js.map +1 -1
- package/dist/components/combobox/combobox.d.ts +49 -4
- package/dist/components/combobox/combobox.d.ts.map +1 -1
- package/dist/components/combobox/combobox.js +73 -5
- package/dist/components/combobox/combobox.js.map +1 -1
- package/dist/components/combobox/context.js +10 -1
- package/dist/components/combobox/context.js.map +1 -1
- package/dist/components/command/command.js +2 -2
- package/dist/components/command/use-command.d.ts.map +1 -1
- package/dist/components/command/use-command.js +9 -30
- package/dist/components/command/use-command.js.map +1 -1
- package/dist/components/context-menu/context-menu.d.ts +50 -18
- package/dist/components/context-menu/context-menu.d.ts.map +1 -1
- package/dist/components/context-menu/context-menu.js +101 -47
- package/dist/components/context-menu/context-menu.js.map +1 -1
- package/dist/components/context-menu/context.js +1 -1
- package/dist/components/context-menu/context.js.map +1 -1
- package/dist/components/context-menu/use-context-menu.d.ts +1 -1
- package/dist/components/context-menu/use-context-menu.d.ts.map +1 -1
- package/dist/components/context-menu/use-context-menu.js +4 -2
- package/dist/components/context-menu/use-context-menu.js.map +1 -1
- package/dist/components/date-field/date-field.d.ts +9 -1
- package/dist/components/date-field/date-field.d.ts.map +1 -1
- package/dist/components/date-field/date-field.js +2 -0
- package/dist/components/date-field/date-field.js.map +1 -1
- package/dist/components/date-picker/date-picker.d.ts +41 -1
- package/dist/components/date-picker/date-picker.d.ts.map +1 -1
- package/dist/components/date-picker/date-picker.js +16 -3
- package/dist/components/date-picker/date-picker.js.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.d.ts +77 -2
- package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.js +102 -5
- package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
- package/dist/components/date-range-picker/use-date-range-picker.d.ts +1 -1
- package/dist/components/date-range-picker/use-date-range-picker.js.map +1 -1
- package/dist/components/descriptions/descriptions.d.ts +38 -7
- package/dist/components/descriptions/descriptions.d.ts.map +1 -1
- package/dist/components/descriptions/descriptions.js +38 -4
- package/dist/components/descriptions/descriptions.js.map +1 -1
- package/dist/components/dialog/dialog.d.ts +16 -1
- package/dist/components/dialog/dialog.d.ts.map +1 -1
- package/dist/components/dialog/dialog.js +15 -2
- package/dist/components/dialog/dialog.js.map +1 -1
- package/dist/components/dialog/use-dialog.d.ts.map +1 -1
- package/dist/components/dialog/use-dialog.js +9 -27
- package/dist/components/dialog/use-dialog.js.map +1 -1
- package/dist/components/diff-view/diff-view.d.ts +22 -2
- package/dist/components/diff-view/diff-view.d.ts.map +1 -1
- package/dist/components/diff-view/diff-view.js +37 -14
- package/dist/components/diff-view/diff-view.js.map +1 -1
- package/dist/components/diff-view/use-diff-view.d.ts +7 -2
- package/dist/components/diff-view/use-diff-view.d.ts.map +1 -1
- package/dist/components/diff-view/use-diff-view.js +12 -5
- package/dist/components/diff-view/use-diff-view.js.map +1 -1
- package/dist/components/drawer/drawer.d.ts +46 -1
- package/dist/components/drawer/drawer.d.ts.map +1 -1
- package/dist/components/drawer/drawer.js +28 -4
- package/dist/components/drawer/drawer.js.map +1 -1
- package/dist/components/drawer/use-drawer.d.ts +1 -1
- package/dist/components/drawer/use-drawer.d.ts.map +1 -1
- package/dist/components/drawer/use-drawer.js +12 -29
- package/dist/components/drawer/use-drawer.js.map +1 -1
- package/dist/components/empty-state/empty-state.js +4 -1
- package/dist/components/empty-state/empty-state.js.map +1 -1
- package/dist/components/empty-state/use-empty-state.js +12 -3
- package/dist/components/empty-state/use-empty-state.js.map +1 -1
- package/dist/components/field/field.js +1 -1
- package/dist/components/field-array/field-array.d.ts +1 -1
- package/dist/components/field-array/field-array.d.ts.map +1 -1
- package/dist/components/field-array/field-array.js +5 -1
- package/dist/components/field-array/field-array.js.map +1 -1
- package/dist/components/field-array/use-field-array.d.ts +3 -1
- package/dist/components/field-array/use-field-array.d.ts.map +1 -1
- package/dist/components/field-array/use-field-array.js +5 -2
- package/dist/components/field-array/use-field-array.js.map +1 -1
- package/dist/components/file-upload/file-upload.d.ts +24 -1
- package/dist/components/file-upload/file-upload.d.ts.map +1 -1
- package/dist/components/file-upload/file-upload.js +12 -2
- package/dist/components/file-upload/file-upload.js.map +1 -1
- package/dist/components/file-upload/use-file-upload.d.ts +1 -1
- package/dist/components/file-upload/use-file-upload.d.ts.map +1 -1
- package/dist/components/file-upload/use-file-upload.js.map +1 -1
- package/dist/components/flex/flex.d.ts +1 -1
- package/dist/components/flex/flex.d.ts.map +1 -1
- package/dist/components/flex/flex.js +4 -4
- package/dist/components/flex/flex.js.map +1 -1
- package/dist/components/form/form.d.ts +18 -4
- package/dist/components/form/form.d.ts.map +1 -1
- package/dist/components/form/form.js +21 -7
- package/dist/components/form/form.js.map +1 -1
- package/dist/components/form/use-form.d.ts +6 -0
- package/dist/components/form/use-form.d.ts.map +1 -1
- package/dist/components/form/use-form.js +4 -0
- package/dist/components/form/use-form.js.map +1 -1
- package/dist/components/funnel-chart/context.js +15 -0
- package/dist/components/funnel-chart/context.js.map +1 -0
- package/dist/components/funnel-chart/funnel-chart.d.ts +175 -0
- package/dist/components/funnel-chart/funnel-chart.d.ts.map +1 -0
- package/dist/components/funnel-chart/funnel-chart.js +188 -0
- package/dist/components/funnel-chart/funnel-chart.js.map +1 -0
- package/dist/components/funnel-chart/use-funnel-chart.d.ts +19 -0
- package/dist/components/funnel-chart/use-funnel-chart.d.ts.map +1 -0
- package/dist/components/funnel-chart/use-funnel-chart.js +26 -0
- package/dist/components/funnel-chart/use-funnel-chart.js.map +1 -0
- package/dist/components/graph-chart/context.js +15 -0
- package/dist/components/graph-chart/context.js.map +1 -0
- package/dist/components/graph-chart/graph-chart.d.ts +194 -0
- package/dist/components/graph-chart/graph-chart.d.ts.map +1 -0
- package/dist/components/graph-chart/graph-chart.js +219 -0
- package/dist/components/graph-chart/graph-chart.js.map +1 -0
- package/dist/components/graph-chart/use-graph-chart.d.ts +19 -0
- package/dist/components/graph-chart/use-graph-chart.d.ts.map +1 -0
- package/dist/components/graph-chart/use-graph-chart.js +26 -0
- package/dist/components/graph-chart/use-graph-chart.js.map +1 -0
- package/dist/components/grid/grid.d.ts +7 -0
- package/dist/components/grid/grid.d.ts.map +1 -1
- package/dist/components/grid/grid.js +7 -1
- package/dist/components/grid/grid.js.map +1 -1
- package/dist/components/grid-list/context.d.ts +9 -0
- package/dist/components/grid-list/context.d.ts.map +1 -0
- package/dist/components/grid-list/context.js +24 -0
- package/dist/components/grid-list/context.js.map +1 -0
- package/dist/components/grid-list/grid-list.d.ts +149 -0
- package/dist/components/grid-list/grid-list.d.ts.map +1 -0
- package/dist/components/grid-list/grid-list.js +118 -0
- package/dist/components/grid-list/grid-list.js.map +1 -0
- package/dist/components/grid-list/use-grid-list.d.ts +12 -0
- package/dist/components/grid-list/use-grid-list.d.ts.map +1 -0
- package/dist/components/grid-list/use-grid-list.js +20 -0
- package/dist/components/grid-list/use-grid-list.js.map +1 -0
- package/dist/components/heatmap/heatmap.d.ts +45 -4
- package/dist/components/heatmap/heatmap.d.ts.map +1 -1
- package/dist/components/heatmap/heatmap.js +40 -14
- package/dist/components/heatmap/heatmap.js.map +1 -1
- package/dist/components/heatmap/use-heatmap.d.ts +4 -2
- package/dist/components/heatmap/use-heatmap.d.ts.map +1 -1
- package/dist/components/heatmap/use-heatmap.js +8 -4
- package/dist/components/heatmap/use-heatmap.js.map +1 -1
- package/dist/components/hierarchy-chart/context.js +15 -0
- package/dist/components/hierarchy-chart/context.js.map +1 -0
- package/dist/components/hierarchy-chart/hierarchy-chart.d.ts +201 -0
- package/dist/components/hierarchy-chart/hierarchy-chart.d.ts.map +1 -0
- package/dist/components/hierarchy-chart/hierarchy-chart.js +228 -0
- package/dist/components/hierarchy-chart/hierarchy-chart.js.map +1 -0
- package/dist/components/hierarchy-chart/use-hierarchy-chart.d.ts +19 -0
- package/dist/components/hierarchy-chart/use-hierarchy-chart.d.ts.map +1 -0
- package/dist/components/hierarchy-chart/use-hierarchy-chart.js +26 -0
- package/dist/components/hierarchy-chart/use-hierarchy-chart.js.map +1 -0
- package/dist/components/hover-card/hover-card.js +2 -2
- package/dist/components/icon/icon.d.ts +7 -1
- package/dist/components/icon/icon.d.ts.map +1 -1
- package/dist/components/icon/icon.js +1 -0
- package/dist/components/icon/icon.js.map +1 -1
- package/dist/components/image/use-image.d.ts.map +1 -1
- package/dist/components/image/use-image.js +3 -1
- package/dist/components/image/use-image.js.map +1 -1
- package/dist/components/image-cropper/image-cropper.d.ts +35 -4
- package/dist/components/image-cropper/image-cropper.d.ts.map +1 -1
- package/dist/components/image-cropper/image-cropper.js +34 -5
- package/dist/components/image-cropper/image-cropper.js.map +1 -1
- package/dist/components/image-cropper/use-image-cropper.d.ts +3 -1
- package/dist/components/image-cropper/use-image-cropper.d.ts.map +1 -1
- package/dist/components/image-cropper/use-image-cropper.js +4 -1
- package/dist/components/image-cropper/use-image-cropper.js.map +1 -1
- package/dist/components/image-viewer/image-viewer.js +1 -1
- package/dist/components/image-viewer/use-image-viewer.d.ts.map +1 -1
- package/dist/components/image-viewer/use-image-viewer.js +9 -27
- package/dist/components/image-viewer/use-image-viewer.js.map +1 -1
- package/dist/components/infinite-scroll/infinite-scroll.d.ts +9 -1
- package/dist/components/infinite-scroll/infinite-scroll.d.ts.map +1 -1
- package/dist/components/infinite-scroll/infinite-scroll.js +2 -0
- package/dist/components/infinite-scroll/infinite-scroll.js.map +1 -1
- package/dist/components/json-viewer/json-viewer.d.ts +17 -2
- package/dist/components/json-viewer/json-viewer.d.ts.map +1 -1
- package/dist/components/json-viewer/json-viewer.js +26 -8
- package/dist/components/json-viewer/json-viewer.js.map +1 -1
- package/dist/components/listbox/listbox.d.ts +7 -1
- package/dist/components/listbox/listbox.d.ts.map +1 -1
- package/dist/components/listbox/listbox.js +2 -0
- package/dist/components/listbox/listbox.js.map +1 -1
- package/dist/components/loading-bar/use-loading-bar.d.ts.map +1 -1
- package/dist/components/loading-bar/use-loading-bar.js +3 -1
- package/dist/components/loading-bar/use-loading-bar.js.map +1 -1
- package/dist/components/log/log.d.ts +41 -2
- package/dist/components/log/log.d.ts.map +1 -1
- package/dist/components/log/log.js +25 -3
- package/dist/components/log/log.js.map +1 -1
- package/dist/components/log/use-log.d.ts +1 -1
- package/dist/components/log/use-log.d.ts.map +1 -1
- package/dist/components/log/use-log.js +4 -1
- package/dist/components/log/use-log.js.map +1 -1
- package/dist/components/markdown-stream/markdown-stream.d.ts +22 -2
- package/dist/components/markdown-stream/markdown-stream.d.ts.map +1 -1
- package/dist/components/markdown-stream/markdown-stream.js +43 -4
- package/dist/components/markdown-stream/markdown-stream.js.map +1 -1
- package/dist/components/marquee/marquee.d.ts +68 -12
- package/dist/components/marquee/marquee.d.ts.map +1 -1
- package/dist/components/marquee/marquee.js +52 -7
- package/dist/components/marquee/marquee.js.map +1 -1
- package/dist/components/mention/mention.d.ts +26 -6
- package/dist/components/mention/mention.d.ts.map +1 -1
- package/dist/components/mention/mention.js +14 -4
- package/dist/components/mention/mention.js.map +1 -1
- package/dist/components/menu/context.js +1 -1
- package/dist/components/menu/context.js.map +1 -1
- package/dist/components/menu/menu.d.ts +79 -28
- package/dist/components/menu/menu.d.ts.map +1 -1
- package/dist/components/menu/menu.js +104 -51
- package/dist/components/menu/menu.js.map +1 -1
- package/dist/components/menu/use-menu.d.ts +1 -1
- package/dist/components/menu/use-menu.d.ts.map +1 -1
- package/dist/components/menu/use-menu.js +8 -6
- package/dist/components/menu/use-menu.js.map +1 -1
- package/dist/components/menubar/context.js +1 -1
- package/dist/components/menubar/context.js.map +1 -1
- package/dist/components/menubar/menubar.d.ts +39 -18
- package/dist/components/menubar/menubar.d.ts.map +1 -1
- package/dist/components/menubar/menubar.js +96 -47
- package/dist/components/menubar/menubar.js.map +1 -1
- package/dist/components/menubar/use-menubar.d.ts +1 -1
- package/dist/components/menubar/use-menubar.d.ts.map +1 -1
- package/dist/components/menubar/use-menubar.js +4 -2
- package/dist/components/menubar/use-menubar.js.map +1 -1
- package/dist/components/message-feed/message-feed.d.ts +13 -1
- package/dist/components/message-feed/message-feed.d.ts.map +1 -1
- package/dist/components/message-feed/message-feed.js +25 -1
- package/dist/components/message-feed/message-feed.js.map +1 -1
- package/dist/components/navigation-menu/navigation-menu.d.ts +58 -1
- package/dist/components/navigation-menu/navigation-menu.d.ts.map +1 -1
- package/dist/components/navigation-menu/navigation-menu.js +82 -10
- package/dist/components/navigation-menu/navigation-menu.js.map +1 -1
- package/dist/components/notification/context.d.ts +5 -1
- package/dist/components/notification/context.d.ts.map +1 -1
- package/dist/components/notification/context.js.map +1 -1
- package/dist/components/notification/notification.d.ts +39 -23
- package/dist/components/notification/notification.d.ts.map +1 -1
- package/dist/components/notification/notification.js +27 -9
- package/dist/components/notification/notification.js.map +1 -1
- package/dist/components/notification/use-item-exit.js +22 -0
- package/dist/components/notification/use-item-exit.js.map +1 -0
- package/dist/components/notification/use-notification.d.ts +3 -3
- package/dist/components/notification/use-notification.d.ts.map +1 -1
- package/dist/components/notification/use-notification.js +20 -5
- package/dist/components/notification/use-notification.js.map +1 -1
- package/dist/components/number-animation/number-animation.d.ts +14 -2
- package/dist/components/number-animation/number-animation.d.ts.map +1 -1
- package/dist/components/number-animation/number-animation.js +5 -1
- package/dist/components/number-animation/number-animation.js.map +1 -1
- package/dist/components/number-field/number-field.d.ts +16 -1
- package/dist/components/number-field/number-field.d.ts.map +1 -1
- package/dist/components/number-field/number-field.js +6 -0
- package/dist/components/number-field/number-field.js.map +1 -1
- package/dist/components/pagination/pagination.d.ts +22 -2
- package/dist/components/pagination/pagination.d.ts.map +1 -1
- package/dist/components/pagination/pagination.js +22 -1
- package/dist/components/pagination/pagination.js.map +1 -1
- package/dist/components/pagination/use-pagination.js +1 -0
- package/dist/components/pagination/use-pagination.js.map +1 -1
- package/dist/components/pie-chart/context.js +15 -0
- package/dist/components/pie-chart/context.js.map +1 -0
- package/dist/components/pie-chart/pie-chart.d.ts +203 -0
- package/dist/components/pie-chart/pie-chart.d.ts.map +1 -0
- package/dist/components/pie-chart/pie-chart.js +236 -0
- package/dist/components/pie-chart/pie-chart.js.map +1 -0
- package/dist/components/pie-chart/use-pie-chart.d.ts +19 -0
- package/dist/components/pie-chart/use-pie-chart.d.ts.map +1 -0
- package/dist/components/pie-chart/use-pie-chart.js +26 -0
- package/dist/components/pie-chart/use-pie-chart.js.map +1 -0
- package/dist/components/popconfirm/popconfirm.js +2 -2
- package/dist/components/popover/popover.d.ts +11 -0
- package/dist/components/popover/popover.d.ts.map +1 -1
- package/dist/components/popover/popover.js +7 -2
- package/dist/components/popover/popover.js.map +1 -1
- package/dist/components/progress/progress.d.ts +63 -3
- package/dist/components/progress/progress.d.ts.map +1 -1
- package/dist/components/progress/progress.js +55 -3
- package/dist/components/progress/progress.js.map +1 -1
- package/dist/components/question-flow/question-flow.d.ts +40 -1
- package/dist/components/question-flow/question-flow.d.ts.map +1 -1
- package/dist/components/question-flow/question-flow.js +37 -1
- package/dist/components/question-flow/question-flow.js.map +1 -1
- package/dist/components/radar-chart/context.js +15 -0
- package/dist/components/radar-chart/context.js.map +1 -0
- package/dist/components/radar-chart/radar-chart.d.ts +189 -0
- package/dist/components/radar-chart/radar-chart.d.ts.map +1 -0
- package/dist/components/radar-chart/radar-chart.js +220 -0
- package/dist/components/radar-chart/radar-chart.js.map +1 -0
- package/dist/components/radar-chart/use-radar-chart.d.ts +19 -0
- package/dist/components/radar-chart/use-radar-chart.d.ts.map +1 -0
- package/dist/components/radar-chart/use-radar-chart.js +26 -0
- package/dist/components/radar-chart/use-radar-chart.js.map +1 -0
- package/dist/components/radio-group/radio-group.d.ts +37 -2
- package/dist/components/radio-group/radio-group.d.ts.map +1 -1
- package/dist/components/radio-group/radio-group.js +54 -8
- package/dist/components/radio-group/radio-group.js.map +1 -1
- package/dist/components/radio-group/use-radio-group.d.ts +3 -1
- package/dist/components/radio-group/use-radio-group.d.ts.map +1 -1
- package/dist/components/radio-group/use-radio-group.js +7 -3
- package/dist/components/radio-group/use-radio-group.js.map +1 -1
- package/dist/components/reasoning/reasoning.d.ts +1 -1
- package/dist/components/reasoning/reasoning.d.ts.map +1 -1
- package/dist/components/reasoning/reasoning.js +1 -0
- package/dist/components/reasoning/reasoning.js.map +1 -1
- package/dist/components/sankey-chart/context.js +15 -0
- package/dist/components/sankey-chart/context.js.map +1 -0
- package/dist/components/sankey-chart/sankey-chart.d.ts +161 -0
- package/dist/components/sankey-chart/sankey-chart.d.ts.map +1 -0
- package/dist/components/sankey-chart/sankey-chart.js +208 -0
- package/dist/components/sankey-chart/sankey-chart.js.map +1 -0
- package/dist/components/sankey-chart/use-sankey-chart.d.ts +19 -0
- package/dist/components/sankey-chart/use-sankey-chart.d.ts.map +1 -0
- package/dist/components/sankey-chart/use-sankey-chart.js +26 -0
- package/dist/components/sankey-chart/use-sankey-chart.js.map +1 -0
- package/dist/components/scroll-area/scroll-area.d.ts +13 -5
- package/dist/components/scroll-area/scroll-area.d.ts.map +1 -1
- package/dist/components/scroll-area/scroll-area.js +17 -3
- package/dist/components/scroll-area/scroll-area.js.map +1 -1
- package/dist/components/select/select.d.ts +7 -1
- package/dist/components/select/select.d.ts.map +1 -1
- package/dist/components/select/select.js +13 -4
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/select/use-select.js +2 -1
- package/dist/components/select/use-select.js.map +1 -1
- package/dist/components/side-nav/context.js +17 -1
- package/dist/components/side-nav/context.js.map +1 -1
- package/dist/components/side-nav/side-nav.d.ts +51 -7
- package/dist/components/side-nav/side-nav.d.ts.map +1 -1
- package/dist/components/side-nav/side-nav.js +152 -13
- package/dist/components/side-nav/side-nav.js.map +1 -1
- package/dist/components/side-nav/use-side-nav.d.ts +4 -2
- package/dist/components/side-nav/use-side-nav.d.ts.map +1 -1
- package/dist/components/side-nav/use-side-nav.js +5 -3
- package/dist/components/side-nav/use-side-nav.js.map +1 -1
- package/dist/components/signature-pad/signature-pad.d.ts +26 -4
- package/dist/components/signature-pad/signature-pad.d.ts.map +1 -1
- package/dist/components/signature-pad/signature-pad.js +32 -4
- package/dist/components/signature-pad/signature-pad.js.map +1 -1
- package/dist/components/signature-pad/use-signature-pad.d.ts +1 -1
- package/dist/components/signature-pad/use-signature-pad.d.ts.map +1 -1
- package/dist/components/signature-pad/use-signature-pad.js.map +1 -1
- package/dist/components/skeleton/use-skeleton.js +6 -2
- package/dist/components/skeleton/use-skeleton.js.map +1 -1
- package/dist/components/slider/slider.d.ts +27 -0
- package/dist/components/slider/slider.d.ts.map +1 -1
- package/dist/components/slider/slider.js +12 -0
- package/dist/components/slider/slider.js.map +1 -1
- package/dist/components/sortable/sortable.d.ts +19 -1
- package/dist/components/sortable/sortable.d.ts.map +1 -1
- package/dist/components/sortable/sortable.js +7 -2
- package/dist/components/sortable/sortable.js.map +1 -1
- package/dist/components/sortable/use-sortable.d.ts +1 -1
- package/dist/components/sortable/use-sortable.d.ts.map +1 -1
- package/dist/components/sortable/use-sortable.js +2 -1
- package/dist/components/sortable/use-sortable.js.map +1 -1
- package/dist/components/sparkline/sparkline.d.ts +101 -0
- package/dist/components/sparkline/sparkline.d.ts.map +1 -0
- package/dist/components/sparkline/sparkline.js +54 -0
- package/dist/components/sparkline/sparkline.js.map +1 -0
- package/dist/components/sparkline/use-sparkline.d.ts +15 -0
- package/dist/components/sparkline/use-sparkline.d.ts.map +1 -0
- package/dist/components/sparkline/use-sparkline.js +21 -0
- package/dist/components/sparkline/use-sparkline.js.map +1 -0
- package/dist/components/spinner/spinner.d.ts +8 -0
- package/dist/components/spinner/spinner.d.ts.map +1 -1
- package/dist/components/spinner/spinner.js +2 -0
- package/dist/components/spinner/spinner.js.map +1 -1
- package/dist/components/spinner/use-spinner.js +4 -2
- package/dist/components/spinner/use-spinner.js.map +1 -1
- package/dist/components/steps/steps.d.ts +28 -1
- package/dist/components/steps/steps.d.ts.map +1 -1
- package/dist/components/steps/steps.js +11 -2
- package/dist/components/steps/steps.js.map +1 -1
- package/dist/components/switch/switch.js +1 -1
- package/dist/components/table/context.js +9 -1
- package/dist/components/table/context.js.map +1 -1
- package/dist/components/table/table.d.ts +54 -5
- package/dist/components/table/table.d.ts.map +1 -1
- package/dist/components/table/table.js +40 -11
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/table/use-table.d.ts +3 -1
- package/dist/components/table/use-table.d.ts.map +1 -1
- package/dist/components/table/use-table.js +5 -2
- package/dist/components/table/use-table.js.map +1 -1
- package/dist/components/tabs/tabs.d.ts +51 -3
- package/dist/components/tabs/tabs.d.ts.map +1 -1
- package/dist/components/tabs/tabs.js +60 -8
- package/dist/components/tabs/tabs.js.map +1 -1
- package/dist/components/tag/use-tag.d.ts.map +1 -1
- package/dist/components/tag/use-tag.js +3 -1
- package/dist/components/tag/use-tag.js.map +1 -1
- package/dist/components/tags-input/tags-input.d.ts +10 -2
- package/dist/components/tags-input/tags-input.d.ts.map +1 -1
- package/dist/components/tags-input/tags-input.js +11 -4
- package/dist/components/tags-input/tags-input.js.map +1 -1
- package/dist/components/tags-input/use-tags-input.d.ts +4 -2
- package/dist/components/tags-input/use-tags-input.d.ts.map +1 -1
- package/dist/components/tags-input/use-tags-input.js +5 -2
- package/dist/components/tags-input/use-tags-input.js.map +1 -1
- package/dist/components/time-picker/time-picker.d.ts +11 -7
- package/dist/components/time-picker/time-picker.d.ts.map +1 -1
- package/dist/components/time-picker/time-picker.js +4 -2
- package/dist/components/time-picker/time-picker.js.map +1 -1
- package/dist/components/time-range-picker/time-range-picker.d.ts +11 -7
- package/dist/components/time-range-picker/time-range-picker.d.ts.map +1 -1
- package/dist/components/time-range-picker/time-range-picker.js +4 -2
- package/dist/components/time-range-picker/time-range-picker.js.map +1 -1
- package/dist/components/timer/timer.d.ts +1 -1
- package/dist/components/timestamp/timestamp.d.ts +20 -1
- package/dist/components/timestamp/timestamp.d.ts.map +1 -1
- package/dist/components/timestamp/timestamp.js +16 -5
- package/dist/components/timestamp/timestamp.js.map +1 -1
- package/dist/components/toolbar/toolbar.d.ts +17 -2
- package/dist/components/toolbar/toolbar.d.ts.map +1 -1
- package/dist/components/toolbar/toolbar.js +31 -4
- package/dist/components/toolbar/toolbar.js.map +1 -1
- package/dist/components/toolbar/use-toolbar.d.ts +4 -2
- package/dist/components/toolbar/use-toolbar.d.ts.map +1 -1
- package/dist/components/toolbar/use-toolbar.js +5 -2
- package/dist/components/toolbar/use-toolbar.js.map +1 -1
- package/dist/components/tooltip/context.d.ts +21 -0
- package/dist/components/tooltip/context.d.ts.map +1 -0
- package/dist/components/tooltip/context.js +10 -1
- package/dist/components/tooltip/context.js.map +1 -1
- package/dist/components/tooltip/tooltip.d.ts +53 -1
- package/dist/components/tooltip/tooltip.d.ts.map +1 -1
- package/dist/components/tooltip/tooltip.js +34 -3
- package/dist/components/tooltip/tooltip.js.map +1 -1
- package/dist/components/tooltip/use-tooltip.d.ts +3 -18
- package/dist/components/tooltip/use-tooltip.d.ts.map +1 -1
- package/dist/components/tooltip/use-tooltip.js +2 -0
- package/dist/components/tooltip/use-tooltip.js.map +1 -1
- package/dist/components/tour/tour.d.ts +9 -1
- package/dist/components/tour/tour.d.ts.map +1 -1
- package/dist/components/tour/tour.js +2 -0
- package/dist/components/tour/tour.js.map +1 -1
- package/dist/components/transfer/transfer.d.ts +21 -1
- package/dist/components/transfer/transfer.d.ts.map +1 -1
- package/dist/components/transfer/transfer.js +10 -2
- package/dist/components/transfer/transfer.js.map +1 -1
- package/dist/components/tree/tree.d.ts +34 -1
- package/dist/components/tree/tree.d.ts.map +1 -1
- package/dist/components/tree/tree.js +11 -0
- package/dist/components/tree/tree.js.map +1 -1
- package/dist/components/tree-select/context.js +10 -1
- package/dist/components/tree-select/context.js.map +1 -1
- package/dist/components/tree-select/tree-select.d.ts +70 -6
- package/dist/components/tree-select/tree-select.d.ts.map +1 -1
- package/dist/components/tree-select/tree-select.js +109 -12
- package/dist/components/tree-select/tree-select.js.map +1 -1
- package/dist/components/tree-select/use-tree-select.d.ts +3 -0
- package/dist/components/tree-select/use-tree-select.d.ts.map +1 -1
- package/dist/components/tree-select/use-tree-select.js +6 -1
- package/dist/components/tree-select/use-tree-select.js.map +1 -1
- package/dist/components/truncate/truncate.d.ts +25 -4
- package/dist/components/truncate/truncate.d.ts.map +1 -1
- package/dist/components/truncate/truncate.js +29 -14
- package/dist/components/truncate/truncate.js.map +1 -1
- package/dist/components/truncate/use-truncate.d.ts.map +1 -1
- package/dist/components/truncate/use-truncate.js +3 -1
- package/dist/components/truncate/use-truncate.js.map +1 -1
- package/dist/components/typography/typography.d.ts +35 -2
- package/dist/components/typography/typography.d.ts.map +1 -1
- package/dist/components/typography/typography.js +21 -3
- package/dist/components/typography/typography.js.map +1 -1
- package/dist/components/virtualizer/virtualizer.d.ts +26 -2
- package/dist/components/virtualizer/virtualizer.d.ts.map +1 -1
- package/dist/components/virtualizer/virtualizer.js +20 -3
- package/dist/components/virtualizer/virtualizer.js.map +1 -1
- package/dist/components/watermark/watermark.d.ts +14 -1
- package/dist/components/watermark/watermark.d.ts.map +1 -1
- package/dist/components/watermark/watermark.js +20 -5
- package/dist/components/watermark/watermark.js.map +1 -1
- package/dist/config/config.d.ts +1 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +2 -1
- package/dist/config/config.js.map +1 -1
- package/dist/index.d.ts +59 -44
- package/dist/index.js +53 -38
- package/dist/package.js +1 -1
- package/dist/runtime/as-child.js +3 -2
- package/dist/runtime/as-child.js.map +1 -1
- package/dist/runtime/hydration.js +14 -0
- package/dist/runtime/hydration.js.map +1 -0
- package/dist/runtime/use-overlay-exit.js +0 -1
- package/dist/runtime/use-overlay-exit.js.map +1 -1
- package/dist/services/notification-service.d.ts +26 -7
- package/dist/services/notification-service.d.ts.map +1 -1
- package/dist/services/notification-service.js +35 -8
- package/dist/services/notification-service.js.map +1 -1
- package/dist/sound.d.ts +6 -7
- package/dist/sound.d.ts.map +1 -1
- package/dist/sound.js +6 -6
- package/dist/sound.js.map +1 -1
- package/package.json +15 -14
- package/dist/components/gradient-text/gradient-text.d.ts +0 -36
- package/dist/components/gradient-text/gradient-text.d.ts.map +0 -1
- package/dist/components/gradient-text/gradient-text.js +0 -20
- package/dist/components/gradient-text/gradient-text.js.map +0 -1
- package/dist/components/icon-wrapper/icon-wrapper.d.ts +0 -29
- package/dist/components/icon-wrapper/icon-wrapper.d.ts.map +0 -1
- package/dist/components/icon-wrapper/icon-wrapper.js +0 -20
- package/dist/components/icon-wrapper/icon-wrapper.js.map +0 -1
- package/dist/components/segmented/context.d.ts +0 -13
- package/dist/components/segmented/context.d.ts.map +0 -1
- package/dist/components/segmented/context.js +0 -24
- package/dist/components/segmented/context.js.map +0 -1
- package/dist/components/segmented/segmented.d.ts +0 -161
- package/dist/components/segmented/segmented.d.ts.map +0 -1
- package/dist/components/segmented/segmented.js +0 -142
- package/dist/components/segmented/segmented.js.map +0 -1
- package/dist/components/segmented/use-segmented.d.ts +0 -15
- package/dist/components/segmented/use-segmented.d.ts.map +0 -1
- package/dist/components/segmented/use-segmented.js +0 -22
- package/dist/components/segmented/use-segmented.js.map +0 -1
- package/dist/components/toast/context.js +0 -15
- package/dist/components/toast/context.js.map +0 -1
- package/dist/components/toast/toast.d.ts +0 -123
- package/dist/components/toast/toast.d.ts.map +0 -1
- package/dist/components/toast/toast.js +0 -112
- package/dist/components/toast/toast.js.map +0 -1
- package/dist/components/toast/use-toast.d.ts +0 -10
- package/dist/components/toast/use-toast.d.ts.map +0 -1
- package/dist/components/toast/use-toast.js +0 -17
- package/dist/components/toast/use-toast.js.map +0 -1
- package/dist/services/toast-service.d.ts +0 -69
- package/dist/services/toast-service.d.ts.map +0 -1
- package/dist/services/toast-service.js +0 -161
- package/dist/services/toast-service.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menubar.js","names":[],"sources":["../../../src/components/menubar/menubar.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 menubar 相关实现。\n\nimport type { Direction, Orientation, Placement, Size, Tone } from '@xihan-ui/core'\nimport type { PresenceHandle } from '@xihan-ui/core/presence'\nimport type { MenubarApi, MenubarContentProps, MenubarGroupProps, MenubarItemProps, MenubarNode, MenubarNodeMeta, MenubarSchema } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport type { MenubarPartRegistry } from './use-menubar'\nimport { createRuntimeConfig, groupAdjacentRuns } from '@xihan-ui/core'\nimport { computed, defineComponent, h, mergeProps, onBeforeUnmount, ref, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { mergeIntoChild } from '../../runtime/as-child'\nimport { mergePartProps } from '../../runtime/merge-props'\nimport { XhPortal } from '../../runtime/portal'\nimport { useOverlayExit } from '../../runtime/use-overlay-exit'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { provideMenu, useMenuContext } from '../menu/context'\nimport { useMenuWithParent } from '../menu/use-menu'\nimport {\n provideMenubar,\n provideMenubarGroup,\n provideMenubarItem,\n provideMenubarMenu,\n provideMenubarSub,\n useMenubarContext,\n useMenubarGroupContext,\n useMenubarItemContext,\n useMenubarMenuContext,\n useMenubarSubContext,\n} from './context'\nimport { useMenubar } from './use-menubar'\n\ntype MenubarProps = MenubarSchema['props']\n\n/** 在 ref 回调中把节点按 value 登记进菜单栏取值表,value 变更时迁移到新键,卸载时注销 */\nfunction useMenubarPart(register: MenubarPartRegistry, value: () => string): (el: HTMLElement | null) => void {\n const node = ref<HTMLElement | null>(null)\n watch(value, (next, prev) => {\n if (next === prev)\n return\n register(prev, null)\n register(next, node.value)\n })\n onBeforeUnmount(() => register(value(), null))\n return (el) => {\n node.value = el\n register(value(), el)\n }\n}\n\n/** 默认插槽的载荷:当前展开的菜单项、是否有菜单展开,以及切换展开项的命令。 */\nexport type MenubarRootSlotProps = Pick<MenubarApi, 'value' | 'open' | 'setValue'>\n\n/** role=menubar 根节点:trigger 的 roving tabindex 作用域,各菜单浮层也挂在其内 */\n/** 代铺条目时可逐槽接管的三个插槽;三个都不写即完全按数据铺。 */\nexport interface MenubarItemSlots {\n /** 只填条目的文字槽,其余槽照旧由数据铺。 */\n item?: (node: MenubarNodeMeta) => VNode[]\n /** 只接管行首那一格,其余槽照旧由数据铺。 */\n ['item-prefix']?: (node: MenubarNodeMeta) => VNode[]\n /** 只接管行尾那一格(计数、徽标、次级图标),其余槽照旧由数据铺。 */\n ['item-suffix']?: (node: MenubarNodeMeta) => VNode[]\n}\n\nexport const XhMenubarRoot = defineComponent({\n name: 'XhMenubarRoot',\n // 缺省值由机器与 connect 决定;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n collection: { type: Array as PropType<MenubarNode[]> },\n value: { type: String as PropType<string | null> },\n defaultValue: { type: String as PropType<string | null> },\n orientation: { type: String as PropType<Orientation> },\n loop: { type: Boolean, default: undefined },\n dir: { type: String as PropType<Direction> },\n disabled: { type: Boolean, default: undefined },\n typeahead: { type: Boolean, default: undefined },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n translations: { type: Object as PropType<MenubarProps['translations']> },\n },\n // value-change 携带 { value }、select 携带 { menu, value },update:value 携带裸值\n emits: {\n 'value-change': (_details: PayloadOf<MenubarProps, 'onValueChange'>) => true,\n 'select': (_details: PayloadOf<MenubarProps, 'onSelect'>) => true,\n 'update:value': (_value: PayloadOf<MenubarProps, 'onValueChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n 'default'?: (props: MenubarRootSlotProps) => VNode[]\n /** 只填条目的文字槽,标记位、副文本与快捷键照旧由数据铺 */\n 'item'?: (node: MenubarNodeMeta) => VNode[]\n /** 只接管行首那一格,其余槽照旧由数据铺 */\n 'item-prefix'?: (node: MenubarNodeMeta) => VNode[]\n /** 只接管行尾那一格(计数、徽标、次级图标),其余槽照旧由数据铺 */\n 'item-suffix'?: (node: MenubarNodeMeta) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: MenubarProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifySelect: MenubarProps['onSelect'] = details => emit('select', details)\n const ctx = useMenubar(withXhConfig('menubar', props) as MenubarProps, notifyValue, notifySelect)\n provideMenubar(ctx)\n return () => h('div', {\n ...ctx.api.value.getRootProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.rootRef.value = el as HTMLElement },\n }, slots.default\n ? slots.default({\n value: ctx.api.value.value,\n open: ctx.api.value.open,\n setValue: ctx.api.value.setValue,\n })\n : props.collection\n ? renderDefaultTree(ctx.api.value.collection, { 'item': slots.item, 'item-prefix': slots['item-prefix'], 'item-suffix': slots['item-suffix'] })\n : [])\n },\n})\n\nexport const XhMenubarTrigger = defineComponent({\n name: 'XhMenubarTrigger',\n // 直通属性自己合:Vue 默认把作者的处理器排在部件的后面,这里改成作者先跑\n inheritAttrs: false,\n props: {\n value: { type: String, required: true },\n // 缺省交给 connect 回 collection 里查,写死 false 会盖掉数据里的禁用\n disabled: { type: Boolean, default: undefined },\n /** 借用作者的子节点作为触发器,不再渲染自己的包裹元素;子节点须恰好一个。 */\n asChild: Boolean,\n },\n setup(props, { slots, attrs }) {\n const ctx = useMenubarContext()\n // trigger 同时作为定位锚点与焦点归还目标\n const setEl = useMenubarPart(ctx.registerTrigger, () => props.value)\n // 本入口持有焦点时,value 变更重报焦点入口,卸载时上报菜单栏失焦\n const triggerEl = ref<HTMLElement | null>(null)\n watch(() => props.value, (next, prev) => {\n if (next === prev)\n return\n const { service } = ctx\n if (service.getStatus() !== 'Started')\n return\n if (triggerEl.value && service.scope.getActiveElement() === triggerEl.value)\n service.send({ type: 'TRIGGER.FOCUS', value: next, disabled: props.disabled })\n })\n onBeforeUnmount(() => {\n const { service } = ctx\n // 整条栏一起卸载时根部件先停机,此刻送事件会在 dev 下抛\n if (service.getStatus() !== 'Started')\n return\n // 按「本入口当下正持有焦点」判定,不按 value 比对\n if (triggerEl.value && service.scope.getActiveElement() === triggerEl.value)\n service.send({ type: 'MENUBAR.BLUR' })\n })\n return () => {\n const part = mergePartProps({\n ...ctx.api.value.getTriggerProps({ value: props.value, disabled: props.disabled }) as Record<string, unknown>,\n ref: (el: unknown) => {\n triggerEl.value = el as HTMLElement | null\n setEl(el as HTMLElement | null)\n },\n }, attrs)\n const children = slots.default?.()\n // asChild:把触发器属性合到作者的节点上,不再自己渲染包裹元素\n if (props.asChild) {\n const merged = mergeIntoChild(children, part, 'menubar')\n if (merged)\n return merged\n }\n return h('button', part, children)\n }\n },\n})\n\nexport const XhMenubarPositioner = defineComponent({\n name: 'XhMenubarPositioner',\n props: {\n value: { type: String, required: true },\n /** 本实例的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useMenubarContext()\n const menu = computed<MenubarContentProps>(() => ({ value: props.value }))\n // 供内部 content 继承 value,并把它的内容节点写回来给自绘条\n const contentRef = ref<HTMLElement | null>(null)\n provideMenubarMenu({ menu, contentRef })\n const setEl = useMenubarPart(ctx.registerPositioner, () => props.value)\n // 这张菜单的条目列表的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner;\n // 一张菜单一套,浮层里的条子走 4px 档\n const bars = useScrollbars({ scrollable: () => contentRef.value, props: { size: 'sm' } })\n // 每张菜单各搬各的定位层到 portal 落点,逃开祖先的层叠上下文\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.rootRef }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps(menu.value) as Record<string, unknown>, attrs),\n ref: (el: unknown) => setEl(el as HTMLElement | null),\n }, [...(slots.default?.() ?? []), ...bars.render()]),\n ])\n },\n})\n\nexport const XhMenubarContent = defineComponent({\n name: 'XhMenubarContent',\n props: {\n // 缺省时沿用外层 positioner 提供的身份,无 positioner 时必填\n value: { type: String },\n },\n setup(props, { slots }) {\n const ctx = useMenubarContext()\n const inherited = useMenubarMenuContext()\n if (props.value == null && !inherited)\n throw new Error('[xh] XhMenubarContent 必须写在 XhMenubarPositioner 内,或自带 value')\n const menu = computed<MenubarContentProps>(() => ({ value: props.value ?? inherited!.menu.value.value }))\n const setEl = useMenubarPart(ctx.registerContent, () => menu.value.value)\n // 一个菜单一份退场闸门:它们各开各的、动画各跑各的,一份管不过来。\n // 开合判据直接取 connect 这一帧的产出,不另起一套——两边各判一次迟早会说岔\n const contentRef = ref<HTMLElement | null>(null)\n let presence: PresenceHandle | null = null\n let presenceValue: string | null = null\n const sendPresence = (event: MenubarSchema['event']): void => {\n const deliver = (): void => {\n if (ctx.service.getStatus() === 'Started')\n ctx.service.send(event)\n }\n if (ctx.service.getStatus() === 'Started')\n deliver()\n else\n queueMicrotask(deliver)\n }\n const visible = useOverlayExit({\n config: typeof document === 'undefined' ? null : createRuntimeConfig(),\n isOpen: () => (ctx.api.value.getContentProps(menu.value) as Record<string, unknown>).hidden !== true,\n contentRef,\n onPresence: (next) => {\n const previous = presence\n const previousValue = presenceValue\n presence = next\n presenceValue = next ? menu.value.value : null\n if (next)\n sendPresence({ type: 'PRESENCE.SET', value: presenceValue!, presence: next, connected: true })\n else if (previous && previousValue != null)\n sendPresence({ type: 'PRESENCE.SET', value: previousValue, presence: previous, connected: false })\n },\n })\n return () => h('div', {\n ...ctx.api.value.getContentProps(menu.value) as Record<string, unknown>,\n // 收起跟着闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场就一帧都\n // 播不出来),所以真正的收起落成内联 display\n style: visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => {\n contentRef.value = el as HTMLElement | null\n setEl(el as HTMLElement | null)\n // 写回给外层 positioner:它按这个节点配自绘条\n if (inherited)\n inherited.contentRef.value = el as HTMLElement | null\n },\n }, slots.default?.())\n },\n})\n\nexport const XhMenubarGroup = defineComponent({\n name: 'XhMenubarGroup',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useMenubarContext()\n const group = computed<MenubarGroupProps>(() => ({ value: props.value }))\n provideMenubarGroup({ group })\n return () => h('div', ctx.api.value.getGroupProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhMenubarGroupLabel = defineComponent({\n name: 'XhMenubarGroupLabel',\n setup(_, { slots }) {\n const ctx = useMenubarContext()\n const { group } = useMenubarGroupContext()\n return () => h('span', ctx.api.value.getGroupLabelProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhMenubarItem = defineComponent({\n name: 'XhMenubarItem',\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 = useMenubarContext()\n const item = computed<MenubarItemProps>(() => ({ value: props.value, disabled: props.disabled }))\n provideMenubarItem({ item })\n // 本条目持有焦点时,value 变更重报焦点条目,卸载时上报焦点丢失\n const itemEl = ref<HTMLElement | null>(null)\n watch(() => props.value, (next, prev) => {\n if (next === prev)\n return\n const { service } = ctx\n if (service.getStatus() !== 'Started')\n return\n if (itemEl.value && service.scope.getActiveElement() === itemEl.value)\n service.send({ type: 'ITEM.FOCUS', value: next })\n })\n onBeforeUnmount(() => {\n const { service } = ctx\n // 整组一起卸载时根部件先停机,此刻送事件会在 dev 下抛\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(item.value) as Record<string, unknown>, ref: itemEl },\n slots.default?.(),\n )\n },\n})\n\nexport const XhMenubarItemText = defineComponent({\n name: 'XhMenubarItemText',\n setup(_, { slots }) {\n const ctx = useMenubarContext()\n const { item } = useMenubarItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhMenubarItemIndicator = defineComponent({\n name: 'XhMenubarItemIndicator',\n setup(_, { slots }) {\n const ctx = useMenubarContext()\n const { item } = useMenubarItemContext()\n return () => h('span', ctx.api.value.getItemIndicatorProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目中的副文本,排在文字下一行 */\nexport const XhMenubarItemDescription = defineComponent({\n name: 'XhMenubarItemDescription',\n setup(_, { slots }) {\n const ctx = useMenubarContext()\n const { item } = useMenubarItemContext()\n return () => h('span', ctx.api.value.getItemDescriptionProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目中的快捷键提示,贴行尾;纯装饰,读屏从条目文字取意 */\nexport const XhMenubarItemShortcut = defineComponent({\n name: 'XhMenubarItemShortcut',\n setup(_, { slots }) {\n const ctx = useMenubarContext()\n const { item } = useMenubarItemContext()\n return () => h('span', ctx.api.value.getItemShortcutProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目行尾的作者内容(计数、徽标、次级图标);家族只管落位,不规定字号与颜色 */\nexport const XhMenubarItemSuffix = defineComponent({\n name: 'XhMenubarItemSuffix',\n setup(_, { slots }) {\n const ctx = useMenubarContext()\n const { item } = useMenubarItemContext()\n return () => h('span', ctx.api.value.getItemSuffixProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 指向本菜单锚点的箭头,纯装饰;须写在同一菜单的 positioner 中 */\nexport const XhMenubarArrow = defineComponent({\n name: 'XhMenubarArrow',\n setup() {\n const ctx = useMenubarContext()\n const menu = useMenubarMenuContext()\n if (!menu)\n throw new Error('[xh] XhMenubarArrow 必须用在 XhMenubarPositioner 内')\n return () => h('div', ctx.api.value.getArrowProps(menu.menu.value) as Record<string, unknown>)\n },\n})\n\nexport const XhMenubarSeparator = defineComponent({\n name: 'XhMenubarSeparator',\n setup() {\n const ctx = useMenubarContext()\n return () => h('div', ctx.api.value.getSeparatorProps() as Record<string, unknown>)\n },\n})\n\n/**\n * 未写默认插槽时按 collection 铺开的整套结构,作者只提供数据。\n * 一排入口排在前、各自菜单的浮层排在后,与手写部件产出的 DOM 完全一致;\n * 需要修改结构时写默认插槽,行为不变。\n */\nfunction renderDefaultTree(\n collection: readonly MenubarNodeMeta[],\n itemSlots: MenubarItemSlots,\n): VNode[] {\n return [\n ...collection.map(menu =>\n h(XhMenubarTrigger, { key: `trigger:${menu.value}`, value: menu.value }, () => menu.label),\n ),\n ...collection.map(menu =>\n h(XhMenubarPositioner, { key: `positioner:${menu.value}`, value: menu.value }, () => [\n h(XhMenubarContent, null, () => renderNodes(menu.items, itemSlots)),\n ]),\n ),\n ]\n}\n\n/**\n * 单个条目:文字在上,副文本在下,未提供副文本时不铺设该部件。\n * `item-prefix` / `item-suffix` 插槽各接管首尾一格,其余槽照旧由数据铺。\n */\nfunction renderNode(\n meta: MenubarNodeMeta,\n itemSlots: MenubarItemSlots,\n): VNode {\n const prefix = itemSlots['item-prefix']\n const suffix = itemSlots['item-suffix']\n return h(XhMenubarItem, { key: meta.value, value: meta.value }, () => [\n ...(prefix ? [h(XhMenubarItemIndicator, null, () => prefix(meta))] : []),\n h(XhMenubarItemText, null, () => itemSlots.item?.(meta) ?? meta.label),\n ...(meta.description != null ? [h(XhMenubarItemDescription, null, () => meta.description)] : []),\n ...(meta.shortcut != null ? [h(XhMenubarItemShortcut, null, () => meta.shortcut)] : []),\n ...(suffix ? [h(XhMenubarItemSuffix, null, () => suffix(meta))] : []),\n ])\n}\n\n/** content 的内容:分组段铺为 group,段首的分隔线落在 group 外面。 */\nfunction renderNodes(\n collection: readonly MenubarNodeMeta[],\n itemSlots: MenubarItemSlots,\n): VNode[] {\n return groupAdjacentRuns(collection, node => node.group).flatMap((run, runIndex) => {\n const head = run[0]!\n // 首条上的标记不产出分隔线:菜单开头不留一道空隔\n const lead = runIndex > 0 && head.separatorBefore\n ? [h(XhMenubarSeparator, { key: `separator:${head.value}` })]\n : []\n if (head.group == null)\n return [...lead, renderNode(head, itemSlots)]\n const groupLabel = run.find(node => node.groupLabel != null)?.groupLabel ?? null\n return [\n ...lead,\n h(XhMenubarGroup, { key: `group:${head.group}`, value: head.group }, () => [\n ...(groupLabel != null ? [h(XhMenubarGroupLabel, null, () => groupLabel)] : []),\n ...run.flatMap((node, index) => [\n ...(index > 0 && node.separatorBefore ? [h(XhMenubarSeparator, { key: `separator:${node.value}` })] : []),\n renderNode(node, itemSlots),\n ]),\n ]),\n ]\n })\n}\n\n/** XhMenubarSub 默认插槽得到的载荷。 */\nexport interface MenubarSubSlotProps {\n open: boolean\n setOpen: (next: boolean) => void\n}\n\nexport const XhMenubarSub = defineComponent({\n name: 'XhMenubarSub',\n props: {\n /** 它在所属菜单中的条目身份。 */\n value: { type: String, required: true },\n disabled: { type: Boolean, default: undefined },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n loop: { type: Boolean, default: undefined },\n openOnHover: { type: Boolean, default: undefined },\n hoverOpenDelay: { type: Number },\n hoverCloseDelay: { type: Number },\n /** 文字方向;默认继承父层。子层被迁移到浮层落点,无法继承父层的方向。 */\n dir: { type: String as PropType<Direction> },\n /** 语气;默认继承父层。子层是浮层落点下的同级节点,CSS 私有槽无法继承。 */\n tone: { type: String as PropType<Tone> },\n /** 尺寸;默认继承父层,理由同 tone。 */\n size: { type: String as PropType<Size> },\n },\n slots: Object as SlotsType<{\n default?: (props: MenubarSubSlotProps) => VNode[]\n }>,\n setup(props, { slots }) {\n const parent = useMenubarContext()\n const owner = useMenubarMenuContext()\n if (!owner)\n throw new Error('[xh] MenubarSub 必须用在 XhMenubarPositioner 内')\n // 子层跑的是一台子菜单模式的 menu 机器:菜单栏那台是单机器单锚点,装不下第二层\n const sub = useMenuWithParent(\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 },\n undefined,\n parent.tree,\n )\n // 子树内的 XhMenu 系部件都归子机器\n provideMenu(sub)\n provideMenubarSub({ parent, value: props.value, disabled: props.disabled })\n // 所属那张菜单收起时本层跟着收,层层传导\n watch(() => parent.api.value.isOpen(owner.menu.value.value), (open) => {\n if (!open)\n sub.api.value.setOpen(false)\n })\n return () => slots.default?.({ open: sub.api.value.open, setOpen: sub.api.value.setOpen })\n },\n})\n\nexport const XhMenubarSubTrigger = defineComponent({\n name: 'XhMenubarSubTrigger',\n setup(_, { slots }) {\n const handle = useMenubarSubContext()\n const sub = useMenuContext()\n return () => h('div', {\n // 合并序=子先父后:父层的 data-scope/data-part 胜出,菜单栏的方向键与选中照常认它。\n // 反过来写会让节点带上 data-scope=\"menu\",菜单栏按自己的 scope 查条目就一条都找不到\n ...mergeProps(\n sub.api.value.getSubmenuTriggerProps({ value: handle.value, disabled: handle.disabled }) as Record<string, unknown>,\n handle.parent.api.value.getItemProps({ value: handle.value, disabled: handle.disabled }) as Record<string, unknown>,\n ),\n // 子菜单的定位锚点就是这一条\n ref: (el: unknown) => {\n sub.triggerRef.value = el as HTMLElement\n },\n }, slots.default?.())\n },\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"menubar.js","names":[],"sources":["../../../src/components/menubar/menubar.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 menubar 相关实现。\n\nimport type { Direction, Orientation, Placement, Size, Tone } from '@xihan-ui/core'\nimport type { PresenceHandle } from '@xihan-ui/core/presence'\nimport type { MenubarAnyItemProps, MenubarApi, MenubarContentProps, MenubarGroupProps, MenubarNode, MenubarNodeMeta, MenubarRadioValue, MenubarSchema } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport type { MenubarPartRegistry } from './use-menubar'\nimport { createRuntimeConfig, groupAdjacentRuns } from '@xihan-ui/core'\nimport { computed, defineComponent, h, mergeProps, onBeforeUnmount, ref, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { mergeIntoChild } from '../../runtime/as-child'\nimport { mergePartProps } from '../../runtime/merge-props'\nimport { XhPortal } from '../../runtime/portal'\nimport { useOverlayExit } from '../../runtime/use-overlay-exit'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { provideMenu, useMenuContext } from '../menu/context'\nimport { useMenuWithParent } from '../menu/use-menu'\nimport {\n provideMenubar,\n provideMenubarGroup,\n provideMenubarItem,\n provideMenubarMenu,\n provideMenubarSub,\n useMenubarContext,\n useMenubarGroupContext,\n useMenubarItemContext,\n useMenubarMenuContext,\n useMenubarSubContext,\n} from './context'\nimport { useMenubar } from './use-menubar'\n\ntype MenubarProps = MenubarSchema['props']\n\n/** 在 ref 回调中把节点按 value 登记进菜单栏取值表,value 变更时迁移到新键,卸载时注销 */\nfunction useMenubarPart(register: MenubarPartRegistry, value: () => string): (el: HTMLElement | null) => void {\n const node = ref<HTMLElement | null>(null)\n watch(value, (next, prev) => {\n if (next === prev)\n return\n register(prev, null)\n register(next, node.value)\n })\n onBeforeUnmount(() => register(value(), null))\n return (el) => {\n node.value = el\n register(value(), el)\n }\n}\n\n/** 默认插槽的载荷:当前展开的菜单项、是否有菜单展开,以及切换展开项的命令。 */\nexport type MenubarRootSlotProps = Pick<MenubarApi, 'value' | 'open' | 'setValue' | 'checkboxValue' | 'radioValue' | 'setCheckboxValue' | 'setRadioValue'>\n\n/** role=menubar 根节点:trigger 的 roving tabindex 作用域,各菜单浮层也挂在其内 */\n/** 代铺条目时可逐槽接管的三个插槽;三个都不写即完全按数据铺。 */\nexport interface MenubarItemSlots {\n /** 只填条目的文字槽,其余槽照旧由数据铺。 */\n item?: (node: MenubarNodeMeta) => VNode[]\n /** 只接管行首那一格,其余槽照旧由数据铺。 */\n ['item-prefix']?: (node: MenubarNodeMeta) => VNode[]\n /** 只接管行尾那一格(计数、徽标、次级图标),其余槽照旧由数据铺。 */\n ['item-suffix']?: (node: MenubarNodeMeta) => VNode[]\n}\n\nexport const XhMenubarRoot = defineComponent({\n name: 'XhMenubarRoot',\n // 缺省值由机器与 connect 决定;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n collection: { type: Array as PropType<MenubarNode[]> },\n checkboxValue: { type: Array as PropType<string[]> },\n defaultCheckboxValue: { type: Array as PropType<string[]> },\n radioValue: { type: Object as PropType<MenubarRadioValue> },\n defaultRadioValue: { type: Object as PropType<MenubarRadioValue> },\n value: { type: String as PropType<string | null> },\n defaultValue: { type: String as PropType<string | null> },\n orientation: { type: String as PropType<Orientation> },\n loop: { type: Boolean, default: undefined },\n dir: { type: String as PropType<Direction> },\n disabled: { type: Boolean, default: undefined },\n typeahead: { type: Boolean, default: undefined },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n translations: { type: Object as PropType<MenubarProps['translations']> },\n },\n // value-change 携带 { value }、select 携带 { menu, value },update:value 携带裸值\n emits: {\n 'value-change': (_details: PayloadOf<MenubarProps, 'onValueChange'>) => true,\n 'select': (_details: PayloadOf<MenubarProps, 'onSelect'>) => true,\n 'checkbox-value-change': (_details: PayloadOf<MenubarProps, 'onCheckboxValueChange'>) => true,\n 'radio-value-change': (_details: PayloadOf<MenubarProps, 'onRadioValueChange'>) => true,\n 'update:value': (_value: PayloadOf<MenubarProps, 'onValueChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n 'default'?: (props: MenubarRootSlotProps) => VNode[]\n /** 只填条目的文字槽,标记位、副文本与快捷键照旧由数据铺 */\n 'item'?: (node: MenubarNodeMeta) => VNode[]\n /** 只接管行首那一格,其余槽照旧由数据铺 */\n 'item-prefix'?: (node: MenubarNodeMeta) => VNode[]\n /** 只接管行尾那一格(计数、徽标、次级图标),其余槽照旧由数据铺 */\n 'item-suffix'?: (node: MenubarNodeMeta) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: MenubarProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifySelect: MenubarProps['onSelect'] = details => emit('select', details)\n const ctx = useMenubar(\n withXhConfig('menubar', props) as MenubarProps,\n notifyValue,\n notifySelect,\n details => emit('checkbox-value-change', details),\n details => emit('radio-value-change', details),\n )\n provideMenubar(ctx)\n return () => h('div', {\n ...ctx.api.value.getRootProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.rootRef.value = el as HTMLElement },\n }, slots.default\n ? slots.default({\n value: ctx.api.value.value,\n open: ctx.api.value.open,\n setValue: ctx.api.value.setValue,\n checkboxValue: ctx.api.value.checkboxValue,\n radioValue: ctx.api.value.radioValue,\n setCheckboxValue: ctx.api.value.setCheckboxValue,\n setRadioValue: ctx.api.value.setRadioValue,\n })\n : props.collection\n ? renderDefaultTree(ctx.api.value.collection, { 'item': slots.item, 'item-prefix': slots['item-prefix'], 'item-suffix': slots['item-suffix'] })\n : [])\n },\n})\n\nexport const XhMenubarTrigger = defineComponent({\n name: 'XhMenubarTrigger',\n // 直通属性自己合:Vue 默认把作者的处理器排在部件的后面,这里改成作者先跑\n inheritAttrs: false,\n props: {\n value: { type: String, required: true },\n // 缺省交给 connect 回 collection 里查,写死 false 会盖掉数据里的禁用\n disabled: { type: Boolean, default: undefined },\n /** 借用作者的子节点作为触发器,不再渲染自己的包裹元素;子节点须恰好一个。 */\n asChild: Boolean,\n },\n setup(props, { slots, attrs }) {\n const ctx = useMenubarContext()\n // trigger 同时作为定位锚点与焦点归还目标\n const setEl = useMenubarPart(ctx.registerTrigger, () => props.value)\n // 本入口持有焦点时,value 变更重报焦点入口,卸载时上报菜单栏失焦\n const triggerEl = ref<HTMLElement | null>(null)\n watch(() => props.value, (next, prev) => {\n if (next === prev)\n return\n const { service } = ctx\n if (service.getStatus() !== 'Started')\n return\n if (triggerEl.value && service.scope.getActiveElement() === triggerEl.value)\n service.send({ type: 'TRIGGER.FOCUS', value: next, disabled: props.disabled })\n })\n onBeforeUnmount(() => {\n const { service } = ctx\n // 整条栏一起卸载时根部件先停机,此刻送事件会在 dev 下抛\n if (service.getStatus() !== 'Started')\n return\n // 按「本入口当下正持有焦点」判定,不按 value 比对\n if (triggerEl.value && service.scope.getActiveElement() === triggerEl.value)\n service.send({ type: 'MENUBAR.BLUR' })\n })\n return () => {\n const part = mergePartProps({\n ...ctx.api.value.getTriggerProps({ value: props.value, disabled: props.disabled }) as Record<string, unknown>,\n ref: (el: unknown) => {\n triggerEl.value = el as HTMLElement | null\n setEl(el as HTMLElement | null)\n },\n }, attrs)\n const children = slots.default?.()\n // asChild:把触发器属性合到作者的节点上,不再自己渲染包裹元素\n if (props.asChild) {\n const merged = mergeIntoChild(children, part, 'menubar')\n if (merged)\n return merged\n }\n return h('button', part, children)\n }\n },\n})\n\nexport const XhMenubarPositioner = defineComponent({\n name: 'XhMenubarPositioner',\n props: {\n value: { type: String, required: true },\n /** 本实例的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useMenubarContext()\n const menu = computed<MenubarContentProps>(() => ({ value: props.value }))\n // 供内部 content 继承 value,并把它的内容节点写回来给自绘条\n const contentRef = ref<HTMLElement | null>(null)\n provideMenubarMenu({ menu, contentRef })\n const setEl = useMenubarPart(ctx.registerPositioner, () => props.value)\n // 这张菜单的条目列表的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner;\n // 一张菜单一套,浮层里的条子走 4px 档\n const bars = useScrollbars({ scrollable: () => contentRef.value, props: { size: 'sm' } })\n // 每张菜单各搬各的定位层到 portal 落点,逃开祖先的层叠上下文\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.rootRef }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps(menu.value) as Record<string, unknown>, attrs),\n ref: (el: unknown) => setEl(el as HTMLElement | null),\n }, [...(slots.default?.() ?? []), ...bars.render()]),\n ])\n },\n})\n\nexport const XhMenubarContent = defineComponent({\n name: 'XhMenubarContent',\n props: {\n // 缺省时沿用外层 positioner 提供的身份,无 positioner 时必填\n value: { type: String },\n },\n setup(props, { slots }) {\n const ctx = useMenubarContext()\n const inherited = useMenubarMenuContext()\n if (props.value == null && !inherited)\n throw new Error('[xh] XhMenubarContent 必须写在 XhMenubarPositioner 内,或自带 value')\n const menu = computed<MenubarContentProps>(() => ({ value: props.value ?? inherited!.menu.value.value }))\n const setEl = useMenubarPart(ctx.registerContent, () => menu.value.value)\n // 一个菜单一份退场闸门:它们各开各的、动画各跑各的,一份管不过来。\n // 开合判据直接取 connect 这一帧的产出,不另起一套——两边各判一次迟早会说岔\n const contentRef = ref<HTMLElement | null>(null)\n let presence: PresenceHandle | null = null\n let presenceValue: string | null = null\n const sendPresence = (event: MenubarSchema['event']): void => {\n const deliver = (): void => {\n if (ctx.service.getStatus() === 'Started')\n ctx.service.send(event)\n }\n if (ctx.service.getStatus() === 'Started')\n deliver()\n else\n queueMicrotask(deliver)\n }\n const visible = useOverlayExit({\n config: typeof document === 'undefined' ? null : createRuntimeConfig(),\n isOpen: () => (ctx.api.value.getContentProps(menu.value) as Record<string, unknown>).hidden !== true,\n contentRef,\n onPresence: (next) => {\n const previous = presence\n const previousValue = presenceValue\n presence = next\n presenceValue = next ? menu.value.value : null\n if (next)\n sendPresence({ type: 'PRESENCE.SET', value: presenceValue!, presence: next, connected: true })\n else if (previous && previousValue != null)\n sendPresence({ type: 'PRESENCE.SET', value: previousValue, presence: previous, connected: false })\n },\n })\n return () => h('div', {\n ...ctx.api.value.getContentProps(menu.value) as Record<string, unknown>,\n // 收起跟着闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场就一帧都\n // 播不出来),所以真正的收起落成内联 display\n style: visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => {\n contentRef.value = el as HTMLElement | null\n setEl(el as HTMLElement | null)\n // 写回给外层 positioner:它按这个节点配自绘条\n if (inherited)\n inherited.contentRef.value = el as HTMLElement | null\n },\n }, slots.default?.())\n },\n})\n\nexport const XhMenubarGroup = defineComponent({\n name: 'XhMenubarGroup',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useMenubarContext()\n const group = computed<MenubarGroupProps>(() => ({ value: props.value }))\n provideMenubarGroup({ group })\n return () => h('div', ctx.api.value.getGroupProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhMenubarRadioGroup = defineComponent({\n name: 'XhMenubarRadioGroup',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useMenubarContext()\n const group = computed<MenubarGroupProps>(() => ({ value: props.value }))\n provideMenubarGroup({ group })\n return () => h('div', ctx.api.value.getRadioGroupProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhMenubarGroupLabel = defineComponent({\n name: 'XhMenubarGroupLabel',\n setup(_, { slots }) {\n const ctx = useMenubarContext()\n const { group } = useMenubarGroupContext()\n return () => h('span', ctx.api.value.getGroupLabelProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nfunction createMenubarItemComponent(name: string, kind: 'item' | 'checkbox' | 'radio'): ReturnType<typeof defineComponent> {\n return defineComponent({\n name,\n props: {\n value: { type: String, required: true },\n disabled: { type: Boolean, default: undefined },\n closeOnSelect: { type: Boolean, default: undefined },\n },\n setup(props, { slots }) {\n const ctx = useMenubarContext()\n const radioGroup = kind === 'radio' ? useMenubarGroupContext() : null\n const item = computed<MenubarAnyItemProps>(() => kind === 'radio'\n ? { value: props.value, disabled: props.disabled, closeOnSelect: props.closeOnSelect, kind, group: radioGroup!.group.value.value }\n : kind === 'checkbox'\n ? { value: props.value, disabled: props.disabled, closeOnSelect: props.closeOnSelect, kind }\n : { value: props.value, disabled: props.disabled, kind })\n provideMenubarItem({ item })\n // 本条目持有焦点时,value 变更重报焦点条目,卸载时上报焦点丢失\n const itemEl = ref<HTMLElement | null>(null)\n watch(() => props.value, (next, prev) => {\n if (next === prev)\n return\n const { service } = ctx\n if (service.getStatus() !== 'Started')\n return\n if (itemEl.value && service.scope.getActiveElement() === itemEl.value)\n service.send({ type: 'ITEM.FOCUS', value: next })\n })\n onBeforeUnmount(() => {\n const { service } = ctx\n // 整组一起卸载时根部件先停机,此刻送事件会在 dev 下抛\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 () => {\n const declaration = item.value\n const part = declaration.kind === 'checkbox'\n ? ctx.api.value.getCheckboxItemProps(declaration)\n : declaration.kind === 'radio'\n ? ctx.api.value.getRadioItemProps(declaration)\n : ctx.api.value.getItemProps(declaration)\n return h('div', { ...part as Record<string, unknown>, ref: itemEl }, slots.default?.())\n }\n },\n })\n}\n\nexport const XhMenubarItem = /* @__PURE__ */ createMenubarItemComponent('XhMenubarItem', 'item')\nexport const XhMenubarCheckboxItem = /* @__PURE__ */ createMenubarItemComponent('XhMenubarCheckboxItem', 'checkbox')\nexport const XhMenubarRadioItem = /* @__PURE__ */ createMenubarItemComponent('XhMenubarRadioItem', 'radio')\n\nexport const XhMenubarItemText = defineComponent({\n name: 'XhMenubarItemText',\n setup(_, { slots }) {\n const ctx = useMenubarContext()\n const { item } = useMenubarItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhMenubarItemIndicator = defineComponent({\n name: 'XhMenubarItemIndicator',\n setup(_, { slots }) {\n const ctx = useMenubarContext()\n const { item } = useMenubarItemContext()\n return () => h('span', ctx.api.value.getItemIndicatorProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目中的副文本,排在文字下一行 */\nexport const XhMenubarItemDescription = defineComponent({\n name: 'XhMenubarItemDescription',\n setup(_, { slots }) {\n const ctx = useMenubarContext()\n const { item } = useMenubarItemContext()\n return () => h('span', ctx.api.value.getItemDescriptionProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目中的快捷键提示,贴行尾;纯装饰,读屏从条目文字取意 */\nexport const XhMenubarItemShortcut = defineComponent({\n name: 'XhMenubarItemShortcut',\n setup(_, { slots }) {\n const ctx = useMenubarContext()\n const { item } = useMenubarItemContext()\n return () => h('span', ctx.api.value.getItemShortcutProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目行尾的作者内容(计数、徽标、次级图标);家族只管落位,不规定字号与颜色 */\nexport const XhMenubarItemSuffix = defineComponent({\n name: 'XhMenubarItemSuffix',\n setup(_, { slots }) {\n const ctx = useMenubarContext()\n const { item } = useMenubarItemContext()\n return () => h('span', ctx.api.value.getItemSuffixProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 指向本菜单锚点的箭头,纯装饰;须写在同一菜单的 positioner 中 */\nexport const XhMenubarArrow = defineComponent({\n name: 'XhMenubarArrow',\n setup() {\n const ctx = useMenubarContext()\n const menu = useMenubarMenuContext()\n if (!menu)\n throw new Error('[xh] XhMenubarArrow 必须用在 XhMenubarPositioner 内')\n return () => h('div', ctx.api.value.getArrowProps(menu.menu.value) as Record<string, unknown>)\n },\n})\n\nexport const XhMenubarSeparator = defineComponent({\n name: 'XhMenubarSeparator',\n setup() {\n const ctx = useMenubarContext()\n return () => h('div', ctx.api.value.getSeparatorProps() as Record<string, unknown>)\n },\n})\n\n/**\n * 未写默认插槽时按 collection 铺开的整套结构,作者只提供数据。\n * 一排入口排在前、各自菜单的浮层排在后,与手写部件产出的 DOM 完全一致;\n * 需要修改结构时写默认插槽,行为不变。\n */\nfunction renderDefaultTree(\n collection: readonly MenubarNodeMeta[],\n itemSlots: MenubarItemSlots,\n): VNode[] {\n return [\n ...collection.map(menu =>\n h(XhMenubarTrigger, { key: `trigger:${menu.value}`, value: menu.value }, () => menu.label),\n ),\n ...collection.map(menu =>\n h(XhMenubarPositioner, { key: `positioner:${menu.value}`, value: menu.value }, () => [\n h(XhMenubarContent, null, () => renderNodes(menu.items, itemSlots)),\n ]),\n ),\n ]\n}\n\n/**\n * 单个条目:文字在上,副文本在下,未提供副文本时不铺设该部件。\n * `item-prefix` / `item-suffix` 插槽各接管首尾一格,其余槽照旧由数据铺。\n */\nfunction renderNode(\n meta: MenubarNodeMeta,\n itemSlots: MenubarItemSlots,\n): VNode {\n const prefix = itemSlots['item-prefix']\n const suffix = itemSlots['item-suffix']\n const Item = meta.kind === 'checkbox' ? XhMenubarCheckboxItem : meta.kind === 'radio' ? XhMenubarRadioItem : XhMenubarItem\n return h(Item, { key: meta.value, value: meta.value, closeOnSelect: meta.closeOnSelect }, () => [\n ...(prefix\n ? [h(XhMenubarItemIndicator, null, () => prefix(meta))]\n : meta.kind !== 'item' ? [h(XhMenubarItemIndicator)] : []),\n h(XhMenubarItemText, null, () => itemSlots.item?.(meta) ?? meta.label),\n ...(meta.description != null ? [h(XhMenubarItemDescription, null, () => meta.description)] : []),\n ...(meta.shortcut != null ? [h(XhMenubarItemShortcut, null, () => meta.shortcut)] : []),\n ...(suffix ? [h(XhMenubarItemSuffix, null, () => suffix(meta))] : []),\n ])\n}\n\n/** content 的内容:分组段铺为 group,段首的分隔线落在 group 外面。 */\nfunction renderNodes(\n collection: readonly MenubarNodeMeta[],\n itemSlots: MenubarItemSlots,\n): VNode[] {\n return groupAdjacentRuns(collection, node => node.group).flatMap((run, runIndex) => {\n const head = run[0]!\n // 首条上的标记不产出分隔线:菜单开头不留一道空隔\n const lead = runIndex > 0 && head.separatorBefore\n ? [h(XhMenubarSeparator, { key: `separator:${head.value}` })]\n : []\n if (head.group == null)\n return [...lead, renderNode(head, itemSlots)]\n const groupLabel = run.find(node => node.groupLabel != null)?.groupLabel ?? null\n return [\n ...lead,\n h(head.kind === 'radio' ? XhMenubarRadioGroup : XhMenubarGroup, { key: `group:${head.group}`, value: head.group }, () => [\n ...(groupLabel != null ? [h(XhMenubarGroupLabel, null, () => groupLabel)] : []),\n ...run.flatMap((node, index) => [\n ...(index > 0 && node.separatorBefore ? [h(XhMenubarSeparator, { key: `separator:${node.value}` })] : []),\n renderNode(node, itemSlots),\n ]),\n ]),\n ]\n })\n}\n\n/** XhMenubarSub 默认插槽得到的载荷。 */\nexport interface MenubarSubSlotProps {\n open: boolean\n setOpen: (next: boolean) => void\n}\n\nexport const XhMenubarSub = defineComponent({\n name: 'XhMenubarSub',\n props: {\n /** 它在所属菜单中的条目身份。 */\n value: { type: String, required: true },\n disabled: { type: Boolean, default: undefined },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n loop: { type: Boolean, default: undefined },\n openOnHover: { type: Boolean, default: undefined },\n hoverOpenDelay: { type: Number },\n hoverCloseDelay: { type: Number },\n /** 文字方向;默认继承父层。子层被迁移到浮层落点,无法继承父层的方向。 */\n dir: { type: String as PropType<Direction> },\n /** 语气;默认继承父层。子层是浮层落点下的同级节点,CSS 私有槽无法继承。 */\n tone: { type: String as PropType<Tone> },\n /** 尺寸;默认继承父层,理由同 tone。 */\n size: { type: String as PropType<Size> },\n },\n slots: Object as SlotsType<{\n default?: (props: MenubarSubSlotProps) => VNode[]\n }>,\n setup(props, { slots }) {\n const parent = useMenubarContext()\n const owner = useMenubarMenuContext()\n if (!owner)\n throw new Error('[xh] MenubarSub 必须用在 XhMenubarPositioner 内')\n // 子层跑的是一台子菜单模式的 menu 机器:菜单栏那台是单机器单锚点,装不下第二层\n const sub = useMenuWithParent(\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 },\n undefined,\n parent.tree,\n )\n // 子树内的 XhMenu 系部件都归子机器\n provideMenu(sub)\n provideMenubarSub({ parent, value: props.value, disabled: props.disabled })\n // 所属那张菜单收起时本层跟着收,层层传导\n watch(() => parent.api.value.isOpen(owner.menu.value.value), (open) => {\n if (!open)\n sub.api.value.setOpen(false)\n })\n return () => slots.default?.({ open: sub.api.value.open, setOpen: sub.api.value.setOpen })\n },\n})\n\nexport const XhMenubarSubTrigger = defineComponent({\n name: 'XhMenubarSubTrigger',\n setup(_, { slots }) {\n const handle = useMenubarSubContext()\n const sub = useMenuContext()\n return () => h('div', {\n // 合并序=子先父后:父层的 data-scope/data-part 胜出,菜单栏的方向键与选中照常认它。\n // 反过来写会让节点带上 data-scope=\"menu\",菜单栏按自己的 scope 查条目就一条都找不到\n ...mergeProps(\n sub.api.value.getSubmenuTriggerProps({ value: handle.value, disabled: handle.disabled }) as Record<string, unknown>,\n handle.parent.api.value.getItemProps({ value: handle.value, disabled: handle.disabled }) as Record<string, unknown>,\n ),\n // 子菜单的定位锚点就是这一条\n ref: (el: unknown) => {\n sub.triggerRef.value = el as HTMLElement\n },\n }, slots.default?.())\n },\n})\n"],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ interface MenubarContext {
|
|
|
16
16
|
/** 浮层迁移到的位置:全局配置的容器 > 运行时的浮层落点 > body。 */
|
|
17
17
|
portalTarget: ComputedRef<string | Element>;
|
|
18
18
|
}
|
|
19
|
-
declare function useMenubar(props: MenubarSchema['props'], onValueChange?: MenubarSchema['props']['onValueChange'], onSelect?: MenubarSchema['props']['onSelect']): MenubarContext;
|
|
19
|
+
declare function useMenubar(props: MenubarSchema['props'], onValueChange?: MenubarSchema['props']['onValueChange'], onSelect?: MenubarSchema['props']['onSelect'], onCheckboxValueChange?: MenubarSchema['props']['onCheckboxValueChange'], onRadioValueChange?: MenubarSchema['props']['onRadioValueChange']): MenubarContext;
|
|
20
20
|
//#endregion
|
|
21
21
|
export { MenubarContext, MenubarPartRegistry, useMenubar };
|
|
22
22
|
//# sourceMappingURL=use-menubar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-menubar.d.ts","names":[],"sources":["../../../src/components/menubar/use-menubar.ts"],"mappings":";;;;;KAoBY,uBAAuB,eAAe,IAAI;UAErC;EACf,SAAS,QAAQ;EACjB,KAAK,YAAY;EACjB,SAAS,IAAI;EACb,iBAAiB;EACjB,oBAAoB;EACpB,iBAAiB;;EAEjB,MAAM;;EAEN,cAAc,qBAAqB;;iBAGrB,WACd,OAAO,wBACP,gBAAgB,yCAChB,WAAW,
|
|
1
|
+
{"version":3,"file":"use-menubar.d.ts","names":[],"sources":["../../../src/components/menubar/use-menubar.ts"],"mappings":";;;;;KAoBY,uBAAuB,eAAe,IAAI;UAErC;EACf,SAAS,QAAQ;EACjB,KAAK,YAAY;EACjB,SAAS,IAAI;EACb,iBAAiB;EACjB,oBAAoB;EACpB,iBAAiB;;EAEjB,MAAM;;EAEN,cAAc,qBAAqB;;iBAGrB,WACd,OAAO,wBACP,gBAAgB,yCAChB,WAAW,oCACX,wBAAwB,iDACxB,qBAAqB,+CACpB"}
|
|
@@ -7,7 +7,7 @@ import { createRuntimeConfig, createScope } from "@xihan-ui/core";
|
|
|
7
7
|
import { connectMenubar, createMenuTreeNode, menubarMachine } from "@xihan-ui/headless";
|
|
8
8
|
import { createPositionEngine } from "@xihan-ui/position";
|
|
9
9
|
//#region src/components/menubar/use-menubar.ts
|
|
10
|
-
function useMenubar(props, onValueChange, onSelect) {
|
|
10
|
+
function useMenubar(props, onValueChange, onSelect, onCheckboxValueChange, onRadioValueChange) {
|
|
11
11
|
const xhConfig = useXhConfig();
|
|
12
12
|
const rootRef = ref(null);
|
|
13
13
|
const triggers = /* @__PURE__ */ new Map();
|
|
@@ -35,7 +35,9 @@ function useMenubar(props, onValueChange, onSelect) {
|
|
|
35
35
|
service = useMachine(menubarMachine, () => ({
|
|
36
36
|
...props,
|
|
37
37
|
onValueChange,
|
|
38
|
-
onSelect
|
|
38
|
+
onSelect,
|
|
39
|
+
onCheckboxValueChange,
|
|
40
|
+
onRadioValueChange
|
|
39
41
|
}), scope);
|
|
40
42
|
const put = (table) => (value, el) => {
|
|
41
43
|
if (el) table.set(value, el);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-menubar.js","names":[],"sources":["../../../src/components/menubar/use-menubar.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 use menubar 相关实现。\n\nimport type { Cleanup, Layer, RuntimeConfig, Service } from '@xihan-ui/core'\nimport type { MenubarApi, MenubarSchema, MenuTreeNode } from '@xihan-ui/headless'\nimport type { ComputedRef, Ref } from 'vue'\nimport { createRuntimeConfig, createScope } from '@xihan-ui/core'\nimport { connectMenubar, createMenuTreeNode, menubarMachine } from '@xihan-ui/headless'\nimport { createPositionEngine } from '@xihan-ui/position'\nimport { computed, ref, shallowReactive } from 'vue'\nimport { useXhConfig } from '../../config/config'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\n/** 按 value 登记角色节点,浮层三件套据此取到当前展开的菜单项。 */\nexport type MenubarPartRegistry = (value: string, el: HTMLElement | null) => void\n\nexport interface MenubarContext {\n service: Service<MenubarSchema>\n api: ComputedRef<MenubarApi>\n rootRef: Ref<HTMLElement | null>\n registerTrigger: MenubarPartRegistry\n registerPositioner: MenubarPartRegistry\n registerContent: MenubarPartRegistry\n /** 子菜单经 Portal 分离后的逻辑父节点。 */\n tree: MenuTreeNode\n /** 浮层迁移到的位置:全局配置的容器 > 运行时的浮层落点 > body。 */\n portalTarget: ComputedRef<string | Element>\n}\n\nexport function useMenubar(\n props: MenubarSchema['props'],\n onValueChange?: MenubarSchema['props']['onValueChange'],\n onSelect?: MenubarSchema['props']['onSelect'],\n): MenubarContext {\n const xhConfig = useXhConfig()\n const rootRef = ref<HTMLElement | null>(null)\n // 触发器只在事件与效应里被机器读,普通 Map 即可;定位层与内容还要派生「当前展开那张」的两支 ref\n // (层注册的 node 与分支读它们),登记表得是响应式的,菜单后到时派生值才跟着更新\n const triggers = new Map<string, HTMLElement>()\n const positioners = shallowReactive(new Map<string, HTMLElement>())\n const contents = shallowReactive(new Map<string, HTMLElement>())\n\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n let service: Service<MenubarSchema> | null = null\n const tree = createMenuTreeNode({\n getPositioner: () => {\n const value = service?.context.get('value') ?? null\n return value == null ? null : positioners.get(value) ?? null\n },\n isOpen: () => service?.state.get() === 'open',\n close: () => service?.send({ type: 'CLOSE' }),\n isRoot: () => true,\n onRootSelect: (details) => {\n const menu = service?.context.get('value') ?? null\n if (menu != null)\n onSelect?.({ menu, value: details.value })\n },\n })\n service = useMachine(menubarMachine, () => ({ ...props, onValueChange, onSelect }), scope)\n\n const put = (table: Map<string, HTMLElement>): MenubarPartRegistry => (value, el) => {\n if (el)\n table.set(value, el)\n else\n table.delete(value)\n }\n const current = (table: Map<string, HTMLElement>) => (): HTMLElement | null => {\n const value = service.context.get('value') ?? null\n return value == null ? null : table.get(value) ?? null\n }\n // 当前展开那张菜单的定位层与内容:层注册按它们记 node 与分支\n const positionerRef = computed(current(positioners))\n const contentRef = computed(current(contents))\n\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: () => [rootRef.value, positionerRef.value].filter(Boolean) as Element[],\n isModal: () => false,\n // 菜单不带遮罩,没有可点关闭的表面\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', current(triggers))\n service.refs.set('getFloatingEl', current(positioners))\n service.refs.set('getContentEl', current(contents))\n service.refs.set('getRootEl', () => rootRef.value)\n }\n\n const api = computed(() => connectMenubar(service, vueNormalize))\n // 全局配置写了容器就用它,否则落到运行时那个单一浮层落点;没有 DOM 时才回到 body\n const portalTarget = computed<string | Element>(() => xhConfig.value.portalContainer?.() ?? config?.portalContainer() ?? 'body')\n\n return {\n service,\n api,\n rootRef,\n registerTrigger: put(triggers),\n registerPositioner: put(positioners),\n registerContent: put(contents),\n tree,\n portalTarget,\n }\n}\n"],"mappings":";;;;;;;;;AAmCA,SAAgB,WACd,OACA,eACA,
|
|
1
|
+
{"version":3,"file":"use-menubar.js","names":[],"sources":["../../../src/components/menubar/use-menubar.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 use menubar 相关实现。\n\nimport type { Cleanup, Layer, RuntimeConfig, Service } from '@xihan-ui/core'\nimport type { MenubarApi, MenubarSchema, MenuTreeNode } from '@xihan-ui/headless'\nimport type { ComputedRef, Ref } from 'vue'\nimport { createRuntimeConfig, createScope } from '@xihan-ui/core'\nimport { connectMenubar, createMenuTreeNode, menubarMachine } from '@xihan-ui/headless'\nimport { createPositionEngine } from '@xihan-ui/position'\nimport { computed, ref, shallowReactive } from 'vue'\nimport { useXhConfig } from '../../config/config'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\n/** 按 value 登记角色节点,浮层三件套据此取到当前展开的菜单项。 */\nexport type MenubarPartRegistry = (value: string, el: HTMLElement | null) => void\n\nexport interface MenubarContext {\n service: Service<MenubarSchema>\n api: ComputedRef<MenubarApi>\n rootRef: Ref<HTMLElement | null>\n registerTrigger: MenubarPartRegistry\n registerPositioner: MenubarPartRegistry\n registerContent: MenubarPartRegistry\n /** 子菜单经 Portal 分离后的逻辑父节点。 */\n tree: MenuTreeNode\n /** 浮层迁移到的位置:全局配置的容器 > 运行时的浮层落点 > body。 */\n portalTarget: ComputedRef<string | Element>\n}\n\nexport function useMenubar(\n props: MenubarSchema['props'],\n onValueChange?: MenubarSchema['props']['onValueChange'],\n onSelect?: MenubarSchema['props']['onSelect'],\n onCheckboxValueChange?: MenubarSchema['props']['onCheckboxValueChange'],\n onRadioValueChange?: MenubarSchema['props']['onRadioValueChange'],\n): MenubarContext {\n const xhConfig = useXhConfig()\n const rootRef = ref<HTMLElement | null>(null)\n // 触发器只在事件与效应里被机器读,普通 Map 即可;定位层与内容还要派生「当前展开那张」的两支 ref\n // (层注册的 node 与分支读它们),登记表得是响应式的,菜单后到时派生值才跟着更新\n const triggers = new Map<string, HTMLElement>()\n const positioners = shallowReactive(new Map<string, HTMLElement>())\n const contents = shallowReactive(new Map<string, HTMLElement>())\n\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n let service: Service<MenubarSchema> | null = null\n const tree = createMenuTreeNode({\n getPositioner: () => {\n const value = service?.context.get('value') ?? null\n return value == null ? null : positioners.get(value) ?? null\n },\n isOpen: () => service?.state.get() === 'open',\n close: () => service?.send({ type: 'CLOSE' }),\n isRoot: () => true,\n onRootSelect: (details) => {\n const menu = service?.context.get('value') ?? null\n if (menu != null)\n onSelect?.({ menu, value: details.value })\n },\n })\n service = useMachine(menubarMachine, () => ({ ...props, onValueChange, onSelect, onCheckboxValueChange, onRadioValueChange }), scope)\n\n const put = (table: Map<string, HTMLElement>): MenubarPartRegistry => (value, el) => {\n if (el)\n table.set(value, el)\n else\n table.delete(value)\n }\n const current = (table: Map<string, HTMLElement>) => (): HTMLElement | null => {\n const value = service.context.get('value') ?? null\n return value == null ? null : table.get(value) ?? null\n }\n // 当前展开那张菜单的定位层与内容:层注册按它们记 node 与分支\n const positionerRef = computed(current(positioners))\n const contentRef = computed(current(contents))\n\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: () => [rootRef.value, positionerRef.value].filter(Boolean) as Element[],\n isModal: () => false,\n // 菜单不带遮罩,没有可点关闭的表面\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', current(triggers))\n service.refs.set('getFloatingEl', current(positioners))\n service.refs.set('getContentEl', current(contents))\n service.refs.set('getRootEl', () => rootRef.value)\n }\n\n const api = computed(() => connectMenubar(service, vueNormalize))\n // 全局配置写了容器就用它,否则落到运行时那个单一浮层落点;没有 DOM 时才回到 body\n const portalTarget = computed<string | Element>(() => xhConfig.value.portalContainer?.() ?? config?.portalContainer() ?? 'body')\n\n return {\n service,\n api,\n rootRef,\n registerTrigger: put(triggers),\n registerPositioner: put(positioners),\n registerContent: put(contents),\n tree,\n portalTarget,\n }\n}\n"],"mappings":";;;;;;;;;AAmCA,SAAgB,WACd,OACA,eACA,UACA,uBACA,oBACgB;CAChB,MAAM,WAAW,YAAY;CAC7B,MAAM,UAAU,IAAwB,IAAI;CAG5C,MAAM,2BAAW,IAAI,IAAyB;CAC9C,MAAM,cAAc,gCAAgB,IAAI,IAAyB,CAAC;CAClE,MAAM,WAAW,gCAAgB,IAAI,IAAyB,CAAC;CAE/D,MAAM,QAAQ,qBAAqB;CACnC,MAAM,QAAQ,YAAY,MAAM,KAAK;CACrC,IAAI,UAAyC;CAC7C,MAAM,OAAO,mBAAmB;EAC9B,qBAAqB;GACnB,MAAM,QAAQ,SAAS,QAAQ,IAAI,OAAO,KAAK;GAC/C,OAAO,SAAS,OAAO,OAAO,YAAY,IAAI,KAAK,KAAK;EAC1D;EACA,cAAc,SAAS,MAAM,IAAI,MAAM;EACvC,aAAa,SAAS,KAAK,EAAE,MAAM,QAAQ,CAAC;EAC5C,cAAc;EACd,eAAe,YAAY;GACzB,MAAM,OAAO,SAAS,QAAQ,IAAI,OAAO,KAAK;GAC9C,IAAI,QAAQ,MACV,WAAW;IAAE;IAAM,OAAO,QAAQ;GAAM,CAAC;EAC7C;CACF,CAAC;CACD,UAAU,WAAW,uBAAuB;EAAE,GAAG;EAAO;EAAe;EAAU;EAAuB;CAAmB,IAAI,KAAK;CAEpI,MAAM,OAAO,WAA0D,OAAO,OAAO;EACnF,IAAI,IACF,MAAM,IAAI,OAAO,EAAE;OAEnB,MAAM,OAAO,KAAK;CACtB;CACA,MAAM,WAAW,gBAA8D;EAC7E,MAAM,QAAQ,QAAQ,QAAQ,IAAI,OAAO,KAAK;EAC9C,OAAO,SAAS,OAAO,OAAO,MAAM,IAAI,KAAK,KAAK;CACpD;CAEA,MAAM,gBAAgB,SAAS,QAAQ,WAAW,CAAC;CACnD,MAAM,aAAa,SAAS,QAAQ,QAAQ,CAAC;CAE7C,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,QAAQ,OAAO,cAAc,KAAK,CAAC,CAAC,OAAO,OAAO;GACnE,eAAe;GAEf,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,eAAe,QAAQ,QAAQ,CAAC;EACjD,QAAQ,KAAK,IAAI,iBAAiB,QAAQ,WAAW,CAAC;EACtD,QAAQ,KAAK,IAAI,gBAAgB,QAAQ,QAAQ,CAAC;EAClD,QAAQ,KAAK,IAAI,mBAAmB,QAAQ,KAAK;CACnD;CAEA,MAAM,MAAM,eAAe,eAAe,SAAS,YAAY,CAAC;CAEhE,MAAM,eAAe,eAAiC,SAAS,MAAM,kBAAkB,KAAK,QAAQ,gBAAgB,KAAK,MAAM;CAE/H,OAAO;EACL;EACA;EACA;EACA,iBAAiB,IAAI,QAAQ;EAC7B,oBAAoB,IAAI,WAAW;EACnC,iBAAiB,IAAI,QAAQ;EAC7B;EACA;CACF;AACF"}
|
|
@@ -102,9 +102,21 @@ declare const XhMessageFeedItemLabel: import("vue").DefineComponent<{}, () => VN
|
|
|
102
102
|
declare const XhMessageFeedScrollToEndTrigger: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
103
103
|
[key: string]: any;
|
|
104
104
|
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
105
|
+
/** 回到底部按钮上的未读数:放进按钮里;插槽留空时显示条数,没有未读时收起。 */
|
|
106
|
+
declare const XhMessageFeedUnreadCount: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
107
|
+
[key: string]: any;
|
|
108
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
109
|
+
/** 消息之间的分隔(按日期分组):是内容层的直接子节点、与条目平级,对读屏隐藏。 */
|
|
110
|
+
declare const XhMessageFeedSeparator: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
111
|
+
[key: string]: any;
|
|
112
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
113
|
+
/** 已发送、等首个片段时的呼吸点:放在列表之后,只在 status 为 submitted 时出现。 */
|
|
114
|
+
declare const XhMessageFeedPendingIndicator: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
115
|
+
[key: string]: any;
|
|
116
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
105
117
|
declare const XhMessageFeedLiveRegion: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
106
118
|
[key: string]: any;
|
|
107
119
|
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
108
120
|
//#endregion
|
|
109
|
-
export { MessageFeedRootSlotProps, XhMessageFeedItem, XhMessageFeedItemLabel, XhMessageFeedList, XhMessageFeedLiveRegion, XhMessageFeedRoot, XhMessageFeedScrollToEndTrigger, XhMessageFeedViewport };
|
|
121
|
+
export { MessageFeedRootSlotProps, XhMessageFeedItem, XhMessageFeedItemLabel, XhMessageFeedList, XhMessageFeedLiveRegion, XhMessageFeedPendingIndicator, XhMessageFeedRoot, XhMessageFeedScrollToEndTrigger, XhMessageFeedSeparator, XhMessageFeedUnreadCount, XhMessageFeedViewport };
|
|
110
122
|
//# sourceMappingURL=message-feed.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-feed.d.ts","names":[],"sources":["../../../src/components/message-feed/message-feed.ts"],"mappings":";;;;;KAsBK,QAAQ;;KAyBD,2BAA2B,KACrC;cAWW,iCAAiB,8BAAA;;;;;IAKA,MAAA,SAAS;;;;;;;;;;IAGX,MAAA,SAAS;;;IACD,MAAA,SAAS,QAAQ;;;;;EAGtB,iBAAA,UAAA,UAAU;EACZ,eAAA,UAAA,UAAU;;;;;;IART,MAAA,SAAS;;;;;;;;;;IAGX,MAAA,SAAS;;;IACD,MAAA,SAAS,QAAQ;;;;;;;;EAOvC,WAAC,OAAO,6BAA6B;kCAsBjD;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAUhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAU5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,8BAAA;;;;;;IAMa,MAAA;;;;IACX,MAAA,SAAS;;;;;;;;;;;IADE,MAAA;;;;IACX,MAAA,SAAS;;;;;qCAoBvC;cAEW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAkBjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+CAA+B,0BAAA,oBAAA,4BAAA;;8BAM1C,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAOlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
|
|
1
|
+
{"version":3,"file":"message-feed.d.ts","names":[],"sources":["../../../src/components/message-feed/message-feed.ts"],"mappings":";;;;;KAsBK,QAAQ;;KAyBD,2BAA2B,KACrC;cAWW,iCAAiB,8BAAA;;;;;IAKA,MAAA,SAAS;;;;;;;;;;IAGX,MAAA,SAAS;;;IACD,MAAA,SAAS,QAAQ;;;;;EAGtB,iBAAA,UAAA,UAAU;EACZ,eAAA,UAAA,UAAU;;;;;;IART,MAAA,SAAS;;;;;;;;;;IAGX,MAAA,SAAS;;;IACD,MAAA,SAAS,QAAQ;;;;;;;;EAOvC,WAAC,OAAO,6BAA6B;kCAsBjD;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAUhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAU5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,8BAAA;;;;;;IAMa,MAAA;;;;IACX,MAAA,SAAS;;;;;;;;;;;IADE,MAAA;;;;IACX,MAAA,SAAS;;;;;qCAoBvC;cAEW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAkBjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+CAA+B,0BAAA,oBAAA,4BAAA;;8BAM1C,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAMnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAMjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,6CAA6B,0BAAA,oBAAA,4BAAA;;8BAMxC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAOlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
|
|
@@ -135,6 +135,30 @@ const XhMessageFeedScrollToEndTrigger = defineComponent({
|
|
|
135
135
|
return () => h("button", ctx.api.value.getScrollToEndTriggerProps(), slots.default?.());
|
|
136
136
|
}
|
|
137
137
|
});
|
|
138
|
+
/** 回到底部按钮上的未读数:放进按钮里;插槽留空时显示条数,没有未读时收起。 */
|
|
139
|
+
const XhMessageFeedUnreadCount = defineComponent({
|
|
140
|
+
name: "XhMessageFeedUnreadCount",
|
|
141
|
+
setup(_, { slots }) {
|
|
142
|
+
const ctx = useMessageFeedContext();
|
|
143
|
+
return () => h("span", ctx.api.value.getUnreadCountProps(), slots.default?.() ?? String(ctx.api.value.unreadCount));
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
/** 消息之间的分隔(按日期分组):是内容层的直接子节点、与条目平级,对读屏隐藏。 */
|
|
147
|
+
const XhMessageFeedSeparator = defineComponent({
|
|
148
|
+
name: "XhMessageFeedSeparator",
|
|
149
|
+
setup(_, { slots }) {
|
|
150
|
+
const ctx = useMessageFeedContext();
|
|
151
|
+
return () => h("div", ctx.api.value.getSeparatorProps(), slots.default?.());
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
/** 已发送、等首个片段时的呼吸点:放在列表之后,只在 status 为 submitted 时出现。 */
|
|
155
|
+
const XhMessageFeedPendingIndicator = defineComponent({
|
|
156
|
+
name: "XhMessageFeedPendingIndicator",
|
|
157
|
+
setup() {
|
|
158
|
+
const ctx = useMessageFeedContext();
|
|
159
|
+
return () => h("span", ctx.api.value.getPendingIndicatorProps());
|
|
160
|
+
}
|
|
161
|
+
});
|
|
138
162
|
const XhMessageFeedLiveRegion = defineComponent({
|
|
139
163
|
name: "XhMessageFeedLiveRegion",
|
|
140
164
|
setup(_, { slots }) {
|
|
@@ -143,6 +167,6 @@ const XhMessageFeedLiveRegion = defineComponent({
|
|
|
143
167
|
}
|
|
144
168
|
});
|
|
145
169
|
//#endregion
|
|
146
|
-
export { XhMessageFeedItem, XhMessageFeedItemLabel, XhMessageFeedList, XhMessageFeedLiveRegion, XhMessageFeedRoot, XhMessageFeedScrollToEndTrigger, XhMessageFeedViewport };
|
|
170
|
+
export { XhMessageFeedItem, XhMessageFeedItemLabel, XhMessageFeedList, XhMessageFeedLiveRegion, XhMessageFeedPendingIndicator, XhMessageFeedRoot, XhMessageFeedScrollToEndTrigger, XhMessageFeedSeparator, XhMessageFeedUnreadCount, XhMessageFeedViewport };
|
|
147
171
|
|
|
148
172
|
//# sourceMappingURL=message-feed.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-feed.js","names":[],"sources":["../../../src/components/message-feed/message-feed.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 message feed 相关实现。\n\nimport type { Size } from '@xihan-ui/core'\nimport type { MessageFeedApi, MessageFeedItemRole, MessageFeedSchema, MessageFeedStatus, MessageFeedTranslations } from '@xihan-ui/headless'\nimport type { PropType, Ref, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport type { MessageFeedContext } from './use-message-feed'\nimport { defineComponent, h, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport {\n provideMessageFeed,\n provideMessageFeedItem,\n useMessageFeedContext,\n useMessageFeedItemContext,\n} from './context'\nimport { useMessageFeed } from './use-message-feed'\n\ntype Props = MessageFeedSchema['props']\n\n/** 本条持有焦点时,id 变更重新报告锚点,卸载时上报整份消息流失焦 */\nfunction reportItemFocus(ctx: MessageFeedContext, el: Ref<HTMLElement | null>, id: () => string): void {\n watch(id, (next, prev) => {\n if (next === prev)\n return\n const { service } = ctx\n if (service.getStatus() !== 'Started')\n return\n if (el.value && service.scope.getActiveElement() === el.value)\n service.send({ type: 'ITEM.FOCUS', id: next })\n })\n onBeforeUnmount(() => {\n const { service } = ctx\n // 整份消息流一起卸载时根部件先停机,此刻送事件会在 dev 下抛\n if (service.getStatus() !== 'Started')\n return\n // 按「本条当下正持有焦点」判定,不按 id 比对\n if (el.value && service.scope.getActiveElement() === el.value)\n service.send({ type: 'FEED.BLUR' })\n })\n}\n\n/** 默认插槽的载荷:粘底状态、锚点,以及三个命令式入口。 */\nexport type MessageFeedRootSlotProps = Pick<\n MessageFeedApi,\n | 'status'\n | 'atBottom'\n | 'sticking'\n | 'focusedId'\n | 'showScrollToEndTrigger'\n | 'scrollToBottom'\n | 'scrollToItem'\n | 'focusItem'\n>\n\nexport const XhMessageFeedRoot = defineComponent({\n name: 'XhMessageFeedRoot',\n // 缺省值由机器、connect 与粘底句柄给出;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n count: { type: Number },\n status: { type: String as PropType<MessageFeedStatus> },\n threshold: { type: Number },\n loop: { type: Boolean, default: undefined },\n size: { type: String as PropType<Size> },\n translations: { type: Object as PropType<Partial<MessageFeedTranslations>> },\n },\n emits: {\n 'stick-change': (_details: PayloadOf<Props, 'onStickChange'>) => true,\n 'item-focus': (_details: PayloadOf<Props, 'onItemFocus'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: MessageFeedRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const ctx = useMessageFeed(withXhConfig('message-feed', props) as Props, {\n onStickChange: details => emit('stick-change', details),\n onItemFocus: details => emit('item-focus', details),\n })\n provideMessageFeed(ctx)\n return () => h('div', {\n ...ctx.api.value.getRootProps() as Record<string, unknown>,\n ref: ctx.rootRef,\n }, slots.default?.({\n status: ctx.api.value.status,\n atBottom: ctx.api.value.atBottom,\n sticking: ctx.api.value.sticking,\n focusedId: ctx.api.value.focusedId,\n showScrollToEndTrigger: ctx.api.value.showScrollToEndTrigger,\n scrollToBottom: ctx.api.value.scrollToBottom,\n scrollToItem: ctx.api.value.scrollToItem,\n focusItem: ctx.api.value.focusItem,\n }))\n },\n})\n\nexport const XhMessageFeedViewport = defineComponent({\n name: 'XhMessageFeedViewport',\n setup(_, { slots }) {\n const ctx = useMessageFeedContext()\n // 把视口节点交给机器,由粘底句柄监听滚动\n return () => h('div', {\n ...ctx.api.value.getViewportProps() as Record<string, unknown>,\n ref: ctx.viewportRef,\n }, slots.default?.())\n },\n})\n\nexport const XhMessageFeedList = defineComponent({\n name: 'XhMessageFeedList',\n setup(_, { slots }) {\n const ctx = useMessageFeedContext()\n // 把内容节点交给机器,由粘底句柄观察尺寸;条目必须是它的直接子节点\n return () => h('div', {\n ...ctx.api.value.getListProps() as Record<string, unknown>,\n ref: ctx.contentRef,\n }, slots.default?.())\n },\n})\n\nexport const XhMessageFeedItem = defineComponent({\n name: 'XhMessageFeedItem',\n // 属性名一律带 item- 前缀:id 与 role 是 HTML 全局属性,落到节点上会与 role=article 打架\n props: {\n itemId: { type: String, required: true },\n // 收字符串是为了让作者能直接写在标记上(`item-index=\"0\"`),与自定义元素那侧同形\n itemIndex: { type: [Number, String] as PropType<number | string>, required: true },\n itemRole: { type: String as PropType<MessageFeedItemRole> },\n itemStreaming: Boolean,\n },\n setup(props, { slots }) {\n const ctx = useMessageFeedContext()\n const labelCount = ref(0)\n const el = ref<HTMLElement | null>(null)\n provideMessageFeedItem({ id: () => props.itemId, labelCount })\n reportItemFocus(ctx, el, () => props.itemId)\n return () => h('article', {\n ...ctx.api.value.getItemProps({\n id: props.itemId,\n index: Number(props.itemIndex),\n role: props.itemRole,\n streaming: props.itemStreaming,\n labelled: labelCount.value > 0,\n }) as Record<string, unknown>,\n ref: el,\n }, slots.default?.())\n },\n})\n\nexport const XhMessageFeedItemLabel = defineComponent({\n name: 'XhMessageFeedItemLabel',\n setup(_, { slots }) {\n const ctx = useMessageFeedContext()\n const item = useMessageFeedItemContext()\n // 渲出来了才登记:条目的 aria-labelledby 只在这个节点真在场时才指过来\n onMounted(() => {\n item.labelCount.value++\n })\n onBeforeUnmount(() => {\n item.labelCount.value--\n })\n return () => h(\n 'span',\n ctx.api.value.getItemLabelProps({ id: item.id() }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\nexport const XhMessageFeedScrollToEndTrigger = defineComponent({\n name: 'XhMessageFeedScrollToEndTrigger',\n setup(_, { slots }) {\n const ctx = useMessageFeedContext()\n return () => h('button', ctx.api.value.getScrollToEndTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhMessageFeedLiveRegion = defineComponent({\n name: 'XhMessageFeedLiveRegion',\n setup(_, { slots }) {\n const ctx = useMessageFeedContext()\n // 播报文本由宿主在一轮流结束时写进来\n return () => h('div', ctx.api.value.getLiveRegionProps() as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"message-feed.js","names":[],"sources":["../../../src/components/message-feed/message-feed.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 message feed 相关实现。\n\nimport type { Size } from '@xihan-ui/core'\nimport type { MessageFeedApi, MessageFeedItemRole, MessageFeedSchema, MessageFeedStatus, MessageFeedTranslations } from '@xihan-ui/headless'\nimport type { PropType, Ref, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport type { MessageFeedContext } from './use-message-feed'\nimport { defineComponent, h, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport {\n provideMessageFeed,\n provideMessageFeedItem,\n useMessageFeedContext,\n useMessageFeedItemContext,\n} from './context'\nimport { useMessageFeed } from './use-message-feed'\n\ntype Props = MessageFeedSchema['props']\n\n/** 本条持有焦点时,id 变更重新报告锚点,卸载时上报整份消息流失焦 */\nfunction reportItemFocus(ctx: MessageFeedContext, el: Ref<HTMLElement | null>, id: () => string): void {\n watch(id, (next, prev) => {\n if (next === prev)\n return\n const { service } = ctx\n if (service.getStatus() !== 'Started')\n return\n if (el.value && service.scope.getActiveElement() === el.value)\n service.send({ type: 'ITEM.FOCUS', id: next })\n })\n onBeforeUnmount(() => {\n const { service } = ctx\n // 整份消息流一起卸载时根部件先停机,此刻送事件会在 dev 下抛\n if (service.getStatus() !== 'Started')\n return\n // 按「本条当下正持有焦点」判定,不按 id 比对\n if (el.value && service.scope.getActiveElement() === el.value)\n service.send({ type: 'FEED.BLUR' })\n })\n}\n\n/** 默认插槽的载荷:粘底状态、锚点,以及三个命令式入口。 */\nexport type MessageFeedRootSlotProps = Pick<\n MessageFeedApi,\n | 'status'\n | 'atBottom'\n | 'sticking'\n | 'focusedId'\n | 'showScrollToEndTrigger'\n | 'scrollToBottom'\n | 'scrollToItem'\n | 'focusItem'\n>\n\nexport const XhMessageFeedRoot = defineComponent({\n name: 'XhMessageFeedRoot',\n // 缺省值由机器、connect 与粘底句柄给出;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n count: { type: Number },\n status: { type: String as PropType<MessageFeedStatus> },\n threshold: { type: Number },\n loop: { type: Boolean, default: undefined },\n size: { type: String as PropType<Size> },\n translations: { type: Object as PropType<Partial<MessageFeedTranslations>> },\n },\n emits: {\n 'stick-change': (_details: PayloadOf<Props, 'onStickChange'>) => true,\n 'item-focus': (_details: PayloadOf<Props, 'onItemFocus'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: MessageFeedRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const ctx = useMessageFeed(withXhConfig('message-feed', props) as Props, {\n onStickChange: details => emit('stick-change', details),\n onItemFocus: details => emit('item-focus', details),\n })\n provideMessageFeed(ctx)\n return () => h('div', {\n ...ctx.api.value.getRootProps() as Record<string, unknown>,\n ref: ctx.rootRef,\n }, slots.default?.({\n status: ctx.api.value.status,\n atBottom: ctx.api.value.atBottom,\n sticking: ctx.api.value.sticking,\n focusedId: ctx.api.value.focusedId,\n showScrollToEndTrigger: ctx.api.value.showScrollToEndTrigger,\n scrollToBottom: ctx.api.value.scrollToBottom,\n scrollToItem: ctx.api.value.scrollToItem,\n focusItem: ctx.api.value.focusItem,\n }))\n },\n})\n\nexport const XhMessageFeedViewport = defineComponent({\n name: 'XhMessageFeedViewport',\n setup(_, { slots }) {\n const ctx = useMessageFeedContext()\n // 把视口节点交给机器,由粘底句柄监听滚动\n return () => h('div', {\n ...ctx.api.value.getViewportProps() as Record<string, unknown>,\n ref: ctx.viewportRef,\n }, slots.default?.())\n },\n})\n\nexport const XhMessageFeedList = defineComponent({\n name: 'XhMessageFeedList',\n setup(_, { slots }) {\n const ctx = useMessageFeedContext()\n // 把内容节点交给机器,由粘底句柄观察尺寸;条目必须是它的直接子节点\n return () => h('div', {\n ...ctx.api.value.getListProps() as Record<string, unknown>,\n ref: ctx.contentRef,\n }, slots.default?.())\n },\n})\n\nexport const XhMessageFeedItem = defineComponent({\n name: 'XhMessageFeedItem',\n // 属性名一律带 item- 前缀:id 与 role 是 HTML 全局属性,落到节点上会与 role=article 打架\n props: {\n itemId: { type: String, required: true },\n // 收字符串是为了让作者能直接写在标记上(`item-index=\"0\"`),与自定义元素那侧同形\n itemIndex: { type: [Number, String] as PropType<number | string>, required: true },\n itemRole: { type: String as PropType<MessageFeedItemRole> },\n itemStreaming: Boolean,\n },\n setup(props, { slots }) {\n const ctx = useMessageFeedContext()\n const labelCount = ref(0)\n const el = ref<HTMLElement | null>(null)\n provideMessageFeedItem({ id: () => props.itemId, labelCount })\n reportItemFocus(ctx, el, () => props.itemId)\n return () => h('article', {\n ...ctx.api.value.getItemProps({\n id: props.itemId,\n index: Number(props.itemIndex),\n role: props.itemRole,\n streaming: props.itemStreaming,\n labelled: labelCount.value > 0,\n }) as Record<string, unknown>,\n ref: el,\n }, slots.default?.())\n },\n})\n\nexport const XhMessageFeedItemLabel = defineComponent({\n name: 'XhMessageFeedItemLabel',\n setup(_, { slots }) {\n const ctx = useMessageFeedContext()\n const item = useMessageFeedItemContext()\n // 渲出来了才登记:条目的 aria-labelledby 只在这个节点真在场时才指过来\n onMounted(() => {\n item.labelCount.value++\n })\n onBeforeUnmount(() => {\n item.labelCount.value--\n })\n return () => h(\n 'span',\n ctx.api.value.getItemLabelProps({ id: item.id() }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\nexport const XhMessageFeedScrollToEndTrigger = defineComponent({\n name: 'XhMessageFeedScrollToEndTrigger',\n setup(_, { slots }) {\n const ctx = useMessageFeedContext()\n return () => h('button', ctx.api.value.getScrollToEndTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 回到底部按钮上的未读数:放进按钮里;插槽留空时显示条数,没有未读时收起。 */\nexport const XhMessageFeedUnreadCount = defineComponent({\n name: 'XhMessageFeedUnreadCount',\n setup(_, { slots }) {\n const ctx = useMessageFeedContext()\n return () => h('span', ctx.api.value.getUnreadCountProps() as Record<string, unknown>, slots.default?.() ?? String(ctx.api.value.unreadCount))\n },\n})\n\n/** 消息之间的分隔(按日期分组):是内容层的直接子节点、与条目平级,对读屏隐藏。 */\nexport const XhMessageFeedSeparator = defineComponent({\n name: 'XhMessageFeedSeparator',\n setup(_, { slots }) {\n const ctx = useMessageFeedContext()\n return () => h('div', ctx.api.value.getSeparatorProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 已发送、等首个片段时的呼吸点:放在列表之后,只在 status 为 submitted 时出现。 */\nexport const XhMessageFeedPendingIndicator = defineComponent({\n name: 'XhMessageFeedPendingIndicator',\n setup() {\n const ctx = useMessageFeedContext()\n return () => h('span', ctx.api.value.getPendingIndicatorProps() as Record<string, unknown>)\n },\n})\n\nexport const XhMessageFeedLiveRegion = defineComponent({\n name: 'XhMessageFeedLiveRegion',\n setup(_, { slots }) {\n const ctx = useMessageFeedContext()\n // 播报文本由宿主在一轮流结束时写进来\n return () => h('div', ctx.api.value.getLiveRegionProps() as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":"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"}
|
|
@@ -162,15 +162,72 @@ declare const XhNavigationMenuContent: import("vue").DefineComponent<import("vue
|
|
|
162
162
|
required: true;
|
|
163
163
|
};
|
|
164
164
|
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
165
|
+
/** 面板里一枝子级的开关:展开时紧跟其后的 XhNavigationMenuBranchContent 露出来 */
|
|
166
|
+
declare const XhNavigationMenuBranchTrigger: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
167
|
+
value: {
|
|
168
|
+
type: StringConstructor;
|
|
169
|
+
required: true;
|
|
170
|
+
};
|
|
171
|
+
disabled: {
|
|
172
|
+
type: BooleanConstructor;
|
|
173
|
+
default: undefined;
|
|
174
|
+
};
|
|
175
|
+
}>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
176
|
+
[key: string]: any;
|
|
177
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
178
|
+
value: {
|
|
179
|
+
type: StringConstructor;
|
|
180
|
+
required: true;
|
|
181
|
+
};
|
|
182
|
+
disabled: {
|
|
183
|
+
type: BooleanConstructor;
|
|
184
|
+
default: undefined;
|
|
185
|
+
};
|
|
186
|
+
}>> & Readonly<{}>, {
|
|
187
|
+
disabled: boolean;
|
|
188
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
189
|
+
/** 子级开关里的展开方向标记,展开时转向;身份与所在的开关同一份声明 */
|
|
190
|
+
declare const XhNavigationMenuBranchIndicator: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
191
|
+
value: {
|
|
192
|
+
type: StringConstructor;
|
|
193
|
+
required: true;
|
|
194
|
+
};
|
|
195
|
+
}>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
196
|
+
[key: string]: any;
|
|
197
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
198
|
+
value: {
|
|
199
|
+
type: StringConstructor;
|
|
200
|
+
required: true;
|
|
201
|
+
};
|
|
202
|
+
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
203
|
+
/** 一枝子级的容器,写在面板里、紧跟自己的开关之后;收着时 hidden */
|
|
204
|
+
declare const XhNavigationMenuBranchContent: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
205
|
+
value: {
|
|
206
|
+
type: StringConstructor;
|
|
207
|
+
required: true;
|
|
208
|
+
};
|
|
209
|
+
}>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
210
|
+
[key: string]: any;
|
|
211
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
212
|
+
value: {
|
|
213
|
+
type: StringConstructor;
|
|
214
|
+
required: true;
|
|
215
|
+
};
|
|
216
|
+
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
165
217
|
/** 面板内的链接项:href 由作者写,点击不拦截,只收起导航 */
|
|
166
218
|
declare const XhNavigationMenuLink: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
167
219
|
current: BooleanConstructor;
|
|
220
|
+
/** 借用作者的子节点(如路由链接)作为链接,不再渲染自己的 `<a>`;子节点须恰好一个。 */
|
|
221
|
+
asChild: BooleanConstructor;
|
|
168
222
|
}>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
169
223
|
[key: string]: any;
|
|
170
224
|
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
171
225
|
current: BooleanConstructor;
|
|
226
|
+
/** 借用作者的子节点(如路由链接)作为链接,不再渲染自己的 `<a>`;子节点须恰好一个。 */
|
|
227
|
+
asChild: BooleanConstructor;
|
|
172
228
|
}>> & Readonly<{}>, {
|
|
173
229
|
current: boolean;
|
|
230
|
+
asChild: boolean;
|
|
174
231
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
175
232
|
/** 指示条容器,位置由状态机计算后写入内联样式;渲染为 li 以 list 为定位参照系 */
|
|
176
233
|
declare const XhNavigationMenuIndicator: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
@@ -181,5 +238,5 @@ declare const XhNavigationMenuViewport: import("vue").DefineComponent<{}, () =>
|
|
|
181
238
|
[key: string]: any;
|
|
182
239
|
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
183
240
|
//#endregion
|
|
184
|
-
export { XhNavigationMenuContent, XhNavigationMenuIndicator, XhNavigationMenuItem, XhNavigationMenuLink, XhNavigationMenuList, XhNavigationMenuRoot, XhNavigationMenuTrigger, XhNavigationMenuTriggerIndicator, XhNavigationMenuViewport };
|
|
241
|
+
export { XhNavigationMenuBranchContent, XhNavigationMenuBranchIndicator, XhNavigationMenuBranchTrigger, XhNavigationMenuContent, XhNavigationMenuIndicator, XhNavigationMenuItem, XhNavigationMenuLink, XhNavigationMenuList, XhNavigationMenuRoot, XhNavigationMenuTrigger, XhNavigationMenuTriggerIndicator, XhNavigationMenuViewport };
|
|
185
242
|
//# sourceMappingURL=navigation-menu.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-menu.d.ts","names":[],"sources":["../../../src/components/navigation-menu/navigation-menu.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"navigation-menu.d.ts","names":[],"sources":["../../../src/components/navigation-menu/navigation-menu.ts"],"mappings":";;;;;KAqBK,sBAAsB;;cAGd,oCAAoB,8BAAA;;IAIA,MAAA,SAAS;;;IACb,MAAA;;;IACO,MAAA;;;IACD,MAAA,SAAS;;;;;;;;;IAGjB,MAAA,SAAS;;;;;;;;;;;IAGA,MAAA,SAAS,QAAQ;;;IACzB,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;EAIN,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;;;IAhBN,MAAA,SAAS;;;IACb,MAAA;;;IACO,MAAA;;;IACD,MAAA,SAAS;;;;;;;;;IAGjB,MAAA,SAAS;;;;;;;;;;;IAGA,MAAA,SAAS,QAAQ;;;IACzB,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;;;qCA0BnC;cAGW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAS/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAM/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,8BAAA;;;;;;;;;;;;;;;;;;;;;;qCAelC;;cAIW,gDAAgC,8BAAA;;;;;;;;;;;;;;;;;;;;;;qCAc3C;cAEW,uCAAuB,8BAAA;;;;;;;;;;;;MAgDlC,oDAAA;;cAGW,6CAA6B,8BAAA;;;;;;;;;;;;;;;;;;;;;;qCAexC;;cAGW,+CAA+B,8BAAA;;;;;;;;;;;;MAa1C,oDAAA;;cAGW,6CAA6B,8BAAA;;;;;;;;;;;;MAaxC,oDAAA;;cAGW,oCAAoB,8BAAA;;;;;;;;;;;;;qCAqB/B;;cAGW,yCAAyB,0BAAA,oBAAA,4BAAA;;8BAMpC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAMnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { useOverlayExit } from "../../runtime/use-overlay-exit.js";
|
|
2
2
|
import { withXhConfig } from "../../config/config.js";
|
|
3
|
+
import { mergePartProps } from "../../runtime/merge-props.js";
|
|
4
|
+
import { mergeIntoChild } from "../../runtime/as-child.js";
|
|
3
5
|
import { slotPaints } from "../../runtime/slot-content.js";
|
|
4
6
|
import { provideNavigationMenu, useNavigationMenuContext } from "./context.js";
|
|
5
7
|
import { useNavigationMenu } from "./use-navigation-menu.js";
|
|
@@ -163,17 +165,72 @@ const XhNavigationMenuContent = defineComponent({
|
|
|
163
165
|
}, slots.default?.());
|
|
164
166
|
}
|
|
165
167
|
});
|
|
168
|
+
/** 面板里一枝子级的开关:展开时紧跟其后的 XhNavigationMenuBranchContent 露出来 */
|
|
169
|
+
const XhNavigationMenuBranchTrigger = defineComponent({
|
|
170
|
+
name: "XhNavigationMenuBranchTrigger",
|
|
171
|
+
props: {
|
|
172
|
+
value: {
|
|
173
|
+
type: String,
|
|
174
|
+
required: true
|
|
175
|
+
},
|
|
176
|
+
disabled: {
|
|
177
|
+
type: Boolean,
|
|
178
|
+
default: void 0
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
setup(props, { slots }) {
|
|
182
|
+
const ctx = useNavigationMenuContext();
|
|
183
|
+
return () => h("button", ctx.api.value.getBranchTriggerProps({
|
|
184
|
+
value: props.value,
|
|
185
|
+
disabled: props.disabled
|
|
186
|
+
}), slots.default?.());
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
/** 子级开关里的展开方向标记,展开时转向;身份与所在的开关同一份声明 */
|
|
190
|
+
const XhNavigationMenuBranchIndicator = defineComponent({
|
|
191
|
+
name: "XhNavigationMenuBranchIndicator",
|
|
192
|
+
props: { value: {
|
|
193
|
+
type: String,
|
|
194
|
+
required: true
|
|
195
|
+
} },
|
|
196
|
+
setup(props, { slots }) {
|
|
197
|
+
const ctx = useNavigationMenuContext();
|
|
198
|
+
return () => h("span", ctx.api.value.getBranchIndicatorProps({ value: props.value }), slots.default?.());
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
/** 一枝子级的容器,写在面板里、紧跟自己的开关之后;收着时 hidden */
|
|
202
|
+
const XhNavigationMenuBranchContent = defineComponent({
|
|
203
|
+
name: "XhNavigationMenuBranchContent",
|
|
204
|
+
props: { value: {
|
|
205
|
+
type: String,
|
|
206
|
+
required: true
|
|
207
|
+
} },
|
|
208
|
+
setup(props, { slots }) {
|
|
209
|
+
const ctx = useNavigationMenuContext();
|
|
210
|
+
return () => h("div", ctx.api.value.getBranchContentProps({ value: props.value }), slots.default?.());
|
|
211
|
+
}
|
|
212
|
+
});
|
|
166
213
|
/** 面板内的链接项:href 由作者写,点击不拦截,只收起导航 */
|
|
167
214
|
const XhNavigationMenuLink = defineComponent({
|
|
168
215
|
name: "XhNavigationMenuLink",
|
|
169
|
-
|
|
170
|
-
|
|
216
|
+
inheritAttrs: false,
|
|
217
|
+
props: {
|
|
218
|
+
current: Boolean,
|
|
219
|
+
/** 借用作者的子节点(如路由链接)作为链接,不再渲染自己的 `<a>`;子节点须恰好一个。 */
|
|
220
|
+
asChild: Boolean
|
|
221
|
+
},
|
|
222
|
+
setup(props, { slots, attrs }) {
|
|
171
223
|
const ctx = useNavigationMenuContext();
|
|
172
224
|
const value = useId();
|
|
173
|
-
return () =>
|
|
174
|
-
value
|
|
175
|
-
|
|
176
|
-
|
|
225
|
+
return () => {
|
|
226
|
+
const part = mergePartProps(ctx.api.value.getLinkProps({
|
|
227
|
+
value,
|
|
228
|
+
current: props.current
|
|
229
|
+
}), attrs);
|
|
230
|
+
const children = slots.default?.();
|
|
231
|
+
if (props.asChild) return mergeIntoChild(children, part, "navigation-menu", { applyAnatomy: true });
|
|
232
|
+
return h("a", part, children);
|
|
233
|
+
};
|
|
177
234
|
}
|
|
178
235
|
});
|
|
179
236
|
/** 指示条容器,位置由状态机计算后写入内联样式;渲染为 li 以 list 为定位参照系 */
|
|
@@ -194,16 +251,31 @@ const XhNavigationMenuViewport = defineComponent({
|
|
|
194
251
|
});
|
|
195
252
|
/**
|
|
196
253
|
* 未写默认插槽时按 collection 铺开的整套结构,作者只提供数据。
|
|
197
|
-
* 一项一个 li:带 href 的铺为直达链接,其余铺为 trigger
|
|
254
|
+
* 一项一个 li:带 href 的铺为直达链接,其余铺为 trigger 加面板。面板内容给了 panel 插槽就由它提供,
|
|
255
|
+
* 否则按这一项的 children 铺开:带 href 的条目铺为链接,带 children 的铺为一枝子级(开关 + 箭头 + 子级里的链接)。
|
|
198
256
|
* 与手写部件产出的 DOM 完全一致,需要修改结构时写默认插槽,行为不变。
|
|
199
257
|
*/
|
|
200
258
|
function renderDefaultTree(collection, panelSlot) {
|
|
201
|
-
return [h(XhNavigationMenuList, null, () => [...collection.map((node) => h(XhNavigationMenuItem, { key: node.value }, () => node.href != null ? [h(
|
|
259
|
+
return [h(XhNavigationMenuList, null, () => [...collection.map((node) => h(XhNavigationMenuItem, { key: node.value }, () => node.href != null ? [renderLink(node)] : [h(XhNavigationMenuTrigger, { value: node.value }, () => node.label), h(XhNavigationMenuContent, { value: node.value }, () => panelSlot ? panelSlot(node) : renderPanelEntries(node.children))])), h(XhNavigationMenuIndicator)])];
|
|
260
|
+
}
|
|
261
|
+
function renderLink(node) {
|
|
262
|
+
return h(XhNavigationMenuLink, {
|
|
263
|
+
key: node.value,
|
|
202
264
|
href: node.href,
|
|
203
265
|
current: node.current
|
|
204
|
-
}, () => node.label)
|
|
266
|
+
}, () => node.label);
|
|
267
|
+
}
|
|
268
|
+
/** 面板条目:带 children 的铺为一枝子级,开关与容器相邻;其余铺为链接 */
|
|
269
|
+
function renderPanelEntries(entries) {
|
|
270
|
+
return entries.flatMap((entry) => entry.children.length > 0 ? [h(XhNavigationMenuBranchTrigger, {
|
|
271
|
+
key: `${entry.value}:trigger`,
|
|
272
|
+
value: entry.value
|
|
273
|
+
}, () => [entry.label, h(XhNavigationMenuBranchIndicator, { value: entry.value })]), h(XhNavigationMenuBranchContent, {
|
|
274
|
+
key: `${entry.value}:content`,
|
|
275
|
+
value: entry.value
|
|
276
|
+
}, () => entry.children.map(renderLink))] : [renderLink(entry)]);
|
|
205
277
|
}
|
|
206
278
|
//#endregion
|
|
207
|
-
export { XhNavigationMenuContent, XhNavigationMenuIndicator, XhNavigationMenuItem, XhNavigationMenuLink, XhNavigationMenuList, XhNavigationMenuRoot, XhNavigationMenuTrigger, XhNavigationMenuTriggerIndicator, XhNavigationMenuViewport };
|
|
279
|
+
export { XhNavigationMenuBranchContent, XhNavigationMenuBranchIndicator, XhNavigationMenuBranchTrigger, XhNavigationMenuContent, XhNavigationMenuIndicator, XhNavigationMenuItem, XhNavigationMenuLink, XhNavigationMenuList, XhNavigationMenuRoot, XhNavigationMenuTrigger, XhNavigationMenuTriggerIndicator, XhNavigationMenuViewport };
|
|
208
280
|
|
|
209
281
|
//# sourceMappingURL=navigation-menu.js.map
|