@indielayer/ui 2.0.0 → 2.1.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/docs/App.vue +19 -4
- package/docs/assets/css/tailwind.css +7 -1
- package/docs/components/Cookies.vue +3 -1
- package/docs/components/common/CodePreview.vue +1 -1
- package/docs/components/common/DocsCopyPage.vue +200 -0
- package/docs/components/common/DocumentPage.vue +76 -23
- package/docs/components/toolbar/ToolbarColorToggle.vue +29 -18
- package/docs/components/toolbar/ToolbarSearch.vue +4 -4
- package/docs/composables/useDocMeta.ts +63 -4
- package/docs/icons.ts +3 -0
- package/docs/main.ts +25 -26
- package/docs/pages/component/accordion/index.vue +2 -2
- package/docs/pages/component/alert/index.vue +2 -2
- package/docs/pages/component/avatar/index.vue +4 -4
- package/docs/pages/component/badge/index.vue +2 -2
- package/docs/pages/component/breadcrumbs/index.vue +2 -2
- package/docs/pages/component/button/button-group.vue +3 -3
- package/docs/pages/component/button/index.vue +14 -7
- package/docs/pages/component/button/tooltip.vue +10 -0
- package/docs/pages/component/card/index.vue +2 -2
- package/docs/pages/component/carousel/index.vue +2 -2
- package/docs/pages/component/checkbox/index.vue +5 -5
- package/docs/pages/component/container/index.vue +2 -2
- package/docs/pages/component/datepicker/index.vue +2 -2
- package/docs/pages/component/divider/index.vue +4 -4
- package/docs/pages/component/drawer/index.vue +2 -2
- package/docs/pages/component/empty/index.vue +3 -3
- package/docs/pages/component/form/index.vue +2 -2
- package/docs/pages/component/formGroup/index.vue +2 -2
- package/docs/pages/component/infiniteLoader/index.vue +3 -3
- package/docs/pages/component/input/index.vue +5 -5
- package/docs/pages/component/inputGroup/index.vue +3 -3
- package/docs/pages/component/inputGroup/validation.vue +6 -1
- package/docs/pages/component/link/index.vue +2 -2
- package/docs/pages/component/loader/index.vue +2 -2
- package/docs/pages/component/menu/index.vue +2 -2
- package/docs/pages/component/modal/index.vue +3 -3
- package/docs/pages/component/notifications/index.vue +2 -2
- package/docs/pages/component/pagination/index.vue +2 -2
- package/docs/pages/component/popover/index.vue +2 -2
- package/docs/pages/component/popover/usage.vue +14 -0
- package/docs/pages/component/progress/index.vue +3 -3
- package/docs/pages/component/qrCode/index.vue +2 -2
- package/docs/pages/component/radio/index.vue +3 -3
- package/docs/pages/component/scroll/index.vue +3 -3
- package/docs/pages/component/select/index.vue +5 -5
- package/docs/pages/component/skeleton/index.vue +2 -2
- package/docs/pages/component/slider/index.vue +2 -2
- package/docs/pages/component/spacer/index.vue +2 -2
- package/docs/pages/component/spinner/index.vue +3 -3
- package/docs/pages/component/table/index.vue +4 -4
- package/docs/pages/component/tabs/index.vue +2 -2
- package/docs/pages/component/tabs/usage.vue +26 -0
- package/docs/pages/component/tag/index.vue +2 -2
- package/docs/pages/component/textarea/index.vue +4 -4
- package/docs/pages/component/toggle/index.vue +4 -4
- package/docs/pages/component/upload/index.vue +2 -2
- package/docs/pages/component/upload/usage.vue +1 -0
- package/docs/pages/component/virtualGrid/index.vue +2 -2
- package/docs/pages/component/virtualList/index.vue +3 -3
- package/docs/pages/icons.vue +2 -2
- package/docs/router/index.ts +39 -44
- package/docs/search/components.json +1 -1
- package/docs/search/index.json +1 -1
- package/lib/common/buttonGroupRadius.d.ts +3 -0
- package/lib/common/buttonGroupRadius.js +6 -0
- package/lib/common/props.d.ts +1 -1
- package/lib/common/props.js +10 -9
- package/lib/components/accordion/Accordion.vue.d.ts +42 -9
- package/lib/components/accordion/Accordion.vue_vue_type_script_setup_true_lang.js +18 -6
- package/lib/components/accordion/AccordionItem.vue.d.ts +33 -6
- package/lib/components/accordion/AccordionItem.vue_vue_type_script_setup_true_lang.js +31 -6
- package/lib/components/alert/Alert.vue.d.ts +27 -6
- package/lib/components/alert/Alert.vue_vue_type_script_setup_true_lang.js +20 -6
- package/lib/components/avatar/Avatar.vue.d.ts +45 -9
- package/lib/components/avatar/Avatar.vue_vue_type_script_setup_true_lang.js +17 -6
- package/lib/components/badge/Badge.vue.d.ts +54 -9
- package/lib/components/badge/Badge.vue_vue_type_script_setup_true_lang.js +26 -9
- package/lib/components/breadcrumbs/Breadcrumbs.vue.d.ts +30 -6
- package/lib/components/breadcrumbs/Breadcrumbs.vue_vue_type_script_setup_true_lang.js +13 -5
- package/lib/components/button/Button.js +2 -2
- package/lib/components/button/Button.vue.d.ts +138 -28
- package/lib/components/button/Button.vue_vue_type_script_setup_true_lang.js +192 -70
- package/lib/components/button/ButtonGroup.js +4 -5
- package/lib/components/button/ButtonGroup.vue.d.ts +54 -10
- package/lib/components/button/ButtonGroup.vue_vue_type_script_setup_true_lang.js +30 -19
- package/lib/components/button/theme/Button.base.theme.js +6 -5
- package/lib/components/button/theme/Button.carbon.theme.js +6 -5
- package/lib/components/card/Card.vue.d.ts +3 -0
- package/lib/components/card/Card.vue_vue_type_script_setup_true_lang.js +4 -2
- package/lib/components/carousel/Carousel.vue.d.ts +21 -3
- package/lib/components/carousel/Carousel.vue_vue_type_script_setup_true_lang.js +23 -5
- package/lib/components/carousel/CarouselSlide.js +2 -2
- package/lib/components/carousel/CarouselSlide.vue.d.ts +3 -0
- package/lib/components/carousel/CarouselSlide.vue_vue_type_script_setup_true_lang.js +3 -1
- package/lib/components/carousel/{CarouselSlide.vue_vue_type_style_index_0_scoped_e90d2127_lang.module.js → CarouselSlide.vue_vue_type_style_index_0_scoped_4f559831_lang.module.js} +1 -1
- package/lib/components/checkbox/Checkbox.vue.d.ts +198 -45
- package/lib/components/checkbox/Checkbox.vue_vue_type_script_setup_true_lang.js +20 -3
- package/lib/components/container/Container.vue.d.ts +6 -0
- package/lib/components/container/Container.vue_vue_type_script_setup_true_lang.js +5 -2
- package/lib/components/datepicker/Datepicker.vue.d.ts +462 -36
- package/lib/components/datepicker/Datepicker.vue_vue_type_script_setup_true_lang.js +294 -153
- package/lib/components/divider/Divider.vue.d.ts +12 -3
- package/lib/components/divider/Divider.vue_vue_type_script_setup_true_lang.js +6 -2
- package/lib/components/drawer/Drawer.vue.d.ts +39 -6
- package/lib/components/drawer/Drawer.vue_vue_type_script_setup_true_lang.js +30 -7
- package/lib/components/empty/Empty.vue.d.ts +30 -6
- package/lib/components/empty/Empty.vue_vue_type_script_setup_true_lang.js +17 -4
- package/lib/components/form/Form.vue.d.ts +48 -9
- package/lib/components/form/Form.vue_vue_type_script_setup_true_lang.js +34 -7
- package/lib/components/formGroup/FormGroup.vue.d.ts +171 -39
- package/lib/components/formGroup/FormGroup.vue_vue_type_script_setup_true_lang.js +15 -9
- package/lib/components/icon/Icon.vue.d.ts +9 -0
- package/lib/components/icon/Icon.vue_vue_type_script_setup_true_lang.js +6 -3
- package/lib/components/image/Image.vue.d.ts +12 -3
- package/lib/components/image/Image.vue_vue_type_script_setup_true_lang.js +5 -1
- package/lib/components/index.js +18 -18
- package/lib/components/input/Input.vue.d.ts +291 -66
- package/lib/components/input/Input.vue_vue_type_script_setup_true_lang.js +53 -15
- package/lib/components/inputFooter/InputFooter.vue.d.ts +48 -12
- package/lib/components/inputFooter/InputFooter.vue_vue_type_script_setup_true_lang.js +18 -5
- package/lib/components/inputGroup/InputGroup.vue.d.ts +171 -39
- package/lib/components/inputGroup/InputGroup.vue_vue_type_script_setup_true_lang.js +6 -1
- package/lib/components/label/Label.vue.d.ts +78 -18
- package/lib/components/label/Label.vue_vue_type_script_setup_true_lang.js +28 -8
- package/lib/components/link/Link.js +2 -2
- package/lib/components/link/Link.vue.d.ts +18 -3
- package/lib/components/link/Link.vue_vue_type_script_setup_true_lang.js +10 -5
- package/lib/components/loader/Loader.vue.d.ts +30 -6
- package/lib/components/loader/Loader.vue_vue_type_script_setup_true_lang.js +11 -3
- package/lib/components/menu/Menu.vue.d.ts +51 -9
- package/lib/components/menu/Menu.vue_vue_type_script_setup_true_lang.js +24 -8
- package/lib/components/menu/MenuItem.js +2 -2
- package/lib/components/menu/MenuItem.vue.d.ts +198 -45
- package/lib/components/menu/MenuItem.vue_vue_type_script_setup_true_lang.js +84 -23
- package/lib/components/menu/{MenuItem.vue_vue_type_style_index_0_scoped_2a6b7341_lang.module.js → MenuItem.vue_vue_type_style_index_0_scoped_5aebaff3_lang.module.js} +1 -1
- package/lib/components/modal/Modal.vue.d.ts +177 -39
- package/lib/components/modal/Modal.vue_vue_type_script_setup_true_lang.js +104 -23
- package/lib/components/notifications/Notifications.vue.d.ts +24 -0
- package/lib/components/notifications/Notifications.vue_vue_type_script_setup_true_lang.js +39 -12
- package/lib/components/pagination/Pagination.vue.d.ts +12 -0
- package/lib/components/pagination/Pagination.vue_vue_type_script_setup_true_lang.js +8 -4
- package/lib/components/pagination/PaginationItem.vue.d.ts +18 -3
- package/lib/components/pagination/PaginationItem.vue_vue_type_script_setup_true_lang.js +8 -3
- package/lib/components/popover/Popover.vue.d.ts +204 -45
- package/lib/components/popover/Popover.vue_vue_type_script_setup_true_lang.js +157 -66
- package/lib/components/popover/PopoverContainer.vue.d.ts +3 -0
- package/lib/components/popover/PopoverContainer.vue_vue_type_script_setup_true_lang.js +3 -1
- package/lib/components/popover/PopoverContentBoundary.js +5 -0
- package/lib/components/popover/PopoverContentBoundary.vue.d.ts +9 -0
- package/lib/components/popover/PopoverContentBoundary.vue_vue_type_script_setup_true_lang.js +18 -0
- package/lib/components/popover/theme/PopoverContainer.base.theme.js +1 -1
- package/lib/components/progress/Progress.vue.d.ts +9 -0
- package/lib/components/progress/Progress.vue_vue_type_script_setup_true_lang.js +7 -4
- package/lib/components/qrCode/QrCode.vue.d.ts +24 -3
- package/lib/components/qrCode/QrCode.vue_vue_type_script_setup_true_lang.js +13 -5
- package/lib/components/radio/Radio.vue.d.ts +186 -42
- package/lib/components/radio/Radio.vue_vue_type_script_setup_true_lang.js +10 -2
- package/lib/components/radioButton/RadioButton.vue.d.ts +186 -42
- package/lib/components/radioButton/RadioButton.vue_vue_type_script_setup_true_lang.js +9 -1
- package/lib/components/scroll/Scroll.vue.d.ts +3 -0
- package/lib/components/scroll/Scroll.vue_vue_type_script_setup_true_lang.js +9 -4
- package/lib/components/select/Select.vue.d.ts +633 -144
- package/lib/components/select/Select.vue_vue_type_script_setup_true_lang.js +224 -189
- package/lib/components/skeleton/Skeleton.vue.d.ts +6 -0
- package/lib/components/skeleton/Skeleton.vue_vue_type_script_setup_true_lang.js +5 -2
- package/lib/components/slider/Slider.js +1 -1
- package/lib/components/slider/Slider.vue.d.ts +180 -39
- package/lib/components/slider/Slider.vue_vue_type_script_setup_true_lang.js +14 -3
- package/lib/components/spinner/Spinner.vue.d.ts +6 -0
- package/lib/components/spinner/Spinner.vue_vue_type_script_setup_true_lang.js +3 -1
- package/lib/components/stepper/Stepper.vue.d.ts +120 -24
- package/lib/components/stepper/Stepper.vue_vue_type_script_setup_true_lang.js +63 -15
- package/lib/components/tab/Tab.vue.d.ts +112 -31
- package/lib/components/tab/Tab.vue_vue_type_script_setup_true_lang.js +166 -95
- package/lib/components/tab/TabGroup.vue.d.ts +47 -12
- package/lib/components/tab/TabGroup.vue_vue_type_script_setup_true_lang.js +93 -49
- package/lib/components/tab/theme/Tab.base.theme.js +6 -6
- package/lib/components/tab/theme/Tab.carbon.theme.js +6 -6
- package/lib/components/tab/theme/TabGroup.base.theme.js +7 -7
- package/lib/components/tab/theme/TabGroup.carbon.theme.js +3 -3
- package/lib/components/table/Table.vue.d.ts +45 -9
- package/lib/components/table/Table.vue_vue_type_script_setup_true_lang.js +82 -27
- package/lib/components/table/TableCell.vue.d.ts +54 -12
- package/lib/components/table/TableCell.vue_vue_type_script_setup_true_lang.js +23 -8
- package/lib/components/table/TableHead.vue_vue_type_script_setup_true_lang.js +2 -1
- package/lib/components/table/TableHeader.vue.d.ts +18 -3
- package/lib/components/table/TableHeader.vue_vue_type_script_setup_true_lang.js +10 -4
- package/lib/components/table/TableRow.vue.d.ts +15 -3
- package/lib/components/table/TableRow.vue_vue_type_script_setup_true_lang.js +10 -5
- package/lib/components/tag/Tag.vue.d.ts +33 -6
- package/lib/components/tag/Tag.vue_vue_type_script_setup_true_lang.js +21 -7
- package/lib/components/textarea/Textarea.vue.d.ts +237 -54
- package/lib/components/textarea/Textarea.vue_vue_type_script_setup_true_lang.js +38 -13
- package/lib/components/themeProvider/ThemeProvider.vue.d.ts +10 -4
- package/lib/components/themeProvider/ThemeProvider.vue_vue_type_script_setup_true_lang.js +6 -1
- package/lib/components/toggle/Toggle.vue.d.ts +174 -39
- package/lib/components/toggle/Toggle.vue_vue_type_script_setup_true_lang.js +5 -1
- package/lib/components/tooltip/ToggleTip.vue.d.ts +24 -6
- package/lib/components/tooltip/ToggleTip.vue_vue_type_script_setup_true_lang.js +9 -2
- package/lib/components/tooltip/Tooltip.vue.d.ts +30 -6
- package/lib/components/tooltip/Tooltip.vue_vue_type_script_setup_true_lang.js +16 -4
- package/lib/components/upload/Upload.vue.d.ts +249 -57
- package/lib/components/upload/Upload.vue_vue_type_script_setup_true_lang.js +156 -125
- package/lib/components/upload/fileAccept.d.ts +6 -0
- package/lib/components/upload/fileAccept.js +17 -0
- package/lib/composables/useColors.d.ts +1 -0
- package/lib/composables/useColors.js +2 -1
- package/lib/composables/useCommon.d.ts +1 -0
- package/lib/composables/useCommon.js +2 -1
- package/lib/composables/useFocusTrap.js +1 -1
- package/lib/composables/useInputtable.d.ts +45 -10
- package/lib/composables/useInputtable.js +56 -14
- package/lib/composables/useInteractive.d.ts +13 -3
- package/lib/composables/useInteractive.js +14 -4
- package/lib/index.js +12 -12
- package/lib/index.umd.js +9 -10
- package/lib/themes/base/styles.d.ts +1 -1
- package/lib/themes/base/styles.js +1 -1
- package/lib/themes/carbon/styles.d.ts +1 -1
- package/lib/themes/carbon/styles.js +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/virtual/components/infiniteLoader/InfiniteLoader.vue.d.ts +27 -16
- package/lib/virtual/components/infiniteLoader/InfiniteLoader.vue_vue_type_script_setup_true_lang.js +25 -5
- package/lib/virtual/components/virtualGrid/VirtualGrid.vue.d.ts +108 -86
- package/lib/virtual/components/virtualGrid/VirtualGrid.vue_vue_type_script_setup_true_lang.js +91 -21
- package/lib/virtual/components/virtualList/VirtualList.vue.d.ts +62 -48
- package/lib/virtual/components/virtualList/VirtualList.vue_vue_type_script_setup_true_lang.js +64 -13
- package/lib/virtual/components/virtualList/useDynamicRowHeight.js +4 -3
- package/package.json +5 -3
- package/src/common/buttonGroupRadius.ts +16 -0
- package/src/common/props.ts +10 -9
- package/src/components/accordion/Accordion.vue +20 -4
- package/src/components/accordion/AccordionItem.vue +28 -3
- package/src/components/alert/Alert.vue +22 -6
- package/src/components/avatar/Avatar.vue +20 -5
- package/src/components/badge/Badge.vue +24 -5
- package/src/components/breadcrumbs/Breadcrumbs.vue +15 -5
- package/src/components/button/Button.vue +140 -5
- package/src/components/button/ButtonGroup.vue +41 -25
- package/src/components/button/__tests__/ Button.spec.ts +41 -0
- package/src/components/button/__tests__/ ButtonGroup.spec.ts +32 -0
- package/src/components/button/theme/Button.base.theme.ts +4 -1
- package/src/components/button/theme/Button.carbon.theme.ts +5 -4
- package/src/components/card/Card.vue +10 -2
- package/src/components/carousel/Carousel.vue +22 -2
- package/src/components/carousel/CarouselSlide.vue +6 -0
- package/src/components/checkbox/Checkbox.vue +22 -3
- package/src/components/container/Container.vue +10 -1
- package/src/components/datepicker/Datepicker.vue +466 -101
- package/src/components/datepicker/__tests__/Datepicker.spec.ts +31 -0
- package/src/components/divider/Divider.vue +9 -3
- package/src/components/drawer/Drawer.vue +27 -2
- package/src/components/empty/Empty.vue +18 -3
- package/src/components/form/Form.vue +32 -3
- package/src/components/formGroup/FormGroup.vue +12 -0
- package/src/components/icon/Icon.vue +4 -1
- package/src/components/image/Image.vue +8 -2
- package/src/components/input/Input.vue +54 -12
- package/src/components/inputFooter/InputFooter.vue +21 -6
- package/src/components/inputGroup/InputGroup.vue +12 -1
- package/src/components/label/Label.vue +31 -7
- package/src/components/link/Link.vue +16 -5
- package/src/components/loader/Loader.vue +10 -2
- package/src/components/menu/Menu.vue +23 -5
- package/src/components/menu/MenuItem.vue +78 -17
- package/src/components/modal/Modal.vue +90 -15
- package/src/components/notifications/Notifications.vue +23 -0
- package/src/components/notifications/__tests__/Notifications.spec.ts +44 -4
- package/src/components/pagination/Pagination.vue +9 -1
- package/src/components/pagination/PaginationItem.vue +11 -2
- package/src/components/popover/Popover.vue +113 -18
- package/src/components/popover/PopoverContainer.vue +9 -1
- package/src/components/popover/PopoverContentBoundary.vue +32 -0
- package/src/components/popover/__tests__/Popover.spec.ts +51 -0
- package/src/components/popover/theme/PopoverContainer.base.theme.ts +1 -1
- package/src/components/progress/Progress.vue +8 -3
- package/src/components/qrCode/QrCode.vue +9 -1
- package/src/components/radio/Radio.vue +16 -2
- package/src/components/radioButton/RadioButton.vue +15 -1
- package/src/components/scroll/Scroll.vue +15 -4
- package/src/components/select/Select.vue +53 -16
- package/src/components/skeleton/Skeleton.vue +3 -0
- package/src/components/slider/Slider.vue +15 -0
- package/src/components/spinner/Spinner.vue +2 -0
- package/src/components/stepper/Stepper.vue +57 -9
- package/src/components/tab/Tab.vue +153 -63
- package/src/components/tab/TabGroup.vue +110 -26
- package/src/components/tab/__tests__/Tab.spec.ts +53 -0
- package/src/components/tab/__tests__/TabGroup.spec.ts +113 -0
- package/src/components/tab/theme/Tab.base.theme.ts +24 -2
- package/src/components/tab/theme/Tab.carbon.theme.ts +30 -7
- package/src/components/tab/theme/TabGroup.base.theme.ts +12 -9
- package/src/components/tab/theme/TabGroup.carbon.theme.ts +6 -2
- package/src/components/table/Table.vue +76 -19
- package/src/components/table/TableCell.vue +25 -6
- package/src/components/table/TableHead.vue +9 -2
- package/src/components/table/TableHeader.vue +16 -3
- package/src/components/table/TableRow.vue +17 -5
- package/src/components/tag/Tag.vue +22 -6
- package/src/components/textarea/Textarea.vue +40 -11
- package/src/components/themeProvider/ThemeProvider.vue +22 -7
- package/src/components/toggle/Toggle.vue +9 -1
- package/src/components/tooltip/ToggleTip.vue +12 -3
- package/src/components/tooltip/Tooltip.vue +19 -3
- package/src/components/upload/Upload.vue +46 -16
- package/src/components/upload/__tests__/fileAccept.spec.ts +39 -0
- package/src/components/upload/fileAccept.ts +29 -0
- package/src/composables/useColors.ts +1 -0
- package/src/composables/useCommon.ts +1 -0
- package/src/composables/useFocusTrap.ts +3 -1
- package/src/composables/useInputtable.ts +66 -10
- package/src/composables/useInteractive.ts +13 -3
- package/src/themes/base/styles.ts +2 -3
- package/src/themes/carbon/styles.ts +2 -3
- package/src/version.ts +1 -1
- package/src/virtual/components/infiniteLoader/InfiniteLoader.vue +33 -1
- package/src/virtual/components/virtualGrid/VirtualGrid.vue +104 -10
- package/src/virtual/components/virtualList/VirtualList.vue +73 -8
- package/src/virtual/components/virtualList/useDynamicRowHeight.ts +9 -2
- package/volar.d.ts +3 -0
- package/docs/layouts/simple.vue +0 -5
- package/lib/components/button/ButtonGroup.vue_vue_type_style_index_0_lang.module.js +0 -7
- /package/lib/components/button/{Button.vue_vue_type_style_index_0_scoped_4402fde2_lang.module.js → Button.vue_vue_type_style_index_0_scoped_486cb9c0_lang.module.js} +0 -0
- /package/lib/components/link/{Link.vue_vue_type_style_index_0_scoped_8e0e4d08_lang.module.js → Link.vue_vue_type_style_index_0_scoped_3ee61e03_lang.module.js} +0 -0
|
@@ -7,36 +7,85 @@ const menuItemProps = {
|
|
|
7
7
|
item: {
|
|
8
8
|
type: Object as PropType<MenuArrayItem>,
|
|
9
9
|
default: () => {},
|
|
10
|
+
description: 'Item data object. Individual props override matching fields.',
|
|
11
|
+
},
|
|
12
|
+
active: {
|
|
13
|
+
type: Boolean,
|
|
14
|
+
description: 'Forces active styling when not using router link classes.',
|
|
10
15
|
},
|
|
11
|
-
active: Boolean,
|
|
12
16
|
attrs: {
|
|
13
17
|
type: Object,
|
|
14
18
|
default: () => {},
|
|
19
|
+
description: 'Extra HTML attributes merged onto the root element.',
|
|
20
|
+
},
|
|
21
|
+
onClick: {
|
|
22
|
+
type: Function,
|
|
23
|
+
description: 'Click handler invoked when the item is activated.',
|
|
24
|
+
},
|
|
25
|
+
value: {
|
|
26
|
+
type: [Number, String],
|
|
27
|
+
description: 'Item value identifier.',
|
|
28
|
+
},
|
|
29
|
+
to: {
|
|
30
|
+
type: [String, Object],
|
|
31
|
+
description: 'Vue Router location; renders as a router-link when set.',
|
|
32
|
+
},
|
|
33
|
+
exact: {
|
|
34
|
+
type: Boolean,
|
|
35
|
+
description: 'Requires exact route match for active state.',
|
|
36
|
+
},
|
|
37
|
+
href: {
|
|
38
|
+
type: String,
|
|
39
|
+
description: 'Native link URL; renders as an anchor when set.',
|
|
40
|
+
},
|
|
41
|
+
target: {
|
|
42
|
+
type: String,
|
|
43
|
+
description: 'Anchor target when `href` is set.',
|
|
44
|
+
},
|
|
45
|
+
label: {
|
|
46
|
+
type: String,
|
|
47
|
+
description: 'Visible label text.',
|
|
48
|
+
},
|
|
49
|
+
icon: {
|
|
50
|
+
type: String,
|
|
51
|
+
description: 'Icon name shown before the label.',
|
|
52
|
+
},
|
|
53
|
+
iconRight: {
|
|
54
|
+
type: String,
|
|
55
|
+
description: 'Icon name shown after the label.',
|
|
56
|
+
},
|
|
57
|
+
loading: {
|
|
58
|
+
type: Boolean,
|
|
59
|
+
description: 'Shows a spinner in place of the trailing icon.',
|
|
15
60
|
},
|
|
16
|
-
onClick: Function,
|
|
17
|
-
value: [Number, String],
|
|
18
|
-
to: [String, Object],
|
|
19
|
-
exact: Boolean,
|
|
20
|
-
href: String,
|
|
21
|
-
target: String,
|
|
22
|
-
label: String,
|
|
23
|
-
icon: String,
|
|
24
|
-
iconRight: String,
|
|
25
|
-
loading: Boolean,
|
|
26
61
|
rounded: {
|
|
27
62
|
type: Boolean,
|
|
28
63
|
default: true,
|
|
64
|
+
description: 'Applies rounded corners.',
|
|
29
65
|
},
|
|
30
66
|
filled: {
|
|
31
67
|
type: Boolean,
|
|
32
68
|
default: true,
|
|
69
|
+
description: 'Filled background style.',
|
|
70
|
+
},
|
|
71
|
+
selected: {
|
|
72
|
+
type: Boolean,
|
|
73
|
+
description: 'Selected visual state.',
|
|
33
74
|
},
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
75
|
+
disabled: {
|
|
76
|
+
type: Boolean,
|
|
77
|
+
description: 'Disables interaction.',
|
|
78
|
+
},
|
|
79
|
+
minimal: optionalBooleanProp('Hides the label; icon-only layout.'),
|
|
80
|
+
prefix: {
|
|
81
|
+
type: String,
|
|
82
|
+
description: 'Text before the label when no prefix slot is used.',
|
|
83
|
+
},
|
|
84
|
+
suffix: {
|
|
85
|
+
type: String,
|
|
86
|
+
description: 'Text after the label when no suffix slot is used.',
|
|
87
|
+
},
|
|
88
|
+
checkbox: optionalBooleanProp('Shows a checkbox before the label.'),
|
|
40
89
|
}
|
|
41
90
|
|
|
42
91
|
export type MenuItemProps = ExtractPublicPropTypes<typeof menuItemProps>
|
|
@@ -50,6 +99,18 @@ export default {
|
|
|
50
99
|
validators: {
|
|
51
100
|
...useCommon.validators(),
|
|
52
101
|
},
|
|
102
|
+
docs: {
|
|
103
|
+
slots: {
|
|
104
|
+
default: 'Label content. Slot prop: item.',
|
|
105
|
+
prefix: 'Content before the label. Slot prop: item.',
|
|
106
|
+
suffix: 'Content after the label. Slot prop: item.',
|
|
107
|
+
},
|
|
108
|
+
emits: {
|
|
109
|
+
active: 'Emitted when the item becomes active (route or `active` prop).',
|
|
110
|
+
click: 'Emitted on item click when not disabled.',
|
|
111
|
+
'checkbox-click': 'Emitted when the checkbox is clicked.',
|
|
112
|
+
},
|
|
113
|
+
},
|
|
53
114
|
}
|
|
54
115
|
</script>
|
|
55
116
|
|
|
@@ -5,46 +5,92 @@ const modalProps = {
|
|
|
5
5
|
size: {
|
|
6
6
|
type: String as PropType<ModalSize>,
|
|
7
7
|
default: 'lg',
|
|
8
|
+
description: 'Dialog width preset (xs, sm, md, lg, xl, full).',
|
|
8
9
|
},
|
|
9
10
|
position: {
|
|
10
11
|
type: String as PropType<ModalPosition>,
|
|
11
12
|
default: 'center',
|
|
13
|
+
description: 'Vertical placement of the dialog (top, center, bottom).',
|
|
14
|
+
},
|
|
15
|
+
modelValue: {
|
|
16
|
+
type: Boolean,
|
|
17
|
+
description: 'Open state (v-model).',
|
|
18
|
+
},
|
|
19
|
+
showClose: {
|
|
20
|
+
type: Boolean,
|
|
21
|
+
description: 'Shows a close button in the corner.',
|
|
12
22
|
},
|
|
13
|
-
modelValue: Boolean,
|
|
14
|
-
showClose: Boolean,
|
|
15
23
|
backdrop: {
|
|
16
24
|
type: Boolean,
|
|
17
25
|
default: true,
|
|
26
|
+
description: 'Shows a dimmed backdrop behind the dialog.',
|
|
18
27
|
},
|
|
19
28
|
hasActions: {
|
|
20
29
|
type: Boolean,
|
|
21
30
|
default: true,
|
|
31
|
+
description: 'Renders the default actions footer region when no footer slot is used.',
|
|
22
32
|
},
|
|
23
33
|
hasHeader: {
|
|
24
34
|
type: Boolean,
|
|
25
35
|
default: true,
|
|
36
|
+
description: 'Renders the default header region when no header slot is used.',
|
|
37
|
+
},
|
|
38
|
+
title: {
|
|
39
|
+
type: String,
|
|
40
|
+
description: 'Header title text.',
|
|
41
|
+
},
|
|
42
|
+
description: {
|
|
43
|
+
type: String,
|
|
44
|
+
description: 'Body description shown above the default slot.',
|
|
45
|
+
},
|
|
46
|
+
label: {
|
|
47
|
+
type: String,
|
|
48
|
+
description: 'Small label above the title in the header.',
|
|
49
|
+
},
|
|
50
|
+
loading: {
|
|
51
|
+
type: Boolean,
|
|
52
|
+
description: 'Loading state for the modal (theme/visual).',
|
|
53
|
+
},
|
|
54
|
+
loadingText: {
|
|
55
|
+
type: String,
|
|
56
|
+
description: 'Text shown while loading.',
|
|
57
|
+
},
|
|
58
|
+
fluid: {
|
|
59
|
+
type: Boolean,
|
|
60
|
+
description: 'Stretches the dialog to fill available width within its size.',
|
|
26
61
|
},
|
|
27
|
-
title: String,
|
|
28
|
-
description: String,
|
|
29
|
-
label: String,
|
|
30
|
-
loading: Boolean,
|
|
31
|
-
loadingText: String,
|
|
32
|
-
fluid: Boolean,
|
|
33
62
|
|
|
34
63
|
// form props
|
|
35
|
-
isForm:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
64
|
+
isForm: {
|
|
65
|
+
type: Boolean,
|
|
66
|
+
description: 'Wraps content in x-form and enables form submit handling.',
|
|
67
|
+
},
|
|
68
|
+
formDisabled: {
|
|
69
|
+
type: Boolean,
|
|
70
|
+
description: 'Disables the inner form when `isForm` is set.',
|
|
71
|
+
},
|
|
72
|
+
formDescription: {
|
|
73
|
+
type: String,
|
|
74
|
+
description: 'Description passed to the inner form when `isForm` is set.',
|
|
75
|
+
},
|
|
76
|
+
formTitle: {
|
|
77
|
+
type: String,
|
|
78
|
+
description: 'Title passed to the inner form when `isForm` is set.',
|
|
79
|
+
},
|
|
39
80
|
formAutoValidate: {
|
|
40
81
|
type: Boolean,
|
|
41
82
|
default: true,
|
|
83
|
+
description: 'Auto-validate the inner form on submit when `isForm` is set.',
|
|
42
84
|
},
|
|
43
85
|
formErrors: {
|
|
44
86
|
type: [Array, Object] as PropType<FormError[] | FormError>,
|
|
45
87
|
default: () => ([]),
|
|
88
|
+
description: 'External form errors passed to the inner form when `isForm` is set.',
|
|
89
|
+
},
|
|
90
|
+
persistent: {
|
|
91
|
+
type: Boolean,
|
|
92
|
+
description: 'Prevents closing on Escape or backdrop click.',
|
|
46
93
|
},
|
|
47
|
-
persistent: Boolean,
|
|
48
94
|
}
|
|
49
95
|
|
|
50
96
|
export type ModalSize = typeof modalSize[number]
|
|
@@ -63,6 +109,28 @@ export default {
|
|
|
63
109
|
size: modalSize,
|
|
64
110
|
position: modalPosition,
|
|
65
111
|
},
|
|
112
|
+
docs: {
|
|
113
|
+
slots: {
|
|
114
|
+
default: 'Main modal body content.',
|
|
115
|
+
image: 'Optional media above the header.',
|
|
116
|
+
header: 'Replaces the default header region.',
|
|
117
|
+
'header-content': 'Custom header content inside the default header layout.',
|
|
118
|
+
footer: 'Replaces the default actions footer.',
|
|
119
|
+
actions: 'Custom actions row inside the default footer.',
|
|
120
|
+
'cancel-action': 'Cancel / dismiss control in the actions row.',
|
|
121
|
+
'tertiary-action': 'Tertiary action control in the actions row.',
|
|
122
|
+
'secondary-action': 'Secondary action control in the actions row.',
|
|
123
|
+
'primary-action': 'Primary action control in the actions row.',
|
|
124
|
+
},
|
|
125
|
+
emits: {
|
|
126
|
+
'update:modelValue': 'Emitted when open state changes (v-model).',
|
|
127
|
+
submit: 'Emitted when the inner form submits. Payload is the validation result.',
|
|
128
|
+
},
|
|
129
|
+
methods: {
|
|
130
|
+
open: 'Open the modal.',
|
|
131
|
+
close: 'Close the modal.',
|
|
132
|
+
},
|
|
133
|
+
},
|
|
66
134
|
}
|
|
67
135
|
</script>
|
|
68
136
|
|
|
@@ -100,7 +168,7 @@ watch(value, (val) => {
|
|
|
100
168
|
if (val) {
|
|
101
169
|
setTimeout(() => {
|
|
102
170
|
stopClickOutside = onClickOutside(modalRef, clickOutsideCallback, {
|
|
103
|
-
ignore: ['.v-popper__popper'],
|
|
171
|
+
ignore: ['.v-popper__popper', '.dp__menu', '.dp--menu-wrapper'],
|
|
104
172
|
})
|
|
105
173
|
})
|
|
106
174
|
}
|
|
@@ -113,6 +181,13 @@ watch(() => props.modelValue, checkVisibility, { immediate: true })
|
|
|
113
181
|
async function checkVisibility() {
|
|
114
182
|
const val = props.modelValue
|
|
115
183
|
|
|
184
|
+
if (typeof document === 'undefined' || typeof window === 'undefined') {
|
|
185
|
+
value.value = val
|
|
186
|
+
visible.value = val
|
|
187
|
+
|
|
188
|
+
return
|
|
189
|
+
}
|
|
190
|
+
|
|
116
191
|
if (val) {
|
|
117
192
|
const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth
|
|
118
193
|
|
|
@@ -141,7 +216,7 @@ async function checkVisibility() {
|
|
|
141
216
|
if (typeof window !== 'undefined') useEventListener(document, 'keydown', onKeyDown)
|
|
142
217
|
|
|
143
218
|
const shouldIgnoreEvent = (event: KeyboardEvent) => {
|
|
144
|
-
return ['.v-popper__popper', '.x-datepicker'].some((target) => {
|
|
219
|
+
return ['.v-popper__popper', '.x-datepicker', '.dp__menu', '.dp--menu-wrapper'].some((target) => {
|
|
145
220
|
if (typeof target === 'string') {
|
|
146
221
|
return Array.from(window.document.querySelectorAll(target))
|
|
147
222
|
.some((el) => el === event.target || event.composedPath().includes(el))
|
|
@@ -5,31 +5,38 @@ const notificationsProps = {
|
|
|
5
5
|
type: String as PropType<NotificationsAlign>,
|
|
6
6
|
default: 'right',
|
|
7
7
|
validator: (value: string) => validators.align.includes(value as NotificationsAlign),
|
|
8
|
+
description: 'Horizontal placement of the toast stack (left or right).',
|
|
8
9
|
},
|
|
9
10
|
position: {
|
|
10
11
|
type: String as PropType<NotificationsPosition>,
|
|
11
12
|
default: 'bottom',
|
|
12
13
|
validator: (value: string) => validators.position.includes(value as NotificationsPosition),
|
|
14
|
+
description: 'Vertical placement of the toast stack (top or bottom).',
|
|
13
15
|
},
|
|
14
16
|
timeout: {
|
|
15
17
|
type: Number,
|
|
16
18
|
default: 3500,
|
|
19
|
+
description: 'Default auto-dismiss delay in milliseconds. Set 0 to keep until removed.',
|
|
17
20
|
},
|
|
18
21
|
removable: {
|
|
19
22
|
type: Boolean,
|
|
20
23
|
default: true,
|
|
24
|
+
description: 'Shows a dismiss control on each notification by default.',
|
|
21
25
|
},
|
|
22
26
|
pauseOnHover: {
|
|
23
27
|
type: Boolean,
|
|
24
28
|
default: true,
|
|
29
|
+
description: 'Pauses the dismiss timer while the pointer hovers a notification.',
|
|
25
30
|
},
|
|
26
31
|
injectKey: {
|
|
27
32
|
type: [Symbol, String],
|
|
28
33
|
default: injectNotificationKey,
|
|
34
|
+
description: 'Provide/inject key for notification helpers (log, info, success, warn, error).',
|
|
29
35
|
},
|
|
30
36
|
offset: {
|
|
31
37
|
type: [String, Number],
|
|
32
38
|
default: 0,
|
|
39
|
+
description: 'Extra inset from the viewport edge in pixels.',
|
|
33
40
|
},
|
|
34
41
|
}
|
|
35
42
|
|
|
@@ -78,6 +85,19 @@ export interface NotificationsTheme extends ThemeComponent<NotificationsProps, I
|
|
|
78
85
|
export default {
|
|
79
86
|
name: 'XNotifications',
|
|
80
87
|
validators,
|
|
88
|
+
docs: {
|
|
89
|
+
slots: {
|
|
90
|
+
default: 'App content that can inject notification helpers.',
|
|
91
|
+
},
|
|
92
|
+
methods: {
|
|
93
|
+
log: 'Show a plain notification.',
|
|
94
|
+
info: 'Show an info-styled notification.',
|
|
95
|
+
success: 'Show a success-styled notification.',
|
|
96
|
+
warn: 'Show a warning-styled notification.',
|
|
97
|
+
warning: 'Alias of `warn`.',
|
|
98
|
+
error: 'Show an error-styled notification.',
|
|
99
|
+
},
|
|
100
|
+
},
|
|
81
101
|
}
|
|
82
102
|
</script>
|
|
83
103
|
|
|
@@ -274,6 +294,7 @@ defineExpose({ log, info, success, warn, warning: warn, error })
|
|
|
274
294
|
:class="[
|
|
275
295
|
className,
|
|
276
296
|
classes.wrapper,
|
|
297
|
+
'pointer-events-none',
|
|
277
298
|
{
|
|
278
299
|
// align
|
|
279
300
|
'left-0': internalAlign === 'left',
|
|
@@ -290,6 +311,7 @@ defineExpose({ log, info, success, warn, warning: warn, error })
|
|
|
290
311
|
]"
|
|
291
312
|
:class="[
|
|
292
313
|
classes.list,
|
|
314
|
+
'pointer-events-none',
|
|
293
315
|
{ 'flex-col-reverse': internalPosition }
|
|
294
316
|
]"
|
|
295
317
|
enter-active-class="transition ease-out duration-200"
|
|
@@ -305,6 +327,7 @@ defineExpose({ log, info, success, warn, warning: warn, error })
|
|
|
305
327
|
:key="notification.id"
|
|
306
328
|
:class="[
|
|
307
329
|
classes.item,
|
|
330
|
+
'pointer-events-auto',
|
|
308
331
|
{
|
|
309
332
|
'mb-2': internalPosition === 'bottom',
|
|
310
333
|
'mt-2': internalPosition === 'top',
|
|
@@ -1,11 +1,51 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import { mount } from '@vue/test-utils'
|
|
3
|
-
import
|
|
1
|
+
import { describe, it, expect, afterEach } from 'vitest'
|
|
2
|
+
import { mount, type VueWrapper } from '@vue/test-utils'
|
|
3
|
+
import type { ComponentPublicInstance } from 'vue'
|
|
4
|
+
import Notifications, { type NotificationInjection } from '../Notifications.vue'
|
|
4
5
|
|
|
5
6
|
describe('Notifications', () => {
|
|
7
|
+
let wrapper: VueWrapper<ComponentPublicInstance & NotificationInjection>
|
|
8
|
+
|
|
9
|
+
afterEach(() => {
|
|
10
|
+
wrapper?.unmount()
|
|
11
|
+
})
|
|
12
|
+
|
|
6
13
|
it('renders without errors', () => {
|
|
7
|
-
|
|
14
|
+
wrapper = mount(Notifications)
|
|
8
15
|
|
|
9
16
|
expect(wrapper.vm).toBeTruthy()
|
|
10
17
|
})
|
|
18
|
+
|
|
19
|
+
it('does not capture pointer events on offset padding', async () => {
|
|
20
|
+
wrapper = mount(Notifications, {
|
|
21
|
+
props: { offset: 60, timeout: 0 },
|
|
22
|
+
attachTo: document.body,
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
const overlay = document.body.querySelector('.x-notifications') as HTMLElement | null
|
|
26
|
+
const list = overlay?.querySelector('ul') as HTMLElement | null
|
|
27
|
+
|
|
28
|
+
expect(overlay?.classList.contains('pointer-events-none')).toBe(true)
|
|
29
|
+
expect(list?.classList.contains('pointer-events-none')).toBe(true)
|
|
30
|
+
expect(list?.style.paddingBottom).toBe('60px')
|
|
31
|
+
|
|
32
|
+
wrapper.vm.log('Hello')
|
|
33
|
+
await wrapper.vm.$nextTick()
|
|
34
|
+
|
|
35
|
+
const item = overlay?.querySelector('li')
|
|
36
|
+
|
|
37
|
+
expect(item?.classList.contains('pointer-events-auto')).toBe(true)
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
it('applies offset as padding-top when stacked at the top', () => {
|
|
41
|
+
wrapper = mount(Notifications, {
|
|
42
|
+
props: { offset: 48, position: 'top' },
|
|
43
|
+
attachTo: document.body,
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
const list = document.body.querySelector('.x-notifications ul') as HTMLElement | null
|
|
47
|
+
|
|
48
|
+
expect(list?.style.paddingTop).toBe('48px')
|
|
49
|
+
expect(list?.classList.contains('pointer-events-none')).toBe(true)
|
|
50
|
+
})
|
|
11
51
|
})
|
|
@@ -4,18 +4,21 @@ import { optionalBooleanProp } from '../../common/props'
|
|
|
4
4
|
const paginationVariant = ['simple', 'quick', 'dots'] as const
|
|
5
5
|
const paginationProps = {
|
|
6
6
|
...useCommon.props(),
|
|
7
|
-
links: optionalBooleanProp(),
|
|
7
|
+
links: optionalBooleanProp('Renders page buttons as links (`?page=` query).'),
|
|
8
8
|
totalPages: {
|
|
9
9
|
type: Number,
|
|
10
10
|
default: 1,
|
|
11
|
+
description: 'Total number of pages.',
|
|
11
12
|
},
|
|
12
13
|
modelValue: {
|
|
13
14
|
type: Number,
|
|
14
15
|
default: 1,
|
|
16
|
+
description: 'Current page (v-model).',
|
|
15
17
|
},
|
|
16
18
|
variant: {
|
|
17
19
|
type: String as PropType<PaginationVariant>,
|
|
18
20
|
default: 'simple',
|
|
21
|
+
description: 'Layout style (simple, quick, or dots).',
|
|
19
22
|
},
|
|
20
23
|
}
|
|
21
24
|
|
|
@@ -31,6 +34,11 @@ export default {
|
|
|
31
34
|
...useCommon.validators(),
|
|
32
35
|
variant: paginationVariant,
|
|
33
36
|
},
|
|
37
|
+
docs: {
|
|
38
|
+
emits: {
|
|
39
|
+
'update:modelValue': 'Emitted when the current page changes (v-model).',
|
|
40
|
+
},
|
|
41
|
+
},
|
|
34
42
|
}
|
|
35
43
|
</script>
|
|
36
44
|
|
|
@@ -6,9 +6,13 @@ const paginationItemProps = {
|
|
|
6
6
|
value: {
|
|
7
7
|
type: Number,
|
|
8
8
|
default: 0,
|
|
9
|
+
description: 'Page number shown on the control.',
|
|
9
10
|
},
|
|
10
|
-
selected:
|
|
11
|
-
|
|
11
|
+
selected: {
|
|
12
|
+
type: Boolean,
|
|
13
|
+
description: 'Marks this page as the current selection.',
|
|
14
|
+
},
|
|
15
|
+
links: optionalBooleanProp('Renders as a link to `?page=` instead of a button.'),
|
|
12
16
|
}
|
|
13
17
|
|
|
14
18
|
export type PaginationItemProps = ExtractPublicPropTypes<typeof paginationItemProps>
|
|
@@ -21,6 +25,11 @@ export default {
|
|
|
21
25
|
validators: {
|
|
22
26
|
...useCommon.validators(),
|
|
23
27
|
},
|
|
28
|
+
docs: {
|
|
29
|
+
emits: {
|
|
30
|
+
input: 'Emitted with the page number when an unselected item is clicked.',
|
|
31
|
+
},
|
|
32
|
+
},
|
|
24
33
|
}
|
|
25
34
|
</script>
|
|
26
35
|
|
|
@@ -7,53 +7,106 @@ export type PopoverPlacement = Placement
|
|
|
7
7
|
export type PopoverTriggerEvent = TriggerEvent
|
|
8
8
|
|
|
9
9
|
const popoverProps = {
|
|
10
|
-
disabled:
|
|
11
|
-
|
|
10
|
+
disabled: {
|
|
11
|
+
type: Boolean,
|
|
12
|
+
description: 'Disables showing the popover.',
|
|
13
|
+
},
|
|
14
|
+
positioningDisabled: {
|
|
15
|
+
type: Boolean,
|
|
16
|
+
description: 'Keeps the popover in the DOM flow without floating positioning.',
|
|
17
|
+
},
|
|
12
18
|
placement: {
|
|
13
19
|
type: String as PropType<PopoverPlacement>,
|
|
14
20
|
default: 'bottom-start',
|
|
21
|
+
description: 'Preferred placement relative to the trigger.',
|
|
15
22
|
},
|
|
16
23
|
delay: {
|
|
17
24
|
type: [String, Number, Object] as PropType<string | number | { show: number; hide: number; }>,
|
|
18
25
|
default: 0,
|
|
26
|
+
description: 'Show/hide delay in ms, or `{ show, hide }`.',
|
|
27
|
+
},
|
|
28
|
+
distance: {
|
|
29
|
+
type: [Number, String],
|
|
30
|
+
description: 'Offset along the placement axis in pixels.',
|
|
31
|
+
},
|
|
32
|
+
skidding: {
|
|
33
|
+
type: [Number, String],
|
|
34
|
+
description: 'Offset along the trigger edge in pixels.',
|
|
19
35
|
},
|
|
20
|
-
distance: [Number, String],
|
|
21
|
-
skidding: [Number, String],
|
|
22
36
|
triggers: {
|
|
23
37
|
type: Array as PropType<Array<PopoverTriggerEvent>>,
|
|
24
38
|
default: () => ['click'],
|
|
39
|
+
description: 'Events that toggle the popover (for example click, hover, focus).',
|
|
25
40
|
},
|
|
26
41
|
hideArrow: {
|
|
27
42
|
type: Boolean,
|
|
28
43
|
default: true,
|
|
44
|
+
description: 'Hides the popover arrow.',
|
|
45
|
+
},
|
|
46
|
+
showTriggers: {
|
|
47
|
+
type: [Array, Function] as PropType<Array<PopoverTriggerEvent> | ((triggers: Array<PopoverTriggerEvent>) => Array<PopoverTriggerEvent>)>,
|
|
48
|
+
description: 'Events that show the popover, or a function deriving them from `triggers`.',
|
|
49
|
+
},
|
|
50
|
+
hideTriggers: {
|
|
51
|
+
type: [Array, Function] as PropType<Array<PopoverTriggerEvent> | ((triggers: Array<PopoverTriggerEvent>) => Array<PopoverTriggerEvent>)>,
|
|
52
|
+
description: 'Events that hide the popover, or a function deriving them from `triggers`.',
|
|
53
|
+
},
|
|
54
|
+
popperTriggers: {
|
|
55
|
+
type: Array as PropType<Array<PopoverTriggerEvent>>,
|
|
56
|
+
description: 'Events on the popover content that keep it open.',
|
|
57
|
+
},
|
|
58
|
+
popperShowTriggers: {
|
|
59
|
+
type: [Array, Function] as PropType<Array<PopoverTriggerEvent> | ((triggers: Array<PopoverTriggerEvent>) => Array<PopoverTriggerEvent>)>,
|
|
60
|
+
description: 'Events on the content that show the popover.',
|
|
61
|
+
},
|
|
62
|
+
popperHideTriggers: {
|
|
63
|
+
type: [Array, Function] as PropType<Array<PopoverTriggerEvent> | ((triggers: Array<PopoverTriggerEvent>) => Array<PopoverTriggerEvent>)>,
|
|
64
|
+
description: 'Events on the content that hide the popover.',
|
|
29
65
|
},
|
|
30
|
-
showTriggers: [Array, Function] as PropType<Array<PopoverTriggerEvent> | ((triggers: Array<PopoverTriggerEvent>) => Array<PopoverTriggerEvent>)>,
|
|
31
|
-
hideTriggers: [Array, Function] as PropType<Array<PopoverTriggerEvent> | ((triggers: Array<PopoverTriggerEvent>) => Array<PopoverTriggerEvent>)>,
|
|
32
|
-
popperTriggers: Array as PropType<Array<PopoverTriggerEvent>>,
|
|
33
|
-
popperShowTriggers: [Array, Function] as PropType<Array<PopoverTriggerEvent> | ((triggers: Array<PopoverTriggerEvent>) => Array<PopoverTriggerEvent>)>,
|
|
34
|
-
popperHideTriggers: [Array, Function] as PropType<Array<PopoverTriggerEvent> | ((triggers: Array<PopoverTriggerEvent>) => Array<PopoverTriggerEvent>)>,
|
|
35
66
|
container: {
|
|
36
67
|
type: [String, Object, Boolean],
|
|
37
68
|
default: 'body',
|
|
69
|
+
description: 'Element that contains the floating popover DOM.',
|
|
70
|
+
},
|
|
71
|
+
boundary: {
|
|
72
|
+
type: [String, Object],
|
|
73
|
+
description: 'Overflow boundary used for flip/shift positioning.',
|
|
38
74
|
},
|
|
39
|
-
boundary: [String, Object],
|
|
40
75
|
strategy: {
|
|
41
76
|
type: String as PropType<'absolute' | 'fixed'>,
|
|
42
77
|
default: 'absolute',
|
|
78
|
+
description: 'CSS position strategy for the floating element.',
|
|
43
79
|
},
|
|
44
80
|
autoHide: {
|
|
45
81
|
type: [Boolean, Function] as PropType<boolean | ((event: Event) => boolean)>,
|
|
46
82
|
default: true,
|
|
83
|
+
description: 'Hides on outside click, or a predicate deciding whether to hide.',
|
|
84
|
+
},
|
|
85
|
+
shown: {
|
|
86
|
+
type: Boolean,
|
|
87
|
+
description: 'Controlled open state.',
|
|
47
88
|
},
|
|
48
|
-
shown: Boolean,
|
|
49
89
|
handleResize: {
|
|
50
90
|
type: Boolean,
|
|
51
91
|
default: true,
|
|
92
|
+
description: 'Repositions when the popover content size changes.',
|
|
93
|
+
},
|
|
94
|
+
instantMove: {
|
|
95
|
+
type: Boolean,
|
|
96
|
+
description: 'Skips transition when the popover moves between placements.',
|
|
97
|
+
},
|
|
98
|
+
eagerMount: {
|
|
99
|
+
type: Boolean,
|
|
100
|
+
description: 'Mounts popover content immediately instead of on first open.',
|
|
101
|
+
},
|
|
102
|
+
popperClass: {
|
|
103
|
+
type: [String, Array, Object],
|
|
104
|
+
description: 'Extra class(es) on the floating popover element.',
|
|
105
|
+
},
|
|
106
|
+
computeTransformOrigin: {
|
|
107
|
+
type: Boolean,
|
|
108
|
+
description: 'Computes transform-origin for scale transitions.',
|
|
52
109
|
},
|
|
53
|
-
instantMove: Boolean,
|
|
54
|
-
eagerMount: Boolean,
|
|
55
|
-
popperClass: [String, Array, Object],
|
|
56
|
-
computeTransformOrigin: Boolean,
|
|
57
110
|
}
|
|
58
111
|
|
|
59
112
|
export type PopoverProps = ExtractPublicPropTypes<typeof popoverProps>
|
|
@@ -64,13 +117,47 @@ export interface PopoverTheme extends ThemeComponent<PopoverProps, InternalClass
|
|
|
64
117
|
export default {
|
|
65
118
|
name: 'XPopover',
|
|
66
119
|
validators,
|
|
120
|
+
docs: {
|
|
121
|
+
slots: {
|
|
122
|
+
default: 'Trigger element.',
|
|
123
|
+
content: 'Popover panel content.',
|
|
124
|
+
},
|
|
125
|
+
emits: {
|
|
126
|
+
show: 'Emitted when the popover starts opening.',
|
|
127
|
+
hide: 'Emitted when the popover starts closing.',
|
|
128
|
+
'update:shown': 'Emitted when open state changes.',
|
|
129
|
+
'apply-show': 'Emitted after the show transition is applied.',
|
|
130
|
+
'apply-hide': 'Emitted after the hide transition is applied.',
|
|
131
|
+
'close-group': 'Emitted when a popover group close is requested.',
|
|
132
|
+
'close-directive': 'Emitted when closed via the close directive.',
|
|
133
|
+
'auto-hide': 'Emitted when auto-hide closes the popover.',
|
|
134
|
+
resize: 'Emitted when popover content is resized.',
|
|
135
|
+
},
|
|
136
|
+
methods: {
|
|
137
|
+
show: 'Show the popover.',
|
|
138
|
+
hide: 'Hide the popover.',
|
|
139
|
+
toggle: 'Toggle open state.',
|
|
140
|
+
},
|
|
141
|
+
},
|
|
67
142
|
}
|
|
68
143
|
</script>
|
|
69
144
|
|
|
70
145
|
<script setup lang="ts">
|
|
71
|
-
import { type PropType, type ExtractPublicPropTypes, ref } from 'vue'
|
|
146
|
+
import { type PropType, type ExtractPublicPropTypes, ref, inject, computed } from 'vue'
|
|
72
147
|
import { useTheme, type ThemeComponent } from '../../composables/useTheme'
|
|
148
|
+
import { injectButtonGroupKey } from '../../composables/keys'
|
|
73
149
|
import { Dropdown as VDropdown, type Placement, type TriggerEvent } from 'floating-vue'
|
|
150
|
+
import PopoverContentBoundary from './PopoverContentBoundary.vue'
|
|
151
|
+
import type { ButtonGroupInjection } from '../button/ButtonGroup.vue'
|
|
152
|
+
|
|
153
|
+
const inactiveButtonGroup: ButtonGroupInjection = {
|
|
154
|
+
isButtonGroup: false,
|
|
155
|
+
groupProps: {},
|
|
156
|
+
registerChild: () => {},
|
|
157
|
+
unregisterChild: () => {},
|
|
158
|
+
getPosition: () => 'only',
|
|
159
|
+
childOrder: computed(() => []),
|
|
160
|
+
}
|
|
74
161
|
|
|
75
162
|
const props = defineProps(popoverProps)
|
|
76
163
|
|
|
@@ -95,6 +182,8 @@ const isOpen = ref(false)
|
|
|
95
182
|
|
|
96
183
|
defineExpose({ show, hide, toggle, isOpen })
|
|
97
184
|
|
|
185
|
+
const buttonGroup = inject(injectButtonGroupKey, inactiveButtonGroup)
|
|
186
|
+
|
|
98
187
|
const { styles, classes, className } = useTheme('Popover', {}, props)
|
|
99
188
|
</script>
|
|
100
189
|
|
|
@@ -102,7 +191,11 @@ const { styles, classes, className } = useTheme('Popover', {}, props)
|
|
|
102
191
|
<v-dropdown
|
|
103
192
|
ref="elRef"
|
|
104
193
|
:style="styles"
|
|
105
|
-
:class="[
|
|
194
|
+
:class="[
|
|
195
|
+
className,
|
|
196
|
+
classes.wrapper,
|
|
197
|
+
{ 'inline-flex self-stretch': buttonGroup.isButtonGroup },
|
|
198
|
+
]"
|
|
106
199
|
:positioning-disabled="positioningDisabled"
|
|
107
200
|
:placement="placement"
|
|
108
201
|
:disabled="disabled"
|
|
@@ -141,7 +234,9 @@ const { styles, classes, className } = useTheme('Popover', {}, props)
|
|
|
141
234
|
>
|
|
142
235
|
<slot></slot>
|
|
143
236
|
<template #popper>
|
|
144
|
-
<
|
|
237
|
+
<popover-content-boundary>
|
|
238
|
+
<slot name="content"></slot>
|
|
239
|
+
</popover-content-boundary>
|
|
145
240
|
</template>
|
|
146
241
|
</v-dropdown>
|
|
147
242
|
</template>
|