@xihan-ui/vue 2.0.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 +1593 -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/avatar-group/avatar-group.d.ts.map +1 -1
- package/dist/components/avatar-group/avatar-group.js +2 -1
- package/dist/components/avatar-group/avatar-group.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 +42 -3
- 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 +72 -3
- package/dist/components/cascader/cascader.d.ts.map +1 -1
- package/dist/components/cascader/cascader.js +125 -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 +66 -4
- package/dist/components/combobox/combobox.d.ts.map +1 -1
- package/dist/components/combobox/combobox.js +107 -6
- 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.d.ts +23 -2
- package/dist/components/command/command.d.ts.map +1 -1
- package/dist/components/command/command.js +48 -6
- package/dist/components/command/command.js.map +1 -1
- 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 +63 -18
- package/dist/components/context-menu/context-menu.d.ts.map +1 -1
- package/dist/components/context-menu/context-menu.js +141 -57
- 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/input-group/input-group.d.ts.map +1 -1
- package/dist/components/input-group/input-group.js +2 -1
- package/dist/components/input-group/input-group.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/kbd/kbd.d.ts.map +1 -1
- package/dist/components/kbd/kbd.js +27 -10
- package/dist/components/kbd/kbd.js.map +1 -1
- package/dist/components/listbox/listbox.d.ts +25 -2
- package/dist/components/listbox/listbox.d.ts.map +1 -1
- package/dist/components/listbox/listbox.js +39 -4
- 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 +43 -7
- package/dist/components/mention/mention.d.ts.map +1 -1
- package/dist/components/mention/mention.js +50 -8
- 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 +92 -28
- package/dist/components/menu/menu.d.ts.map +1 -1
- package/dist/components/menu/menu.js +162 -54
- 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 +52 -19
- package/dist/components/menubar/menubar.d.ts.map +1 -1
- package/dist/components/menubar/menubar.js +137 -56
- 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/page-header/page-header.d.ts.map +1 -1
- package/dist/components/page-header/page-header.js +2 -1
- package/dist/components/page-header/page-header.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.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 +25 -2
- package/dist/components/select/select.d.ts.map +1 -1
- package/dist/components/select/select.js +48 -6
- 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 +18 -0
- 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/statistic/statistic.d.ts.map +1 -1
- package/dist/components/statistic/statistic.js +2 -1
- package/dist/components/statistic/statistic.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 +52 -3
- 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/tag-group/tag-group.js +1 -1
- package/dist/components/tag-group/tag-group.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/timeline/timeline.d.ts.map +1 -1
- package/dist/components/timeline/timeline.js +2 -1
- package/dist/components/timeline/timeline.js.map +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 +8 -0
- 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 +30 -2
- package/dist/components/transfer/transfer.d.ts.map +1 -1
- package/dist/components/transfer/transfer.js +29 -3
- package/dist/components/transfer/transfer.js.map +1 -1
- package/dist/components/tree/tree.d.ts +43 -8
- package/dist/components/tree/tree.d.ts.map +1 -1
- package/dist/components/tree/tree.js +28 -15
- 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 +78 -6
- package/dist/components/tree-select/tree-select.d.ts.map +1 -1
- package/dist/components/tree-select/tree-select.js +127 -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 +23 -4
- 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 +65 -50
- package/dist/index.js +59 -44
- 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-machine.js +3 -2
- package/dist/runtime/use-machine.js.map +1 -1
- package/dist/runtime/use-overlay-exit.js +0 -1
- package/dist/runtime/use-overlay-exit.js.map +1 -1
- package/dist/runtime/use-scrollbars.js +3 -1
- package/dist/runtime/use-scrollbars.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
|
@@ -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":";;;;;;AAyBA,SAAS,gBAAgB,KAAyB,IAA6B,IAAwB;CACrG,MAAM,KAAK,MAAM,SAAS;EACxB,IAAI,SAAS,MACX;EACF,MAAM,EAAE,YAAY;EACpB,IAAI,QAAQ,UAAU,MAAM,WAC1B;EACF,IAAI,GAAG,SAAS,QAAQ,MAAM,iBAAiB,MAAM,GAAG,OACtD,QAAQ,KAAK;GAAE,MAAM;GAAc,IAAI;EAAK,CAAC;CACjD,CAAC;CACD,sBAAsB;EACpB,MAAM,EAAE,YAAY;EAEpB,IAAI,QAAQ,UAAU,MAAM,WAC1B;EAEF,IAAI,GAAG,SAAS,QAAQ,MAAM,iBAAiB,MAAM,GAAG,OACtD,QAAQ,KAAK,EAAE,MAAM,YAAY,CAAC;CACtC,CAAC;AACH;AAeA,MAAa,oBAAoB,gBAAgB;CAC/C,MAAM;CAEN,OAAO;EACL,OAAO,EAAE,MAAM,OAAO;EACtB,QAAQ,EAAE,MAAM,OAAsC;EACtD,WAAW,EAAE,MAAM,OAAO;EAC1B,MAAM;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC1C,MAAM,EAAE,MAAM,OAAyB;EACvC,cAAc,EAAE,MAAM,OAAqD;CAC7E;CACA,OAAO;EACL,iBAAiB,aAAgD;EACjE,eAAe,aAA8C;CAC/D;CACA,OAAO;CAGP,MAAM,OAAO,EAAE,OAAO,QAAQ;EAC5B,MAAM,MAAM,eAAe,aAAa,gBAAgB,KAAK,GAAY;GACvE,gBAAe,YAAW,KAAK,gBAAgB,OAAO;GACtD,cAAa,YAAW,KAAK,cAAc,OAAO;EACpD,CAAC;EACD,mBAAmB,GAAG;EACtB,aAAa,EAAE,OAAO;GACpB,GAAG,IAAI,IAAI,MAAM,aAAa;GAC9B,KAAK,IAAI;EACX,GAAG,MAAM,UAAU;GACjB,QAAQ,IAAI,IAAI,MAAM;GACtB,UAAU,IAAI,IAAI,MAAM;GACxB,UAAU,IAAI,IAAI,MAAM;GACxB,WAAW,IAAI,IAAI,MAAM;GACzB,wBAAwB,IAAI,IAAI,MAAM;GACtC,gBAAgB,IAAI,IAAI,MAAM;GAC9B,cAAc,IAAI,IAAI,MAAM;GAC5B,WAAW,IAAI,IAAI,MAAM;EAC3B,CAAC,CAAC;CACJ;AACF,CAAC;AAED,MAAa,wBAAwB,gBAAgB;CACnD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,sBAAsB;EAElC,aAAa,EAAE,OAAO;GACpB,GAAG,IAAI,IAAI,MAAM,iBAAiB;GAClC,KAAK,IAAI;EACX,GAAG,MAAM,UAAU,CAAC;CACtB;AACF,CAAC;AAED,MAAa,oBAAoB,gBAAgB;CAC/C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,sBAAsB;EAElC,aAAa,EAAE,OAAO;GACpB,GAAG,IAAI,IAAI,MAAM,aAAa;GAC9B,KAAK,IAAI;EACX,GAAG,MAAM,UAAU,CAAC;CACtB;AACF,CAAC;AAED,MAAa,oBAAoB,gBAAgB;CAC/C,MAAM;CAEN,OAAO;EACL,QAAQ;GAAE,MAAM;GAAQ,UAAU;EAAK;EAEvC,WAAW;GAAE,MAAM,CAAC,QAAQ,MAAM;GAAgC,UAAU;EAAK;EACjF,UAAU,EAAE,MAAM,OAAwC;EAC1D,eAAe;CACjB;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,sBAAsB;EAClC,MAAM,aAAa,IAAI,CAAC;EACxB,MAAM,KAAK,IAAwB,IAAI;EACvC,uBAAuB;GAAE,UAAU,MAAM;GAAQ;EAAW,CAAC;EAC7D,gBAAgB,KAAK,UAAU,MAAM,MAAM;EAC3C,aAAa,EAAE,WAAW;GACxB,GAAG,IAAI,IAAI,MAAM,aAAa;IAC5B,IAAI,MAAM;IACV,OAAO,OAAO,MAAM,SAAS;IAC7B,MAAM,MAAM;IACZ,WAAW,MAAM;IACjB,UAAU,WAAW,QAAQ;GAC/B,CAAC;GACD,KAAK;EACP,GAAG,MAAM,UAAU,CAAC;CACtB;AACF,CAAC;AAED,MAAa,yBAAyB,gBAAgB;CACpD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,sBAAsB;EAClC,MAAM,OAAO,0BAA0B;EAEvC,gBAAgB;GACd,KAAK,WAAW;EAClB,CAAC;EACD,sBAAsB;GACpB,KAAK,WAAW;EAClB,CAAC;EACD,aAAa,EACX,QACA,IAAI,IAAI,MAAM,kBAAkB,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC,GACjD,MAAM,UAAU,CAClB;CACF;AACF,CAAC;AAED,MAAa,kCAAkC,gBAAgB;CAC7D,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,sBAAsB;EAClC,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,2BAA2B,GAA8B,MAAM,UAAU,CAAC;CACnH;AACF,CAAC;AAED,MAAa,0BAA0B,gBAAgB;CACrD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,sBAAsB;EAElC,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,mBAAmB,GAA8B,MAAM,UAAU,CAAC;CACxG;AACF,CAAC"}
|
|
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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-menu.js","names":[],"sources":["../../../src/components/navigation-menu/navigation-menu.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// 提供 navigation menu 相关实现。\n\nimport type { Direction, Orientation, Size, Tone } from '@xihan-ui/core'\nimport type { PresenceHandle } from '@xihan-ui/core/presence'\nimport type { NavigationMenuNode, NavigationMenuNodeMeta, NavigationMenuSchema, NavigationMenuTranslations } from '@xihan-ui/headless'\nimport type { PropType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h, nextTick, onMounted, ref, useId } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { slotPaints } from '../../runtime/slot-content'\nimport { useOverlayExit } from '../../runtime/use-overlay-exit'\nimport { provideNavigationMenu, useNavigationMenuContext } from './context'\nimport { useNavigationMenu } from './use-navigation-menu'\n\ntype NavigationMenuProps = NavigationMenuSchema['props']\n\n/** 根节点渲染为 nav,收起的三条出口(指针离开、焦点离场、Escape)在这一层处理 */\nexport const XhNavigationMenuRoot = defineComponent({\n name: 'XhNavigationMenuRoot',\n // 缺省值由机器与 connect 决定;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n collection: { type: Array as PropType<NavigationMenuNode[]> },\n value: { type: String as PropType<string | null> },\n defaultValue: { type: String as PropType<string | null> },\n orientation: { type: String as PropType<Orientation> },\n delayDuration: { type: Number },\n skipDelayDuration: { type: Number },\n dir: { type: String as PropType<Direction> },\n loop: { type: Boolean, default: undefined },\n disabled: { type: Boolean, default: undefined },\n translations: { type: Object as PropType<Partial<NavigationMenuTranslations>> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n },\n // value-change 携带 { value },update:value 携带裸值以支持 v-model:value\n emits: {\n 'value-change': (_details: PayloadOf<NavigationMenuProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<NavigationMenuProps, 'onValueChange'>['value']) => true,\n },\n setup(props, { slots, emit }) {\n const notify: NavigationMenuProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const ctx = useNavigationMenu(withXhConfig('navigation-menu', props) as NavigationMenuProps, notify)\n provideNavigationMenu(ctx)\n return () => {\n // 默认插槽里有真内容就照旧交给作者;只剩注释或空白时当没写,给了 collection 就按数据铺开整套结构\n const authored = slots.default?.()\n const children = slotPaints(authored)\n ? authored\n : (props.collection ? renderDefaultTree(ctx.api.value.collection, slots.panel) : undefined)\n return h('nav', {\n ...ctx.api.value.getRootProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.rootRef.value = el as HTMLElement },\n }, children)\n }\n },\n})\n\n// 用 ul 而非 div:站点导航是一组并列的去处,读屏会念\"列表,共 n 项\"。\nexport const XhNavigationMenuList = defineComponent({\n name: 'XhNavigationMenuList',\n setup(_, { slots }) {\n const ctx = useNavigationMenuContext()\n return () => h('ul', {\n ...ctx.api.value.getListProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.listRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\n/** 一项渲染为一个 li;面板 content 写在同一个 li 内、紧跟 trigger 之后 */\nexport const XhNavigationMenuItem = defineComponent({\n name: 'XhNavigationMenuItem',\n setup(_, { slots }) {\n const ctx = useNavigationMenuContext()\n return () => h('li', ctx.api.value.getItemProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhNavigationMenuTrigger = defineComponent({\n name: 'XhNavigationMenuTrigger',\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 = useNavigationMenuContext()\n return () => h(\n 'button',\n ctx.api.value.getTriggerProps({ value: props.value, disabled: props.disabled }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\n// 面板常挂,靠 hidden 显隐,不做懒挂载\n/** 入口中表示下方还有面板的标记,展开时转向;身份与所在 trigger 同一份声明 */\nexport const XhNavigationMenuTriggerIndicator = defineComponent({\n name: 'XhNavigationMenuTriggerIndicator',\n props: {\n value: { type: String, required: true },\n disabled: { type: Boolean, default: undefined },\n },\n setup(props, { slots }) {\n const ctx = useNavigationMenuContext()\n return () => h(\n 'span',\n ctx.api.value.getTriggerIndicatorProps({ value: props.value, disabled: props.disabled }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\nexport const XhNavigationMenuContent = defineComponent({\n name: 'XhNavigationMenuContent',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useNavigationMenuContext()\n // 一个面板一份退场闸门:它们各开各的、动画各跑各的,一份管不过来。\n // 开合判据直接取 connect 这一帧的产出,不另起一套——两边各判一次迟早会说岔\n const contentRef = ref<HTMLElement | null>(null)\n let presence: PresenceHandle | null = null\n const visible = useOverlayExit({\n config: ctx.config,\n isOpen: () => ctx.api.value.isOpen(props.value),\n contentRef,\n onPresence: (next) => {\n const previous = presence\n presence = next\n if (ctx.service.getStatus() !== 'Started')\n return\n if (next) {\n ctx.service.send({ type: 'PRESENCE.SET', value: props.value, presence: next, connected: true })\n }\n else if (previous) {\n ctx.service.send({ type: 'PRESENCE.SET', value: props.value, presence: previous, connected: false })\n }\n },\n })\n // setup 期 Presence 早于根机器的 onMounted;挂载后补报一次,确保首帧句柄已入 Headless 表。\n onMounted(() => {\n // 子组件 mounted 早于父级根机器启动,再让出一次提交队列才可安全送事件。\n void nextTick(() => {\n if (presence && ctx.service.getStatus() === 'Started')\n ctx.service.send({ type: 'PRESENCE.SET', value: props.value, presence, connected: true })\n })\n })\n return () => h(\n 'div',\n {\n ...ctx.api.value.getContentProps({ value: props.value }) as Record<string, unknown>,\n // 收起跟着闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场就一帧都\n // 播不出来),所以真正的收起落成内联 display\n style: visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { contentRef.value = el as HTMLElement | null },\n },\n slots.default?.(),\n )\n },\n})\n\n/** 面板内的链接项:href 由作者写,点击不拦截,只收起导航 */\nexport const XhNavigationMenuLink = defineComponent({\n name: 'XhNavigationMenuLink',\n props: {\n current: Boolean,\n },\n setup(props, { slots }) {\n const ctx = useNavigationMenuContext()\n // 链接身份:按压通道按它记按住的那一条,按实例生成,作者不必提供\n const value = useId()\n return () => h(\n 'a',\n ctx.api.value.getLinkProps({ value, current: props.current }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\n/** 指示条容器,位置由状态机计算后写入内联样式;渲染为 li 以 list 为定位参照系 */\nexport const XhNavigationMenuIndicator = defineComponent({\n name: 'XhNavigationMenuIndicator',\n setup() {\n const ctx = useNavigationMenuContext()\n return () => h('li', ctx.api.value.getIndicatorProps() as Record<string, unknown>)\n },\n})\n\n/** 可选的共享面板外壳,放在 root 内、list 之后 */\nexport const XhNavigationMenuViewport = defineComponent({\n name: 'XhNavigationMenuViewport',\n setup(_, { slots }) {\n const ctx = useNavigationMenuContext()\n return () => h('div', ctx.api.value.getViewportProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 未写默认插槽时按 collection 铺开的整套结构,作者只提供数据。\n * 一项一个 li:带 href 的铺为直达链接,其余铺为 trigger 加面板,面板内容由 panel 插槽提供。\n * 与手写部件产出的 DOM 完全一致,需要修改结构时写默认插槽,行为不变。\n */\nfunction renderDefaultTree(\n collection: readonly NavigationMenuNodeMeta[],\n panelSlot?: (node: NavigationMenuNodeMeta) => VNode[],\n): VNode[] {\n return [\n h(XhNavigationMenuList, null, () => [\n ...collection.map(node => h(XhNavigationMenuItem, { key: node.value }, () => (\n node.href != null\n ? [h(XhNavigationMenuLink, { href: node.href, current: node.current }, () => node.label)]\n : [\n h(XhNavigationMenuTrigger, { value: node.value }, () => node.label),\n h(XhNavigationMenuContent, { value: node.value }, () => panelSlot?.(node) ?? []),\n ]\n ))),\n h(XhNavigationMenuIndicator),\n ]),\n ]\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"navigation-menu.js","names":[],"sources":["../../../src/components/navigation-menu/navigation-menu.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// 提供 navigation menu 相关实现。\n\nimport type { Direction, Orientation, Size, Tone } from '@xihan-ui/core'\nimport type { PresenceHandle } from '@xihan-ui/core/presence'\nimport type { NavigationMenuNode, NavigationMenuNodeMeta, NavigationMenuSchema, NavigationMenuTranslations } from '@xihan-ui/headless'\nimport type { PropType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h, nextTick, onMounted, ref, useId } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { mergeIntoChild } from '../../runtime/as-child'\nimport { mergePartProps } from '../../runtime/merge-props'\nimport { slotPaints } from '../../runtime/slot-content'\nimport { useOverlayExit } from '../../runtime/use-overlay-exit'\nimport { provideNavigationMenu, useNavigationMenuContext } from './context'\nimport { useNavigationMenu } from './use-navigation-menu'\n\ntype NavigationMenuProps = NavigationMenuSchema['props']\n\n/** 根节点渲染为 nav,收起的三条出口(指针离开、焦点离场、Escape)在这一层处理 */\nexport const XhNavigationMenuRoot = defineComponent({\n name: 'XhNavigationMenuRoot',\n // 缺省值由机器与 connect 决定;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n collection: { type: Array as PropType<NavigationMenuNode[]> },\n value: { type: String as PropType<string | null> },\n defaultValue: { type: String as PropType<string | null> },\n orientation: { type: String as PropType<Orientation> },\n delayDuration: { type: Number },\n skipDelayDuration: { type: Number },\n dir: { type: String as PropType<Direction> },\n loop: { type: Boolean, default: undefined },\n disabled: { type: Boolean, default: undefined },\n translations: { type: Object as PropType<Partial<NavigationMenuTranslations>> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n },\n // value-change 携带 { value },update:value 携带裸值以支持 v-model:value\n emits: {\n 'value-change': (_details: PayloadOf<NavigationMenuProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<NavigationMenuProps, 'onValueChange'>['value']) => true,\n },\n setup(props, { slots, emit }) {\n const notify: NavigationMenuProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const ctx = useNavigationMenu(withXhConfig('navigation-menu', props) as NavigationMenuProps, notify)\n provideNavigationMenu(ctx)\n return () => {\n // 默认插槽里有真内容就照旧交给作者;只剩注释或空白时当没写,给了 collection 就按数据铺开整套结构\n const authored = slots.default?.()\n const children = slotPaints(authored)\n ? authored\n : (props.collection ? renderDefaultTree(ctx.api.value.collection, slots.panel) : undefined)\n return h('nav', {\n ...ctx.api.value.getRootProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.rootRef.value = el as HTMLElement },\n }, children)\n }\n },\n})\n\n// 用 ul 而非 div:站点导航是一组并列的去处,读屏会念\"列表,共 n 项\"。\nexport const XhNavigationMenuList = defineComponent({\n name: 'XhNavigationMenuList',\n setup(_, { slots }) {\n const ctx = useNavigationMenuContext()\n return () => h('ul', {\n ...ctx.api.value.getListProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.listRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\n/** 一项渲染为一个 li;面板 content 写在同一个 li 内、紧跟 trigger 之后 */\nexport const XhNavigationMenuItem = defineComponent({\n name: 'XhNavigationMenuItem',\n setup(_, { slots }) {\n const ctx = useNavigationMenuContext()\n return () => h('li', ctx.api.value.getItemProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhNavigationMenuTrigger = defineComponent({\n name: 'XhNavigationMenuTrigger',\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 = useNavigationMenuContext()\n return () => h(\n 'button',\n ctx.api.value.getTriggerProps({ value: props.value, disabled: props.disabled }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\n// 面板常挂,靠 hidden 显隐,不做懒挂载\n/** 入口中表示下方还有面板的标记,展开时转向;身份与所在 trigger 同一份声明 */\nexport const XhNavigationMenuTriggerIndicator = defineComponent({\n name: 'XhNavigationMenuTriggerIndicator',\n props: {\n value: { type: String, required: true },\n disabled: { type: Boolean, default: undefined },\n },\n setup(props, { slots }) {\n const ctx = useNavigationMenuContext()\n return () => h(\n 'span',\n ctx.api.value.getTriggerIndicatorProps({ value: props.value, disabled: props.disabled }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\nexport const XhNavigationMenuContent = defineComponent({\n name: 'XhNavigationMenuContent',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useNavigationMenuContext()\n // 一个面板一份退场闸门:它们各开各的、动画各跑各的,一份管不过来。\n // 开合判据直接取 connect 这一帧的产出,不另起一套——两边各判一次迟早会说岔\n const contentRef = ref<HTMLElement | null>(null)\n let presence: PresenceHandle | null = null\n const visible = useOverlayExit({\n config: ctx.config,\n isOpen: () => ctx.api.value.isOpen(props.value),\n contentRef,\n onPresence: (next) => {\n const previous = presence\n presence = next\n if (ctx.service.getStatus() !== 'Started')\n return\n if (next) {\n ctx.service.send({ type: 'PRESENCE.SET', value: props.value, presence: next, connected: true })\n }\n else if (previous) {\n ctx.service.send({ type: 'PRESENCE.SET', value: props.value, presence: previous, connected: false })\n }\n },\n })\n // setup 期 Presence 早于根机器的 onMounted;挂载后补报一次,确保首帧句柄已入 Headless 表。\n onMounted(() => {\n // 子组件 mounted 早于父级根机器启动,再让出一次提交队列才可安全送事件。\n void nextTick(() => {\n if (presence && ctx.service.getStatus() === 'Started')\n ctx.service.send({ type: 'PRESENCE.SET', value: props.value, presence, connected: true })\n })\n })\n return () => h(\n 'div',\n {\n ...ctx.api.value.getContentProps({ value: props.value }) as Record<string, unknown>,\n // 收起跟着闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场就一帧都\n // 播不出来),所以真正的收起落成内联 display\n style: visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { contentRef.value = el as HTMLElement | null },\n },\n slots.default?.(),\n )\n },\n})\n\n/** 面板里一枝子级的开关:展开时紧跟其后的 XhNavigationMenuBranchContent 露出来 */\nexport const XhNavigationMenuBranchTrigger = defineComponent({\n name: 'XhNavigationMenuBranchTrigger',\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 = useNavigationMenuContext()\n return () => h(\n 'button',\n ctx.api.value.getBranchTriggerProps({ value: props.value, disabled: props.disabled }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\n/** 子级开关里的展开方向标记,展开时转向;身份与所在的开关同一份声明 */\nexport const XhNavigationMenuBranchIndicator = defineComponent({\n name: 'XhNavigationMenuBranchIndicator',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useNavigationMenuContext()\n return () => h(\n 'span',\n ctx.api.value.getBranchIndicatorProps({ value: props.value }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\n/** 一枝子级的容器,写在面板里、紧跟自己的开关之后;收着时 hidden */\nexport const XhNavigationMenuBranchContent = defineComponent({\n name: 'XhNavigationMenuBranchContent',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useNavigationMenuContext()\n return () => h(\n 'div',\n ctx.api.value.getBranchContentProps({ value: props.value }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\n/** 面板内的链接项:href 由作者写,点击不拦截,只收起导航 */\nexport const XhNavigationMenuLink = defineComponent({\n name: 'XhNavigationMenuLink',\n // 直通属性自己合:作者的处理器排在部件前面,asChild 时连同部件属性一起落到作者的链接上\n inheritAttrs: false,\n props: {\n current: Boolean,\n /** 借用作者的子节点(如路由链接)作为链接,不再渲染自己的 `<a>`;子节点须恰好一个。 */\n asChild: Boolean,\n },\n setup(props, { slots, attrs }) {\n const ctx = useNavigationMenuContext()\n // 链接身份:按压通道按它记按住的那一条,按实例生成,作者不必提供\n const value = useId()\n return () => {\n const part = mergePartProps(ctx.api.value.getLinkProps({ value, current: props.current }) as Record<string, unknown>, attrs)\n const children = slots.default?.()\n if (props.asChild)\n return mergeIntoChild(children, part, 'navigation-menu', { applyAnatomy: true })\n return h('a', part, children)\n }\n },\n})\n\n/** 指示条容器,位置由状态机计算后写入内联样式;渲染为 li 以 list 为定位参照系 */\nexport const XhNavigationMenuIndicator = defineComponent({\n name: 'XhNavigationMenuIndicator',\n setup() {\n const ctx = useNavigationMenuContext()\n return () => h('li', ctx.api.value.getIndicatorProps() as Record<string, unknown>)\n },\n})\n\n/** 可选的共享面板外壳,放在 root 内、list 之后 */\nexport const XhNavigationMenuViewport = defineComponent({\n name: 'XhNavigationMenuViewport',\n setup(_, { slots }) {\n const ctx = useNavigationMenuContext()\n return () => h('div', ctx.api.value.getViewportProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 未写默认插槽时按 collection 铺开的整套结构,作者只提供数据。\n * 一项一个 li:带 href 的铺为直达链接,其余铺为 trigger 加面板。面板内容给了 panel 插槽就由它提供,\n * 否则按这一项的 children 铺开:带 href 的条目铺为链接,带 children 的铺为一枝子级(开关 + 箭头 + 子级里的链接)。\n * 与手写部件产出的 DOM 完全一致,需要修改结构时写默认插槽,行为不变。\n */\nfunction renderDefaultTree(\n collection: readonly NavigationMenuNodeMeta[],\n panelSlot?: (node: NavigationMenuNodeMeta) => VNode[],\n): VNode[] {\n return [\n h(XhNavigationMenuList, null, () => [\n ...collection.map(node => h(XhNavigationMenuItem, { key: node.value }, () => (\n node.href != null\n ? [renderLink(node)]\n : [\n h(XhNavigationMenuTrigger, { value: node.value }, () => node.label),\n h(XhNavigationMenuContent, { value: node.value }, () => (panelSlot ? panelSlot(node) : renderPanelEntries(node.children))),\n ]\n ))),\n h(XhNavigationMenuIndicator),\n ]),\n ]\n}\n\nfunction renderLink(node: NavigationMenuNodeMeta): VNode {\n return h(XhNavigationMenuLink, { key: node.value, href: node.href, current: node.current }, () => node.label)\n}\n\n/** 面板条目:带 children 的铺为一枝子级,开关与容器相邻;其余铺为链接 */\nfunction renderPanelEntries(entries: readonly NavigationMenuNodeMeta[]): VNode[] {\n return entries.flatMap(entry => (entry.children.length > 0\n ? [\n h(XhNavigationMenuBranchTrigger, { key: `${entry.value}:trigger`, value: entry.value }, () => [\n entry.label,\n h(XhNavigationMenuBranchIndicator, { value: entry.value }),\n ]),\n h(XhNavigationMenuBranchContent, { key: `${entry.value}:content`, value: entry.value }, () => entry.children.map(renderLink)),\n ]\n : [renderLink(entry)]))\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { ComputedRef } from "vue";
|
|
1
|
+
import { ComputedRef, Ref } from "vue";
|
|
2
2
|
import { NotificationApi, NotificationItemApi, NotificationOptions } from "@xihan-ui/headless";
|
|
3
3
|
//#region src/components/notification/context.d.ts
|
|
4
4
|
interface NotificationContext {
|
|
5
5
|
api: ComputedRef<NotificationApi>;
|
|
6
|
+
/** 作用域包装节点:条目到达的追踪挂在它上面。 */
|
|
7
|
+
rootRef: Ref<HTMLElement | null>;
|
|
6
8
|
/** 入队并返回 id;同 id 已存在则就地改写,位置不变。 */
|
|
7
9
|
create: (options?: NotificationOptions) => string;
|
|
8
10
|
update: (id: string, options: Partial<NotificationOptions>) => void;
|
|
@@ -11,6 +13,8 @@ interface NotificationContext {
|
|
|
11
13
|
}
|
|
12
14
|
interface NotificationItemContext {
|
|
13
15
|
api: ComputedRef<NotificationItemApi>;
|
|
16
|
+
/** 卡片根节点:退场动画从它上面探测。 */
|
|
17
|
+
rootRef: Ref<HTMLElement | null>;
|
|
14
18
|
}
|
|
15
19
|
declare function provideNotification(ctx: NotificationContext): void;
|
|
16
20
|
declare function useNotificationContext(): NotificationContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","names":[],"sources":["../../../src/components/notification/context.ts"],"mappings":";;;UAWiB;EACf,KAAK,YAAY;;EAEjB,SAAS,UAAU;EACnB,SAAS,YAAY,SAAS,QAAQ;EACtC,UAAU;EACV;;UAGe;EACf,KAAK,YAAY;;
|
|
1
|
+
{"version":3,"file":"context.d.ts","names":[],"sources":["../../../src/components/notification/context.ts"],"mappings":";;;UAWiB;EACf,KAAK,YAAY;;EAEjB,SAAS,IAAI;;EAEb,SAAS,UAAU;EACnB,SAAS,YAAY,SAAS,QAAQ;EACtC,UAAU;EACV;;UAGe;EACf,KAAK,YAAY;;EAEjB,SAAS,IAAI;;iBAMC,oBAAoB,KAAK;iBAIzB,0BAA0B;;iBAQ1B,kCAAkC;iBAIlC,wBAAwB,KAAK;iBAI7B,8BAA8B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/notification/context.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// 提供 context 相关实现。\n\nimport type { NotificationApi, NotificationItemApi, NotificationOptions } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport { inject, provide } from 'vue'\n\nexport interface NotificationContext {\n api: ComputedRef<NotificationApi>\n /** 入队并返回 id;同 id 已存在则就地改写,位置不变。 */\n create: (options?: NotificationOptions) => string\n update: (id: string, options: Partial<NotificationOptions>) => void\n dismiss: (id: string) => void\n dismissAll: () => void\n}\n\nexport interface NotificationItemContext {\n api: ComputedRef<NotificationItemApi>\n}\n\nconst KEY: InjectionKey<NotificationContext> = Symbol.for('xh-notification')\nconst ITEM_KEY: InjectionKey<NotificationItemContext> = Symbol.for('xh-notification-item')\n\nexport function provideNotification(ctx: NotificationContext): void {\n provide(KEY, ctx)\n}\n\nexport function useNotificationContext(): NotificationContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Notification 部件必须用在 XhNotificationRoot 内')\n return ctx\n}\n\n/** 注入队列上下文,不在队列内时返回 null 而非抛错。 */\nexport function useNotificationContextOptional(): NotificationContext | null {\n return inject(KEY, null)\n}\n\nexport function provideNotificationItem(ctx: NotificationItemContext): void {\n provide(ITEM_KEY, ctx)\n}\n\nexport function useNotificationItemContext(): NotificationItemContext {\n const ctx = inject(ITEM_KEY, null)\n if (!ctx)\n throw new Error('[xh] Notification 卡片部件必须用在 XhNotificationItem 内')\n return ctx\n}\n"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/notification/context.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// 提供 context 相关实现。\n\nimport type { NotificationApi, NotificationItemApi, NotificationOptions } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey, Ref } from 'vue'\nimport { inject, provide } from 'vue'\n\nexport interface NotificationContext {\n api: ComputedRef<NotificationApi>\n /** 作用域包装节点:条目到达的追踪挂在它上面。 */\n rootRef: Ref<HTMLElement | null>\n /** 入队并返回 id;同 id 已存在则就地改写,位置不变。 */\n create: (options?: NotificationOptions) => string\n update: (id: string, options: Partial<NotificationOptions>) => void\n dismiss: (id: string) => void\n dismissAll: () => void\n}\n\nexport interface NotificationItemContext {\n api: ComputedRef<NotificationItemApi>\n /** 卡片根节点:退场动画从它上面探测。 */\n rootRef: Ref<HTMLElement | null>\n}\n\nconst KEY: InjectionKey<NotificationContext> = Symbol.for('xh-notification')\nconst ITEM_KEY: InjectionKey<NotificationItemContext> = Symbol.for('xh-notification-item')\n\nexport function provideNotification(ctx: NotificationContext): void {\n provide(KEY, ctx)\n}\n\nexport function useNotificationContext(): NotificationContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Notification 部件必须用在 XhNotificationRoot 内')\n return ctx\n}\n\n/** 注入队列上下文,不在队列内时返回 null 而非抛错。 */\nexport function useNotificationContextOptional(): NotificationContext | null {\n return inject(KEY, null)\n}\n\nexport function provideNotificationItem(ctx: NotificationItemContext): void {\n provide(ITEM_KEY, ctx)\n}\n\nexport function useNotificationItemContext(): NotificationItemContext {\n const ctx = inject(ITEM_KEY, null)\n if (!ctx)\n throw new Error('[xh] Notification 卡片部件必须用在 XhNotificationItem 内')\n return ctx\n}\n"],"mappings":";;AA4BA,MAAM,MAAyC,OAAO,IAAI,iBAAiB;AAC3E,MAAM,WAAkD,OAAO,IAAI,sBAAsB;AAEzF,SAAgB,oBAAoB,KAAgC;CAClE,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,yBAA8C;CAC5D,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,+CAA+C;CACjE,OAAO;AACT;;AAGA,SAAgB,iCAA6D;CAC3E,OAAO,OAAO,KAAK,IAAI;AACzB;AAEA,SAAgB,wBAAwB,KAAoC;CAC1E,QAAQ,UAAU,GAAG;AACvB;AAEA,SAAgB,6BAAsD;CACpE,MAAM,MAAM,OAAO,UAAU,IAAI;CACjC,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,iDAAiD;CACnE,OAAO;AACT"}
|