@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.
Files changed (300) hide show
  1. package/assets/style/global.css +1 -0
  2. package/assets/style/var/Wuxing.css +71 -0
  3. package/assets/style/var.css +23 -0
  4. package/components/base/affix/api.ts +16 -0
  5. package/components/base/affix/index.ts +15 -0
  6. package/components/base/affix/props.d.ts +34 -0
  7. package/components/base/affix/useAffix.ts +123 -0
  8. package/components/base/alert/api.ts +18 -0
  9. package/components/base/alert/index.ts +15 -0
  10. package/components/base/alert/props.d.ts +50 -0
  11. package/components/base/anchor/api.ts +20 -0
  12. package/components/base/anchor/index.ts +16 -0
  13. package/components/base/anchor/props.d.ts +46 -0
  14. package/components/base/anchor/useAnchor.ts +83 -0
  15. package/components/base/autoComplete/api.ts +24 -0
  16. package/components/base/autoComplete/index.ts +17 -0
  17. package/components/base/autoComplete/props.d.ts +75 -0
  18. package/components/base/autoComplete/useAutoComplete.ts +149 -0
  19. package/components/base/avatar/api.ts +17 -0
  20. package/components/base/avatar/avatar.css +61 -0
  21. package/components/base/avatar/index.ts +14 -0
  22. package/components/base/avatar/props.d.ts +37 -0
  23. package/components/base/backTop/api.ts +17 -0
  24. package/components/base/backTop/index.ts +15 -0
  25. package/components/base/backTop/props.d.ts +38 -0
  26. package/components/base/backTop/useBackTop.ts +62 -0
  27. package/components/base/badge/api.ts +22 -0
  28. package/components/base/badge/index.ts +15 -0
  29. package/components/base/badge/props.d.ts +50 -0
  30. package/components/base/button/api.ts +28 -0
  31. package/components/base/button/button.css +34 -0
  32. package/components/base/button/index.ts +16 -0
  33. package/components/base/button/props.d.ts +64 -0
  34. package/components/base/button/useButton.ts +37 -0
  35. package/components/base/card/api.ts +17 -0
  36. package/components/base/card/index.ts +15 -0
  37. package/components/base/card/props.d.ts +37 -0
  38. package/components/base/carousel/api.ts +28 -0
  39. package/components/base/carousel/index.ts +17 -0
  40. package/components/base/carousel/props.d.ts +72 -0
  41. package/components/base/carousel/useCarousel.ts +151 -0
  42. package/components/base/cascader/api.ts +23 -0
  43. package/components/base/cascader/index.ts +18 -0
  44. package/components/base/cascader/props.d.ts +103 -0
  45. package/components/base/cascader/useCascader.ts +334 -0
  46. package/components/base/checkbox/api.ts +24 -0
  47. package/components/base/checkbox/checkbox.css +0 -0
  48. package/components/base/checkbox/index.ts +16 -0
  49. package/components/base/checkbox/props.d.ts +77 -0
  50. package/components/base/checkbox/useCheckbox.ts +42 -0
  51. package/components/base/collapse/api.ts +21 -0
  52. package/components/base/collapse/index.ts +16 -0
  53. package/components/base/collapse/props.d.ts +45 -0
  54. package/components/base/collapse/useCollapse.ts +80 -0
  55. package/components/base/datePicker/api.ts +18 -0
  56. package/components/base/datePicker/index.ts +19 -0
  57. package/components/base/datePicker/props.d.ts +60 -0
  58. package/components/base/datePicker/useDatePicker.ts +392 -0
  59. package/components/base/divider/api.ts +15 -0
  60. package/components/base/divider/divider.css +11 -0
  61. package/components/base/divider/index.ts +15 -0
  62. package/components/base/divider/props.d.ts +30 -0
  63. package/components/base/dropdown/api.ts +33 -0
  64. package/components/base/dropdown/index.ts +16 -0
  65. package/components/base/dropdown/props.d.ts +60 -0
  66. package/components/base/dropdown/useDropdown.ts +123 -0
  67. package/components/base/empty/api.ts +15 -0
  68. package/components/base/empty/index.ts +15 -0
  69. package/components/base/empty/props.d.ts +26 -0
  70. package/components/base/image/api.ts +25 -0
  71. package/components/base/image/index.ts +18 -0
  72. package/components/base/image/props.d.ts +67 -0
  73. package/components/base/image/useImage.ts +119 -0
  74. package/components/base/input/api.ts +19 -0
  75. package/components/base/input/index.ts +16 -0
  76. package/components/base/input/input.css +19 -0
  77. package/components/base/input/props.d.ts +60 -0
  78. package/components/base/input/useInput.ts +53 -0
  79. package/components/base/inputNumber/api.ts +21 -0
  80. package/components/base/inputNumber/index.ts +15 -0
  81. package/components/base/inputNumber/props.d.ts +64 -0
  82. package/components/base/inputNumber/useInputNumber.ts +140 -0
  83. package/components/base/li/api.ts +15 -0
  84. package/components/base/li/index.ts +13 -0
  85. package/components/base/li/props.d.ts +30 -0
  86. package/components/base/list/api.ts +16 -0
  87. package/components/base/list/index.ts +15 -0
  88. package/components/base/list/props.d.ts +33 -0
  89. package/components/base/list/useList.ts +36 -0
  90. package/components/base/loading/api.ts +17 -0
  91. package/components/base/loading/index.ts +15 -0
  92. package/components/base/loading/props.d.ts +38 -0
  93. package/components/base/popover/api.ts +28 -0
  94. package/components/base/popover/index.ts +15 -0
  95. package/components/base/popover/props.d.ts +73 -0
  96. package/components/base/popover/usePopover.ts +188 -0
  97. package/components/base/progress/api.ts +18 -0
  98. package/components/base/progress/index.ts +15 -0
  99. package/components/base/progress/props.d.ts +53 -0
  100. package/components/base/progress/useProgress.ts +28 -0
  101. package/components/base/radio/api.ts +19 -0
  102. package/components/base/radio/index.ts +19 -0
  103. package/components/base/radio/props.d.ts +59 -0
  104. package/components/base/radio/useRadio.ts +11 -0
  105. package/components/base/rate/api.ts +18 -0
  106. package/components/base/rate/index.ts +15 -0
  107. package/components/base/rate/props.d.ts +49 -0
  108. package/components/base/rate/useRate.ts +75 -0
  109. package/components/base/result/api.ts +20 -0
  110. package/components/base/result/index.ts +15 -0
  111. package/components/base/result/props.d.ts +36 -0
  112. package/components/base/select/api.ts +31 -0
  113. package/components/base/select/index.ts +18 -0
  114. package/components/base/select/props.d.ts +132 -0
  115. package/components/base/select/select.css +7 -0
  116. package/components/base/select/useSelect.ts +280 -0
  117. package/components/base/select/useSelectTools.ts +60 -0
  118. package/components/base/skeleton/api.ts +18 -0
  119. package/components/base/skeleton/index.ts +15 -0
  120. package/components/base/skeleton/props.d.ts +41 -0
  121. package/components/base/slider/api.ts +20 -0
  122. package/components/base/slider/index.ts +15 -0
  123. package/components/base/slider/props.d.ts +65 -0
  124. package/components/base/slider/useSlider.ts +83 -0
  125. package/components/base/space/api.ts +17 -0
  126. package/components/base/space/index.ts +15 -0
  127. package/components/base/space/props.d.ts +39 -0
  128. package/components/base/steps/api.ts +30 -0
  129. package/components/base/steps/index.ts +22 -0
  130. package/components/base/steps/props.d.ts +88 -0
  131. package/components/base/steps/useSteps.ts +101 -0
  132. package/components/base/switch/api.ts +22 -0
  133. package/components/base/switch/index.ts +17 -0
  134. package/components/base/switch/props.d.ts +66 -0
  135. package/components/base/switch/useSwitch.tsx +79 -0
  136. package/components/base/tabs/api.ts +23 -0
  137. package/components/base/tabs/index.ts +18 -0
  138. package/components/base/tabs/props.d.ts +41 -0
  139. package/components/base/tabs/useTabs.ts +66 -0
  140. package/components/base/tag/api.ts +17 -0
  141. package/components/base/tag/index.ts +13 -0
  142. package/components/base/tag/props.d.ts +49 -0
  143. package/components/base/timePicker/api.ts +21 -0
  144. package/components/base/timePicker/index.ts +18 -0
  145. package/components/base/timePicker/props.d.ts +66 -0
  146. package/components/base/timePicker/useTimePicker.ts +161 -0
  147. package/components/base/timeline/api.ts +24 -0
  148. package/components/base/timeline/index.ts +16 -0
  149. package/components/base/timeline/props.d.ts +60 -0
  150. package/components/base/tooltip/api.ts +19 -0
  151. package/components/base/tooltip/index.ts +17 -0
  152. package/components/base/tooltip/props.d.ts +34 -0
  153. package/components/base/tooltip/useTooltip.ts +89 -0
  154. package/components/base/transfer/api.ts +18 -0
  155. package/components/base/transfer/index.ts +17 -0
  156. package/components/base/transfer/props.d.ts +63 -0
  157. package/components/base/transfer/useTransfer.ts +207 -0
  158. package/components/base/tree/api.ts +47 -0
  159. package/components/base/tree/index.ts +29 -0
  160. package/components/base/tree/props.d.ts +108 -0
  161. package/components/base/tree/tree.ts +263 -0
  162. package/components/base/tree/useTree.ts +114 -0
  163. package/components/message/confirm/api.ts +21 -0
  164. package/components/message/confirm/index.ts +15 -0
  165. package/components/message/confirm/props.d.ts +69 -0
  166. package/components/message/dialog/api.ts +19 -0
  167. package/components/message/dialog/index.ts +15 -0
  168. package/components/message/dialog/props.d.ts +55 -0
  169. package/components/message/drawer/api.ts +32 -0
  170. package/components/message/drawer/index.ts +15 -0
  171. package/components/message/drawer/props.d.ts +73 -0
  172. package/components/message/message/api.ts +27 -0
  173. package/components/message/message/index.ts +20 -0
  174. package/components/message/message/props.d.ts +54 -0
  175. package/components/message/message/useMessage.ts +61 -0
  176. package/components/message/notification/api.ts +23 -0
  177. package/components/message/notification/index.ts +19 -0
  178. package/components/message/notification/props.d.ts +64 -0
  179. package/components/message/notification/useNotification.ts +79 -0
  180. package/components/message/popover/MPopover.tsx +94 -0
  181. package/components/message/popover/api.ts +54 -0
  182. package/components/message/popover/index.ts +17 -0
  183. package/components/message/popover/popover.css +21 -0
  184. package/components/message/popover/props.d.ts +76 -0
  185. package/components/message/popover/usePopover.ts +230 -0
  186. package/components/other/darkMode/api.ts +17 -0
  187. package/components/other/darkMode/index.ts +17 -0
  188. package/components/other/darkMode/props.d.ts +37 -0
  189. package/components/other/darkMode/useDarkMode.ts +129 -0
  190. package/components/template/border/api.ts +18 -0
  191. package/components/template/border/index.ts +15 -0
  192. package/components/template/border/props.d.ts +41 -0
  193. package/components/template/breadcrumb/api.ts +15 -0
  194. package/components/template/breadcrumb/index.ts +15 -0
  195. package/components/template/breadcrumb/props.d.ts +45 -0
  196. package/components/template/descriptions/api.ts +23 -0
  197. package/components/template/descriptions/index.ts +16 -0
  198. package/components/template/descriptions/props.d.ts +54 -0
  199. package/components/template/form/api.ts +23 -0
  200. package/components/template/form/index.ts +20 -0
  201. package/components/template/form/props.d.ts +60 -0
  202. package/components/template/grid/api.ts +20 -0
  203. package/components/template/grid/index.ts +15 -0
  204. package/components/template/grid/props.d.ts +48 -0
  205. package/components/template/menu/api.ts +26 -0
  206. package/components/template/menu/index.ts +19 -0
  207. package/components/template/menu/props.d.ts +93 -0
  208. package/components/template/menu/useMenu.ts +155 -0
  209. package/components/template/pagination/api.ts +22 -0
  210. package/components/template/pagination/index.ts +18 -0
  211. package/components/template/pagination/props.d.ts +65 -0
  212. package/components/template/pagination/usePagination.ts +186 -0
  213. package/components/template/table/api.ts +18 -0
  214. package/components/template/table/index.ts +18 -0
  215. package/components/template/table/props.d.ts +36 -0
  216. package/components/template/table/useTable.ts +138 -0
  217. package/components/template/tableColumn/api.ts +17 -0
  218. package/components/template/tableColumn/index.ts +15 -0
  219. package/components/template/tableColumn/props.d.ts +32 -0
  220. package/components/template/virtualList/api.ts +16 -0
  221. package/components/template/virtualList/index.ts +18 -0
  222. package/components/template/virtualList/props.d.ts +25 -0
  223. package/components/template/virtualList/useVirtualList.ts +237 -0
  224. package/components/types/hook.d.ts +13 -0
  225. package/components/types/props.d.ts +52 -0
  226. package/components/types/template.d.ts +59 -0
  227. package/compositions/common/defineCore.ts +55 -0
  228. package/compositions/common/useDebounceFn.ts +27 -0
  229. package/compositions/common/useDrag.ts +65 -0
  230. package/compositions/common/useElementSize.ts +37 -0
  231. package/compositions/common/useEventListener.ts +48 -0
  232. package/compositions/common/usePopover.ts +45 -0
  233. package/compositions/common/useResizeObserver.ts +43 -0
  234. package/compositions/common/useTeleport.ts +24 -0
  235. package/compositions/input/useBooleanInput.ts +52 -0
  236. package/compositions/modal/useModal.ts +72 -0
  237. package/compositions/popper/useClickAway.ts +41 -0
  238. package/compositions/popper/usePopper.ts +63 -0
  239. package/compositions/utils/filters.ts +135 -0
  240. package/compositions/virtualList/enums.ts +52 -0
  241. package/compositions/virtualList/useContainerObserver.ts +82 -0
  242. package/compositions/virtualList/useEntries.ts +248 -0
  243. package/compositions/virtualList/useHeightCache.ts +83 -0
  244. package/compositions/virtualList/useSentinelObserver.ts +81 -0
  245. package/dist/components/base/affix/useAffix.d.ts +5 -4
  246. package/dist/components/base/anchor/useAnchor.d.ts +1 -1
  247. package/dist/components/base/autoComplete/useAutoComplete.d.ts +12 -4
  248. package/dist/components/base/backTop/useBackTop.d.ts +1 -1
  249. package/dist/components/base/button/index.d.ts +11 -2
  250. package/dist/components/base/button/useButton.d.ts +11 -2
  251. package/dist/components/base/carousel/useCarousel.d.ts +6 -3
  252. package/dist/components/base/cascader/useCascader.d.ts +23 -11
  253. package/dist/components/base/checkbox/useCheckbox.d.ts +4 -3
  254. package/dist/components/base/collapse/useCollapse.d.ts +2 -2
  255. package/dist/components/base/datePicker/useDatePicker.d.ts +140 -8
  256. package/dist/components/base/dropdown/useDropdown.d.ts +11 -5
  257. package/dist/components/base/image/useImage.d.ts +5 -5
  258. package/dist/components/base/input/useInput.d.ts +1 -2
  259. package/dist/components/base/inputNumber/useInputNumber.d.ts +2 -2
  260. package/dist/components/base/popover/usePopover.d.ts +8 -8
  261. package/dist/components/base/progress/useProgress.d.ts +1 -1
  262. package/dist/components/base/rate/useRate.d.ts +1 -1
  263. package/dist/components/base/select/useSelect.d.ts +8 -8
  264. package/dist/components/base/slider/useSlider.d.ts +3 -3
  265. package/dist/components/base/steps/index.d.ts +1 -1
  266. package/dist/components/base/steps/useSteps.d.ts +5 -5
  267. package/dist/components/base/switch/useSwitch.d.ts +8 -3
  268. package/dist/components/base/tabs/useTabs.d.ts +2 -2
  269. package/dist/components/base/timePicker/useTimePicker.d.ts +14 -6
  270. package/dist/components/base/tooltip/useTooltip.d.ts +14 -4
  271. package/dist/components/base/transfer/useTransfer.d.ts +15 -15
  272. package/dist/components/base/tree/index.d.ts +1 -1
  273. package/dist/components/base/tree/useTree.d.ts +2 -1
  274. package/dist/components/message/message/useMessage.d.ts +11 -1
  275. package/dist/components/message/notification/useNotification.d.ts +17 -1
  276. package/dist/components/message/popover/MPopover.d.ts +6 -1
  277. package/dist/components/message/popover/usePopover.d.ts +6 -6
  278. package/dist/components/other/darkMode/useDarkMode.d.ts +1 -1
  279. package/dist/components/template/menu/useMenu.d.ts +1 -0
  280. package/dist/components/template/virtualList/useVirtualList.d.ts +10 -7
  281. package/dist/compositions/common/useDrag.d.ts +1 -1
  282. package/dist/compositions/common/useElementSize.d.ts +2 -2
  283. package/dist/compositions/common/useTeleport.d.ts +4 -2
  284. package/dist/compositions/modal/useModal.d.ts +1 -1
  285. package/dist/core.js +6137 -4186
  286. package/dist/runtime/defineHook.d.ts +1 -1
  287. package/index.css +1 -0
  288. package/index.ts +71 -0
  289. package/package.json +19 -16
  290. package/runtime/defineHook.ts +21 -0
  291. package/tools/empty.ts +81 -0
  292. package/tools/index.ts +15 -0
  293. package/tools/types.ts +11 -0
  294. package/tsconfig.json +8 -0
  295. package/types/common/common.d.ts +25 -0
  296. package/types/common/model.d.ts +25 -0
  297. package/types/index.d.ts +11 -0
  298. package/types/props.d.ts +13 -0
  299. package/vite.config.build.ts +41 -0
  300. 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
+ };