@kine-design/core 0.0.1-beta.1 → 0.0.1-beta.2
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/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 +15 -0
- package/components/base/affix/props.d.ts +34 -0
- package/components/base/affix/useAffix.ts +123 -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 +16 -0
- package/components/base/anchor/props.d.ts +46 -0
- package/components/base/anchor/useAnchor.ts +83 -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 +149 -0
- package/components/base/avatar/api.ts +17 -0
- package/components/base/avatar/avatar.css +61 -0
- package/components/base/avatar/index.ts +14 -0
- package/components/base/avatar/props.d.ts +37 -0
- package/components/base/backTop/api.ts +17 -0
- package/components/base/backTop/index.ts +15 -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 +16 -0
- package/components/base/button/props.d.ts +64 -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 +151 -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 +334 -0
- package/components/base/checkbox/api.ts +24 -0
- package/components/base/checkbox/checkbox.css +0 -0
- package/components/base/checkbox/index.ts +16 -0
- package/components/base/checkbox/props.d.ts +77 -0
- package/components/base/checkbox/useCheckbox.ts +42 -0
- package/components/base/collapse/api.ts +21 -0
- package/components/base/collapse/index.ts +16 -0
- package/components/base/collapse/props.d.ts +45 -0
- package/components/base/collapse/useCollapse.ts +80 -0
- package/components/base/datePicker/api.ts +18 -0
- package/components/base/datePicker/index.ts +19 -0
- package/components/base/datePicker/props.d.ts +60 -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 +16 -0
- package/components/base/dropdown/props.d.ts +60 -0
- package/components/base/dropdown/useDropdown.ts +123 -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/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 +19 -0
- package/components/base/input/index.ts +16 -0
- package/components/base/input/input.css +19 -0
- package/components/base/input/props.d.ts +60 -0
- package/components/base/input/useInput.ts +53 -0
- package/components/base/inputNumber/api.ts +21 -0
- package/components/base/inputNumber/index.ts +15 -0
- package/components/base/inputNumber/props.d.ts +64 -0
- package/components/base/inputNumber/useInputNumber.ts +140 -0
- package/components/base/li/api.ts +15 -0
- package/components/base/li/index.ts +13 -0
- package/components/base/li/props.d.ts +30 -0
- package/components/base/list/api.ts +16 -0
- package/components/base/list/index.ts +15 -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 +38 -0
- package/components/base/popover/api.ts +28 -0
- package/components/base/popover/index.ts +15 -0
- package/components/base/popover/props.d.ts +73 -0
- package/components/base/popover/usePopover.ts +188 -0
- package/components/base/progress/api.ts +18 -0
- package/components/base/progress/index.ts +15 -0
- package/components/base/progress/props.d.ts +53 -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 +15 -0
- package/components/base/rate/props.d.ts +49 -0
- package/components/base/rate/useRate.ts +75 -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 +31 -0
- package/components/base/select/index.ts +18 -0
- package/components/base/select/props.d.ts +132 -0
- package/components/base/select/select.css +7 -0
- package/components/base/select/useSelect.ts +280 -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 +20 -0
- package/components/base/slider/index.ts +15 -0
- package/components/base/slider/props.d.ts +65 -0
- package/components/base/slider/useSlider.ts +83 -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/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 +17 -0
- package/components/base/switch/props.d.ts +66 -0
- package/components/base/switch/useSwitch.tsx +79 -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 +66 -0
- package/components/base/tag/api.ts +17 -0
- package/components/base/tag/index.ts +13 -0
- package/components/base/tag/props.d.ts +49 -0
- package/components/base/timePicker/api.ts +21 -0
- package/components/base/timePicker/index.ts +18 -0
- package/components/base/timePicker/props.d.ts +66 -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 +19 -0
- package/components/base/tooltip/index.ts +17 -0
- package/components/base/tooltip/props.d.ts +34 -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 +207 -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 +19 -0
- package/components/message/dialog/index.ts +15 -0
- package/components/message/dialog/props.d.ts +55 -0
- package/components/message/drawer/api.ts +32 -0
- package/components/message/drawer/index.ts +15 -0
- package/components/message/drawer/props.d.ts +73 -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/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 +230 -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/api.ts +26 -0
- package/components/template/menu/index.ts +19 -0
- package/components/template/menu/props.d.ts +93 -0
- package/components/template/menu/useMenu.ts +155 -0
- package/components/template/pagination/api.ts +22 -0
- package/components/template/pagination/index.ts +18 -0
- package/components/template/pagination/props.d.ts +65 -0
- package/components/template/pagination/usePagination.ts +186 -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 +138 -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 +18 -0
- package/components/template/virtualList/props.d.ts +25 -0
- package/components/template/virtualList/useVirtualList.ts +237 -0
- package/components/types/hook.d.ts +13 -0
- package/components/types/props.d.ts +52 -0
- package/components/types/template.d.ts +59 -0
- package/compositions/common/defineCore.ts +55 -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 +43 -0
- package/compositions/common/useTeleport.ts +24 -0
- package/compositions/input/useBooleanInput.ts +52 -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/filters.ts +135 -0
- package/compositions/virtualList/enums.ts +52 -0
- package/compositions/virtualList/useContainerObserver.ts +82 -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/useAffix.d.ts +5 -4
- package/dist/components/base/anchor/useAnchor.d.ts +1 -1
- package/dist/components/base/autoComplete/useAutoComplete.d.ts +12 -4
- package/dist/components/base/backTop/useBackTop.d.ts +1 -1
- package/dist/components/base/button/index.d.ts +11 -2
- package/dist/components/base/button/useButton.d.ts +11 -2
- package/dist/components/base/carousel/useCarousel.d.ts +6 -3
- package/dist/components/base/cascader/useCascader.d.ts +23 -11
- package/dist/components/base/checkbox/useCheckbox.d.ts +4 -3
- package/dist/components/base/collapse/useCollapse.d.ts +2 -2
- package/dist/components/base/datePicker/useDatePicker.d.ts +140 -8
- package/dist/components/base/dropdown/useDropdown.d.ts +11 -5
- package/dist/components/base/image/useImage.d.ts +5 -5
- package/dist/components/base/input/useInput.d.ts +1 -2
- package/dist/components/base/inputNumber/useInputNumber.d.ts +2 -2
- package/dist/components/base/popover/usePopover.d.ts +8 -8
- package/dist/components/base/progress/useProgress.d.ts +1 -1
- package/dist/components/base/rate/useRate.d.ts +1 -1
- package/dist/components/base/select/useSelect.d.ts +8 -8
- package/dist/components/base/slider/useSlider.d.ts +3 -3
- 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/useSwitch.d.ts +8 -3
- package/dist/components/base/tabs/useTabs.d.ts +2 -2
- package/dist/components/base/timePicker/useTimePicker.d.ts +14 -6
- package/dist/components/base/tooltip/useTooltip.d.ts +14 -4
- package/dist/components/base/transfer/useTransfer.d.ts +15 -15
- package/dist/components/base/tree/index.d.ts +1 -1
- package/dist/components/base/tree/useTree.d.ts +2 -1
- package/dist/components/message/message/useMessage.d.ts +11 -1
- 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/usePopover.d.ts +6 -6
- package/dist/components/other/darkMode/useDarkMode.d.ts +1 -1
- package/dist/components/template/menu/useMenu.d.ts +1 -0
- package/dist/components/template/virtualList/useVirtualList.d.ts +10 -7
- package/dist/compositions/common/useDrag.d.ts +1 -1
- package/dist/compositions/common/useElementSize.d.ts +2 -2
- package/dist/compositions/common/useTeleport.d.ts +4 -2
- package/dist/compositions/modal/useModal.d.ts +1 -1
- package/dist/core.js +6137 -4186
- package/dist/runtime/defineHook.d.ts +1 -1
- package/index.css +1 -0
- package/index.ts +71 -0
- package/package.json +19 -16
- package/runtime/defineHook.ts +21 -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/dist/vite.config.build.d.ts +0 -2
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description inputNumber composable
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/25 00:00
|
|
5
|
+
* @version v1.1.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { ref, watch } from 'vue';
|
|
10
|
+
import { InputNumberProps } from './props';
|
|
11
|
+
import { HTMLElementEvent } from '../../types/template';
|
|
12
|
+
|
|
13
|
+
export type InputNumber = string | number | null;
|
|
14
|
+
|
|
15
|
+
export default function useInputNumber(props: Required<InputNumberProps>, ctx: any) {
|
|
16
|
+
const currentValue = ref<string | number>(props.modelValue ?? '');
|
|
17
|
+
|
|
18
|
+
const updateInput = (oldVal: InputNumber) => {
|
|
19
|
+
ctx.emit('update:modelValue', currentValue.value);
|
|
20
|
+
ctx.emit('change', currentValue.value, oldVal);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const setCurrentValue = (newVal: string | number, e?: HTMLElementEvent<HTMLInputElement>) => {
|
|
24
|
+
const oldVal = currentValue.value;
|
|
25
|
+
const { min, max, precision } = props;
|
|
26
|
+
if (oldVal === newVal) {
|
|
27
|
+
return;
|
|
28
|
+
} else if (+newVal >= +max) {
|
|
29
|
+
// 超过最大值,截断到 max
|
|
30
|
+
newVal = max;
|
|
31
|
+
} else if (+newVal <= +min) {
|
|
32
|
+
// 低于最小值,截断到 min
|
|
33
|
+
newVal = min;
|
|
34
|
+
} else if (
|
|
35
|
+
precision !== 0 &&
|
|
36
|
+
String(newVal).includes('.') &&
|
|
37
|
+
(`${newVal}`.length - (`${newVal}`.indexOf('.') + 1) >= precision)
|
|
38
|
+
) {
|
|
39
|
+
// 按精度截断小数位
|
|
40
|
+
newVal = Number(`${newVal}`.substring(0, `${newVal}`.indexOf('.') + (precision + 1)));
|
|
41
|
+
}
|
|
42
|
+
if (e) { e.target.value = String(newVal); }
|
|
43
|
+
currentValue.value = newVal;
|
|
44
|
+
updateInput(oldVal);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const validate = (value: InputNumber, e?: HTMLElementEvent<HTMLInputElement>) => {
|
|
48
|
+
if (value === null || value === undefined) {
|
|
49
|
+
const oldVal = currentValue.value;
|
|
50
|
+
currentValue.value = '';
|
|
51
|
+
updateInput(oldVal);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// 合法值:数字、空字符串、负号前缀(用户正在输入负数)
|
|
55
|
+
if (!isNaN(+value) || value === '' || value === '-') {
|
|
56
|
+
setCurrentValue(value, e);
|
|
57
|
+
} else {
|
|
58
|
+
// 非法输入,还原为当前值
|
|
59
|
+
if (e) e.target.value = String(currentValue.value);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const handleInputChange = (e: HTMLElementEvent<HTMLInputElement>) => {
|
|
64
|
+
let val = e.target.value;
|
|
65
|
+
// 处理以小数点开头的输入,补充整数部分 0
|
|
66
|
+
if (val.indexOf('.') === 0) {
|
|
67
|
+
val = val.replace(/^\./g, '0.');
|
|
68
|
+
}
|
|
69
|
+
// 处理整数部分多余前导零
|
|
70
|
+
if (/^-?\d+$/.test(val) && val.indexOf('0') === 0) {
|
|
71
|
+
val = `${Number(val)}`;
|
|
72
|
+
e.target.value = val;
|
|
73
|
+
}
|
|
74
|
+
validate(val, e);
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const handleInputBlur = () => {
|
|
78
|
+
// blur 时清理末尾的负号
|
|
79
|
+
if (currentValue.value === '-') {
|
|
80
|
+
currentValue.value = '';
|
|
81
|
+
} else if (currentValue.value === '-0') {
|
|
82
|
+
currentValue.value = 0;
|
|
83
|
+
}
|
|
84
|
+
const oldVal = currentValue.value;
|
|
85
|
+
const str = String(currentValue.value);
|
|
86
|
+
// 清理末尾小数点
|
|
87
|
+
currentValue.value = str.indexOf('.') === str.length - 1
|
|
88
|
+
? str.replace(/\.$/g, '')
|
|
89
|
+
: currentValue.value;
|
|
90
|
+
updateInput(oldVal);
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* 按步长增加当前值,不超过 max
|
|
95
|
+
*/
|
|
96
|
+
const increment = () => {
|
|
97
|
+
if (props.disabled || props.readonly) { return; }
|
|
98
|
+
const base = currentValue.value === '' ? 0 : +currentValue.value;
|
|
99
|
+
const next = base + props.step;
|
|
100
|
+
validate(next);
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* 按步长减少当前值,不低于 min
|
|
105
|
+
*/
|
|
106
|
+
const decrement = () => {
|
|
107
|
+
if (props.disabled || props.readonly) { return; }
|
|
108
|
+
const base = currentValue.value === '' ? 0 : +currentValue.value;
|
|
109
|
+
const next = base - props.step;
|
|
110
|
+
validate(next);
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* 键盘上/下箭头按步长增减
|
|
115
|
+
*/
|
|
116
|
+
const handleKeydown = (e: KeyboardEvent) => {
|
|
117
|
+
if (e.key === 'ArrowUp') {
|
|
118
|
+
e.preventDefault();
|
|
119
|
+
increment();
|
|
120
|
+
} else if (e.key === 'ArrowDown') {
|
|
121
|
+
e.preventDefault();
|
|
122
|
+
decrement();
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
// 监听外部 modelValue 变化,同步内部值
|
|
127
|
+
watch(() => props.modelValue, val => {
|
|
128
|
+
validate(val);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
return {
|
|
132
|
+
currentValue,
|
|
133
|
+
handleInputChange,
|
|
134
|
+
handleInputBlur,
|
|
135
|
+
handleKeydown,
|
|
136
|
+
increment,
|
|
137
|
+
decrement,
|
|
138
|
+
validate,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
@@ -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,15 @@
|
|
|
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.ts';
|
|
10
|
+
import useList from './useList';
|
|
11
|
+
|
|
12
|
+
export const ListCore = {
|
|
13
|
+
props,
|
|
14
|
+
useList,
|
|
15
|
+
};
|
|
@@ -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 default 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: 'medium' },
|
|
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';
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description loading api type
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/27
|
|
5
|
+
* @version v1.1.0
|
|
6
|
+
*
|
|
7
|
+
* @name k-loading
|
|
8
|
+
* @docDescription Loading component with Phosphor sci-fi theme.
|
|
9
|
+
* Kine Design 加载组件。
|
|
10
|
+
*
|
|
11
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export declare type LoadingProps = {
|
|
15
|
+
/**
|
|
16
|
+
* @description 是否显示 loading
|
|
17
|
+
* @type boolean
|
|
18
|
+
* @default false
|
|
19
|
+
*/
|
|
20
|
+
modelValue?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* @description 尺寸
|
|
23
|
+
* @type 'large' | 'medium' | 'small'
|
|
24
|
+
* @default 'medium'
|
|
25
|
+
*/
|
|
26
|
+
size?: 'large' | 'medium' | 'small';
|
|
27
|
+
/**
|
|
28
|
+
* @description 是否显示遮罩层(覆盖父元素)
|
|
29
|
+
* @type boolean
|
|
30
|
+
* @default false
|
|
31
|
+
*/
|
|
32
|
+
mask?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* @description 加载提示文字
|
|
35
|
+
* @type string
|
|
36
|
+
*/
|
|
37
|
+
text?: string;
|
|
38
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description popover 运行时 props
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/25 00:00
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { PopoverProps } from './props';
|
|
10
|
+
import { MCOPO, MPropType } from '../../types/props';
|
|
11
|
+
import { Placement } from '../../../compositions/popper/usePopper.ts';
|
|
12
|
+
|
|
13
|
+
export const props: MCOPO<PopoverProps> = {
|
|
14
|
+
placement: {
|
|
15
|
+
type: String as MPropType<Placement>,
|
|
16
|
+
default: 'bottom',
|
|
17
|
+
},
|
|
18
|
+
mountRender: { type: Boolean, default: false },
|
|
19
|
+
disableClickAway: { type: Boolean, default: false },
|
|
20
|
+
hover: { type: Boolean, default: false },
|
|
21
|
+
show: { type: Boolean, default: null },
|
|
22
|
+
content: { type: String, default: '' },
|
|
23
|
+
popper: {
|
|
24
|
+
type: Object, default: () => ({}),
|
|
25
|
+
},
|
|
26
|
+
teleport: { type: [Object, Boolean], default: undefined },
|
|
27
|
+
title: { type: String, default: undefined },
|
|
28
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description popover core 导出
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/25 00:00
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { props } from './api.ts';
|
|
10
|
+
import usePopover from './usePopover.ts';
|
|
11
|
+
|
|
12
|
+
export const PopoverCore = {
|
|
13
|
+
props,
|
|
14
|
+
usePopover,
|
|
15
|
+
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description popover 类型定义
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/25 00:00
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* @name m-popover
|
|
8
|
+
* @docDescription Popover component.
|
|
9
|
+
* 弹出框组件。
|
|
10
|
+
* @docUrl https://shuimo.design/popover
|
|
11
|
+
*
|
|
12
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
13
|
+
*/
|
|
14
|
+
import { Placement, PopperConfig } from '../../../compositions/popper/usePopper.ts';
|
|
15
|
+
import { MTeleportProps } from '../../../types/common/common';
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
export type PopoverProps = {
|
|
19
|
+
/**
|
|
20
|
+
* @description 弹出框位置
|
|
21
|
+
* @type Placement
|
|
22
|
+
* @default bottom
|
|
23
|
+
*/
|
|
24
|
+
placement?: Placement,
|
|
25
|
+
/**
|
|
26
|
+
* @description 挂载时是否渲染弹出内容
|
|
27
|
+
* @type boolean
|
|
28
|
+
* @default false
|
|
29
|
+
*/
|
|
30
|
+
mountRender?: boolean,
|
|
31
|
+
/**
|
|
32
|
+
* @description 禁用点击外部自动关闭
|
|
33
|
+
* @type boolean
|
|
34
|
+
* @default false
|
|
35
|
+
*/
|
|
36
|
+
disableClickAway?: boolean,
|
|
37
|
+
/**
|
|
38
|
+
* @description 简单文本内容可通过 prop 传入
|
|
39
|
+
* @type any
|
|
40
|
+
* @default ''
|
|
41
|
+
*/
|
|
42
|
+
content?: any,
|
|
43
|
+
/**
|
|
44
|
+
* @description 是否通过 hover 触发
|
|
45
|
+
* @type boolean
|
|
46
|
+
* @default false
|
|
47
|
+
*/
|
|
48
|
+
hover?: boolean,
|
|
49
|
+
/**
|
|
50
|
+
* @description 是否显示
|
|
51
|
+
* @type boolean
|
|
52
|
+
* @default false
|
|
53
|
+
*/
|
|
54
|
+
show?: boolean,
|
|
55
|
+
/**
|
|
56
|
+
* @description floating-ui 配置项,参考 https://floating-ui.com/
|
|
57
|
+
* @type PopperConfig
|
|
58
|
+
* @default {}
|
|
59
|
+
*/
|
|
60
|
+
popper?: PopperConfig,
|
|
61
|
+
/**
|
|
62
|
+
* @description 传送门配置
|
|
63
|
+
* @type MTeleportProps | boolean
|
|
64
|
+
* @default undefined
|
|
65
|
+
*/
|
|
66
|
+
teleport?: MTeleportProps | undefined | boolean,
|
|
67
|
+
/**
|
|
68
|
+
* @description 气泡标题,传入时在内容上方渲染标题行
|
|
69
|
+
* @type string
|
|
70
|
+
* @default undefined
|
|
71
|
+
*/
|
|
72
|
+
title?: string,
|
|
73
|
+
};
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description popover composable
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/25 00:00
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { Placement, PopperConfig, PositionStyle, usePopper } from '../../../compositions/popper/usePopper.ts';
|
|
10
|
+
import useClickAway from '../../../compositions/popper/useClickAway';
|
|
11
|
+
import { PopoverProps } from './props';
|
|
12
|
+
import { onBeforeMount, onMounted, ref, type Ref, shallowRef } from 'vue';
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
export type IPopper = ReturnType<typeof usePopper>;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Popover 实例,管理定位、显示/隐藏状态
|
|
19
|
+
*/
|
|
20
|
+
export class PopoverImpl {
|
|
21
|
+
|
|
22
|
+
protected _active: HTMLElement;
|
|
23
|
+
protected _content: HTMLElement;
|
|
24
|
+
protected _arrow: HTMLElement | undefined;
|
|
25
|
+
popperInstance: IPopper;
|
|
26
|
+
style: Ref;
|
|
27
|
+
arrowStyle: Ref;
|
|
28
|
+
placement: Ref;
|
|
29
|
+
visible: boolean = false;
|
|
30
|
+
onShow?: Function;
|
|
31
|
+
onHide?: Function;
|
|
32
|
+
|
|
33
|
+
constructor(
|
|
34
|
+
val: { style: Ref, arrowStyle: Ref, placement: Ref, show: boolean },
|
|
35
|
+
active: HTMLElement,
|
|
36
|
+
content: HTMLElement,
|
|
37
|
+
arrow?: HTMLElement,
|
|
38
|
+
config?: PopperConfig,
|
|
39
|
+
lifecycle?: {
|
|
40
|
+
onShow?: Function,
|
|
41
|
+
onHide?: Function
|
|
42
|
+
},
|
|
43
|
+
) {
|
|
44
|
+
if (!content) { throw new Error('MPopover: content is required'); }
|
|
45
|
+
if (!active) { throw new Error('MPopover: active is required'); }
|
|
46
|
+
|
|
47
|
+
this._active = active;
|
|
48
|
+
this._content = content;
|
|
49
|
+
this._arrow = arrow;
|
|
50
|
+
this.popperInstance = usePopper(this._active, this._content,
|
|
51
|
+
(positionStyle: PositionStyle) => this.update(positionStyle), this._arrow, config);
|
|
52
|
+
this.style = val.style;
|
|
53
|
+
this.arrowStyle = val.arrowStyle;
|
|
54
|
+
this.placement = val.placement;
|
|
55
|
+
this.visible = val.show;
|
|
56
|
+
this.onShow = lifecycle?.onShow;
|
|
57
|
+
this.onHide = lifecycle?.onHide;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
get content() {
|
|
61
|
+
return this._content;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async show() {
|
|
65
|
+
this.style.value = { display: 'block', opacity: '0' };
|
|
66
|
+
this.arrowStyle.value = { display: 'block', opacity: '0' };
|
|
67
|
+
this.visible = true;
|
|
68
|
+
await this.popperInstance.getPositionStyle();
|
|
69
|
+
this.onShow?.();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
update(positionStyle: PositionStyle) {
|
|
73
|
+
if (!this.visible) {
|
|
74
|
+
this.hide();
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
this.style.value = positionStyle.style;
|
|
78
|
+
this.arrowStyle.value = positionStyle.arrowStyle;
|
|
79
|
+
this.placement.value = positionStyle.placement;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
hide() {
|
|
83
|
+
this.style.value = undefined;
|
|
84
|
+
this.arrowStyle.value = undefined;
|
|
85
|
+
this.visible = false;
|
|
86
|
+
this.onHide?.();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async toggle() {
|
|
90
|
+
if (this.visible) {
|
|
91
|
+
this.hide();
|
|
92
|
+
} else {
|
|
93
|
+
await this.show();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
destroy() {
|
|
98
|
+
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
export default function usePopover(props: Required<PopoverProps>, ctx: any) {
|
|
104
|
+
const style = ref();
|
|
105
|
+
const arrowStyle = ref();
|
|
106
|
+
const placement = ref<Placement>(props.placement);
|
|
107
|
+
let instance: PopoverImpl | null = null;
|
|
108
|
+
let clickAwayInstance: ReturnType<typeof useClickAway>;
|
|
109
|
+
|
|
110
|
+
const popperInstance = shallowRef<PopoverImpl>();
|
|
111
|
+
|
|
112
|
+
const popoverRef = ref<HTMLElement>();
|
|
113
|
+
const contentRef = ref<HTMLElement>();
|
|
114
|
+
const arrowRef = ref<HTMLElement>();
|
|
115
|
+
|
|
116
|
+
const createPopover = (
|
|
117
|
+
active: HTMLElement,
|
|
118
|
+
content: HTMLElement,
|
|
119
|
+
arrow?: HTMLElement,
|
|
120
|
+
config?: PopperConfig,
|
|
121
|
+
) => {
|
|
122
|
+
instance = new PopoverImpl(
|
|
123
|
+
{ style, arrowStyle, placement, show: props.show },
|
|
124
|
+
active,
|
|
125
|
+
content,
|
|
126
|
+
arrow,
|
|
127
|
+
config,
|
|
128
|
+
{
|
|
129
|
+
onShow: () => {
|
|
130
|
+
clickAwayInstance?.add();
|
|
131
|
+
ctx.emit('update:show', true);
|
|
132
|
+
},
|
|
133
|
+
onHide: () => {
|
|
134
|
+
clickAwayInstance?.remove();
|
|
135
|
+
ctx.emit('update:show', false);
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
return instance;
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
const popoverEnter = () => {
|
|
142
|
+
if (props.hover) {
|
|
143
|
+
instance?.show();
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
const popoverLeave = () => {
|
|
147
|
+
if (props.hover) {
|
|
148
|
+
instance?.hide();
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
onMounted(() => {
|
|
153
|
+
if (!popoverRef.value || !contentRef.value) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
popperInstance.value = createPopover(popoverRef.value, contentRef.value, arrowRef.value, {
|
|
157
|
+
...props.popper,
|
|
158
|
+
placement: props.placement,
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
if (props.disableClickAway) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
clickAwayInstance = useClickAway({
|
|
166
|
+
target: () => instance?.content?.parentElement,
|
|
167
|
+
handler: () => {
|
|
168
|
+
instance?.hide();
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
onBeforeMount(() => {
|
|
174
|
+
if (clickAwayInstance) {
|
|
175
|
+
const { onBeforeDestroy } = clickAwayInstance;
|
|
176
|
+
onBeforeDestroy();
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
return {
|
|
181
|
+
popoverEnter,
|
|
182
|
+
popoverLeave,
|
|
183
|
+
popoverRef, contentRef, arrowRef,
|
|
184
|
+
popperInstance,
|
|
185
|
+
style, arrowStyle,
|
|
186
|
+
placement,
|
|
187
|
+
};
|
|
188
|
+
}
|