@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
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
const toggleTipProps = {
|
|
3
|
-
content:
|
|
4
|
-
|
|
3
|
+
content: {
|
|
4
|
+
type: String,
|
|
5
|
+
description: 'HTML or text shown inside the tooltip.',
|
|
6
|
+
},
|
|
7
|
+
icon: {
|
|
8
|
+
type: String,
|
|
9
|
+
description: 'Icon name for the trigger. Defaults to the info icon.',
|
|
10
|
+
},
|
|
5
11
|
}
|
|
6
12
|
|
|
7
13
|
export type ToggleTipProps = ExtractPublicPropTypes<typeof toggleTipProps>
|
|
8
14
|
|
|
9
|
-
export default {
|
|
15
|
+
export default {
|
|
16
|
+
name: 'XToggleTip',
|
|
17
|
+
docs: {},
|
|
18
|
+
}
|
|
10
19
|
</script>
|
|
11
20
|
|
|
12
21
|
<script setup lang="ts">
|
|
@@ -3,12 +3,20 @@ const tooltipProps = {
|
|
|
3
3
|
tag: {
|
|
4
4
|
type: String,
|
|
5
5
|
default: 'div',
|
|
6
|
+
description: 'Root element tag wrapping the trigger.',
|
|
7
|
+
},
|
|
8
|
+
tooltip: {
|
|
9
|
+
type: String,
|
|
10
|
+
description: 'Tooltip text shown on hover. Prefer the tooltip slot for custom content.',
|
|
11
|
+
},
|
|
12
|
+
disabled: {
|
|
13
|
+
type: Boolean,
|
|
14
|
+
description: 'Disables showing the tooltip.',
|
|
6
15
|
},
|
|
7
|
-
tooltip: String,
|
|
8
|
-
disabled: Boolean,
|
|
9
16
|
position: {
|
|
10
17
|
type: String as PropType<TooltipPosition>,
|
|
11
18
|
default: 'bottom',
|
|
19
|
+
description: 'Preferred placement relative to the trigger (top, bottom, left, right).',
|
|
12
20
|
},
|
|
13
21
|
}
|
|
14
22
|
|
|
@@ -19,7 +27,15 @@ export type TooltipProps = ExtractPublicPropTypes<typeof tooltipProps>
|
|
|
19
27
|
type InternalClasses = 'tooltip'
|
|
20
28
|
export interface TooltipTheme extends ThemeComponent<TooltipProps, InternalClasses> {}
|
|
21
29
|
|
|
22
|
-
export default {
|
|
30
|
+
export default {
|
|
31
|
+
name: 'XTooltip',
|
|
32
|
+
docs: {
|
|
33
|
+
slots: {
|
|
34
|
+
default: 'Trigger content the tooltip is attached to.',
|
|
35
|
+
tooltip: 'Custom tooltip content; overrides the `tooltip` prop.',
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
}
|
|
23
39
|
</script>
|
|
24
40
|
|
|
25
41
|
<script setup lang="ts">
|
|
@@ -8,28 +8,46 @@ const validators = {
|
|
|
8
8
|
const uploadProps = {
|
|
9
9
|
...useInteractive.props(),
|
|
10
10
|
...useInputtable.props(),
|
|
11
|
-
placeholder:
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
placeholder: {
|
|
12
|
+
type: String,
|
|
13
|
+
description: 'Text shown in the default drop zone.',
|
|
14
|
+
},
|
|
15
|
+
accept: {
|
|
16
|
+
type: String,
|
|
17
|
+
description: 'Accepted file types (native `accept` attribute).',
|
|
18
|
+
},
|
|
19
|
+
multiple: optionalBooleanProp('Allows selecting more than one file.'),
|
|
20
|
+
maxFiles: {
|
|
21
|
+
type: [Number, String],
|
|
22
|
+
description: 'Maximum number of files allowed.',
|
|
23
|
+
},
|
|
24
|
+
maxFileSize: {
|
|
25
|
+
type: [Number, String],
|
|
26
|
+
description: 'Maximum file size in bytes.',
|
|
27
|
+
},
|
|
16
28
|
variant: {
|
|
17
29
|
type: String as PropType<UploadVariant>,
|
|
18
30
|
default: 'box',
|
|
31
|
+
description: 'Visual variant of the upload control.',
|
|
32
|
+
},
|
|
33
|
+
action: {
|
|
34
|
+
type: String,
|
|
35
|
+
description: 'URL to upload files to; enables remote upload mode when set.',
|
|
36
|
+
},
|
|
37
|
+
headers: {
|
|
38
|
+
type: Object as PropType<Record<string, string>>,
|
|
39
|
+
description: 'Additional HTTP headers sent with the upload request.',
|
|
19
40
|
},
|
|
20
|
-
|
|
21
|
-
// URL to submit data to.
|
|
22
|
-
action: String,
|
|
23
|
-
// Additional HTTP headers
|
|
24
|
-
headers: Object as PropType<Record<string, string>>,
|
|
25
41
|
method: {
|
|
26
42
|
type: String as PropType<'POST' | 'PUT'>,
|
|
27
43
|
default: 'POST',
|
|
44
|
+
description: 'HTTP method used when uploading to `action`.',
|
|
28
45
|
},
|
|
29
|
-
withCredentials: optionalBooleanProp(),
|
|
46
|
+
withCredentials: optionalBooleanProp('Sends cookies/credentials with the upload request.'),
|
|
30
47
|
fileFormDataName: {
|
|
31
48
|
type: String,
|
|
32
49
|
default: 'file',
|
|
50
|
+
description: 'FormData field name for each uploaded file.',
|
|
33
51
|
},
|
|
34
52
|
}
|
|
35
53
|
|
|
@@ -50,6 +68,21 @@ export interface UploadTheme extends ThemeComponent<UploadProps, InternalClasses
|
|
|
50
68
|
export default {
|
|
51
69
|
name: 'XUpload',
|
|
52
70
|
validators,
|
|
71
|
+
docs: {
|
|
72
|
+
slots: {
|
|
73
|
+
box: 'Custom drop zone UI (`is-over` when dragging files).',
|
|
74
|
+
files: 'Custom file list (`files` upload state array).',
|
|
75
|
+
removeIcon: 'Icon for the remove-file control.',
|
|
76
|
+
},
|
|
77
|
+
emits: {
|
|
78
|
+
...useInputtable.emitDocs(),
|
|
79
|
+
upload: 'Emitted when a file finishes uploading (remote mode).',
|
|
80
|
+
remove: 'Emitted when a file is removed from the list.',
|
|
81
|
+
},
|
|
82
|
+
methods: {
|
|
83
|
+
...useInputtable.methodDocs(),
|
|
84
|
+
},
|
|
85
|
+
},
|
|
53
86
|
}
|
|
54
87
|
</script>
|
|
55
88
|
|
|
@@ -61,6 +94,7 @@ import { useInteractive } from '../../composables/useInteractive'
|
|
|
61
94
|
import { useInputtable } from '../../composables/useInputtable'
|
|
62
95
|
import { useTheme, type ThemeComponent } from '../../composables/useTheme'
|
|
63
96
|
import { uploadIcon, closeIcon, fileIcon } from '../../common/icons'
|
|
97
|
+
import { isFileAccepted } from './fileAccept'
|
|
64
98
|
|
|
65
99
|
import XLabel from '../label/Label.vue'
|
|
66
100
|
import XInputFooter from '../inputFooter/InputFooter.vue'
|
|
@@ -104,12 +138,8 @@ function isInputValid(files: File[] | FileList | null) {
|
|
|
104
138
|
}
|
|
105
139
|
|
|
106
140
|
if (props.accept) {
|
|
107
|
-
const accept = props.accept.split(',').map((type) => type.trim())
|
|
108
|
-
|
|
109
141
|
for (let i = 0; i < files.length; i++) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
if (!accept.some((type) => file.type === type || file.name.endsWith(type))) {
|
|
142
|
+
if (!isFileAccepted(files[i], props.accept)) {
|
|
113
143
|
errorInternal.value = 'Invalid file type'
|
|
114
144
|
|
|
115
145
|
return false
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { isFileAccepted } from '../fileAccept'
|
|
3
|
+
|
|
4
|
+
function file(name: string, type: string) {
|
|
5
|
+
return new File([''], name, { type })
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
describe('isFileAccepted', () => {
|
|
9
|
+
it('accepts any file when accept is empty', () => {
|
|
10
|
+
expect(isFileAccepted(file('a.png', 'image/png'), '')).toBe(true)
|
|
11
|
+
expect(isFileAccepted(file('a.png', 'image/png'), ' ')).toBe(true)
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
it('matches filename extensions (case-insensitive)', () => {
|
|
15
|
+
expect(isFileAccepted(file('photo.PNG', 'image/png'), '.png')).toBe(true)
|
|
16
|
+
expect(isFileAccepted(file('photo.jpg', 'image/jpeg'), '.png, .jpg')).toBe(true)
|
|
17
|
+
expect(isFileAccepted(file('doc.pdf', 'application/pdf'), '.png')).toBe(false)
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('matches exact MIME types', () => {
|
|
21
|
+
expect(isFileAccepted(file('a.png', 'image/png'), 'image/png')).toBe(true)
|
|
22
|
+
expect(isFileAccepted(file('a.png', 'image/png'), 'image/jpeg')).toBe(false)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
it('matches MIME wildcards like image/*', () => {
|
|
26
|
+
expect(isFileAccepted(file('a.png', 'image/png'), 'image/*')).toBe(true)
|
|
27
|
+
expect(isFileAccepted(file('a.webp', 'image/webp'), 'image/*')).toBe(true)
|
|
28
|
+
expect(isFileAccepted(file('a.pdf', 'application/pdf'), 'image/*')).toBe(false)
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
it('matches mixed HTML accept lists', () => {
|
|
32
|
+
const accept = 'image/*,.pdf,application/json'
|
|
33
|
+
|
|
34
|
+
expect(isFileAccepted(file('a.png', 'image/png'), accept)).toBe(true)
|
|
35
|
+
expect(isFileAccepted(file('a.PDF', 'application/pdf'), accept)).toBe(true)
|
|
36
|
+
expect(isFileAccepted(file('a.json', 'application/json'), accept)).toBe(true)
|
|
37
|
+
expect(isFileAccepted(file('a.txt', 'text/plain'), accept)).toBe(false)
|
|
38
|
+
})
|
|
39
|
+
})
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Matches a file against an HTML `accept` attribute value.
|
|
3
|
+
* Supports extensions (`.png`), MIME types (`image/png`), and wildcards (`image/*`).
|
|
4
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/accept
|
|
5
|
+
*/
|
|
6
|
+
export function isFileAccepted(file: File, accept: string): boolean {
|
|
7
|
+
const tokens = accept.split(',').map((token) => token.trim()).filter(Boolean)
|
|
8
|
+
|
|
9
|
+
if (!tokens.length) return true
|
|
10
|
+
|
|
11
|
+
const fileName = file.name.toLowerCase()
|
|
12
|
+
const fileType = file.type.toLowerCase()
|
|
13
|
+
|
|
14
|
+
return tokens.some((token) => {
|
|
15
|
+
const type = token.toLowerCase()
|
|
16
|
+
|
|
17
|
+
if (type.startsWith('.')) {
|
|
18
|
+
return fileName.endsWith(type)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (type.endsWith('/*')) {
|
|
22
|
+
const category = type.slice(0, -2)
|
|
23
|
+
|
|
24
|
+
return fileType.startsWith(`${category}/`)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return fileType === type
|
|
28
|
+
})
|
|
29
|
+
}
|
|
@@ -97,7 +97,9 @@ export function useFocusTrap() {
|
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
function clearFocusTrap(options?: { returnFocus?: boolean; }) {
|
|
100
|
-
document
|
|
100
|
+
if (typeof document !== 'undefined') {
|
|
101
|
+
document.removeEventListener('keydown', handleKeydown)
|
|
102
|
+
}
|
|
101
103
|
observer?.disconnect()
|
|
102
104
|
observer = null
|
|
103
105
|
if (options?.returnFocus && prevActiveElement) {
|
|
@@ -201,27 +201,83 @@ useInputtable.emits = (withListeners = true): string[] => {
|
|
|
201
201
|
['update:modelValue']
|
|
202
202
|
}
|
|
203
203
|
|
|
204
|
+
useInputtable.emitDocs = (withListeners = true): Record<string, string> => {
|
|
205
|
+
const docs: Record<string, string> = {
|
|
206
|
+
'update:modelValue': 'Emitted when the bound value changes (v-model).',
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (withListeners) {
|
|
210
|
+
docs.blur = 'Emitted when the field loses focus.'
|
|
211
|
+
docs.focus = 'Emitted when the field receives focus.'
|
|
212
|
+
docs.input = 'Emitted on native input events.'
|
|
213
|
+
docs.change = 'Emitted when the value is committed (change).'
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return docs
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
useInputtable.methodDocs = (): Record<string, string> => ({
|
|
220
|
+
focus: 'Focus the underlying control.',
|
|
221
|
+
blur: 'Remove focus from the underlying control.',
|
|
222
|
+
reset: 'Reset the field value and validation state.',
|
|
223
|
+
validate: 'Run validation rules and return whether the field is valid.',
|
|
224
|
+
setError: 'Set an external error message on the field.',
|
|
225
|
+
})
|
|
226
|
+
|
|
204
227
|
useInputtable.props = () => ({
|
|
205
228
|
modelValue: {
|
|
206
229
|
type: [String, Number, Boolean, Object, Array] as PropType<string | number | boolean | object | any[] | undefined>,
|
|
207
230
|
default: undefined,
|
|
231
|
+
description: 'Bound value (v-model).',
|
|
232
|
+
},
|
|
233
|
+
id: {
|
|
234
|
+
type: String,
|
|
235
|
+
description: 'Native id attribute for the input element.',
|
|
236
|
+
},
|
|
237
|
+
name: {
|
|
238
|
+
type: String,
|
|
239
|
+
description: 'Native name attribute for form submission.',
|
|
240
|
+
},
|
|
241
|
+
readonly: {
|
|
242
|
+
type: Boolean,
|
|
243
|
+
description: 'Makes the field read-only without disabling it.',
|
|
244
|
+
},
|
|
245
|
+
required: {
|
|
246
|
+
type: Boolean,
|
|
247
|
+
description: 'Marks the field as required for validation.',
|
|
208
248
|
},
|
|
209
|
-
id: String,
|
|
210
|
-
name: String,
|
|
211
|
-
readonly: Boolean,
|
|
212
|
-
required: Boolean,
|
|
213
249
|
validateOnInput: {
|
|
214
250
|
type: Boolean,
|
|
215
251
|
default: true,
|
|
252
|
+
description: 'Runs validation on each input event when true.',
|
|
253
|
+
},
|
|
254
|
+
label: {
|
|
255
|
+
type: String,
|
|
256
|
+
description: 'Visible label text for the field.',
|
|
257
|
+
},
|
|
258
|
+
helper: {
|
|
259
|
+
type: String,
|
|
260
|
+
description: 'Helper text shown below the field.',
|
|
261
|
+
},
|
|
262
|
+
error: {
|
|
263
|
+
type: String,
|
|
264
|
+
description: 'External error message; overrides rule errors when set.',
|
|
265
|
+
},
|
|
266
|
+
hideFooter: {
|
|
267
|
+
type: Boolean,
|
|
268
|
+
description: 'Hides the footer area (helper / error).',
|
|
216
269
|
},
|
|
217
|
-
label: String,
|
|
218
|
-
helper: String,
|
|
219
|
-
error: String,
|
|
220
|
-
hideFooter: Boolean,
|
|
221
270
|
rules: {
|
|
222
271
|
type: Array,
|
|
223
272
|
default: () => [],
|
|
273
|
+
description: 'Validation rule functions or rule descriptors.',
|
|
274
|
+
},
|
|
275
|
+
tooltip: {
|
|
276
|
+
type: String,
|
|
277
|
+
description: 'Optional tooltip text next to the label.',
|
|
278
|
+
},
|
|
279
|
+
skipFormRegistry: {
|
|
280
|
+
type: Boolean,
|
|
281
|
+
description: 'Skips registering this field with a parent x-form.',
|
|
224
282
|
},
|
|
225
|
-
tooltip: String,
|
|
226
|
-
skipFormRegistry: Boolean,
|
|
227
283
|
} as const)
|
|
@@ -18,11 +18,21 @@ export const useInteractive = (
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
useInteractive.props = () => ({
|
|
21
|
-
disabled:
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
disabled: {
|
|
22
|
+
type: Boolean,
|
|
23
|
+
description: 'Disables interaction and applies disabled styling.',
|
|
24
|
+
},
|
|
25
|
+
loading: {
|
|
26
|
+
type: Boolean,
|
|
27
|
+
description: 'Shows a loading indicator and blocks interaction.',
|
|
28
|
+
},
|
|
29
|
+
loadingLabel: {
|
|
30
|
+
type: String,
|
|
31
|
+
description: 'Accessible label announced while loading.',
|
|
32
|
+
},
|
|
24
33
|
loadingStatus: {
|
|
25
34
|
type: String as PropType<LoaderStatus>,
|
|
26
35
|
default: 'active',
|
|
36
|
+
description: 'Loader visual status (for example active or indeterminate).',
|
|
27
37
|
},
|
|
28
38
|
} as const)
|
|
@@ -3,6 +3,7 @@ export default `
|
|
|
3
3
|
html {
|
|
4
4
|
color: #111827;
|
|
5
5
|
background-color: white;
|
|
6
|
+
color-scheme: light;
|
|
6
7
|
}
|
|
7
8
|
|
|
8
9
|
html.dark {
|
|
@@ -27,9 +28,7 @@ export default `
|
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
.dark {
|
|
30
|
-
|
|
31
|
-
filter: invert(100%);
|
|
32
|
-
}
|
|
31
|
+
color-scheme: dark;
|
|
33
32
|
}
|
|
34
33
|
}
|
|
35
34
|
|
|
@@ -3,6 +3,7 @@ export default `
|
|
|
3
3
|
html {
|
|
4
4
|
color: #111827;
|
|
5
5
|
background-color: white;
|
|
6
|
+
color-scheme: light;
|
|
6
7
|
}
|
|
7
8
|
|
|
8
9
|
html.dark {
|
|
@@ -23,9 +24,7 @@ export default `
|
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
.dark {
|
|
26
|
-
|
|
27
|
-
filter: invert(100%);
|
|
28
|
-
}
|
|
27
|
+
color-scheme: dark;
|
|
29
28
|
}
|
|
30
29
|
}
|
|
31
30
|
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export default '2.
|
|
1
|
+
export default '2.1.0'
|
|
@@ -1,14 +1,46 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
const infiniteLoaderProps = {
|
|
3
|
+
isRowLoaded: {
|
|
4
|
+
type: Function as PropType<(index: number) => boolean>,
|
|
5
|
+
required: true,
|
|
6
|
+
description: 'Returns whether the row at the given index is already loaded.',
|
|
7
|
+
},
|
|
8
|
+
loadMoreRows: {
|
|
9
|
+
type: Function as PropType<(startIndex: number, stopIndex: number) => Promise<void>>,
|
|
10
|
+
required: true,
|
|
11
|
+
description: 'Loads more rows for the given index range; resolve when finished.',
|
|
12
|
+
},
|
|
13
|
+
minimumBatchSize: {
|
|
14
|
+
type: Number,
|
|
15
|
+
description: 'Minimum rows to request per load (default 10). Batches HTTP fetches.',
|
|
16
|
+
},
|
|
17
|
+
threshold: {
|
|
18
|
+
type: Number,
|
|
19
|
+
description: 'Prefetch when the user scrolls within this many rows of unloaded data (default 15).',
|
|
20
|
+
},
|
|
21
|
+
rowCount: {
|
|
22
|
+
type: Number,
|
|
23
|
+
required: true,
|
|
24
|
+
description: 'Total row count; may be an upper bound if the true size is unknown.',
|
|
25
|
+
},
|
|
26
|
+
}
|
|
27
|
+
|
|
2
28
|
export default {
|
|
3
29
|
name: 'XInfiniteLoader',
|
|
30
|
+
docs: {
|
|
31
|
+
slots: {
|
|
32
|
+
default: 'Render prop slot; receives `onRowsRendered` to wire into a virtual list.',
|
|
33
|
+
},
|
|
34
|
+
},
|
|
4
35
|
}
|
|
5
36
|
</script>
|
|
6
37
|
|
|
7
38
|
<script setup lang="ts">
|
|
39
|
+
import type { PropType } from 'vue'
|
|
8
40
|
import { useInfiniteLoader } from '../../composables/infinite-loader/useInfiniteLoader'
|
|
9
41
|
import type { InfiniteLoaderProps } from '../../composables/infinite-loader/types'
|
|
10
42
|
|
|
11
|
-
const props = defineProps
|
|
43
|
+
const props = defineProps(infiniteLoaderProps) as unknown as InfiniteLoaderProps
|
|
12
44
|
|
|
13
45
|
const { onRowsRendered } = useInfiniteLoader(props)
|
|
14
46
|
</script>
|
|
@@ -1,22 +1,116 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
const virtualGridProps = {
|
|
3
|
+
cellProps: {
|
|
4
|
+
type: Object as PropType<Record<string, unknown>>,
|
|
5
|
+
description: 'Extra props passed to the cell slot as `props`.',
|
|
6
|
+
},
|
|
7
|
+
class: {
|
|
8
|
+
type: String,
|
|
9
|
+
description: 'CSS class name on the root element.',
|
|
10
|
+
},
|
|
11
|
+
columnCount: {
|
|
12
|
+
type: Number,
|
|
13
|
+
required: true,
|
|
14
|
+
description: 'Total number of columns in the grid.',
|
|
15
|
+
},
|
|
16
|
+
columnWidth: {
|
|
17
|
+
type: [Number, String, Function] as PropType<
|
|
18
|
+
number | string | ((index: number, cellProps: Record<string, unknown>) => number)
|
|
19
|
+
>,
|
|
20
|
+
required: true,
|
|
21
|
+
description: 'Column width as px, percent string, or a function of index.',
|
|
22
|
+
},
|
|
23
|
+
defaultHeight: {
|
|
24
|
+
type: Number,
|
|
25
|
+
default: 0,
|
|
26
|
+
description: 'Initial grid height before measure; important for SSR.',
|
|
27
|
+
},
|
|
28
|
+
defaultWidth: {
|
|
29
|
+
type: Number,
|
|
30
|
+
default: 0,
|
|
31
|
+
description: 'Initial grid width before measure; important for SSR.',
|
|
32
|
+
},
|
|
33
|
+
dir: {
|
|
34
|
+
type: String as PropType<'ltr' | 'rtl' | 'auto'>,
|
|
35
|
+
description: 'Text directionality for cell layout (ltr, rtl, or auto).',
|
|
36
|
+
},
|
|
37
|
+
onCellsRendered: {
|
|
38
|
+
type: Function as PropType<(
|
|
39
|
+
visibleCells: {
|
|
40
|
+
columnStartIndex: number;
|
|
41
|
+
columnStopIndex: number;
|
|
42
|
+
rowStartIndex: number;
|
|
43
|
+
rowStopIndex: number;
|
|
44
|
+
},
|
|
45
|
+
allCells: {
|
|
46
|
+
columnStartIndex: number;
|
|
47
|
+
columnStopIndex: number;
|
|
48
|
+
rowStartIndex: number;
|
|
49
|
+
rowStopIndex: number;
|
|
50
|
+
}
|
|
51
|
+
) => void>,
|
|
52
|
+
description: 'Called when the visible or overscan cell range changes.',
|
|
53
|
+
},
|
|
54
|
+
onResize: {
|
|
55
|
+
type: Function as PropType<(
|
|
56
|
+
size: { height: number; width: number; },
|
|
57
|
+
prevSize: { height: number; width: number; }
|
|
58
|
+
) => void>,
|
|
59
|
+
description: 'Called when the grid root resizes.',
|
|
60
|
+
},
|
|
61
|
+
overscanCount: {
|
|
62
|
+
type: Number,
|
|
63
|
+
default: 3,
|
|
64
|
+
description: 'Extra rows/columns rendered outside the visible area.',
|
|
65
|
+
},
|
|
66
|
+
rowCount: {
|
|
67
|
+
type: Number,
|
|
68
|
+
required: true,
|
|
69
|
+
description: 'Total number of rows in the grid.',
|
|
70
|
+
},
|
|
71
|
+
rowHeight: {
|
|
72
|
+
type: [Number, String, Function] as PropType<
|
|
73
|
+
number | string | ((index: number, cellProps: Record<string, unknown>) => number)
|
|
74
|
+
>,
|
|
75
|
+
required: true,
|
|
76
|
+
description: 'Row height as px, percent string, or a function of index.',
|
|
77
|
+
},
|
|
78
|
+
style: {
|
|
79
|
+
type: Object as PropType<CSSProperties>,
|
|
80
|
+
description: 'Inline styles; the grid fills the size defined here.',
|
|
81
|
+
},
|
|
82
|
+
tag: {
|
|
83
|
+
type: String as PropType<TagNames>,
|
|
84
|
+
default: 'div',
|
|
85
|
+
description: 'Root element tag.',
|
|
86
|
+
},
|
|
87
|
+
}
|
|
88
|
+
|
|
2
89
|
export default {
|
|
3
90
|
name: 'XVirtualGrid',
|
|
91
|
+
docs: {
|
|
92
|
+
slots: {
|
|
93
|
+
cell: 'Render a single cell. Receives columnIndex, rowIndex, style, ariaAttributes, and props.',
|
|
94
|
+
default: 'Optional content rendered after the virtualized cells.',
|
|
95
|
+
},
|
|
96
|
+
methods: {
|
|
97
|
+
scrollToCell: 'Scroll so the given cell (row and column) is visible.',
|
|
98
|
+
scrollToColumn: 'Scroll so the given column index is visible.',
|
|
99
|
+
scrollToRow: 'Scroll so the given row index is visible.',
|
|
100
|
+
element: 'Root HTML element when mounted, otherwise null.',
|
|
101
|
+
},
|
|
102
|
+
},
|
|
4
103
|
}
|
|
5
104
|
</script>
|
|
6
105
|
|
|
7
106
|
<script setup lang="ts">
|
|
8
|
-
import { computed, ref, watch, type CSSProperties } from 'vue'
|
|
107
|
+
import { computed, ref, watch, type CSSProperties, type PropType } from 'vue'
|
|
9
108
|
import { useIsRtl } from '../../core/useIsRtl'
|
|
10
109
|
import { useVirtualizer } from '../../core/useVirtualizer'
|
|
11
|
-
import type { Align } from '../../types'
|
|
110
|
+
import type { Align, TagNames } from '../../types'
|
|
12
111
|
import type { VirtualGridProps, VirtualGridImperativeAPI } from './types'
|
|
13
112
|
|
|
14
|
-
const props =
|
|
15
|
-
defaultHeight: 0,
|
|
16
|
-
defaultWidth: 0,
|
|
17
|
-
overscanCount: 3,
|
|
18
|
-
tag: 'div',
|
|
19
|
-
})
|
|
113
|
+
const props = defineProps(virtualGridProps) as unknown as VirtualGridProps
|
|
20
114
|
|
|
21
115
|
const element = ref<HTMLDivElement | null>(null)
|
|
22
116
|
|
|
@@ -42,7 +136,7 @@ const {
|
|
|
42
136
|
itemProps: cellProps.value,
|
|
43
137
|
itemSize: props.columnWidth,
|
|
44
138
|
onResize: props.onResize,
|
|
45
|
-
overscanCount: props.overscanCount,
|
|
139
|
+
overscanCount: props.overscanCount ?? 3,
|
|
46
140
|
})
|
|
47
141
|
|
|
48
142
|
const {
|
|
@@ -62,7 +156,7 @@ const {
|
|
|
62
156
|
itemProps: cellProps.value,
|
|
63
157
|
itemSize: props.rowHeight,
|
|
64
158
|
onResize: props.onResize,
|
|
65
|
-
overscanCount: props.overscanCount,
|
|
159
|
+
overscanCount: props.overscanCount ?? 3,
|
|
66
160
|
})
|
|
67
161
|
|
|
68
162
|
// Expose imperative API
|