@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,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description dropdown composable
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/26
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { computed, onBeforeUnmount, onMounted, ref } from 'vue';
|
|
10
|
+
import { DropdownItemProps, DropdownProps } from './props';
|
|
11
|
+
import useClickAway from '../../../compositions/popper/useClickAway';
|
|
12
|
+
|
|
13
|
+
export default function useDropdown(props: Required<DropdownProps>, ctx: any) {
|
|
14
|
+
const { emit } = ctx;
|
|
15
|
+
|
|
16
|
+
// 下拉菜单是否展开
|
|
17
|
+
const visible = ref(false);
|
|
18
|
+
|
|
19
|
+
// 触发器 DOM 引用,用于 clickAway 检测
|
|
20
|
+
const triggerRef = ref<HTMLElement>();
|
|
21
|
+
const menuRef = ref<HTMLElement>();
|
|
22
|
+
|
|
23
|
+
/** 打开下拉菜单 */
|
|
24
|
+
const open = () => {
|
|
25
|
+
if (props.disabled) { return; }
|
|
26
|
+
visible.value = true;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/** 关闭下拉菜单 */
|
|
30
|
+
const close = () => {
|
|
31
|
+
visible.value = false;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/** 切换下拉菜单展开/收起 */
|
|
35
|
+
const toggle = () => {
|
|
36
|
+
if (visible.value) {
|
|
37
|
+
close();
|
|
38
|
+
} else {
|
|
39
|
+
open();
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// 点击外部自动关闭
|
|
44
|
+
let clickAwayInstance: ReturnType<typeof useClickAway>;
|
|
45
|
+
|
|
46
|
+
onMounted(() => {
|
|
47
|
+
clickAwayInstance = useClickAway({
|
|
48
|
+
// 以 trigger 容器为边界,点击 trigger 或 menu 内部不触发关闭
|
|
49
|
+
target: () => triggerRef.value?.parentElement,
|
|
50
|
+
handler: () => {
|
|
51
|
+
close();
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
clickAwayInstance?.add();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
onBeforeUnmount(() => {
|
|
58
|
+
clickAwayInstance?.remove();
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// ---- 触发器事件处理 ----
|
|
62
|
+
|
|
63
|
+
/** click 触发模式下点击处理 */
|
|
64
|
+
const handleTriggerClick = () => {
|
|
65
|
+
if (props.trigger !== 'click') { return; }
|
|
66
|
+
toggle();
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/** hover 触发模式下鼠标进入处理 */
|
|
70
|
+
const handleMouseenter = () => {
|
|
71
|
+
if (props.trigger !== 'hover') { return; }
|
|
72
|
+
open();
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/** hover 触发模式下鼠标离开处理 */
|
|
76
|
+
const handleMouseleave = () => {
|
|
77
|
+
if (props.trigger !== 'hover') { return; }
|
|
78
|
+
close();
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
// ---- 选项点击处理 ----
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* 选项被点击时:触发 command 事件并关闭菜单
|
|
85
|
+
*/
|
|
86
|
+
const handleItemClick = (item: DropdownItemProps) => {
|
|
87
|
+
if (item.disabled) { return; }
|
|
88
|
+
emit('command', item.command);
|
|
89
|
+
close();
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// ---- class 计算 ----
|
|
93
|
+
|
|
94
|
+
const dropdownClass = computed(() => [
|
|
95
|
+
'm-dropdown',
|
|
96
|
+
{ 'm-dropdown-open': visible.value },
|
|
97
|
+
{ 'm-dropdown-disabled': props.disabled },
|
|
98
|
+
]);
|
|
99
|
+
|
|
100
|
+
const menuClass = computed(() => ['m-dropdown-menu']);
|
|
101
|
+
|
|
102
|
+
const getItemClass = (item: DropdownItemProps) => [
|
|
103
|
+
'm-dropdown-item',
|
|
104
|
+
{ 'm-dropdown-item-disabled': item.disabled },
|
|
105
|
+
{ 'm-dropdown-item-divided': item.divided },
|
|
106
|
+
];
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
visible,
|
|
110
|
+
triggerRef,
|
|
111
|
+
menuRef,
|
|
112
|
+
open,
|
|
113
|
+
close,
|
|
114
|
+
toggle,
|
|
115
|
+
handleTriggerClick,
|
|
116
|
+
handleMouseenter,
|
|
117
|
+
handleMouseleave,
|
|
118
|
+
handleItemClick,
|
|
119
|
+
dropdownClass,
|
|
120
|
+
menuClass,
|
|
121
|
+
getItemClass,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description empty api
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/26
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { MCOPO } from '../../types/props';
|
|
10
|
+
import { EmptyProps } from './props';
|
|
11
|
+
|
|
12
|
+
export const props: MCOPO<EmptyProps> = {
|
|
13
|
+
description: { type: String, default: '暂无数据' },
|
|
14
|
+
image: { type: String, default: undefined },
|
|
15
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description empty 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 EmptyCore = {
|
|
12
|
+
props,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export type { EmptyProps } from './props';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description empty api type
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/26
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* @name m-empty
|
|
8
|
+
* @docDescription Empty state component with shuimo-ui style.
|
|
9
|
+
* 水墨组件的空状态组件。
|
|
10
|
+
*
|
|
11
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export declare type EmptyProps = {
|
|
15
|
+
/**
|
|
16
|
+
* @description 描述文字
|
|
17
|
+
* @type string
|
|
18
|
+
* @default '暂无数据'
|
|
19
|
+
*/
|
|
20
|
+
description?: string;
|
|
21
|
+
/**
|
|
22
|
+
* @description 自定义图片地址
|
|
23
|
+
* @type string
|
|
24
|
+
*/
|
|
25
|
+
image?: string;
|
|
26
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description image api
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/26
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { MCOPO, MPropType } from '../../types/props';
|
|
10
|
+
import { ImageProps } from './props';
|
|
11
|
+
|
|
12
|
+
export const props: MCOPO<ImageProps> = {
|
|
13
|
+
src: { type: String, required: true },
|
|
14
|
+
alt: { type: String, default: '' },
|
|
15
|
+
fit: {
|
|
16
|
+
type: String as MPropType<'contain' | 'cover' | 'fill' | 'none' | 'scale-down'>,
|
|
17
|
+
default: 'cover',
|
|
18
|
+
enum: ['contain', 'cover', 'fill', 'none', 'scale-down'],
|
|
19
|
+
},
|
|
20
|
+
width: { type: [String, Number], default: undefined },
|
|
21
|
+
height: { type: [String, Number], default: undefined },
|
|
22
|
+
lazy: { type: Boolean, default: false },
|
|
23
|
+
previewSrcList: { type: Array as MPropType<string[]>, default: () => [] },
|
|
24
|
+
zIndex: { type: Number, default: 2000 },
|
|
25
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description image core 导出
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/26
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { props } from './api';
|
|
10
|
+
import { useImage } from './useImage';
|
|
11
|
+
|
|
12
|
+
export const ImageCore = {
|
|
13
|
+
props,
|
|
14
|
+
useImage,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export type { ImageProps, ImageEvents } from './props';
|
|
18
|
+
export type { ImageLoadStatus } from './useImage';
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description image props type
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/26
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* @name m-image
|
|
8
|
+
* @docDescription Image component with lazy loading and preview support.
|
|
9
|
+
* 图片组件,支持懒加载和全屏预览。
|
|
10
|
+
*
|
|
11
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export declare type ImageProps = {
|
|
15
|
+
/**
|
|
16
|
+
* @description 图片地址
|
|
17
|
+
* @type string
|
|
18
|
+
*/
|
|
19
|
+
src: string,
|
|
20
|
+
/**
|
|
21
|
+
* @description 图片 alt 描述
|
|
22
|
+
* @type string
|
|
23
|
+
* @default ''
|
|
24
|
+
*/
|
|
25
|
+
alt?: string,
|
|
26
|
+
/**
|
|
27
|
+
* @description 图片填充模式,对应 object-fit
|
|
28
|
+
* @type string
|
|
29
|
+
* @default 'cover'
|
|
30
|
+
* @enum contain|cover|fill|none|scale-down
|
|
31
|
+
*/
|
|
32
|
+
fit?: 'contain' | 'cover' | 'fill' | 'none' | 'scale-down',
|
|
33
|
+
/**
|
|
34
|
+
* @description 是否开启懒加载
|
|
35
|
+
* @type boolean
|
|
36
|
+
* @default false
|
|
37
|
+
*/
|
|
38
|
+
lazy?: boolean,
|
|
39
|
+
/**
|
|
40
|
+
* @description 开启预览的图片列表,传入后点击可全屏预览
|
|
41
|
+
* @type string[]
|
|
42
|
+
* @default []
|
|
43
|
+
*/
|
|
44
|
+
previewSrcList?: string[],
|
|
45
|
+
/**
|
|
46
|
+
* @description 图片宽度
|
|
47
|
+
* @type string | number
|
|
48
|
+
*/
|
|
49
|
+
width?: string | number,
|
|
50
|
+
/**
|
|
51
|
+
* @description 图片高度
|
|
52
|
+
* @type string | number
|
|
53
|
+
*/
|
|
54
|
+
height?: string | number,
|
|
55
|
+
/**
|
|
56
|
+
* @description 预览弹层的 z-index
|
|
57
|
+
* @type number
|
|
58
|
+
* @default 2000
|
|
59
|
+
*/
|
|
60
|
+
zIndex?: number,
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export declare type ImageEvents = {
|
|
64
|
+
onLoad?: (e: Event) => void,
|
|
65
|
+
onError?: (e: Event) => void,
|
|
66
|
+
onSwitch?: (index: number) => void,
|
|
67
|
+
};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description image hook
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2026/2/26
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { ref, watch, onMounted } from 'vue';
|
|
10
|
+
import { ImageProps } from './props';
|
|
11
|
+
|
|
12
|
+
/** 图片加载状态 */
|
|
13
|
+
export type ImageLoadStatus = 'loading' | 'loaded' | 'error';
|
|
14
|
+
|
|
15
|
+
export function useImage(
|
|
16
|
+
props: Required<ImageProps>,
|
|
17
|
+
emit: (event: 'load' | 'error' | 'switch', payload: Event | number) => void,
|
|
18
|
+
) {
|
|
19
|
+
const status = ref<ImageLoadStatus>('loading');
|
|
20
|
+
// 预览弹层是否可见
|
|
21
|
+
const previewVisible = ref(false);
|
|
22
|
+
// 预览当前索引(在 previewSrcList 中的位置)
|
|
23
|
+
const previewIndex = ref(0);
|
|
24
|
+
// 预览缩放比例
|
|
25
|
+
const previewScale = ref(1);
|
|
26
|
+
// 预览旋转角度
|
|
27
|
+
const previewRotate = ref(0);
|
|
28
|
+
|
|
29
|
+
/** 重置加载状态(src 变化时调用) */
|
|
30
|
+
const reset = () => {
|
|
31
|
+
status.value = 'loading';
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const handleLoad = (e: Event) => {
|
|
35
|
+
status.value = 'loaded';
|
|
36
|
+
emit('load', e);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const handleError = (e: Event) => {
|
|
40
|
+
status.value = 'error';
|
|
41
|
+
emit('error', e);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/** 打开全屏预览,定位到 src 在 previewSrcList 中的位置 */
|
|
45
|
+
const openPreview = () => {
|
|
46
|
+
if (!props.previewSrcList || props.previewSrcList.length === 0) { return; }
|
|
47
|
+
const idx = props.previewSrcList.indexOf(props.src);
|
|
48
|
+
previewIndex.value = idx >= 0 ? idx : 0;
|
|
49
|
+
previewScale.value = 1;
|
|
50
|
+
previewRotate.value = 0;
|
|
51
|
+
previewVisible.value = true;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const closePreview = () => {
|
|
55
|
+
previewVisible.value = false;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/** 预览切换到上一张 */
|
|
59
|
+
const previewPrev = () => {
|
|
60
|
+
const total = props.previewSrcList.length;
|
|
61
|
+
if (total === 0) { return; }
|
|
62
|
+
previewIndex.value = ((previewIndex.value - 1) + total) % total;
|
|
63
|
+
previewScale.value = 1;
|
|
64
|
+
previewRotate.value = 0;
|
|
65
|
+
emit('switch', previewIndex.value);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
/** 预览切换到下一张 */
|
|
69
|
+
const previewNext = () => {
|
|
70
|
+
const total = props.previewSrcList.length;
|
|
71
|
+
if (total === 0) { return; }
|
|
72
|
+
previewIndex.value = (previewIndex.value + 1) % total;
|
|
73
|
+
previewScale.value = 1;
|
|
74
|
+
previewRotate.value = 0;
|
|
75
|
+
emit('switch', previewIndex.value);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
/** 预览放大 */
|
|
79
|
+
const zoomIn = () => {
|
|
80
|
+
previewScale.value = Math.min(previewScale.value + 0.25, 5);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
/** 预览缩小 */
|
|
84
|
+
const zoomOut = () => {
|
|
85
|
+
previewScale.value = Math.max(previewScale.value - 0.25, 0.25);
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/** 顺时针旋转 90° */
|
|
89
|
+
const rotate = () => {
|
|
90
|
+
previewRotate.value = (previewRotate.value + 90) % 360;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
// src 变化时重置加载状态
|
|
94
|
+
watch(() => props.src, reset);
|
|
95
|
+
|
|
96
|
+
onMounted(() => {
|
|
97
|
+
if (props.lazy) {
|
|
98
|
+
// 懒加载:交由 img 标签的 loading="lazy" 处理
|
|
99
|
+
status.value = 'loading';
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
status,
|
|
105
|
+
previewVisible,
|
|
106
|
+
previewIndex,
|
|
107
|
+
previewScale,
|
|
108
|
+
previewRotate,
|
|
109
|
+
handleLoad,
|
|
110
|
+
handleError,
|
|
111
|
+
openPreview,
|
|
112
|
+
closePreview,
|
|
113
|
+
previewPrev,
|
|
114
|
+
previewNext,
|
|
115
|
+
zoomIn,
|
|
116
|
+
zoomOut,
|
|
117
|
+
rotate,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description input api
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2023/4/20 17:31
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { MCOPO } from '../../types/props';
|
|
10
|
+
import { InputProps } from './props';
|
|
11
|
+
|
|
12
|
+
export const props: MCOPO<InputProps> = {
|
|
13
|
+
type: { type: String, default: 'text' },
|
|
14
|
+
placeholder: { type: String, default: '' },
|
|
15
|
+
modelValue: { type: [String, Number], default: '' },
|
|
16
|
+
readonly: { type: Boolean, default: false },
|
|
17
|
+
disabled: { type: Boolean, default: false },
|
|
18
|
+
autofocus: { type: Boolean, default: false },
|
|
19
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2024/11/29 10:24
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { props } from './api.ts';
|
|
10
|
+
import useInput from './useInput';
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
export const InputCore = {
|
|
14
|
+
props,
|
|
15
|
+
useInput,
|
|
16
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
:root{
|
|
2
|
+
--m-input-w: 244px;
|
|
3
|
+
--m-color-disabled: #DBDADD;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.m-input{
|
|
7
|
+
box-sizing: content-box;
|
|
8
|
+
width: var(--m-input-w);
|
|
9
|
+
height: 31px;
|
|
10
|
+
line-height: 31px;
|
|
11
|
+
|
|
12
|
+
&.m-input-disabled {
|
|
13
|
+
|
|
14
|
+
.m-input-inner, .m-textarea-inner {
|
|
15
|
+
background-color: var(--m-color-disabled) !important;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description input api type
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2022/4/6 10:50 PM
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* @name m-input
|
|
8
|
+
* @docDescription Input component with shuimo-ui style.
|
|
9
|
+
* 水墨组件的输入组件。
|
|
10
|
+
* @docUrl https://shuimo.design/input
|
|
11
|
+
*
|
|
12
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
13
|
+
*/
|
|
14
|
+
import { HTMLElementEvent } from '../../types/template';
|
|
15
|
+
|
|
16
|
+
export declare type InputProps = {
|
|
17
|
+
/**
|
|
18
|
+
* @description input type. 输入框类型
|
|
19
|
+
* @type string
|
|
20
|
+
* @default input
|
|
21
|
+
* @enum input|textarea
|
|
22
|
+
*/
|
|
23
|
+
type?: string,
|
|
24
|
+
/**
|
|
25
|
+
* @description input placeholder. 提示语
|
|
26
|
+
* @type string
|
|
27
|
+
* @default ''
|
|
28
|
+
*/
|
|
29
|
+
placeholder?: string,
|
|
30
|
+
/**
|
|
31
|
+
* @description input value. 输入框绑定值
|
|
32
|
+
* @type string|number
|
|
33
|
+
* @default ''
|
|
34
|
+
*/
|
|
35
|
+
modelValue?: string | number,
|
|
36
|
+
/**
|
|
37
|
+
* @description input readonly. 是否只读
|
|
38
|
+
* @type boolean
|
|
39
|
+
* @default false
|
|
40
|
+
*/
|
|
41
|
+
readonly?: boolean,
|
|
42
|
+
/**
|
|
43
|
+
* @description input disabled. 是否禁用
|
|
44
|
+
* @type boolean
|
|
45
|
+
* @default false
|
|
46
|
+
*/
|
|
47
|
+
disabled?: boolean
|
|
48
|
+
/**
|
|
49
|
+
* @description input autofocus. 是否自动聚焦
|
|
50
|
+
* @type boolean
|
|
51
|
+
* @default false
|
|
52
|
+
*/
|
|
53
|
+
autofocus?: boolean
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export declare type InputEvents = {
|
|
57
|
+
onInput?: (e: HTMLElementEvent<HTMLInputElement>) => void
|
|
58
|
+
onFocus?: (e: FocusEvent) => void
|
|
59
|
+
onBlur?: (e: FocusEvent) => void
|
|
60
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description
|
|
3
|
+
* @author 阿怪
|
|
4
|
+
* @date 2024/11/29 10:15
|
|
5
|
+
* @version v1.0.0
|
|
6
|
+
*
|
|
7
|
+
* 江湖的业务千篇一律,复杂的代码好几百行。
|
|
8
|
+
*/
|
|
9
|
+
import { HTMLElementEvent } from '../../types/template';
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
export default function useInput<
|
|
13
|
+
Props extends Record<string, any>,
|
|
14
|
+
>(props: Props, ctx: any) {
|
|
15
|
+
|
|
16
|
+
const isInput = props.type !== 'textarea';
|
|
17
|
+
const inputType = isInput ? 'input' : 'textarea';
|
|
18
|
+
const inputClass = isInput ? 'm-input-inner' : 'm-textarea-inner';
|
|
19
|
+
const rowInfo = isInput ? {} : { rows: 10 };
|
|
20
|
+
|
|
21
|
+
const baseProps = {
|
|
22
|
+
autofocus: props.autofocus,
|
|
23
|
+
value: props.modelValue,
|
|
24
|
+
placeholder: props.placeholder,
|
|
25
|
+
disabled: props.disabled,
|
|
26
|
+
type: props.type,
|
|
27
|
+
readOnly: props.readonly,
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const onInput = (e: HTMLElementEvent<HTMLInputElement>)=>{
|
|
31
|
+
ctx.emit('update:modelValue', e.target.value);
|
|
32
|
+
ctx.emit('input', e.target.value);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const onFocus = (e: FocusEvent)=>{
|
|
36
|
+
ctx.emit('focus', e);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const onBlur = (e: FocusEvent)=>{
|
|
40
|
+
ctx.emit('blur', e);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
baseProps,
|
|
45
|
+
inputType,
|
|
46
|
+
inputClass,
|
|
47
|
+
rowInfo,
|
|
48
|
+
onInput,
|
|
49
|
+
onFocus,
|
|
50
|
+
onBlur
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
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 } 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
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
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.ts';
|
|
10
|
+
import useInputNumber from './useInputNumber.ts';
|
|
11
|
+
|
|
12
|
+
export const InputNumberCore = {
|
|
13
|
+
props,
|
|
14
|
+
useInputNumber,
|
|
15
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
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
|
+
export declare type InputNumberProps = {
|
|
16
|
+
/**
|
|
17
|
+
* @description input-number modelValue
|
|
18
|
+
* @type number | string
|
|
19
|
+
* @default ''
|
|
20
|
+
*/
|
|
21
|
+
modelValue?: number | string | null,
|
|
22
|
+
/**
|
|
23
|
+
* @description input-number max
|
|
24
|
+
* @type number
|
|
25
|
+
* @default Infinity
|
|
26
|
+
*/
|
|
27
|
+
max?: number,
|
|
28
|
+
/**
|
|
29
|
+
* @description input-number min
|
|
30
|
+
* @type number
|
|
31
|
+
* @default -Infinity
|
|
32
|
+
*/
|
|
33
|
+
min?: number,
|
|
34
|
+
/**
|
|
35
|
+
* @description input-number step. 步长,每次增减的幅度
|
|
36
|
+
* @type number
|
|
37
|
+
* @default 1
|
|
38
|
+
*/
|
|
39
|
+
step?: number,
|
|
40
|
+
/**
|
|
41
|
+
* @description input-number precision
|
|
42
|
+
* @type number
|
|
43
|
+
* @default 0
|
|
44
|
+
*/
|
|
45
|
+
precision?: number,
|
|
46
|
+
/**
|
|
47
|
+
* @description input-number disabled
|
|
48
|
+
* @type boolean
|
|
49
|
+
* @default false
|
|
50
|
+
*/
|
|
51
|
+
disabled?: boolean,
|
|
52
|
+
/**
|
|
53
|
+
* @description input readonly. 是否只读
|
|
54
|
+
* @type boolean
|
|
55
|
+
* @default false
|
|
56
|
+
*/
|
|
57
|
+
readonly?: boolean,
|
|
58
|
+
/**
|
|
59
|
+
* @description input-number placeholder
|
|
60
|
+
* @type string
|
|
61
|
+
* @default ''
|
|
62
|
+
*/
|
|
63
|
+
placeholder?: string
|
|
64
|
+
};
|