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