@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,17 @@
1
+ /**
2
+ * @description card 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 { CardProps } from './props';
11
+
12
+ export const props: MCOPO<CardProps> = {
13
+ title: { type: String, default: undefined },
14
+ shadow: { type: String as MPropType<'always' | 'hover' | 'never'>, default: 'never' },
15
+ bodyStyle: { type: Object, default: undefined },
16
+ bordered: { type: Boolean, default: true },
17
+ };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @description card 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 CardCore = {
12
+ props,
13
+ };
14
+
15
+ export type { CardProps } from './props';
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @description card api type
3
+ * @author 阿怪
4
+ * @date 2026/2/26
5
+ * @version v1.0.0
6
+ *
7
+ * @name m-card
8
+ * @docDescription Card component with shuimo-ui style.
9
+ * 水墨组件的卡片组件。
10
+ *
11
+ * 江湖的业务千篇一律,复杂的代码好几百行。
12
+ */
13
+
14
+ export declare type CardProps = {
15
+ /**
16
+ * @description 卡片标题
17
+ * @type string
18
+ */
19
+ title?: string;
20
+ /**
21
+ * @description 阴影显示时机
22
+ * @type 'always' | 'hover' | 'never'
23
+ * @default 'never'
24
+ */
25
+ shadow?: 'always' | 'hover' | 'never';
26
+ /**
27
+ * @description 卡片内容区自定义样式
28
+ * @type Record<string, string>
29
+ */
30
+ bodyStyle?: Record<string, string>;
31
+ /**
32
+ * @description 是否显示边框
33
+ * @type boolean
34
+ * @default true
35
+ */
36
+ bordered?: boolean;
37
+ };
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @description carousel 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 { CarouselProps } from './props';
11
+
12
+ export const props: MCOPO<CarouselProps> = {
13
+ autoplay: { type: Boolean, default: true },
14
+ interval: { type: Number, default: 3000 },
15
+ loop: { type: Boolean, default: true },
16
+ direction: {
17
+ type: String as MPropType<'horizontal' | 'vertical'>,
18
+ default: 'horizontal',
19
+ enum: ['horizontal', 'vertical'],
20
+ },
21
+ modelValue: { type: Number, default: undefined },
22
+ initialIndex: { type: Number, default: 0 },
23
+ showIndicators: { type: Boolean, default: true },
24
+ showArrows: {
25
+ type: [Boolean, String] as MPropType<boolean | 'hover'>,
26
+ default: 'hover',
27
+ },
28
+ };
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @description carousel core 导出
3
+ * @author 阿怪
4
+ * @date 2026/2/26
5
+ * @version v1.0.0
6
+ *
7
+ * 江湖的业务千篇一律,复杂的代码好几百行。
8
+ */
9
+ import { props } from './api';
10
+ import { useCarousel } from './useCarousel';
11
+
12
+ export const CarouselCore = {
13
+ props,
14
+ useCarousel,
15
+ };
16
+
17
+ export type { CarouselProps, CarouselEvents } from './props';
@@ -0,0 +1,72 @@
1
+ /**
2
+ * @description carousel props type
3
+ * @author 阿怪
4
+ * @date 2026/2/26
5
+ * @version v1.0.0
6
+ *
7
+ * @name m-carousel
8
+ * @docDescription Carousel / slideshow component.
9
+ * 轮播图组件。
10
+ *
11
+ * 江湖的业务千篇一律,复杂的代码好几百行。
12
+ */
13
+
14
+ export declare type CarouselProps = {
15
+ /**
16
+ * @description 是否自动播放
17
+ * @type boolean
18
+ * @default true
19
+ */
20
+ autoplay?: boolean,
21
+ /**
22
+ * @description 自动切换时间间隔(毫秒)
23
+ * @type number
24
+ * @default 3000
25
+ */
26
+ interval?: number,
27
+ /**
28
+ * @description 是否循环播放
29
+ * @type boolean
30
+ * @default true
31
+ */
32
+ loop?: boolean,
33
+ /**
34
+ * @description 轮播方向
35
+ * @type string
36
+ * @default horizontal
37
+ * @enum horizontal|vertical
38
+ */
39
+ direction?: 'horizontal' | 'vertical',
40
+ /**
41
+ * @description 当前激活的幻灯片索引(v-model)
42
+ * @type number
43
+ * @default 0
44
+ */
45
+ modelValue?: number,
46
+ /**
47
+ * @description 初始激活的幻灯片索引
48
+ * @type number
49
+ * @default 0
50
+ */
51
+ initialIndex?: number,
52
+ /**
53
+ * @description 是否显示指示器
54
+ * @type boolean
55
+ * @default true
56
+ */
57
+ showIndicators?: boolean,
58
+ /**
59
+ * @description 是否显示切换箭头,hover 表示鼠标悬浮时显示
60
+ * @type boolean | 'hover'
61
+ * @default 'hover'
62
+ */
63
+ showArrows?: boolean | 'hover',
64
+ };
65
+
66
+ export declare type CarouselEvents = {
67
+ /**
68
+ * @description 幻灯片切换时触发
69
+ * @param index 当前激活的索引
70
+ */
71
+ onChange?: (index: number) => void,
72
+ };
@@ -0,0 +1,151 @@
1
+ /**
2
+ * @description carousel hook
3
+ * @author 阿怪
4
+ * @date 2026/2/26
5
+ * @version v1.0.0
6
+ *
7
+ * 江湖的业务千篇一律,复杂的代码好几百行。
8
+ */
9
+ import { ref, computed, onMounted, onUnmounted, watch } from 'vue';
10
+ import { CarouselProps } from './props';
11
+
12
+ export function useCarousel(props: Required<CarouselProps>, emit: (event: string, ...args: any[]) => void, count: () => number) {
13
+ // 逻辑索引(0..N-1),用于指示器和 v-model
14
+ const activeIndex = ref(props.modelValue ?? props.initialIndex);
15
+ // track 位置索引(loop 时含克隆偏移)
16
+ const trackIndex = ref(0);
17
+ // 禁用过渡标记(用于无缝瞬间跳转)
18
+ const disableTransition = ref(false);
19
+ // 自动播放定时器
20
+ let timer: ReturnType<typeof setInterval> | null = null;
21
+
22
+ const hasClones = () => props.loop && count() > 1;
23
+
24
+ // 同步 trackIndex 到当前 activeIndex
25
+ const syncTrackIndex = () => {
26
+ trackIndex.value = hasClones() ? activeIndex.value + 1 : activeIndex.value;
27
+ };
28
+
29
+ // 初始化
30
+ syncTrackIndex();
31
+
32
+ // 外部 v-model 变化时同步
33
+ watch(() => props.modelValue, (val) => {
34
+ if (val != null && val !== activeIndex.value) {
35
+ activeIndex.value = val;
36
+ syncTrackIndex();
37
+ }
38
+ });
39
+
40
+ /**
41
+ * 切换到指定索引,支持循环
42
+ */
43
+ const setActive = (index: number) => {
44
+ const total = count();
45
+ if (total === 0) { return; }
46
+
47
+ if (props.loop && total > 1) {
48
+ if (index >= total) {
49
+ // forward past last => slide to clone of first (trackIndex = total + 1)
50
+ activeIndex.value = 0;
51
+ trackIndex.value = total + 1;
52
+ emit('update:modelValue', 0);
53
+ emit('change', 0);
54
+ } else if (index < 0) {
55
+ // backward past first => slide to clone of last (trackIndex = 0)
56
+ activeIndex.value = total - 1;
57
+ trackIndex.value = 0;
58
+ emit('update:modelValue', total - 1);
59
+ emit('change', total - 1);
60
+ } else {
61
+ activeIndex.value = index;
62
+ trackIndex.value = index + 1;
63
+ emit('update:modelValue', index);
64
+ emit('change', index);
65
+ }
66
+ } else {
67
+ const next = Math.max(0, Math.min(index, total - 1));
68
+ if (next !== activeIndex.value) {
69
+ activeIndex.value = next;
70
+ trackIndex.value = next;
71
+ emit('update:modelValue', next);
72
+ emit('change', next);
73
+ }
74
+ }
75
+ };
76
+
77
+ /**
78
+ * transitionend 回调:如果停在克隆位置,瞬间跳回真实位置
79
+ */
80
+ const onTrackTransitionEnd = () => {
81
+ const total = count();
82
+ if (!hasClones() || total === 0) { return; }
83
+
84
+ const ti = trackIndex.value;
85
+ if (ti === 0) {
86
+ // 在克隆的最后一张 => 跳到真实的最后一张
87
+ disableTransition.value = true;
88
+ trackIndex.value = total;
89
+ reEnableTransition();
90
+ } else if (ti === total + 1) {
91
+ // 在克隆的第一张 => 跳到真实的第一张
92
+ disableTransition.value = true;
93
+ trackIndex.value = 1;
94
+ reEnableTransition();
95
+ }
96
+ };
97
+
98
+ const reEnableTransition = () => {
99
+ requestAnimationFrame(() => {
100
+ requestAnimationFrame(() => {
101
+ disableTransition.value = false;
102
+ });
103
+ });
104
+ };
105
+
106
+ /** 切换到上一张 */
107
+ const prev = () => setActive(activeIndex.value - 1);
108
+ /** 切换到下一张 */
109
+ const next = () => setActive(activeIndex.value + 1);
110
+
111
+ /** 启动自动播放 */
112
+ const startAutoplay = () => {
113
+ if (!props.autoplay || props.interval <= 0) { return; }
114
+ timer = setInterval(next, props.interval);
115
+ };
116
+
117
+ /** 停止自动播放 */
118
+ const stopAutoplay = () => {
119
+ if (timer !== null) {
120
+ clearInterval(timer);
121
+ timer = null;
122
+ }
123
+ };
124
+
125
+ // 监听 autoplay 属性变化
126
+ watch(() => props.autoplay, (val) => {
127
+ if (val) { startAutoplay(); } else { stopAutoplay(); }
128
+ });
129
+
130
+ onMounted(startAutoplay);
131
+ onUnmounted(stopAutoplay);
132
+
133
+ const arrowsClass = computed(() => {
134
+ if (props.showArrows === 'hover') { return 'k-carousel-arrows-hover'; }
135
+ if (props.showArrows === false) { return 'k-carousel-arrows-hidden'; }
136
+ return 'k-carousel-arrows-always';
137
+ });
138
+
139
+ return {
140
+ activeIndex,
141
+ trackIndex,
142
+ disableTransition,
143
+ prev,
144
+ next,
145
+ setActive,
146
+ startAutoplay,
147
+ stopAutoplay,
148
+ arrowsClass,
149
+ onTrackTransitionEnd,
150
+ };
151
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @description cascader 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 { CascaderProps, CascaderOption } from './props';
11
+
12
+ export const props: MCOPO<CascaderProps> = {
13
+ modelValue: { type: undefined, default: () => [] },
14
+ options: { type: Array as MPropType<CascaderOption[]>, default: () => [] },
15
+ placeholder: { type: String, default: '请选择' },
16
+ disabled: { type: Boolean, default: false },
17
+ clearable: { type: Boolean, default: false },
18
+ filterable: { type: Boolean, default: false },
19
+ separator: { type: String, default: '/' },
20
+ expandTrigger: { type: String as MPropType<'click' | 'hover'>, default: 'click' },
21
+ showAllLevels: { type: Boolean, default: true },
22
+ multiple: { type: Boolean, default: false },
23
+ };
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @description cascader core 导出
3
+ * @author 阿怪
4
+ * @date 2026/2/26
5
+ * @version v1.0.0
6
+ *
7
+ * 江湖的业务千篇一律,复杂的代码好几百行。
8
+ */
9
+ import { props } from './api';
10
+ import { useCascader } from './useCascader';
11
+
12
+ export const CascaderCore = {
13
+ props,
14
+ useCascader,
15
+ };
16
+
17
+ export type { CascaderProps, CascaderOption } from './props';
18
+ export type { FlatCascaderOption } from './useCascader';
@@ -0,0 +1,103 @@
1
+ /**
2
+ * @description cascader api type
3
+ * @author 阿怪
4
+ * @date 2026/2/26
5
+ * @version v1.0.0
6
+ *
7
+ * 江湖的业务千篇一律,复杂的代码好几百行。
8
+ */
9
+
10
+ /**
11
+ * 级联选择器的选项数据结构
12
+ */
13
+ export declare type CascaderOption = {
14
+ /**
15
+ * @description 选项值
16
+ * @type string | number
17
+ */
18
+ value: string | number;
19
+ /**
20
+ * @description 选项显示文本
21
+ * @type string
22
+ */
23
+ label: string;
24
+ /**
25
+ * @description 子选项列表
26
+ * @type CascaderOption[]
27
+ */
28
+ children?: CascaderOption[];
29
+ /**
30
+ * @description 是否禁用该选项
31
+ * @type boolean
32
+ * @default false
33
+ */
34
+ disabled?: boolean;
35
+ /**
36
+ * @description 是否为叶子节点(无子节点)
37
+ * @type boolean
38
+ */
39
+ leaf?: boolean;
40
+ };
41
+
42
+ export declare type CascaderProps = {
43
+ /**
44
+ * @description 绑定值,单选时为数组路径,多选时为二维数组
45
+ * @type (string | number)[] | (string | number)[][]
46
+ * @default []
47
+ */
48
+ modelValue?: (string | number)[] | (string | number)[][];
49
+ /**
50
+ * @description 可选项数据源
51
+ * @type CascaderOption[]
52
+ * @default []
53
+ */
54
+ options?: CascaderOption[];
55
+ /**
56
+ * @description 占位文本
57
+ * @type string
58
+ * @default '请选择'
59
+ */
60
+ placeholder?: string;
61
+ /**
62
+ * @description 是否禁用
63
+ * @type boolean
64
+ * @default false
65
+ */
66
+ disabled?: boolean;
67
+ /**
68
+ * @description 是否支持清空
69
+ * @type boolean
70
+ * @default false
71
+ */
72
+ clearable?: boolean;
73
+ /**
74
+ * @description 是否可搜索过滤
75
+ * @type boolean
76
+ * @default false
77
+ */
78
+ filterable?: boolean;
79
+ /**
80
+ * @description 选项分隔符
81
+ * @type string
82
+ * @default '/'
83
+ */
84
+ separator?: string;
85
+ /**
86
+ * @description 次级菜单的展开方式
87
+ * @type 'click' | 'hover'
88
+ * @default 'click'
89
+ */
90
+ expandTrigger?: 'click' | 'hover';
91
+ /**
92
+ * @description 是否在输入框中显示选中值的完整路径
93
+ * @type boolean
94
+ * @default true
95
+ */
96
+ showAllLevels?: boolean;
97
+ /**
98
+ * @description 是否多选
99
+ * @type boolean
100
+ * @default false
101
+ */
102
+ multiple?: boolean;
103
+ };