@kine-design/core 0.0.1-beta.1 → 0.0.1-beta.3
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 +17 -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 +18 -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 +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 +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 +149 -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 +17 -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 +18 -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 +18 -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 +17 -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 +17 -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 +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 +38 -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 +192 -0
- package/components/base/progress/api.ts +18 -0
- package/components/base/progress/index.ts +17 -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 +17 -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 +17 -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 +19 -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 +15 -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 +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/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/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/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 +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 +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 +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 +6 -5
- package/dist/components/base/anchor/index.d.ts +2 -1
- package/dist/components/base/anchor/useAnchor.d.ts +2 -2
- package/dist/components/base/autoComplete/useAutoComplete.d.ts +12 -4
- 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 +6 -3
- package/dist/components/base/cascader/useCascader.d.ts +23 -11
- package/dist/components/base/checkbox/index.d.ts +2 -1
- package/dist/components/base/checkbox/useCheckbox.d.ts +4 -3
- package/dist/components/base/collapse/index.d.ts +2 -1
- package/dist/components/base/collapse/useCollapse.d.ts +3 -3
- 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 +12 -6
- 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 +1 -2
- package/dist/components/base/inputNumber/index.d.ts +2 -1
- package/dist/components/base/inputNumber/useInputNumber.d.ts +3 -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 +9 -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 +2 -2
- package/dist/components/base/select/useSelect.d.ts +8 -8
- package/dist/components/base/slider/index.d.ts +2 -1
- package/dist/components/base/slider/useSlider.d.ts +4 -4
- 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 +8 -3
- package/dist/components/base/tabs/index.d.ts +1 -1
- package/dist/components/base/tabs/useTabs.d.ts +3 -3
- package/dist/components/base/tag/index.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 +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/drawer/index.d.ts +2 -2
- 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/index.d.ts +1 -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/index.d.ts +0 -1
- package/dist/components/template/menu/useMenu.d.ts +2 -1
- package/dist/components/template/pagination/index.d.ts +2 -1
- package/dist/components/template/virtualList/index.d.ts +0 -1
- 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 +6147 -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,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description autoComplete 核心 composable
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/26
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*
|
|
9
|
+
* 与 Select 的核心差异:
|
|
10
|
+
* 1. freetype 模式:输入框文字直接就是 modelValue,不强制匹配选项
|
|
11
|
+
* 2. 搜索由外部 fetchSuggestions 驱动,结果动态替换
|
|
12
|
+
* 3. debounce:输入停止后延迟触发搜索,避免频繁请求
|
|
13
|
+
* 4. loading 状态:搜索进行中显示加载指示
|
|
14
|
+
*/
|
|
15
|
+
import { ref, toRef, onBeforeUnmount } from 'vue';
|
|
16
|
+
import { AutoCompleteProps, AutoCompleteOption } from './props';
|
|
17
|
+
|
|
18
|
+
export function useAutoComplete(props: AutoCompleteProps, ctx: any) {
|
|
19
|
+
const modelValueRef = toRef(() => props.modelValue ?? '');
|
|
20
|
+
|
|
21
|
+
// --- 状态 ---
|
|
22
|
+
/** 输入框当前文本,与 modelValue 保持同步 */
|
|
23
|
+
const inputValue = ref(modelValueRef.value);
|
|
24
|
+
/** 下拉是否展开 */
|
|
25
|
+
const isOpen = ref(false);
|
|
26
|
+
/** 搜索进行中 */
|
|
27
|
+
const loading = ref(false);
|
|
28
|
+
/** 当前建议列表 */
|
|
29
|
+
const suggestions = ref<AutoCompleteOption[]>([]);
|
|
30
|
+
|
|
31
|
+
// --- debounce timer ---
|
|
32
|
+
let debounceTimer: ReturnType<typeof setTimeout> | undefined;
|
|
33
|
+
|
|
34
|
+
const clearDebounce = () => {
|
|
35
|
+
if (debounceTimer !== undefined) {
|
|
36
|
+
clearTimeout(debounceTimer);
|
|
37
|
+
debounceTimer = undefined;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// --- 搜索逻辑 ---
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* 执行一次搜索,更新 suggestions 并打开下拉
|
|
45
|
+
* 仅在 fetchSuggestions 存在时才执行
|
|
46
|
+
*/
|
|
47
|
+
const doSearch = async (query: string) => {
|
|
48
|
+
if (!props.fetchSuggestions) return;
|
|
49
|
+
|
|
50
|
+
loading.value = true;
|
|
51
|
+
try {
|
|
52
|
+
const result = await props.fetchSuggestions(query);
|
|
53
|
+
suggestions.value = result ?? [];
|
|
54
|
+
// 有结果(包括空数组)时才打开,方便外部展示"无结果"状态
|
|
55
|
+
isOpen.value = true;
|
|
56
|
+
} catch {
|
|
57
|
+
suggestions.value = [];
|
|
58
|
+
} finally {
|
|
59
|
+
loading.value = false;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* debounce 包装的搜索:输入后等待 debounce ms 再执行
|
|
65
|
+
*/
|
|
66
|
+
const debouncedSearch = (query: string) => {
|
|
67
|
+
clearDebounce();
|
|
68
|
+
const delay = props.debounce ?? 300;
|
|
69
|
+
debounceTimer = setTimeout(() => {
|
|
70
|
+
doSearch(query);
|
|
71
|
+
ctx.emit('search', query);
|
|
72
|
+
}, delay);
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// --- 事件处理 ---
|
|
76
|
+
|
|
77
|
+
/** 输入事件:更新 modelValue + 触发 debounce 搜索 */
|
|
78
|
+
const onInput = (e: Event) => {
|
|
79
|
+
const value = (e.target as HTMLInputElement).value;
|
|
80
|
+
inputValue.value = value;
|
|
81
|
+
ctx.emit('update:modelValue', value);
|
|
82
|
+
debouncedSearch(value);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
/** 聚焦事件 */
|
|
86
|
+
const onFocus = (e: FocusEvent) => {
|
|
87
|
+
if (props.disabled) return;
|
|
88
|
+
ctx.emit('focus', e);
|
|
89
|
+
|
|
90
|
+
if (props.triggerOnFocus) {
|
|
91
|
+
// 聚焦时立即搜索当前值(不走 debounce)
|
|
92
|
+
doSearch(inputValue.value);
|
|
93
|
+
ctx.emit('search', inputValue.value);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
/** 失焦事件:延迟关闭,预留给点击选项的时间 */
|
|
98
|
+
const onBlur = (e: FocusEvent) => {
|
|
99
|
+
if (props.disabled) return;
|
|
100
|
+
// 延迟关闭,避免与选项的 mousedown 事件竞争
|
|
101
|
+
setTimeout(() => {
|
|
102
|
+
isOpen.value = false;
|
|
103
|
+
}, 150);
|
|
104
|
+
ctx.emit('blur', e);
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
/** 选中某条建议 */
|
|
108
|
+
const onSelect = (item: AutoCompleteOption) => {
|
|
109
|
+
inputValue.value = item.value;
|
|
110
|
+
ctx.emit('update:modelValue', item.value);
|
|
111
|
+
ctx.emit('select', item);
|
|
112
|
+
isOpen.value = false;
|
|
113
|
+
clearDebounce();
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
/** 清空输入 */
|
|
117
|
+
const onClear = () => {
|
|
118
|
+
inputValue.value = '';
|
|
119
|
+
suggestions.value = [];
|
|
120
|
+
isOpen.value = false;
|
|
121
|
+
clearDebounce();
|
|
122
|
+
ctx.emit('update:modelValue', '');
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
/** 关闭下拉 */
|
|
126
|
+
const close = () => {
|
|
127
|
+
isOpen.value = false;
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
// 组件卸载时清理 debounce timer
|
|
131
|
+
onBeforeUnmount(() => {
|
|
132
|
+
clearDebounce();
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
return {
|
|
136
|
+
// 状态
|
|
137
|
+
inputValue,
|
|
138
|
+
isOpen,
|
|
139
|
+
loading,
|
|
140
|
+
suggestions,
|
|
141
|
+
// 事件
|
|
142
|
+
onInput,
|
|
143
|
+
onFocus,
|
|
144
|
+
onBlur,
|
|
145
|
+
onSelect,
|
|
146
|
+
onClear,
|
|
147
|
+
close,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description avatar 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 { AvatarProps } from './props';
|
|
11
|
+
|
|
12
|
+
export const props: MCOPO<AvatarProps> = {
|
|
13
|
+
shape: { type: String as MPropType<'circle' | 'square'>, default: 'circle' },
|
|
14
|
+
size: { type: String as MPropType<'large' | 'medium' | 'small'>, default: 'medium' },
|
|
15
|
+
src: { type: String, default: '' },
|
|
16
|
+
alt: { type: String, default: '' },
|
|
17
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--m-avatar-large: 50px;
|
|
3
|
+
--m-avatar-default: 40px;
|
|
4
|
+
--m-avatar-small: 24px;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.m-avatar {
|
|
8
|
+
--m-avatar-size: var(--m-avatar-default);
|
|
9
|
+
--m-avatar-w: var(--m-avatar-size);
|
|
10
|
+
--m-image-size: var(--m-avatar-size);
|
|
11
|
+
|
|
12
|
+
display: inline-grid;
|
|
13
|
+
grid-template-areas: 'avatar';
|
|
14
|
+
|
|
15
|
+
&.m-avatar-large {
|
|
16
|
+
--m-avatar-size: var(--m-avatar-large);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
&.m-avatar-small {
|
|
20
|
+
--m-avatar-size: var(--m-avatar-small);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
width: var(--m-avatar-w);
|
|
24
|
+
height: var(--m-avatar-size);
|
|
25
|
+
|
|
26
|
+
& .m-avatar-mask {
|
|
27
|
+
grid-area: avatar;
|
|
28
|
+
width: var(--m-avatar-w);
|
|
29
|
+
height: var(--m-avatar-size);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
--m-image-m-t: 0;
|
|
33
|
+
--m-image-m-l: 0;
|
|
34
|
+
|
|
35
|
+
& > img {
|
|
36
|
+
grid-area: avatar;
|
|
37
|
+
width: var(--m-image-size);
|
|
38
|
+
height: var(--m-image-size);
|
|
39
|
+
margin: var(--m-image-m-t) 0 0 var(--m-image-m-l);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
.m-avatar-circle {
|
|
45
|
+
--m-avatar-w: calc(var(--m-avatar-size) / 43 * 54);
|
|
46
|
+
--m-image-size: calc(var(--m-avatar-size) / 54 * 45);
|
|
47
|
+
--m-image-m-t: calc(var(--m-avatar-w) / 54 * 3);
|
|
48
|
+
--m-image-m-l: calc(var(--m-avatar-w) / 54 * 9);
|
|
49
|
+
|
|
50
|
+
& > img {
|
|
51
|
+
margin: var(--m-image-m-t) 0 0 var(--m-image-m-l);
|
|
52
|
+
border-radius: 50%;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.m-avatar-square {
|
|
57
|
+
--m-image-size: calc(var(--m-avatar-size) / 49 * 45);
|
|
58
|
+
--m-image-m-t: calc(var(--m-avatar-w) / 52 * 2);
|
|
59
|
+
--m-image-m-l: calc(var(--m-avatar-w) / 52 * 2);
|
|
60
|
+
}
|
|
61
|
+
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description avatar component props definition.
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/27
|
|
5
|
+
* @version v1.1.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export declare type AvatarProps = {
|
|
11
|
+
/**
|
|
12
|
+
* @description avatar shape
|
|
13
|
+
* 头像的形状
|
|
14
|
+
* @type string
|
|
15
|
+
* @default circle
|
|
16
|
+
*/
|
|
17
|
+
shape?: 'circle' | 'square';
|
|
18
|
+
/**
|
|
19
|
+
* @description avatar size
|
|
20
|
+
* 头像的大小
|
|
21
|
+
* @type string
|
|
22
|
+
* @default medium
|
|
23
|
+
*/
|
|
24
|
+
size?: 'large' | 'medium' | 'small';
|
|
25
|
+
/**
|
|
26
|
+
* @description image url
|
|
27
|
+
* 头像图片地址
|
|
28
|
+
* @type string
|
|
29
|
+
*/
|
|
30
|
+
src?: string;
|
|
31
|
+
/**
|
|
32
|
+
* @description image alt text
|
|
33
|
+
* 图片替代文字
|
|
34
|
+
* @type string
|
|
35
|
+
*/
|
|
36
|
+
alt?: string;
|
|
37
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description backTop api
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/26
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { MCOPO } from '../../types/props';
|
|
10
|
+
import { BackTopProps } from './props';
|
|
11
|
+
|
|
12
|
+
export const props: MCOPO<BackTopProps> = {
|
|
13
|
+
target: { type: String, default: '' },
|
|
14
|
+
visibilityHeight: { type: Number, default: 200 },
|
|
15
|
+
right: { type: Number, default: 40 },
|
|
16
|
+
bottom: { type: Number, default: 40 },
|
|
17
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description backTop core
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/26
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { props } from './api';
|
|
10
|
+
import { useBackTop } from './useBackTop';
|
|
11
|
+
|
|
12
|
+
export const BackTopCore = {
|
|
13
|
+
props,
|
|
14
|
+
useBackTop,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export type { BackTopProps } from './props';
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description backTop props type
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/26
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* @name k-back-top
|
|
8
|
+
* @docDescription BackTop(回到顶部)组件。
|
|
9
|
+
*
|
|
10
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export declare type BackTopProps = {
|
|
14
|
+
/**
|
|
15
|
+
* @description 触发滚动的目标元素 CSS 选择器,默认监听 window
|
|
16
|
+
* @type string
|
|
17
|
+
* @default ''
|
|
18
|
+
*/
|
|
19
|
+
target?: string,
|
|
20
|
+
/**
|
|
21
|
+
* @description 滚动距离超过此值时显示按钮
|
|
22
|
+
* @type number
|
|
23
|
+
* @default 200
|
|
24
|
+
*/
|
|
25
|
+
visibilityHeight?: number,
|
|
26
|
+
/**
|
|
27
|
+
* @description 按钮距离页面右侧的距离(px)
|
|
28
|
+
* @type number
|
|
29
|
+
* @default 40
|
|
30
|
+
*/
|
|
31
|
+
right?: number,
|
|
32
|
+
/**
|
|
33
|
+
* @description 按钮距离页面底部的距离(px)
|
|
34
|
+
* @type number
|
|
35
|
+
* @default 40
|
|
36
|
+
*/
|
|
37
|
+
bottom?: number,
|
|
38
|
+
};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description backTop hook
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/26
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { ref, onMounted, onUnmounted } from 'vue';
|
|
10
|
+
import { BackTopProps } from './props';
|
|
11
|
+
|
|
12
|
+
export function useBackTop(props: Required<BackTopProps>) {
|
|
13
|
+
const visible = ref(false);
|
|
14
|
+
|
|
15
|
+
/** 获取滚动目标元素,无匹配则使用 window */
|
|
16
|
+
const getScrollTarget = (): HTMLElement | Window => {
|
|
17
|
+
if (props.target) {
|
|
18
|
+
const el = document.querySelector<HTMLElement>(props.target);
|
|
19
|
+
if (el) { return el; }
|
|
20
|
+
}
|
|
21
|
+
return window;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/** 读取当前滚动高度 */
|
|
25
|
+
const getScrollTop = (): number => {
|
|
26
|
+
const target = getScrollTarget();
|
|
27
|
+
if (target === window) {
|
|
28
|
+
return window.scrollY;
|
|
29
|
+
}
|
|
30
|
+
return (target as HTMLElement).scrollTop;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const onScroll = () => {
|
|
34
|
+
visible.value = getScrollTop() >= props.visibilityHeight;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const scrollToTop = () => {
|
|
38
|
+
const target = getScrollTarget();
|
|
39
|
+
if (target === window) {
|
|
40
|
+
window.scrollTo({ top: 0, behavior: 'smooth' });
|
|
41
|
+
} else {
|
|
42
|
+
(target as HTMLElement).scrollTo({ top: 0, behavior: 'smooth' });
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
onMounted(() => {
|
|
47
|
+
const target = getScrollTarget();
|
|
48
|
+
target.addEventListener('scroll', onScroll, { passive: true });
|
|
49
|
+
// 初始检测
|
|
50
|
+
onScroll();
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
onUnmounted(() => {
|
|
54
|
+
const target = getScrollTarget();
|
|
55
|
+
target.removeEventListener('scroll', onScroll);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
visible,
|
|
60
|
+
scrollToTop,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description badge 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 { BadgeProps } from './props';
|
|
11
|
+
|
|
12
|
+
export const props: MCOPO<BadgeProps> = {
|
|
13
|
+
value: { type: [String, Number], default: undefined },
|
|
14
|
+
max: { type: Number, default: 99 },
|
|
15
|
+
dot: { type: Boolean, default: false },
|
|
16
|
+
hidden: { type: Boolean, default: false },
|
|
17
|
+
showZero: { type: Boolean, default: false },
|
|
18
|
+
type: {
|
|
19
|
+
type: String as MPropType<'default' | 'primary' | 'success' | 'warning' | 'danger' | 'info'>,
|
|
20
|
+
default: 'danger',
|
|
21
|
+
},
|
|
22
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description badge core 导出
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/26
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { props } from './api';
|
|
10
|
+
|
|
11
|
+
export const BadgeCore = {
|
|
12
|
+
props,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export type { BadgeProps } from './props';
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description badge api type
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/27
|
|
5
|
+
* @version v1.1.0
|
|
6
|
+
*
|
|
7
|
+
* @name m-badge
|
|
8
|
+
* @docDescription Badge component with shuimo-ui style.
|
|
9
|
+
* 水墨组件的徽标组件。
|
|
10
|
+
*
|
|
11
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export declare type BadgeProps = {
|
|
15
|
+
/**
|
|
16
|
+
* @description 显示的值,number 时支持 max 截断,string 时直接显示(如 "NEW"/"HOT")
|
|
17
|
+
* @type number | string
|
|
18
|
+
*/
|
|
19
|
+
value?: number | string;
|
|
20
|
+
/**
|
|
21
|
+
* @description 最大值,超出时显示 max+(仅 value 为 number 时生效)
|
|
22
|
+
* @type number
|
|
23
|
+
* @default 99
|
|
24
|
+
*/
|
|
25
|
+
max?: number;
|
|
26
|
+
/**
|
|
27
|
+
* @description 是否显示小圆点(开启后忽略 value)
|
|
28
|
+
* @type boolean
|
|
29
|
+
* @default false
|
|
30
|
+
*/
|
|
31
|
+
dot?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* @description 是否隐藏徽标
|
|
34
|
+
* @type boolean
|
|
35
|
+
* @default false
|
|
36
|
+
*/
|
|
37
|
+
hidden?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* @description value 为 0 时是否显示徽标
|
|
40
|
+
* @type boolean
|
|
41
|
+
* @default false
|
|
42
|
+
*/
|
|
43
|
+
showZero?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* @description 类型,控制徽标颜色
|
|
46
|
+
* @type 'default' | 'primary' | 'success' | 'warning' | 'danger' | 'info'
|
|
47
|
+
* @default 'danger'
|
|
48
|
+
*/
|
|
49
|
+
type?: 'default' | 'primary' | 'success' | 'warning' | 'danger' | 'info';
|
|
50
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description button 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 { ButtonProps } from './props';
|
|
11
|
+
|
|
12
|
+
export const props: MCOPO<ButtonProps> = {
|
|
13
|
+
text: { type: String, default: '' },
|
|
14
|
+
link: { type: Boolean, default: false },
|
|
15
|
+
disabled: { type: Boolean, default: false },
|
|
16
|
+
loading: { type: Boolean, default: false },
|
|
17
|
+
plain: { type: Boolean, default: false },
|
|
18
|
+
type: {
|
|
19
|
+
type: String as MPropType<'default' | 'primary' | 'success' | 'warning' | 'danger' | 'info'>,
|
|
20
|
+
default: 'default',
|
|
21
|
+
enum: ['default', 'primary', 'success', 'warning', 'danger', 'info'],
|
|
22
|
+
},
|
|
23
|
+
size: {
|
|
24
|
+
type: String as MPropType<'large' | 'medium' | 'small'>,
|
|
25
|
+
default: 'medium',
|
|
26
|
+
enum: ['large', 'medium', 'small'],
|
|
27
|
+
},
|
|
28
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
/* --m-button-width: 180px;
|
|
3
|
+
--m-button-height: 80px;
|
|
4
|
+
--m-button-line-height: 24px;*/
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.m-button {
|
|
8
|
+
padding: 0 15px;
|
|
9
|
+
outline: unset;
|
|
10
|
+
height: var(--m-button-height, 32px);
|
|
11
|
+
/*line-height: var(--m-button-line-height, 32px);*/
|
|
12
|
+
min-width: var(--m-button-width, 32px);
|
|
13
|
+
border: 5px double transparent;
|
|
14
|
+
border-radius: var(--kine-radius-xs);
|
|
15
|
+
color: white;
|
|
16
|
+
text-align: center;
|
|
17
|
+
cursor: var(--m-cursor-pointer);
|
|
18
|
+
|
|
19
|
+
&:disabled, &:disabled:hover {
|
|
20
|
+
color: var(--m-color-text-disabled);
|
|
21
|
+
cursor: var(--m-cursor-disabled);
|
|
22
|
+
|
|
23
|
+
& > slot {
|
|
24
|
+
pointer-events: none;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
a.m-button {
|
|
30
|
+
text-decoration: unset;
|
|
31
|
+
height: 22px;
|
|
32
|
+
padding: unset;
|
|
33
|
+
}
|
|
34
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2024/12/16 09:44
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { props } from './api';
|
|
10
|
+
import { useButton } from './useButton';
|
|
11
|
+
|
|
12
|
+
export const ButtonCore = {
|
|
13
|
+
props,
|
|
14
|
+
useButton,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export type { ButtonProps } from './props';
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description button api type
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/27
|
|
5
|
+
* @version v1.1.0
|
|
6
|
+
*
|
|
7
|
+
* @name m-button
|
|
8
|
+
* @docDescription Button component with kine-design style.
|
|
9
|
+
* kine-design 的按钮组件。
|
|
10
|
+
*
|
|
11
|
+
* 公司的业务千篇一律,复杂的代码好几百行。
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export declare type ButtonProps = {
|
|
15
|
+
/**
|
|
16
|
+
* @description button inline text, will replace by slot
|
|
17
|
+
* 按钮文本,会被 slot 覆盖
|
|
18
|
+
* @type string
|
|
19
|
+
* @default ''
|
|
20
|
+
*/
|
|
21
|
+
text?: string,
|
|
22
|
+
/**
|
|
23
|
+
* @description link style 链接样式
|
|
24
|
+
* @type boolean
|
|
25
|
+
* @default false
|
|
26
|
+
*/
|
|
27
|
+
link?: boolean,
|
|
28
|
+
/**
|
|
29
|
+
* @description disable or not 是否禁用
|
|
30
|
+
* @type boolean
|
|
31
|
+
* @default false
|
|
32
|
+
*/
|
|
33
|
+
disabled?: boolean,
|
|
34
|
+
/**
|
|
35
|
+
* @description loading state 加载状态(自动禁用点击并显示 spinner)
|
|
36
|
+
* @type boolean
|
|
37
|
+
* @default false
|
|
38
|
+
*/
|
|
39
|
+
loading?: boolean,
|
|
40
|
+
/**
|
|
41
|
+
* @description plain style 文本按钮样式(无边框无背景)
|
|
42
|
+
* @type boolean
|
|
43
|
+
* @default false
|
|
44
|
+
*/
|
|
45
|
+
plain?: boolean,
|
|
46
|
+
/**
|
|
47
|
+
* @description button type 按钮类型
|
|
48
|
+
* @type string
|
|
49
|
+
* @default default
|
|
50
|
+
* @enum default|primary|success|warning|danger|info
|
|
51
|
+
*/
|
|
52
|
+
type?: 'default' | 'primary' | 'success' | 'warning' | 'danger' | 'info',
|
|
53
|
+
/**
|
|
54
|
+
* @description button size 按钮尺寸
|
|
55
|
+
* @type string
|
|
56
|
+
* @default medium
|
|
57
|
+
* @enum large|medium|small
|
|
58
|
+
*/
|
|
59
|
+
size?: 'large' | 'medium' | 'small',
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export declare type ButtonEvents = {
|
|
63
|
+
onClick?: (e: MouseEvent) => void
|
|
64
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description button composable
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/27
|
|
5
|
+
* @version v1.1.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { SetupContext } from 'vue';
|
|
10
|
+
import { ButtonProps } from './props';
|
|
11
|
+
|
|
12
|
+
export function useButton(props: ButtonProps, { slots }: SetupContext) {
|
|
13
|
+
const domType = props.link ? 'a' : 'button';
|
|
14
|
+
const slot = slots.default?.() ?? props.text;
|
|
15
|
+
|
|
16
|
+
// loading 状态视为禁用(阻止交互)
|
|
17
|
+
const isDisabled = props.disabled || props.loading;
|
|
18
|
+
|
|
19
|
+
const domProps = {
|
|
20
|
+
class: [
|
|
21
|
+
'm-button',
|
|
22
|
+
{ 'm-button-disabled': isDisabled },
|
|
23
|
+
{ 'm-button-loading': props.loading },
|
|
24
|
+
{ 'm-button-plain': props.plain },
|
|
25
|
+
`m-button-${props.type ?? 'default'}`,
|
|
26
|
+
`m-button-${props.size ?? 'medium'}`,
|
|
27
|
+
],
|
|
28
|
+
disabled: isDisabled,
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
domType,
|
|
33
|
+
slot,
|
|
34
|
+
domProps,
|
|
35
|
+
isDisabled,
|
|
36
|
+
};
|
|
37
|
+
}
|