@kine-design/core 0.0.1-beta.1 → 0.0.1-beta.10
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/.vlaude/last-session-id +1 -0
- package/.vlaude/session-switch.signal +1 -0
- package/assets/style/global.css +1 -0
- package/assets/style/var/Wuxing.css +71 -0
- package/assets/style/var.css +23 -0
- package/components/base/affix/api.ts +16 -0
- package/components/base/affix/index.ts +17 -0
- package/components/base/affix/props.d.ts +34 -0
- package/components/base/affix/useAffix.ts +124 -0
- package/components/base/alert/api.ts +18 -0
- package/components/base/alert/index.ts +15 -0
- package/components/base/alert/props.d.ts +50 -0
- package/components/base/anchor/api.ts +20 -0
- package/components/base/anchor/index.ts +18 -0
- package/components/base/anchor/props.d.ts +46 -0
- package/components/base/anchor/useAnchor.ts +84 -0
- package/components/base/autoComplete/api.ts +24 -0
- package/components/base/autoComplete/index.ts +17 -0
- package/components/base/autoComplete/props.d.ts +75 -0
- package/components/base/autoComplete/useAutoComplete.ts +157 -0
- package/components/base/avatar/api.ts +17 -0
- package/components/base/avatar/avatar.css +61 -0
- package/components/base/avatar/index.ts +15 -0
- package/components/base/avatar/props.d.ts +37 -0
- package/components/base/backTop/api.ts +17 -0
- package/components/base/backTop/index.ts +17 -0
- package/components/base/backTop/props.d.ts +38 -0
- package/components/base/backTop/useBackTop.ts +62 -0
- package/components/base/badge/api.ts +22 -0
- package/components/base/badge/index.ts +15 -0
- package/components/base/badge/props.d.ts +50 -0
- package/components/base/button/api.ts +28 -0
- package/components/base/button/button.css +34 -0
- package/components/base/button/index.ts +17 -0
- package/components/base/button/props.d.ts +66 -0
- package/components/base/button/useButton.ts +37 -0
- package/components/base/card/api.ts +17 -0
- package/components/base/card/index.ts +15 -0
- package/components/base/card/props.d.ts +37 -0
- package/components/base/carousel/api.ts +28 -0
- package/components/base/carousel/index.ts +17 -0
- package/components/base/carousel/props.d.ts +72 -0
- package/components/base/carousel/useCarousel.ts +150 -0
- package/components/base/cascader/api.ts +23 -0
- package/components/base/cascader/index.ts +18 -0
- package/components/base/cascader/props.d.ts +103 -0
- package/components/base/cascader/useCascader.ts +335 -0
- package/components/base/checkbox/api.ts +24 -0
- package/components/base/checkbox/checkbox.css +0 -0
- package/components/base/checkbox/index.ts +17 -0
- package/components/base/checkbox/props.d.ts +77 -0
- package/components/base/checkbox/useCheckbox.ts +43 -0
- package/components/base/collapse/api.ts +21 -0
- package/components/base/collapse/index.ts +18 -0
- package/components/base/collapse/props.d.ts +45 -0
- package/components/base/collapse/useCollapse.ts +81 -0
- package/components/base/datePicker/__tests__/useDatePicker.test.ts +244 -0
- package/components/base/datePicker/api.ts +22 -0
- package/components/base/datePicker/index.ts +19 -0
- package/components/base/datePicker/props.d.ts +86 -0
- package/components/base/datePicker/useDatePicker.ts +392 -0
- package/components/base/divider/api.ts +15 -0
- package/components/base/divider/divider.css +11 -0
- package/components/base/divider/index.ts +15 -0
- package/components/base/divider/props.d.ts +30 -0
- package/components/base/dropdown/api.ts +33 -0
- package/components/base/dropdown/index.ts +18 -0
- package/components/base/dropdown/props.d.ts +60 -0
- package/components/base/dropdown/useDropdown.ts +124 -0
- package/components/base/empty/api.ts +15 -0
- package/components/base/empty/index.ts +15 -0
- package/components/base/empty/props.d.ts +26 -0
- package/components/base/image/__tests__/useImage.test.ts +176 -0
- package/components/base/image/api.ts +25 -0
- package/components/base/image/index.ts +18 -0
- package/components/base/image/props.d.ts +67 -0
- package/components/base/image/useImage.ts +119 -0
- package/components/base/input/api.ts +23 -0
- package/components/base/input/index.ts +17 -0
- package/components/base/input/input.css +19 -0
- package/components/base/input/props.d.ts +85 -0
- package/components/base/input/useInput.ts +63 -0
- package/components/base/inputNumber/__tests__/useInputNumber.test.ts +189 -0
- package/components/base/inputNumber/api.ts +23 -0
- package/components/base/inputNumber/index.ts +17 -0
- package/components/base/inputNumber/props.d.ts +78 -0
- package/components/base/inputNumber/useInputNumber.ts +182 -0
- package/components/base/li/api.ts +15 -0
- package/components/base/li/index.ts +15 -0
- package/components/base/li/props.d.ts +30 -0
- package/components/base/list/api.ts +16 -0
- package/components/base/list/index.ts +17 -0
- package/components/base/list/props.d.ts +33 -0
- package/components/base/list/useList.ts +36 -0
- package/components/base/loading/api.ts +17 -0
- package/components/base/loading/index.ts +15 -0
- package/components/base/loading/props.d.ts +40 -0
- package/components/base/popover/api.ts +28 -0
- package/components/base/popover/index.ts +17 -0
- package/components/base/popover/props.d.ts +73 -0
- package/components/base/popover/usePopover.ts +193 -0
- package/components/base/progress/api.ts +20 -0
- package/components/base/progress/index.ts +17 -0
- package/components/base/progress/props.d.ts +68 -0
- package/components/base/progress/useProgress.ts +28 -0
- package/components/base/radio/api.ts +19 -0
- package/components/base/radio/index.ts +19 -0
- package/components/base/radio/props.d.ts +59 -0
- package/components/base/radio/useRadio.ts +11 -0
- package/components/base/rate/api.ts +18 -0
- package/components/base/rate/index.ts +17 -0
- package/components/base/rate/props.d.ts +49 -0
- package/components/base/rate/useRate.ts +76 -0
- package/components/base/result/api.ts +20 -0
- package/components/base/result/index.ts +15 -0
- package/components/base/result/props.d.ts +36 -0
- package/components/base/select/api.ts +34 -0
- package/components/base/select/index.ts +18 -0
- package/components/base/select/props.d.ts +152 -0
- package/components/base/select/select.css +7 -0
- package/components/base/select/useSelect.ts +281 -0
- package/components/base/select/useSelectTools.ts +60 -0
- package/components/base/skeleton/api.ts +18 -0
- package/components/base/skeleton/index.ts +15 -0
- package/components/base/skeleton/props.d.ts +41 -0
- package/components/base/slider/api.ts +22 -0
- package/components/base/slider/index.ts +17 -0
- package/components/base/slider/props.d.ts +79 -0
- package/components/base/slider/useSlider.ts +87 -0
- package/components/base/space/api.ts +17 -0
- package/components/base/space/index.ts +15 -0
- package/components/base/space/props.d.ts +39 -0
- package/components/base/steps/__tests__/useSteps.test.ts +46 -0
- package/components/base/steps/api.ts +30 -0
- package/components/base/steps/index.ts +22 -0
- package/components/base/steps/props.d.ts +88 -0
- package/components/base/steps/useSteps.ts +101 -0
- package/components/base/switch/api.ts +22 -0
- package/components/base/switch/index.ts +19 -0
- package/components/base/switch/props.d.ts +66 -0
- package/components/base/switch/useSwitch.tsx +80 -0
- package/components/base/tabs/api.ts +23 -0
- package/components/base/tabs/index.ts +18 -0
- package/components/base/tabs/props.d.ts +41 -0
- package/components/base/tabs/useTabs.ts +67 -0
- package/components/base/tag/api.ts +17 -0
- package/components/base/tag/index.ts +15 -0
- package/components/base/tag/props.d.ts +51 -0
- package/components/base/timePicker/__tests__/useTimePicker.test.ts +124 -0
- package/components/base/timePicker/api.ts +24 -0
- package/components/base/timePicker/index.ts +18 -0
- package/components/base/timePicker/props.d.ts +86 -0
- package/components/base/timePicker/useTimePicker.ts +161 -0
- package/components/base/timeline/api.ts +24 -0
- package/components/base/timeline/index.ts +16 -0
- package/components/base/timeline/props.d.ts +60 -0
- package/components/base/tooltip/api.ts +21 -0
- package/components/base/tooltip/index.ts +18 -0
- package/components/base/tooltip/props.d.ts +46 -0
- package/components/base/tooltip/useTooltip.ts +208 -0
- package/components/base/transfer/api.ts +18 -0
- package/components/base/transfer/index.ts +17 -0
- package/components/base/transfer/props.d.ts +63 -0
- package/components/base/transfer/useTransfer.ts +208 -0
- package/components/base/tree/__tests__/tree.test.ts +223 -0
- package/components/base/tree/api.ts +47 -0
- package/components/base/tree/index.ts +29 -0
- package/components/base/tree/props.d.ts +108 -0
- package/components/base/tree/tree.ts +263 -0
- package/components/base/tree/useTree.ts +114 -0
- package/components/message/confirm/api.ts +21 -0
- package/components/message/confirm/index.ts +15 -0
- package/components/message/confirm/props.d.ts +69 -0
- package/components/message/dialog/api.ts +20 -0
- package/components/message/dialog/index.ts +15 -0
- package/components/message/dialog/props.d.ts +62 -0
- package/components/message/drawer/api.ts +33 -0
- package/components/message/drawer/index.ts +15 -0
- package/components/message/drawer/props.d.ts +80 -0
- package/components/message/message/api.ts +27 -0
- package/components/message/message/index.ts +20 -0
- package/components/message/message/props.d.ts +54 -0
- package/components/message/message/useMessage.ts +61 -0
- package/components/message/notification/__tests__/useNotification.test.ts +129 -0
- package/components/message/notification/api.ts +23 -0
- package/components/message/notification/index.ts +19 -0
- package/components/message/notification/props.d.ts +64 -0
- package/components/message/notification/useNotification.ts +79 -0
- package/components/message/popover/MPopover.tsx +94 -0
- package/components/message/popover/api.ts +54 -0
- package/components/message/popover/index.ts +17 -0
- package/components/message/popover/popover.css +21 -0
- package/components/message/popover/props.d.ts +76 -0
- package/components/message/popover/usePopover.ts +234 -0
- package/components/other/darkMode/api.ts +17 -0
- package/components/other/darkMode/index.ts +17 -0
- package/components/other/darkMode/props.d.ts +37 -0
- package/components/other/darkMode/useDarkMode.ts +129 -0
- package/components/template/border/api.ts +18 -0
- package/components/template/border/index.ts +15 -0
- package/components/template/border/props.d.ts +41 -0
- package/components/template/breadcrumb/api.ts +15 -0
- package/components/template/breadcrumb/index.ts +15 -0
- package/components/template/breadcrumb/props.d.ts +45 -0
- package/components/template/descriptions/api.ts +23 -0
- package/components/template/descriptions/index.ts +16 -0
- package/components/template/descriptions/props.d.ts +54 -0
- package/components/template/form/api.ts +23 -0
- package/components/template/form/index.ts +20 -0
- package/components/template/form/props.d.ts +60 -0
- package/components/template/grid/api.ts +20 -0
- package/components/template/grid/index.ts +15 -0
- package/components/template/grid/props.d.ts +48 -0
- package/components/template/menu/__tests__/useMenu.test.ts +157 -0
- package/components/template/menu/api.ts +26 -0
- package/components/template/menu/index.ts +18 -0
- package/components/template/menu/props.d.ts +93 -0
- package/components/template/menu/useMenu.ts +155 -0
- package/components/template/pagination/__tests__/usePagination.test.ts +138 -0
- package/components/template/pagination/api.ts +22 -0
- package/components/template/pagination/index.ts +19 -0
- package/components/template/pagination/props.d.ts +65 -0
- package/components/template/pagination/usePagination.ts +186 -0
- package/components/template/table/__tests__/useTable.test.ts +138 -0
- package/components/template/table/api.ts +18 -0
- package/components/template/table/index.ts +18 -0
- package/components/template/table/props.d.ts +36 -0
- package/components/template/table/useTable.ts +136 -0
- package/components/template/tableColumn/api.ts +17 -0
- package/components/template/tableColumn/index.ts +15 -0
- package/components/template/tableColumn/props.d.ts +32 -0
- package/components/template/virtualList/api.ts +16 -0
- package/components/template/virtualList/index.ts +17 -0
- package/components/template/virtualList/props.d.ts +25 -0
- package/components/template/virtualList/useVirtualList.ts +237 -0
- package/components/types/hook.d.ts +24 -0
- package/components/types/props.d.ts +57 -0
- package/components/types/template.d.ts +59 -0
- package/compositions/commandPalette/index.ts +11 -0
- package/compositions/commandPalette/types.ts +29 -0
- package/compositions/commandPalette/useCommandPalette.ts +135 -0
- package/compositions/common/__tests__/useDebounceFn.test.ts +62 -0
- package/compositions/common/__tests__/useEventListener.test.ts +98 -0
- package/compositions/common/__tests__/usePopover.test.ts +43 -0
- package/compositions/common/__tests__/useTeleport.test.ts +32 -0
- package/compositions/common/defineCore.ts +55 -0
- package/compositions/common/testAnchor.ts +211 -0
- package/compositions/common/useComponentSize.ts +17 -0
- package/compositions/common/useDebounceFn.ts +27 -0
- package/compositions/common/useDrag.ts +65 -0
- package/compositions/common/useElementSize.ts +37 -0
- package/compositions/common/useEventListener.ts +48 -0
- package/compositions/common/usePopover.ts +45 -0
- package/compositions/common/useResizeObserver.ts +47 -0
- package/compositions/common/useTeleport.ts +24 -0
- package/compositions/contextMenu/index.ts +10 -0
- package/compositions/contextMenu/types.ts +21 -0
- package/compositions/contextMenu/useContextMenu.ts +101 -0
- package/compositions/editor/index.ts +18 -0
- package/compositions/editor/types.ts +147 -0
- package/compositions/editor/useEditor.ts +224 -0
- package/compositions/index.ts +15 -0
- package/compositions/input/__tests__/useBooleanInput.test.ts +73 -0
- package/compositions/input/useBooleanInput.ts +52 -0
- package/compositions/modal/__tests__/useModal.test.ts +110 -0
- package/compositions/modal/useModal.ts +72 -0
- package/compositions/overlay/index.ts +14 -0
- package/compositions/overlay/useOverlayStack.ts +146 -0
- package/compositions/peekView/index.ts +10 -0
- package/compositions/peekView/usePeekView.ts +99 -0
- package/compositions/popper/useClickAway.ts +41 -0
- package/compositions/popper/usePopper.ts +63 -0
- package/compositions/theme/index.ts +17 -0
- package/compositions/theme/presets/compact.ts +117 -0
- package/compositions/theme/presets/dark.ts +113 -0
- package/compositions/theme/presets/index.ts +11 -0
- package/compositions/theme/presets/light.ts +113 -0
- package/compositions/theme/types.ts +46 -0
- package/compositions/theme/useTheme.ts +269 -0
- package/compositions/toast/index.ts +10 -0
- package/compositions/toast/useToast.ts +176 -0
- package/compositions/tooltip/index.ts +9 -0
- package/compositions/tooltip/useTooltip.ts +10 -0
- package/compositions/utils/__tests__/filters.test.ts +136 -0
- package/compositions/utils/filters.ts +135 -0
- package/compositions/virtualList/__tests__/useHeightCache.test.ts +97 -0
- package/compositions/virtualList/enums.ts +52 -0
- package/compositions/virtualList/useContainerObserver.ts +89 -0
- package/compositions/virtualList/useEntries.ts +248 -0
- package/compositions/virtualList/useHeightCache.ts +83 -0
- package/compositions/virtualList/useSentinelObserver.ts +81 -0
- package/dist/components/base/affix/index.d.ts +2 -1
- package/dist/components/base/affix/useAffix.d.ts +7 -5
- package/dist/components/base/anchor/index.d.ts +2 -1
- package/dist/components/base/anchor/useAnchor.d.ts +3 -2
- package/dist/components/base/autoComplete/useAutoComplete.d.ts +14 -5
- package/dist/components/base/avatar/index.d.ts +1 -0
- package/dist/components/base/backTop/index.d.ts +2 -1
- package/dist/components/base/backTop/useBackTop.d.ts +2 -2
- package/dist/components/base/button/index.d.ts +3 -21
- package/dist/components/base/button/useButton.d.ts +5 -2
- package/dist/components/base/carousel/useCarousel.d.ts +7 -3
- package/dist/components/base/cascader/useCascader.d.ts +25 -12
- package/dist/components/base/checkbox/index.d.ts +2 -1
- package/dist/components/base/checkbox/useCheckbox.d.ts +5 -3
- package/dist/components/base/collapse/index.d.ts +2 -1
- package/dist/components/base/collapse/useCollapse.d.ts +4 -3
- package/dist/components/base/datePicker/__tests__/useDatePicker.test.d.ts +1 -0
- package/dist/components/base/datePicker/useDatePicker.d.ts +140 -8
- package/dist/components/base/dropdown/index.d.ts +2 -1
- package/dist/components/base/dropdown/useDropdown.d.ts +13 -6
- package/dist/components/base/image/__tests__/useImage.test.d.ts +1 -0
- package/dist/components/base/image/useImage.d.ts +5 -5
- package/dist/components/base/input/index.d.ts +2 -1
- package/dist/components/base/input/useInput.d.ts +4 -2
- package/dist/components/base/inputNumber/__tests__/useInputNumber.test.d.ts +1 -0
- package/dist/components/base/inputNumber/index.d.ts +2 -1
- package/dist/components/base/inputNumber/useInputNumber.d.ts +4 -3
- package/dist/components/base/li/index.d.ts +1 -0
- package/dist/components/base/list/index.d.ts +2 -1
- package/dist/components/base/list/useList.d.ts +1 -1
- package/dist/components/base/popover/index.d.ts +2 -1
- package/dist/components/base/popover/usePopover.d.ts +10 -9
- package/dist/components/base/progress/index.d.ts +2 -1
- package/dist/components/base/progress/useProgress.d.ts +2 -2
- package/dist/components/base/rate/index.d.ts +2 -1
- package/dist/components/base/rate/useRate.d.ts +3 -2
- package/dist/components/base/select/useSelect.d.ts +10 -9
- package/dist/components/base/slider/index.d.ts +2 -1
- package/dist/components/base/slider/useSlider.d.ts +5 -4
- package/dist/components/base/steps/__tests__/useSteps.test.d.ts +1 -0
- package/dist/components/base/steps/index.d.ts +1 -1
- package/dist/components/base/steps/useSteps.d.ts +5 -5
- package/dist/components/base/switch/index.d.ts +2 -1
- package/dist/components/base/switch/useSwitch.d.ts +9 -3
- package/dist/components/base/tabs/index.d.ts +1 -1
- package/dist/components/base/tabs/useTabs.d.ts +4 -3
- package/dist/components/base/tag/index.d.ts +1 -0
- package/dist/components/base/timePicker/__tests__/useTimePicker.test.d.ts +1 -0
- package/dist/components/base/timePicker/useTimePicker.d.ts +14 -6
- package/dist/components/base/tooltip/index.d.ts +2 -1
- package/dist/components/base/tooltip/useTooltip.d.ts +24 -11
- package/dist/components/base/transfer/useTransfer.d.ts +17 -16
- package/dist/components/base/tree/__tests__/tree.test.d.ts +1 -0
- package/dist/components/base/tree/index.d.ts +1 -1
- package/dist/components/base/tree/useTree.d.ts +2 -1
- package/dist/components/message/drawer/index.d.ts +2 -2
- package/dist/components/message/message/useMessage.d.ts +11 -1
- package/dist/components/message/notification/__tests__/useNotification.test.d.ts +1 -0
- package/dist/components/message/notification/useNotification.d.ts +17 -1
- package/dist/components/message/popover/MPopover.d.ts +6 -1
- package/dist/components/message/popover/index.d.ts +1 -1
- package/dist/components/message/popover/usePopover.d.ts +7 -7
- package/dist/components/other/darkMode/useDarkMode.d.ts +3 -4
- package/dist/components/template/menu/__tests__/useMenu.test.d.ts +1 -0
- package/dist/components/template/menu/index.d.ts +0 -1
- package/dist/components/template/menu/useMenu.d.ts +2 -1
- package/dist/components/template/pagination/__tests__/usePagination.test.d.ts +1 -0
- package/dist/components/template/pagination/index.d.ts +2 -1
- package/dist/components/template/table/__tests__/useTable.test.d.ts +1 -0
- package/dist/components/template/virtualList/index.d.ts +0 -1
- package/dist/components/template/virtualList/useVirtualList.d.ts +10 -7
- package/dist/compositions/commandPalette/index.d.ts +11 -0
- package/dist/compositions/commandPalette/types.d.ts +20 -0
- package/dist/compositions/commandPalette/useCommandPalette.d.ts +32 -0
- package/dist/compositions/common/__tests__/useDebounceFn.test.d.ts +1 -0
- package/dist/compositions/common/__tests__/useEventListener.test.d.ts +1 -0
- package/dist/compositions/common/__tests__/usePopover.test.d.ts +1 -0
- package/dist/compositions/common/__tests__/useTeleport.test.d.ts +1 -0
- package/dist/compositions/common/testAnchor.d.ts +40 -0
- package/dist/compositions/common/useComponentSize.d.ts +6 -0
- package/dist/compositions/common/useDrag.d.ts +1 -1
- package/dist/compositions/common/useElementSize.d.ts +2 -2
- package/dist/compositions/common/useEventListener.d.ts +2 -2
- package/dist/compositions/common/useTeleport.d.ts +4 -2
- package/dist/compositions/contextMenu/index.d.ts +10 -0
- package/dist/compositions/contextMenu/types.d.ts +12 -0
- package/dist/compositions/contextMenu/useContextMenu.d.ts +52 -0
- package/dist/compositions/editor/index.d.ts +10 -0
- package/dist/compositions/editor/types.d.ts +132 -0
- package/dist/compositions/editor/useEditor.d.ts +13 -0
- package/dist/compositions/index.d.ts +15 -0
- package/dist/compositions/input/__tests__/useBooleanInput.test.d.ts +1 -0
- package/dist/compositions/modal/__tests__/useModal.test.d.ts +1 -0
- package/dist/compositions/modal/useModal.d.ts +3 -2
- package/dist/compositions/overlay/index.d.ts +10 -0
- package/dist/compositions/overlay/useOverlayStack.d.ts +188 -0
- package/dist/compositions/peekView/index.d.ts +10 -0
- package/dist/compositions/peekView/usePeekView.d.ts +16 -0
- package/dist/compositions/popper/useClickAway.d.ts +3 -3
- package/dist/compositions/theme/index.d.ts +11 -0
- package/dist/compositions/theme/presets/compact.d.ts +6 -0
- package/dist/compositions/theme/presets/dark.d.ts +2 -0
- package/dist/compositions/theme/presets/index.d.ts +11 -0
- package/dist/compositions/theme/presets/light.d.ts +2 -0
- package/dist/compositions/theme/types.d.ts +41 -0
- package/dist/compositions/theme/useTheme.d.ts +167 -0
- package/dist/compositions/toast/index.d.ts +10 -0
- package/dist/compositions/toast/useToast.d.ts +71 -0
- package/dist/compositions/tooltip/index.d.ts +9 -0
- package/dist/compositions/tooltip/useTooltip.d.ts +10 -0
- package/dist/compositions/utils/__tests__/filters.test.d.ts +1 -0
- package/dist/compositions/virtualList/__tests__/useHeightCache.test.d.ts +1 -0
- package/dist/core.js +7050 -4188
- package/dist/index.d.ts +1 -0
- package/dist/runtime/defineHook.d.ts +1 -1
- package/dist/tools/__tests__/empty.test.d.ts +1 -0
- package/dist/tools/empty.d.ts +2 -2
- package/dist/tools/types.d.ts +1 -1
- package/dist/vitest.config.d.ts +10 -0
- package/index.css +1 -0
- package/index.ts +73 -0
- package/package.json +41 -22
- package/runtime/defineHook.ts +21 -0
- package/tools/__tests__/empty.test.ts +91 -0
- package/tools/empty.ts +81 -0
- package/tools/index.ts +15 -0
- package/tools/types.ts +11 -0
- package/tsconfig.json +8 -0
- package/types/common/common.d.ts +25 -0
- package/types/common/model.d.ts +25 -0
- package/types/index.d.ts +11 -0
- package/types/props.d.ts +13 -0
- package/vite.config.build.ts +41 -0
- package/vitest.config.ts +17 -0
- package/dist/vite.config.build.d.ts +0 -2
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description useEventListener 测试
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/3/23
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
10
|
+
import useEventListener from '../useEventListener';
|
|
11
|
+
|
|
12
|
+
describe('useEventListener', () => {
|
|
13
|
+
it('add 注册事件,remove 移除事件', () => {
|
|
14
|
+
const handler = vi.fn();
|
|
15
|
+
const target = {
|
|
16
|
+
addEventListener: vi.fn(),
|
|
17
|
+
removeEventListener: vi.fn(),
|
|
18
|
+
dispatchEvent: vi.fn(),
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const { add, remove } = useEventListener({
|
|
22
|
+
target,
|
|
23
|
+
event: 'click',
|
|
24
|
+
handler,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
add();
|
|
28
|
+
expect(target.addEventListener).toHaveBeenCalledWith('click', handler);
|
|
29
|
+
|
|
30
|
+
remove();
|
|
31
|
+
expect(target.removeEventListener).toHaveBeenCalledWith('click', handler);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('onMounted 调用 add,onBeforeUnmount 调用 remove', () => {
|
|
35
|
+
const handler = vi.fn();
|
|
36
|
+
const target = {
|
|
37
|
+
addEventListener: vi.fn(),
|
|
38
|
+
removeEventListener: vi.fn(),
|
|
39
|
+
dispatchEvent: vi.fn(),
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const { onMounted, onBeforeUnmount } = useEventListener({
|
|
43
|
+
target,
|
|
44
|
+
event: 'scroll',
|
|
45
|
+
handler,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
onMounted();
|
|
49
|
+
expect(target.addEventListener).toHaveBeenCalledOnce();
|
|
50
|
+
|
|
51
|
+
onBeforeUnmount();
|
|
52
|
+
expect(target.removeEventListener).toHaveBeenCalledOnce();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('target 为函数时延迟求值', () => {
|
|
56
|
+
const handler = vi.fn();
|
|
57
|
+
const realTarget = {
|
|
58
|
+
addEventListener: vi.fn(),
|
|
59
|
+
removeEventListener: vi.fn(),
|
|
60
|
+
dispatchEvent: vi.fn(),
|
|
61
|
+
};
|
|
62
|
+
const targetFn = vi.fn(() => realTarget);
|
|
63
|
+
|
|
64
|
+
const { add } = useEventListener({
|
|
65
|
+
target: targetFn,
|
|
66
|
+
event: 'click',
|
|
67
|
+
handler,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
add();
|
|
71
|
+
expect(targetFn).toHaveBeenCalled();
|
|
72
|
+
expect(realTarget.addEventListener).toHaveBeenCalledWith('click', handler);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('target 为 null 时 add 抛出异常(无防御性检查)', () => {
|
|
76
|
+
// useEventListener 不对 null/undefined target 做守卫,
|
|
77
|
+
// 调用 add() 时会对 null 调用 addEventListener,导致 TypeError
|
|
78
|
+
const handler = vi.fn();
|
|
79
|
+
const { add } = useEventListener({
|
|
80
|
+
target: null as unknown as EventTarget,
|
|
81
|
+
event: 'click',
|
|
82
|
+
handler,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
expect(() => add()).toThrow();
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('target 为返回 undefined 的函数时 add 抛出异常', () => {
|
|
89
|
+
const handler = vi.fn();
|
|
90
|
+
const { add } = useEventListener({
|
|
91
|
+
target: (() => undefined) as unknown as () => EventTarget,
|
|
92
|
+
event: 'click',
|
|
93
|
+
handler,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
expect(() => add()).toThrow();
|
|
97
|
+
});
|
|
98
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description usePopover(common)测试
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/3/23
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { describe, expect, it } from 'vitest';
|
|
10
|
+
import usePopover from '../usePopover';
|
|
11
|
+
|
|
12
|
+
describe('usePopover', () => {
|
|
13
|
+
it('默认 placement 为 bottom-start', () => {
|
|
14
|
+
const { popoverOptions } = usePopover();
|
|
15
|
+
expect(popoverOptions.placement).toBe('bottom-start');
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('自定义 placement', () => {
|
|
19
|
+
const { popoverOptions } = usePopover({ placement: 'top-end' });
|
|
20
|
+
expect(popoverOptions.placement).toBe('top-end');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('默认 middleware 包含 offset、flip、shift', () => {
|
|
24
|
+
const { popoverOptions } = usePopover();
|
|
25
|
+
expect(popoverOptions.popper?.middleware).toHaveLength(3);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('自定义 offset', () => {
|
|
29
|
+
const { popoverOptions } = usePopover(undefined, { offset: 10 });
|
|
30
|
+
const middleware = popoverOptions.popper?.middleware;
|
|
31
|
+
expect(middleware).toHaveLength(3);
|
|
32
|
+
// middleware[0] 是 offset(10),验证自定义 offset 值确实被应用
|
|
33
|
+
const offsetMiddleware = middleware![0] as { name: string; options: unknown };
|
|
34
|
+
expect(offsetMiddleware.name).toBe('offset');
|
|
35
|
+
expect(offsetMiddleware.options).toBe(10);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('扩展 middleware', () => {
|
|
39
|
+
const customMiddleware = { name: 'custom', fn: () => ({}) };
|
|
40
|
+
const { popoverOptions } = usePopover(undefined, { extends: [customMiddleware as any] });
|
|
41
|
+
expect(popoverOptions.popper?.middleware).toHaveLength(4);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description useTeleport / initTeleportOptions 测试
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/3/23
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { describe, expect, it } from 'vitest';
|
|
10
|
+
import { initTeleportOptions } from '../useTeleport';
|
|
11
|
+
|
|
12
|
+
describe('initTeleportOptions', () => {
|
|
13
|
+
it('true 默认 teleport 到 body', () => {
|
|
14
|
+
expect(initTeleportOptions(true)).toEqual({ to: 'body' });
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('undefined 默认 teleport 到 body', () => {
|
|
18
|
+
expect(initTeleportOptions(undefined)).toEqual({ to: 'body' });
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('自定义配置直接返回', () => {
|
|
22
|
+
const custom = { to: '#app', disabled: false };
|
|
23
|
+
expect(initTeleportOptions(custom as any)).toBe(custom);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('false 不命中 true/undefined 分支,原样返回', () => {
|
|
27
|
+
// initTeleportOptions 只对 true 和 undefined 返回 { to: 'body' },
|
|
28
|
+
// false 走 else 分支直接返回原值
|
|
29
|
+
const result = initTeleportOptions(false as unknown as import('vue').TeleportProps);
|
|
30
|
+
expect(result).toBe(false);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/**
|
|
3
|
+
* @description A tool for normalizing grammatical structures
|
|
4
|
+
* @author 阿怪
|
|
5
|
+
* @date 2023/6/16 11:25
|
|
6
|
+
* @version v1.0.0
|
|
7
|
+
*
|
|
8
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { Ref } from 'vue';
|
|
12
|
+
|
|
13
|
+
type OptionsEmpty = undefined;
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
type IsAllUndefined<T extends any[]> = T extends [infer H, ...infer R]
|
|
17
|
+
? H extends undefined
|
|
18
|
+
? IsAllUndefined<R>
|
|
19
|
+
: false
|
|
20
|
+
: true;
|
|
21
|
+
|
|
22
|
+
interface OptionsNotEmpty<P, V, E> {
|
|
23
|
+
props: Required<P>;
|
|
24
|
+
value: { [K in keyof V]: Ref<V[K]>; };
|
|
25
|
+
event: E;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
type CoreArguments = keyof OptionsNotEmpty<any, any, any>;
|
|
29
|
+
type AnyArguments = {
|
|
30
|
+
[K in CoreArguments]?: any
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
type DefinedKeys<T extends AnyArguments> = { [K in keyof T]: T[K] extends undefined ? never : K }[keyof T];
|
|
34
|
+
type UndefinedKeys<T extends AnyArguments> = Exclude<keyof CoreArguments, DefinedKeys<T>>;
|
|
35
|
+
|
|
36
|
+
export type OptionsKeys<
|
|
37
|
+
A extends AnyArguments,
|
|
38
|
+
P, V, E,
|
|
39
|
+
DK extends string | number | symbol = DefinedKeys<A>,
|
|
40
|
+
UK extends string | number | symbol = UndefinedKeys<A>
|
|
41
|
+
> = {
|
|
42
|
+
[K in DK & keyof OptionsNotEmpty<P, V, E>]: OptionsNotEmpty<P, V, E>[K];
|
|
43
|
+
} & {
|
|
44
|
+
[K in UK & keyof OptionsNotEmpty<P, V, E>]-?: OptionsNotEmpty<P, V, E>[K];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export type Options<
|
|
48
|
+
K extends AnyArguments,
|
|
49
|
+
P = K['props'],
|
|
50
|
+
V = K['value'],
|
|
51
|
+
E = K['event'],
|
|
52
|
+
> =
|
|
53
|
+
IsAllUndefined<[P, V, E]> extends true
|
|
54
|
+
? OptionsEmpty
|
|
55
|
+
: OptionsKeys<K, P, V, E>;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Test anchor system: provide/inject keys, types, and kDefineComponent wrapper
|
|
3
|
+
* @author kine-design
|
|
4
|
+
* @date 2026/4/28
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* Renders business-semantic `data-k` attributes on DOM elements when testAnchor is enabled,
|
|
8
|
+
* allowing E2E tests to target components by stable identifiers.
|
|
9
|
+
*/
|
|
10
|
+
import {
|
|
11
|
+
cloneVNode,
|
|
12
|
+
defineComponent,
|
|
13
|
+
inject,
|
|
14
|
+
type ComponentPropsOptions,
|
|
15
|
+
type EmitsOptions,
|
|
16
|
+
type InjectionKey,
|
|
17
|
+
type Ref,
|
|
18
|
+
type SetupContext,
|
|
19
|
+
type VNode,
|
|
20
|
+
} from 'vue';
|
|
21
|
+
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Injection keys
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
|
|
26
|
+
/** Global switch provided by KConfigProvider to enable data-k rendering */
|
|
27
|
+
export const K_TEST_ANCHOR_KEY: InjectionKey<Ref<boolean>> = Symbol('k-test-anchor');
|
|
28
|
+
|
|
29
|
+
/** Field identity provided by KFormItem so child inputs inherit field name */
|
|
30
|
+
export const K_FIELD_KEY: InjectionKey<Ref<string | undefined>> = Symbol('k-field');
|
|
31
|
+
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Types
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
|
|
36
|
+
export interface KAnchorConfig {
|
|
37
|
+
/** Semantic type: 'field' | 'action' | 'table' | 'col' | 'dialog' | 'drawer' | 'tab' */
|
|
38
|
+
type: string;
|
|
39
|
+
/** Which prop to derive the identity from (e.g., 'prop' for KFormItem, 'title' for KDialog) */
|
|
40
|
+
prop?: string;
|
|
41
|
+
/** Derive identity from default slot text content (for KButton) */
|
|
42
|
+
slotText?: boolean;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
interface KDefineComponentOptions {
|
|
46
|
+
name: string;
|
|
47
|
+
props?: ComponentPropsOptions;
|
|
48
|
+
emits?: EmitsOptions;
|
|
49
|
+
kAnchor?: KAnchorConfig;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// Helpers
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Extract text content from a VNode tree (for slotText mode).
|
|
58
|
+
* Walks children recursively, concatenating string segments.
|
|
59
|
+
*/
|
|
60
|
+
function extractSlotText(nodes: VNode[] | undefined): string {
|
|
61
|
+
if (!nodes) return '';
|
|
62
|
+
let text = '';
|
|
63
|
+
for (const node of nodes) {
|
|
64
|
+
if (typeof node.children === 'string') {
|
|
65
|
+
text += node.children;
|
|
66
|
+
} else if (Array.isArray(node.children)) {
|
|
67
|
+
text += extractSlotText(node.children as VNode[]);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return text.trim();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Resolve the data-k value for a component instance.
|
|
75
|
+
* Returns undefined when testAnchor is off or no identity can be derived.
|
|
76
|
+
*/
|
|
77
|
+
function resolveDataK(
|
|
78
|
+
config: KAnchorConfig,
|
|
79
|
+
props: Record<string, unknown>,
|
|
80
|
+
attrs: Record<string, unknown>,
|
|
81
|
+
fieldFromParent: string | undefined,
|
|
82
|
+
slotNodes?: VNode[],
|
|
83
|
+
): string | undefined {
|
|
84
|
+
// Developer override via k-{type} attr (e.g., k-action="approve")
|
|
85
|
+
const overrideKey = `k-${config.type}`;
|
|
86
|
+
const override = attrs[overrideKey];
|
|
87
|
+
if (typeof override === 'string' && override) {
|
|
88
|
+
return `${config.type}:${override}`;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Derive from prop
|
|
92
|
+
if (config.prop) {
|
|
93
|
+
const val = props[config.prop];
|
|
94
|
+
if (typeof val === 'string' && val) {
|
|
95
|
+
return `${config.type}:${val}`;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Derive from slot text (e.g., KButton default slot)
|
|
100
|
+
if (config.slotText && slotNodes) {
|
|
101
|
+
const text = extractSlotText(slotNodes);
|
|
102
|
+
if (text) {
|
|
103
|
+
return `${config.type}:${text}`;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Fallback: check props.text (for KButton text prop)
|
|
108
|
+
if (config.slotText && typeof props.text === 'string' && props.text) {
|
|
109
|
+
return `${config.type}:${props.text}`;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Inherit from parent KFormItem for input-type components
|
|
113
|
+
if (config.type === 'field' && !config.prop && fieldFromParent) {
|
|
114
|
+
return `${config.type}:${fieldFromParent}`;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Inject data-k attribute into a VNode.
|
|
122
|
+
* Uses cloneVNode to avoid mutating the original.
|
|
123
|
+
*/
|
|
124
|
+
function injectDataK(vnode: VNode, dataK: string): VNode {
|
|
125
|
+
return cloneVNode(vnode, { 'data-k': dataK });
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
129
|
+
// kDefineComponent
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Wrapper around Vue's defineComponent that automatically injects `data-k`
|
|
134
|
+
* test anchor attributes when testAnchor is enabled via KConfigProvider.
|
|
135
|
+
*
|
|
136
|
+
* Usage:
|
|
137
|
+
* ```tsx
|
|
138
|
+
* export default kDefineComponent((_props, ctx) => {
|
|
139
|
+
* return () => <div class="k-form-item">...</div>;
|
|
140
|
+
* }, {
|
|
141
|
+
* name: 'KFormItem',
|
|
142
|
+
* props: FormCore.formItemProps,
|
|
143
|
+
* kAnchor: { type: 'field', prop: 'prop' },
|
|
144
|
+
* });
|
|
145
|
+
* ```
|
|
146
|
+
*/
|
|
147
|
+
export function kDefineComponent<P extends Record<string, unknown>>(
|
|
148
|
+
setup: (props: P, ctx: SetupContext) => () => VNode | VNode[] | null | undefined,
|
|
149
|
+
options: KDefineComponentOptions,
|
|
150
|
+
) {
|
|
151
|
+
const { kAnchor, ...defineOptions } = options;
|
|
152
|
+
|
|
153
|
+
return defineComponent((rawProps: P, ctx: SetupContext) => {
|
|
154
|
+
// Call the original setup to get the render function
|
|
155
|
+
const render = setup(rawProps, ctx);
|
|
156
|
+
|
|
157
|
+
// If no kAnchor config, skip entirely
|
|
158
|
+
if (!kAnchor) {
|
|
159
|
+
return render;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Read the global testAnchor switch
|
|
163
|
+
const testAnchor = inject(K_TEST_ANCHOR_KEY, undefined);
|
|
164
|
+
|
|
165
|
+
// For field-type components without own prop, inject parent field identity
|
|
166
|
+
const parentField = (kAnchor.type === 'field' && !kAnchor.prop)
|
|
167
|
+
? inject(K_FIELD_KEY, undefined)
|
|
168
|
+
: undefined;
|
|
169
|
+
|
|
170
|
+
return () => {
|
|
171
|
+
const vnode = render();
|
|
172
|
+
|
|
173
|
+
// When testAnchor is off (default), render as-is
|
|
174
|
+
if (!testAnchor?.value) {
|
|
175
|
+
return vnode;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Resolve the data-k value
|
|
179
|
+
const props = rawProps as Record<string, unknown>;
|
|
180
|
+
const slotNodes = kAnchor.slotText ? (ctx.slots.default?.() ?? undefined) : undefined;
|
|
181
|
+
const dataK = resolveDataK(
|
|
182
|
+
kAnchor,
|
|
183
|
+
props,
|
|
184
|
+
ctx.attrs,
|
|
185
|
+
parentField?.value,
|
|
186
|
+
slotNodes,
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
if (!dataK) {
|
|
190
|
+
return vnode;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Inject into root vnode
|
|
194
|
+
if (vnode === null || vnode === undefined) {
|
|
195
|
+
return vnode;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Handle array of vnodes (Fragment) — inject into first element
|
|
199
|
+
if (Array.isArray(vnode)) {
|
|
200
|
+
if (vnode.length === 0) return vnode;
|
|
201
|
+
const first = vnode[0];
|
|
202
|
+
if (first && typeof first === 'object') {
|
|
203
|
+
return [injectDataK(first, dataK), ...vnode.slice(1)];
|
|
204
|
+
}
|
|
205
|
+
return vnode;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return injectDataK(vnode, dataK);
|
|
209
|
+
};
|
|
210
|
+
}, defineOptions as Parameters<typeof defineComponent>[1]);
|
|
211
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description composable for unified component size with global injection support
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/4/7
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { computed, inject, type InjectionKey, type Ref } from 'vue';
|
|
10
|
+
import { KineSize } from '../../components/types/props';
|
|
11
|
+
|
|
12
|
+
export const KINE_SIZE_KEY: InjectionKey<Ref<KineSize>> = Symbol('kine-size');
|
|
13
|
+
|
|
14
|
+
export function useComponentSize(props: { size?: KineSize }): Ref<KineSize> {
|
|
15
|
+
const globalSize = inject(KINE_SIZE_KEY, undefined);
|
|
16
|
+
return computed(() => props.size ?? globalSize?.value ?? 'medium');
|
|
17
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description 防抖hook
|
|
3
|
+
* @author youus
|
|
4
|
+
* @date 2022/8/19 23:47
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* Hello, humor
|
|
8
|
+
*/
|
|
9
|
+
import type { DebounceFilterOptions, FunctionArgs } from '../utils/filters';
|
|
10
|
+
import { createFilterWrapper, debounceFilter } from '../utils/filters';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Debounce execution of a function.
|
|
14
|
+
*
|
|
15
|
+
* @see https://vueuse.org/useDebounceFn
|
|
16
|
+
* @param fn A function to be executed after delay milliseconds debounced.
|
|
17
|
+
* @param ms A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.
|
|
18
|
+
* @param opts options
|
|
19
|
+
*
|
|
20
|
+
* @return A new, debounce, function.
|
|
21
|
+
*/
|
|
22
|
+
export default function useDebounceFn<T extends FunctionArgs>(fn: T, ms: number = 200, options: DebounceFilterOptions = {}): T {
|
|
23
|
+
return createFilterWrapper(
|
|
24
|
+
debounceFilter(ms, options),
|
|
25
|
+
fn,
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description drag hook
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2023/5/23 16:42
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import * as _interactjsModule from 'interactjs';
|
|
10
|
+
// interactjs 是 UMD 格式,Vite ESM 不提供 default export,需兼容处理
|
|
11
|
+
const interactjs = (_interactjsModule as any).default ?? _interactjsModule;
|
|
12
|
+
import { Ref, ref } from 'vue';
|
|
13
|
+
|
|
14
|
+
// 方向类型,内联定义避免引用 lib 的 MessageDirectionType
|
|
15
|
+
export type DragDirectionType = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | string;
|
|
16
|
+
export type InteractEvent = any;
|
|
17
|
+
export type DragPosition = { x: number, y: number };
|
|
18
|
+
export type DragOption = { startAxis: 'x' | 'y', lockAxis: 'x' | 'y' };
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
export default function useDrag(config: {
|
|
22
|
+
direction: DragDirectionType,
|
|
23
|
+
value?: {
|
|
24
|
+
domRef?: Ref<HTMLElement | null>
|
|
25
|
+
},
|
|
26
|
+
event?: {
|
|
27
|
+
getOption?: () => DragOption,
|
|
28
|
+
movePositionHandler?: (event: InteractEvent, position: DragPosition) => DragPosition,
|
|
29
|
+
onDragLeave?: (event: InteractEvent) => void
|
|
30
|
+
}
|
|
31
|
+
}) {
|
|
32
|
+
const domRef = config.value?.domRef ?? ref();
|
|
33
|
+
|
|
34
|
+
const init = (basePosition?: { x?: number, y?: number }) => {
|
|
35
|
+
if (!domRef.value) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const position: DragPosition = { x: basePosition?.x ?? 0, y: basePosition?.y ?? 0 };
|
|
39
|
+
return interactjs(domRef.value)
|
|
40
|
+
.styleCursor(false)
|
|
41
|
+
.draggable({
|
|
42
|
+
...config.event?.getOption?.(),
|
|
43
|
+
listeners: {
|
|
44
|
+
end: (event: InteractEvent) => {
|
|
45
|
+
config.event?.onDragLeave?.(event);
|
|
46
|
+
},
|
|
47
|
+
move: (event: InteractEvent) => {
|
|
48
|
+
const { x, y } = config.event?.movePositionHandler?.(event, position) ?? {
|
|
49
|
+
x: position.x + event.dx, y: position.y + event.dy,
|
|
50
|
+
};
|
|
51
|
+
position.x = x;
|
|
52
|
+
position.y = y;
|
|
53
|
+
event.target.style.transform = `translate(${position.x}px, ${position.y}px)`;
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
domRef,
|
|
62
|
+
init,
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description element size hook
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2023/6/24 16:17
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*
|
|
9
|
+
* Learn from vueuse useElementSize
|
|
10
|
+
*/
|
|
11
|
+
import { Ref, ref } from 'vue';
|
|
12
|
+
import { useResizeObserver } from './useResizeObserver';
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
export function useElementSize(
|
|
16
|
+
target: Ref<HTMLElement | null>,
|
|
17
|
+
// initialSize = { w: 0, h: 0 },
|
|
18
|
+
// options: ResizeObserverOptions = {},
|
|
19
|
+
) {
|
|
20
|
+
|
|
21
|
+
const w = ref(0);
|
|
22
|
+
const h = ref(0);
|
|
23
|
+
|
|
24
|
+
useResizeObserver(target, () => {
|
|
25
|
+
const ele = target.value;
|
|
26
|
+
if (window && ele) {
|
|
27
|
+
const styles = window.getComputedStyle(ele);
|
|
28
|
+
w.value = Number.parseFloat(styles.width);
|
|
29
|
+
h.value = Number.parseFloat(styles.height);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
w, h,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description event listener hook
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2023/5/12 00:57
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
export type EventListenerOptions = {
|
|
12
|
+
target: EventTarget | (() => EventTarget),
|
|
13
|
+
event: string,
|
|
14
|
+
handler: EventListenerOrEventListenerObject,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default function useEventListener(options: EventListenerOptions) {
|
|
18
|
+
|
|
19
|
+
const getTarget = () => {
|
|
20
|
+
if (typeof options.target === 'function') {
|
|
21
|
+
return options.target();
|
|
22
|
+
}
|
|
23
|
+
return options.target;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const add = () => {
|
|
27
|
+
getTarget().addEventListener(options.event, options.handler);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const remove = () => {
|
|
31
|
+
getTarget().removeEventListener(options.event, options.handler);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const onMounted = () => {
|
|
35
|
+
add();
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const onBeforeUnmount = () => {
|
|
39
|
+
remove();
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
add, remove,
|
|
44
|
+
onMounted,
|
|
45
|
+
onBeforeUnmount,
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description popover hook, for component like select, datepicker, etc.
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2023/5/19 00:12
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { PopoverProps } from '../../components/message/popover/props';
|
|
10
|
+
import { arrow, flip, offset, type OffsetOptions, shift } from '@floating-ui/dom';
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
flip,
|
|
14
|
+
offset,
|
|
15
|
+
shift,
|
|
16
|
+
arrow,
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export default function usePopover(
|
|
20
|
+
props?: Partial<PopoverProps>,
|
|
21
|
+
middleware?: {
|
|
22
|
+
offset?: OffsetOptions
|
|
23
|
+
extends?: any[]
|
|
24
|
+
},
|
|
25
|
+
) {
|
|
26
|
+
|
|
27
|
+
const offsetOptions = middleware?.offset ?? { crossAxis: 3 };
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
const popoverOptions: PopoverProps = {
|
|
31
|
+
placement: props?.placement ?? 'bottom-start',
|
|
32
|
+
popper: {
|
|
33
|
+
middleware: [
|
|
34
|
+
offset(offsetOptions),
|
|
35
|
+
flip(),
|
|
36
|
+
shift(),
|
|
37
|
+
...middleware?.extends ?? [],
|
|
38
|
+
],
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
popoverOptions,
|
|
44
|
+
};
|
|
45
|
+
}
|