@kine-design/core 0.0.1-beta.1 → 0.0.1-beta.11
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/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 +235 -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 +375 -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 +125 -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 +20 -0
- package/components/base/tooltip/index.ts +17 -0
- package/components/base/tooltip/props.d.ts +40 -0
- package/components/base/tooltip/useTooltip.ts +89 -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/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/useLocale.ts +53 -0
- package/compositions/common/usePopover.ts +45 -0
- package/compositions/common/useResizeObserver.ts +47 -0
- package/compositions/common/useTeleport.ts +24 -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/popper/useClickAway.ts +41 -0
- package/compositions/popper/usePopper.ts +63 -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/index.d.ts +1 -1
- package/dist/components/base/datePicker/useDatePicker.d.ts +140 -15
- 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 +1 -1
- package/dist/components/base/tooltip/useTooltip.d.ts +15 -5
- 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/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/useLocale.d.ts +14 -0
- package/dist/compositions/common/useTeleport.d.ts +4 -2
- 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/popper/useClickAway.d.ts +3 -3
- 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 +6697 -4188
- package/dist/index.d.ts +2 -0
- package/dist/locale/en.d.ts +3 -0
- package/dist/locale/index.d.ts +9 -0
- package/dist/locale/types.d.ts +222 -0
- package/dist/locale/zh.d.ts +3 -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 +81 -0
- package/locale/.vlaude/last-session-id +1 -0
- package/locale/en.ts +187 -0
- package/locale/index.ts +29 -0
- package/locale/types.ts +214 -0
- package/locale/zh.ts +190 -0
- package/package.json +23 -17
- 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,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description useInputNumber 归一 / emit 保真单测
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/4/24
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*/
|
|
7
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
8
|
+
import { nextTick, reactive } from 'vue';
|
|
9
|
+
import { useInputNumber } from '../useInputNumber';
|
|
10
|
+
import type { InputNumberProps } from '../props';
|
|
11
|
+
import type { HookContext } from '../../../types/hook';
|
|
12
|
+
|
|
13
|
+
type PropsShape = Required<InputNumberProps>;
|
|
14
|
+
|
|
15
|
+
const defaultProps: PropsShape = {
|
|
16
|
+
modelValue: null,
|
|
17
|
+
max: Infinity,
|
|
18
|
+
min: -Infinity,
|
|
19
|
+
step: 1,
|
|
20
|
+
precision: 0,
|
|
21
|
+
disabled: false,
|
|
22
|
+
readonly: false,
|
|
23
|
+
placeholder: '',
|
|
24
|
+
controls: true,
|
|
25
|
+
size: 'medium' as PropsShape['size'],
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
function setup(overrides: Partial<PropsShape> = {}) {
|
|
29
|
+
const props = reactive<PropsShape>({ ...defaultProps, ...overrides }) as PropsShape;
|
|
30
|
+
const emit = vi.fn();
|
|
31
|
+
const ctx: HookContext = { emit, slots: {} };
|
|
32
|
+
const hook = useInputNumber(props, ctx);
|
|
33
|
+
return { props, emit, ...hook };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const lastUpdate = (emit: ReturnType<typeof vi.fn>) =>
|
|
37
|
+
emit.mock.calls.filter((c: unknown[]) => c[0] === 'update:modelValue').at(-1)!;
|
|
38
|
+
|
|
39
|
+
describe('useInputNumber emit 归一', () => {
|
|
40
|
+
it('number 入 → number 出', () => {
|
|
41
|
+
const { validate, emit } = setup({ modelValue: 1 });
|
|
42
|
+
validate(5);
|
|
43
|
+
const call = lastUpdate(emit);
|
|
44
|
+
expect(call[1]).toBe(5);
|
|
45
|
+
expect(typeof call[1]).toBe('number');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('string 入 → string 出', () => {
|
|
49
|
+
const { validate, emit } = setup({ modelValue: '1' });
|
|
50
|
+
validate('5');
|
|
51
|
+
const call = lastUpdate(emit);
|
|
52
|
+
expect(call[1]).toBe('5');
|
|
53
|
+
expect(typeof call[1]).toBe('string');
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('null 入 → 用户输入整数后默认 number 出', () => {
|
|
57
|
+
const { validate, emit } = setup({ modelValue: null });
|
|
58
|
+
validate(3);
|
|
59
|
+
const call = lastUpdate(emit);
|
|
60
|
+
expect(call[1]).toBe(3);
|
|
61
|
+
expect(typeof call[1]).toBe('number');
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('空字符串 currentValue → emit null(不是空串)', () => {
|
|
65
|
+
const { validate, emit } = setup({ modelValue: 5 });
|
|
66
|
+
validate(null);
|
|
67
|
+
const call = lastUpdate(emit);
|
|
68
|
+
expect(call[1]).toBeNull();
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('中间态 "-" → emit null(未输完)', () => {
|
|
72
|
+
const { validate, emit } = setup({ modelValue: null });
|
|
73
|
+
validate('-');
|
|
74
|
+
const call = lastUpdate(emit);
|
|
75
|
+
expect(call[1]).toBeNull();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('输入 "0." → emit 0(末尾小数点归一)', () => {
|
|
79
|
+
const { validate, emit } = setup({ modelValue: null, precision: 2 });
|
|
80
|
+
validate('0.');
|
|
81
|
+
const call = lastUpdate(emit);
|
|
82
|
+
expect(call[1]).toBe(0);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('非法字符串 → emit 原样不变(validate 不触发 emit)', () => {
|
|
86
|
+
const { validate, emit } = setup({ modelValue: 5 });
|
|
87
|
+
emit.mockClear();
|
|
88
|
+
validate('abc' as unknown as number);
|
|
89
|
+
// 非法输入不触发 emit
|
|
90
|
+
expect(emit).not.toHaveBeenCalled();
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('跨类型 watch:外部传 1(number)→ 不会重复 emit 成 string', async () => {
|
|
94
|
+
const { props, emit } = setup({ modelValue: 1 });
|
|
95
|
+
emit.mockClear();
|
|
96
|
+
// 模拟外部 bind 把内部 string '1' 回传 number 1:这在真实 v-model 里是 watch 触发的
|
|
97
|
+
props.modelValue = 1;
|
|
98
|
+
await nextTick();
|
|
99
|
+
// 内部 '1' 和外部 1 的 String 归一相等,不该触发 emit
|
|
100
|
+
expect(emit).not.toHaveBeenCalled();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('blur 末尾小数点归一:内部 "1." → emit 1', () => {
|
|
104
|
+
const { handleInputChange, handleInputBlur, emit } = setup({ modelValue: null, precision: 2 });
|
|
105
|
+
handleInputChange({ target: { value: '1.' } } as never);
|
|
106
|
+
emit.mockClear();
|
|
107
|
+
handleInputBlur();
|
|
108
|
+
const call = lastUpdate(emit);
|
|
109
|
+
expect(call[1]).toBe(1);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('max 截断仍然保真类型', () => {
|
|
113
|
+
const { validate, emit } = setup({ modelValue: '10', max: 100 });
|
|
114
|
+
validate(150);
|
|
115
|
+
const call = lastUpdate(emit);
|
|
116
|
+
expect(call[1]).toBe('100');
|
|
117
|
+
expect(typeof call[1]).toBe('string');
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('min 截断仍然保真类型', () => {
|
|
121
|
+
const { validate, emit } = setup({ modelValue: 10, min: 0 });
|
|
122
|
+
validate(-5);
|
|
123
|
+
const call = lastUpdate(emit);
|
|
124
|
+
expect(call[1]).toBe(0);
|
|
125
|
+
expect(typeof call[1]).toBe('number');
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
describe('useInputNumber 输入流程', () => {
|
|
130
|
+
it('合法数字输入触发 emit', () => {
|
|
131
|
+
const { handleInputChange, emit } = setup({ modelValue: 0 });
|
|
132
|
+
emit.mockClear();
|
|
133
|
+
handleInputChange({ target: { value: '88' } } as never);
|
|
134
|
+
const call = lastUpdate(emit);
|
|
135
|
+
expect(call[1]).toBe(88);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it('increment 按 step 递增', () => {
|
|
139
|
+
const { increment, emit } = setup({ modelValue: 5, step: 3 });
|
|
140
|
+
emit.mockClear();
|
|
141
|
+
increment();
|
|
142
|
+
const call = lastUpdate(emit);
|
|
143
|
+
expect(call[1]).toBe(8);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('decrement 按 step 递减', () => {
|
|
147
|
+
const { decrement, emit } = setup({ modelValue: 5, step: 2 });
|
|
148
|
+
emit.mockClear();
|
|
149
|
+
decrement();
|
|
150
|
+
const call = lastUpdate(emit);
|
|
151
|
+
expect(call[1]).toBe(3);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('disabled 时 increment 和 decrement 为 no-op', () => {
|
|
155
|
+
const { increment, decrement, emit } = setup({ modelValue: 5, disabled: true });
|
|
156
|
+
emit.mockClear();
|
|
157
|
+
increment();
|
|
158
|
+
decrement();
|
|
159
|
+
// disabled 状态下不触发任何 emit
|
|
160
|
+
expect(emit).not.toHaveBeenCalled();
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it('readonly 时 increment 和 decrement 为 no-op', () => {
|
|
164
|
+
const { increment, decrement, emit } = setup({ modelValue: 5, readonly: true });
|
|
165
|
+
emit.mockClear();
|
|
166
|
+
increment();
|
|
167
|
+
decrement();
|
|
168
|
+
// readonly 状态下不触发任何 emit
|
|
169
|
+
expect(emit).not.toHaveBeenCalled();
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
describe('useInputNumber 中间态处理', () => {
|
|
174
|
+
it('validate(".") 为中间态 → emit null', () => {
|
|
175
|
+
const { validate, emit } = setup({ modelValue: null });
|
|
176
|
+
validate('.' as unknown as number);
|
|
177
|
+
// "." 经 handleInputChange 会被转为 "0.",但直接 validate('.') 是非法输入
|
|
178
|
+
// validate 里 isNaN(+'.') 为 true 且不是 '' 也不是 '-',所以不触发 emit
|
|
179
|
+
expect(emit.mock.calls.filter((c: unknown[]) => c[0] === 'update:modelValue')).toHaveLength(0);
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it('validate("-.") 为非法输入 → 不触发 emit', () => {
|
|
183
|
+
const { validate, emit } = setup({ modelValue: null });
|
|
184
|
+
emit.mockClear();
|
|
185
|
+
validate('-.' as unknown as number);
|
|
186
|
+
// '-.' → isNaN(+'-.')=true, 不是 '' 不是 '-',走非法输入分支
|
|
187
|
+
expect(emit).not.toHaveBeenCalled();
|
|
188
|
+
});
|
|
189
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description inputNumber 运行时 props
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/25 00:00
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { MCOPO, MPropType } from '../../types/props';
|
|
10
|
+
import { InputNumberProps } from './props';
|
|
11
|
+
|
|
12
|
+
export const props: MCOPO<InputNumberProps> = {
|
|
13
|
+
modelValue: { type: null, default: null },
|
|
14
|
+
placeholder: { type: String, default: '' },
|
|
15
|
+
max: { type: Number, default: Infinity },
|
|
16
|
+
min: { type: Number, default: -Infinity },
|
|
17
|
+
disabled: { type: Boolean, default: false },
|
|
18
|
+
readonly: { type: Boolean, default: false },
|
|
19
|
+
step: { type: Number, default: 1 },
|
|
20
|
+
precision: { type: Number, default: 0 },
|
|
21
|
+
controls: { type: Boolean, default: true },
|
|
22
|
+
size: { type: String as unknown as MPropType<NonNullable<InputNumberProps['size']>>, default: undefined },
|
|
23
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description inputNumber core 导出
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/25 00:00
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { props } from './api';
|
|
10
|
+
import { useInputNumber } from './useInputNumber';
|
|
11
|
+
|
|
12
|
+
export const InputNumberCore = {
|
|
13
|
+
props,
|
|
14
|
+
useInputNumber,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export type { InputNumberProps } from './props';
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description inputNumber 类型定义
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/25 00:00
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* @name m-input-number
|
|
8
|
+
* @docDescription InputNumber component.
|
|
9
|
+
* 数字输入框组件。
|
|
10
|
+
* @docUrl https://shuimo.design/input#number
|
|
11
|
+
*
|
|
12
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { KineSize } from '../../types/props';
|
|
16
|
+
|
|
17
|
+
export declare type InputNumberProps = {
|
|
18
|
+
/**
|
|
19
|
+
* @description input-number modelValue
|
|
20
|
+
* @type number | string
|
|
21
|
+
* @default ''
|
|
22
|
+
*/
|
|
23
|
+
modelValue?: number | string | null,
|
|
24
|
+
/**
|
|
25
|
+
* @description input-number max
|
|
26
|
+
* @type number
|
|
27
|
+
* @default Infinity
|
|
28
|
+
*/
|
|
29
|
+
max?: number,
|
|
30
|
+
/**
|
|
31
|
+
* @description input-number min
|
|
32
|
+
* @type number
|
|
33
|
+
* @default -Infinity
|
|
34
|
+
*/
|
|
35
|
+
min?: number,
|
|
36
|
+
/**
|
|
37
|
+
* @description input-number step. 步长,每次增减的幅度
|
|
38
|
+
* @type number
|
|
39
|
+
* @default 1
|
|
40
|
+
*/
|
|
41
|
+
step?: number,
|
|
42
|
+
/**
|
|
43
|
+
* @description input-number precision
|
|
44
|
+
* @type number
|
|
45
|
+
* @default 0
|
|
46
|
+
*/
|
|
47
|
+
precision?: number,
|
|
48
|
+
/**
|
|
49
|
+
* @description input-number disabled
|
|
50
|
+
* @type boolean
|
|
51
|
+
* @default false
|
|
52
|
+
*/
|
|
53
|
+
disabled?: boolean,
|
|
54
|
+
/**
|
|
55
|
+
* @description input readonly. 是否只读
|
|
56
|
+
* @type boolean
|
|
57
|
+
* @default false
|
|
58
|
+
*/
|
|
59
|
+
readonly?: boolean,
|
|
60
|
+
/**
|
|
61
|
+
* @description input-number placeholder
|
|
62
|
+
* @type string
|
|
63
|
+
* @default ''
|
|
64
|
+
*/
|
|
65
|
+
placeholder?: string,
|
|
66
|
+
/**
|
|
67
|
+
* @description whether to show increase/decrease buttons. 是否显示增减按钮
|
|
68
|
+
* @type boolean
|
|
69
|
+
* @default true
|
|
70
|
+
*/
|
|
71
|
+
controls?: boolean,
|
|
72
|
+
/**
|
|
73
|
+
* @description 尺寸
|
|
74
|
+
* @type KineSize
|
|
75
|
+
* @default undefined
|
|
76
|
+
*/
|
|
77
|
+
size?: KineSize
|
|
78
|
+
};
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description inputNumber composable
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/25 00:00
|
|
5
|
+
* @version v1.2.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*
|
|
9
|
+
* v1.2.0 changelog:
|
|
10
|
+
* - emit 类型保真:string 入 string 出,number 入 number 出;空值一律 emit null
|
|
11
|
+
* - 内部 currentValue 保留中间态('-' / '0.' / ''),仅在 emit 时归一
|
|
12
|
+
*/
|
|
13
|
+
import { ref, watch } from 'vue';
|
|
14
|
+
import { InputNumberProps } from './props';
|
|
15
|
+
import { HTMLElementEvent } from '../../types/template';
|
|
16
|
+
import { type HookContext } from '../../types/hook';
|
|
17
|
+
|
|
18
|
+
export type InputNumber = string | number | null;
|
|
19
|
+
|
|
20
|
+
/** 用户输入中间态:不构成可 emit 的数字,emit null */
|
|
21
|
+
const MID_STATES = new Set(['', '-', '.', '-.']);
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* 把任意内部值归一为 number | null。
|
|
25
|
+
* 规则:
|
|
26
|
+
* - null/undefined/中间态 → null
|
|
27
|
+
* - 末尾小数点去掉('1.' → '1')
|
|
28
|
+
* - 非法 NaN → null
|
|
29
|
+
* - 其他 → Number(v)
|
|
30
|
+
*/
|
|
31
|
+
const normalize = (v: string | number | null | undefined): number | null => {
|
|
32
|
+
if (v === null || v === undefined) return null;
|
|
33
|
+
const s = String(v);
|
|
34
|
+
if (MID_STATES.has(s)) return null;
|
|
35
|
+
const cleaned = s.endsWith('.') ? s.slice(0, -1) : s;
|
|
36
|
+
const n = Number(cleaned);
|
|
37
|
+
return Number.isNaN(n) ? null : n;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export function useInputNumber(props: Required<InputNumberProps>, ctx: HookContext) {
|
|
41
|
+
const currentValue = ref<string | number>(props.modelValue ?? '');
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* 按外部 modelValue 的当前 typeof 决定出参类型,保真 v-model 声明。
|
|
45
|
+
* - null/undefined → null
|
|
46
|
+
* - 外部当前是 string → emit String(n)
|
|
47
|
+
* - 否则 → emit n(默认 number)
|
|
48
|
+
*/
|
|
49
|
+
const toEmitValue = (n: number | null): number | string | null => {
|
|
50
|
+
if (n === null) return null;
|
|
51
|
+
return typeof props.modelValue === 'string' ? String(n) : n;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const updateInput = (oldVal: InputNumber) => {
|
|
55
|
+
const out = toEmitValue(normalize(currentValue.value));
|
|
56
|
+
ctx.emit('update:modelValue', out);
|
|
57
|
+
ctx.emit('change', out, oldVal);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const setCurrentValue = (newVal: string | number, e?: HTMLElementEvent<HTMLInputElement>) => {
|
|
61
|
+
const oldVal = currentValue.value;
|
|
62
|
+
const { min, max, precision } = props;
|
|
63
|
+
// 字符串归一比较:'1' 和 1 视为同值,避免跨类型重复 emit;'-' vs '-' 也命中
|
|
64
|
+
if (String(oldVal) === String(newVal)) {
|
|
65
|
+
return;
|
|
66
|
+
} else if (+newVal >= +max) {
|
|
67
|
+
// 超过最大值,截断到 max
|
|
68
|
+
newVal = max;
|
|
69
|
+
} else if (+newVal <= +min) {
|
|
70
|
+
// 低于最小值,截断到 min
|
|
71
|
+
newVal = min;
|
|
72
|
+
} else if (
|
|
73
|
+
precision !== 0 &&
|
|
74
|
+
String(newVal).includes('.') &&
|
|
75
|
+
(`${newVal}`.length - (`${newVal}`.indexOf('.') + 1) >= precision)
|
|
76
|
+
) {
|
|
77
|
+
// 按精度截断小数位
|
|
78
|
+
newVal = Number(`${newVal}`.substring(0, `${newVal}`.indexOf('.') + (precision + 1)));
|
|
79
|
+
}
|
|
80
|
+
if (e) { e.target.value = String(newVal); }
|
|
81
|
+
currentValue.value = newVal;
|
|
82
|
+
updateInput(oldVal);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const validate = (value: InputNumber, e?: HTMLElementEvent<HTMLInputElement>) => {
|
|
86
|
+
if (value === null || value === undefined) {
|
|
87
|
+
const oldVal = currentValue.value;
|
|
88
|
+
currentValue.value = '';
|
|
89
|
+
updateInput(oldVal);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// 合法值:数字、空字符串、负号前缀(用户正在输入负数)
|
|
93
|
+
if (!isNaN(+value) || value === '' || value === '-') {
|
|
94
|
+
setCurrentValue(value, e);
|
|
95
|
+
} else {
|
|
96
|
+
// 非法输入,还原为当前值
|
|
97
|
+
if (e) e.target.value = String(currentValue.value);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const handleInputChange = (e: HTMLElementEvent<HTMLInputElement>) => {
|
|
102
|
+
let val = e.target.value;
|
|
103
|
+
// 处理以小数点开头的输入,补充整数部分 0
|
|
104
|
+
if (val.indexOf('.') === 0) {
|
|
105
|
+
val = val.replace(/^\./g, '0.');
|
|
106
|
+
}
|
|
107
|
+
// 处理整数部分多余前导零
|
|
108
|
+
if (/^-?\d+$/.test(val) && val.indexOf('0') === 0) {
|
|
109
|
+
val = `${Number(val)}`;
|
|
110
|
+
e.target.value = val;
|
|
111
|
+
}
|
|
112
|
+
validate(val, e);
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const handleInputBlur = () => {
|
|
116
|
+
const oldVal = currentValue.value;
|
|
117
|
+
// blur 时清理末尾的负号
|
|
118
|
+
if (currentValue.value === '-') {
|
|
119
|
+
currentValue.value = '';
|
|
120
|
+
} else if (currentValue.value === '-0') {
|
|
121
|
+
currentValue.value = 0;
|
|
122
|
+
} else {
|
|
123
|
+
const str = String(currentValue.value);
|
|
124
|
+
// 清理末尾小数点
|
|
125
|
+
if (str.indexOf('.') === str.length - 1 && str.length > 0) {
|
|
126
|
+
currentValue.value = str.replace(/\.$/g, '');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// blur 后内部归一到数字(避免 '1' 和 1 并存)
|
|
130
|
+
const n = normalize(currentValue.value);
|
|
131
|
+
currentValue.value = n === null ? '' : n;
|
|
132
|
+
updateInput(oldVal);
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* 按步长增加当前值,不超过 max
|
|
137
|
+
*/
|
|
138
|
+
const increment = () => {
|
|
139
|
+
if (props.disabled || props.readonly) { return; }
|
|
140
|
+
const base = currentValue.value === '' ? 0 : +currentValue.value;
|
|
141
|
+
const next = base + props.step;
|
|
142
|
+
validate(next);
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* 按步长减少当前值,不低于 min
|
|
147
|
+
*/
|
|
148
|
+
const decrement = () => {
|
|
149
|
+
if (props.disabled || props.readonly) { return; }
|
|
150
|
+
const base = currentValue.value === '' ? 0 : +currentValue.value;
|
|
151
|
+
const next = base - props.step;
|
|
152
|
+
validate(next);
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* 键盘上/下箭头按步长增减
|
|
157
|
+
*/
|
|
158
|
+
const handleKeydown = (e: KeyboardEvent) => {
|
|
159
|
+
if (e.key === 'ArrowUp') {
|
|
160
|
+
e.preventDefault();
|
|
161
|
+
increment();
|
|
162
|
+
} else if (e.key === 'ArrowDown') {
|
|
163
|
+
e.preventDefault();
|
|
164
|
+
decrement();
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
// 监听外部 modelValue 变化,同步内部值
|
|
169
|
+
watch(() => props.modelValue, val => {
|
|
170
|
+
validate(val);
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
return {
|
|
174
|
+
currentValue,
|
|
175
|
+
handleInputChange,
|
|
176
|
+
handleInputBlur,
|
|
177
|
+
handleKeydown,
|
|
178
|
+
increment,
|
|
179
|
+
decrement,
|
|
180
|
+
validate,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description li api
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2025/02/25 00:00
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { MCOPO } from '../../types/props';
|
|
10
|
+
import { LiProps } from './props';
|
|
11
|
+
|
|
12
|
+
export const props: MCOPO<LiProps> = {
|
|
13
|
+
active: { type: Boolean, default: false },
|
|
14
|
+
marker: { type: Boolean, default: true },
|
|
15
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description li props type
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2025/02/25 00:00
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* @name m-li
|
|
8
|
+
* @docDescription Li component.
|
|
9
|
+
* 列表项组件。
|
|
10
|
+
* @docUrl https://shuimo.design/li
|
|
11
|
+
*
|
|
12
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export declare type LiProps = {
|
|
16
|
+
/**
|
|
17
|
+
* @description is active style or not
|
|
18
|
+
* 是否激活样式
|
|
19
|
+
* @type boolean
|
|
20
|
+
* @default false
|
|
21
|
+
*/
|
|
22
|
+
active?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* @description show marker or not
|
|
25
|
+
* 是否显示标记
|
|
26
|
+
* @type boolean
|
|
27
|
+
* @default true
|
|
28
|
+
*/
|
|
29
|
+
marker?: boolean;
|
|
30
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description list api
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2025/02/25 00:00
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { MCOPO } from '../../types/props';
|
|
10
|
+
import { ListProps } from './props';
|
|
11
|
+
|
|
12
|
+
export const props: MCOPO<ListProps> = {
|
|
13
|
+
data: { type: Array, default: () => [] },
|
|
14
|
+
autoActive: { type: Boolean, default: false },
|
|
15
|
+
loading: { type: Boolean, default: false },
|
|
16
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description list core
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2025/02/25 00:00
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { props } from './api';
|
|
10
|
+
import { useList } from './useList';
|
|
11
|
+
|
|
12
|
+
export const ListCore = {
|
|
13
|
+
props,
|
|
14
|
+
useList,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export type { ListProps } from './props';
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description list props type
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2025/02/25 00:00
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* @name m-list
|
|
8
|
+
* @docDescription List component.
|
|
9
|
+
* 列表组件。
|
|
10
|
+
* @docUrl https://shuimo.design/list
|
|
11
|
+
*
|
|
12
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export declare type ListProps = {
|
|
16
|
+
/**
|
|
17
|
+
* @description List data
|
|
18
|
+
* 列表数据
|
|
19
|
+
* @default []
|
|
20
|
+
*/
|
|
21
|
+
data?: Record<string, unknown>[],
|
|
22
|
+
/**
|
|
23
|
+
* @description all item use active style
|
|
24
|
+
* 所有项使用激活样式
|
|
25
|
+
* @default false
|
|
26
|
+
*/
|
|
27
|
+
autoActive?: boolean,
|
|
28
|
+
/**
|
|
29
|
+
* @description 加载中状态
|
|
30
|
+
* @default false
|
|
31
|
+
*/
|
|
32
|
+
loading?: boolean
|
|
33
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description list hook
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2025/02/25 00:00
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @description 基础渲染,将数据转为字符串
|
|
12
|
+
*/
|
|
13
|
+
const baseRender = (item: unknown) => {
|
|
14
|
+
if (['string', 'number'].includes(typeof item)) {
|
|
15
|
+
return String(item);
|
|
16
|
+
}
|
|
17
|
+
if (typeof item === 'object') {
|
|
18
|
+
return JSON.stringify(item);
|
|
19
|
+
}
|
|
20
|
+
return '';
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export function useList<T>() {
|
|
24
|
+
const dataValidate = (data: T[] | undefined) => {
|
|
25
|
+
if (!Array.isArray(data)) {
|
|
26
|
+
console.warn('[shuimo-list] data必须是数组');
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
baseRender,
|
|
34
|
+
dataValidate,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description loading api
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/27
|
|
5
|
+
* @version v1.1.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { MCOPO, MPropType } from '../../types/props';
|
|
10
|
+
import { LoadingProps } from './props';
|
|
11
|
+
|
|
12
|
+
export const props: MCOPO<LoadingProps> = {
|
|
13
|
+
modelValue: { type: Boolean, default: false },
|
|
14
|
+
size: { type: String as unknown as MPropType<NonNullable<LoadingProps['size']>>, default: undefined },
|
|
15
|
+
mask: { type: Boolean, default: false },
|
|
16
|
+
text: { type: String, default: undefined },
|
|
17
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description loading core 导出
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/25
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { props } from './api';
|
|
10
|
+
|
|
11
|
+
export const LoadingCore = {
|
|
12
|
+
props,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export type { LoadingProps } from './props';
|