@kine-design/core 0.0.1-beta.1 → 0.0.1-beta.11

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 (387) hide show
  1. package/.vlaude/last-session-id +1 -0
  2. package/assets/style/global.css +1 -0
  3. package/assets/style/var/Wuxing.css +71 -0
  4. package/assets/style/var.css +23 -0
  5. package/components/base/affix/api.ts +16 -0
  6. package/components/base/affix/index.ts +17 -0
  7. package/components/base/affix/props.d.ts +34 -0
  8. package/components/base/affix/useAffix.ts +124 -0
  9. package/components/base/alert/api.ts +18 -0
  10. package/components/base/alert/index.ts +15 -0
  11. package/components/base/alert/props.d.ts +50 -0
  12. package/components/base/anchor/api.ts +20 -0
  13. package/components/base/anchor/index.ts +18 -0
  14. package/components/base/anchor/props.d.ts +46 -0
  15. package/components/base/anchor/useAnchor.ts +84 -0
  16. package/components/base/autoComplete/api.ts +24 -0
  17. package/components/base/autoComplete/index.ts +17 -0
  18. package/components/base/autoComplete/props.d.ts +75 -0
  19. package/components/base/autoComplete/useAutoComplete.ts +157 -0
  20. package/components/base/avatar/api.ts +17 -0
  21. package/components/base/avatar/avatar.css +61 -0
  22. package/components/base/avatar/index.ts +15 -0
  23. package/components/base/avatar/props.d.ts +37 -0
  24. package/components/base/backTop/api.ts +17 -0
  25. package/components/base/backTop/index.ts +17 -0
  26. package/components/base/backTop/props.d.ts +38 -0
  27. package/components/base/backTop/useBackTop.ts +62 -0
  28. package/components/base/badge/api.ts +22 -0
  29. package/components/base/badge/index.ts +15 -0
  30. package/components/base/badge/props.d.ts +50 -0
  31. package/components/base/button/api.ts +28 -0
  32. package/components/base/button/button.css +34 -0
  33. package/components/base/button/index.ts +17 -0
  34. package/components/base/button/props.d.ts +66 -0
  35. package/components/base/button/useButton.ts +37 -0
  36. package/components/base/card/api.ts +17 -0
  37. package/components/base/card/index.ts +15 -0
  38. package/components/base/card/props.d.ts +37 -0
  39. package/components/base/carousel/api.ts +28 -0
  40. package/components/base/carousel/index.ts +17 -0
  41. package/components/base/carousel/props.d.ts +72 -0
  42. package/components/base/carousel/useCarousel.ts +150 -0
  43. package/components/base/cascader/api.ts +23 -0
  44. package/components/base/cascader/index.ts +18 -0
  45. package/components/base/cascader/props.d.ts +103 -0
  46. package/components/base/cascader/useCascader.ts +335 -0
  47. package/components/base/checkbox/api.ts +24 -0
  48. package/components/base/checkbox/checkbox.css +0 -0
  49. package/components/base/checkbox/index.ts +17 -0
  50. package/components/base/checkbox/props.d.ts +77 -0
  51. package/components/base/checkbox/useCheckbox.ts +43 -0
  52. package/components/base/collapse/api.ts +21 -0
  53. package/components/base/collapse/index.ts +18 -0
  54. package/components/base/collapse/props.d.ts +45 -0
  55. package/components/base/collapse/useCollapse.ts +81 -0
  56. package/components/base/datePicker/__tests__/useDatePicker.test.ts +235 -0
  57. package/components/base/datePicker/api.ts +22 -0
  58. package/components/base/datePicker/index.ts +19 -0
  59. package/components/base/datePicker/props.d.ts +86 -0
  60. package/components/base/datePicker/useDatePicker.ts +375 -0
  61. package/components/base/divider/api.ts +15 -0
  62. package/components/base/divider/divider.css +11 -0
  63. package/components/base/divider/index.ts +15 -0
  64. package/components/base/divider/props.d.ts +30 -0
  65. package/components/base/dropdown/api.ts +33 -0
  66. package/components/base/dropdown/index.ts +18 -0
  67. package/components/base/dropdown/props.d.ts +60 -0
  68. package/components/base/dropdown/useDropdown.ts +124 -0
  69. package/components/base/empty/api.ts +15 -0
  70. package/components/base/empty/index.ts +15 -0
  71. package/components/base/empty/props.d.ts +26 -0
  72. package/components/base/image/__tests__/useImage.test.ts +176 -0
  73. package/components/base/image/api.ts +25 -0
  74. package/components/base/image/index.ts +18 -0
  75. package/components/base/image/props.d.ts +67 -0
  76. package/components/base/image/useImage.ts +119 -0
  77. package/components/base/input/api.ts +23 -0
  78. package/components/base/input/index.ts +17 -0
  79. package/components/base/input/input.css +19 -0
  80. package/components/base/input/props.d.ts +85 -0
  81. package/components/base/input/useInput.ts +63 -0
  82. package/components/base/inputNumber/__tests__/useInputNumber.test.ts +189 -0
  83. package/components/base/inputNumber/api.ts +23 -0
  84. package/components/base/inputNumber/index.ts +17 -0
  85. package/components/base/inputNumber/props.d.ts +78 -0
  86. package/components/base/inputNumber/useInputNumber.ts +182 -0
  87. package/components/base/li/api.ts +15 -0
  88. package/components/base/li/index.ts +15 -0
  89. package/components/base/li/props.d.ts +30 -0
  90. package/components/base/list/api.ts +16 -0
  91. package/components/base/list/index.ts +17 -0
  92. package/components/base/list/props.d.ts +33 -0
  93. package/components/base/list/useList.ts +36 -0
  94. package/components/base/loading/api.ts +17 -0
  95. package/components/base/loading/index.ts +15 -0
  96. package/components/base/loading/props.d.ts +40 -0
  97. package/components/base/popover/api.ts +28 -0
  98. package/components/base/popover/index.ts +17 -0
  99. package/components/base/popover/props.d.ts +73 -0
  100. package/components/base/popover/usePopover.ts +193 -0
  101. package/components/base/progress/api.ts +20 -0
  102. package/components/base/progress/index.ts +17 -0
  103. package/components/base/progress/props.d.ts +68 -0
  104. package/components/base/progress/useProgress.ts +28 -0
  105. package/components/base/radio/api.ts +19 -0
  106. package/components/base/radio/index.ts +19 -0
  107. package/components/base/radio/props.d.ts +59 -0
  108. package/components/base/radio/useRadio.ts +11 -0
  109. package/components/base/rate/api.ts +18 -0
  110. package/components/base/rate/index.ts +17 -0
  111. package/components/base/rate/props.d.ts +49 -0
  112. package/components/base/rate/useRate.ts +76 -0
  113. package/components/base/result/api.ts +20 -0
  114. package/components/base/result/index.ts +15 -0
  115. package/components/base/result/props.d.ts +36 -0
  116. package/components/base/select/api.ts +34 -0
  117. package/components/base/select/index.ts +18 -0
  118. package/components/base/select/props.d.ts +152 -0
  119. package/components/base/select/select.css +7 -0
  120. package/components/base/select/useSelect.ts +281 -0
  121. package/components/base/select/useSelectTools.ts +60 -0
  122. package/components/base/skeleton/api.ts +18 -0
  123. package/components/base/skeleton/index.ts +15 -0
  124. package/components/base/skeleton/props.d.ts +41 -0
  125. package/components/base/slider/api.ts +22 -0
  126. package/components/base/slider/index.ts +17 -0
  127. package/components/base/slider/props.d.ts +79 -0
  128. package/components/base/slider/useSlider.ts +87 -0
  129. package/components/base/space/api.ts +17 -0
  130. package/components/base/space/index.ts +15 -0
  131. package/components/base/space/props.d.ts +39 -0
  132. package/components/base/steps/__tests__/useSteps.test.ts +46 -0
  133. package/components/base/steps/api.ts +30 -0
  134. package/components/base/steps/index.ts +22 -0
  135. package/components/base/steps/props.d.ts +88 -0
  136. package/components/base/steps/useSteps.ts +101 -0
  137. package/components/base/switch/api.ts +22 -0
  138. package/components/base/switch/index.ts +19 -0
  139. package/components/base/switch/props.d.ts +66 -0
  140. package/components/base/switch/useSwitch.tsx +80 -0
  141. package/components/base/tabs/api.ts +23 -0
  142. package/components/base/tabs/index.ts +18 -0
  143. package/components/base/tabs/props.d.ts +41 -0
  144. package/components/base/tabs/useTabs.ts +67 -0
  145. package/components/base/tag/api.ts +17 -0
  146. package/components/base/tag/index.ts +15 -0
  147. package/components/base/tag/props.d.ts +51 -0
  148. package/components/base/timePicker/__tests__/useTimePicker.test.ts +125 -0
  149. package/components/base/timePicker/api.ts +24 -0
  150. package/components/base/timePicker/index.ts +18 -0
  151. package/components/base/timePicker/props.d.ts +86 -0
  152. package/components/base/timePicker/useTimePicker.ts +161 -0
  153. package/components/base/timeline/api.ts +24 -0
  154. package/components/base/timeline/index.ts +16 -0
  155. package/components/base/timeline/props.d.ts +60 -0
  156. package/components/base/tooltip/api.ts +20 -0
  157. package/components/base/tooltip/index.ts +17 -0
  158. package/components/base/tooltip/props.d.ts +40 -0
  159. package/components/base/tooltip/useTooltip.ts +89 -0
  160. package/components/base/transfer/api.ts +18 -0
  161. package/components/base/transfer/index.ts +17 -0
  162. package/components/base/transfer/props.d.ts +63 -0
  163. package/components/base/transfer/useTransfer.ts +208 -0
  164. package/components/base/tree/__tests__/tree.test.ts +223 -0
  165. package/components/base/tree/api.ts +47 -0
  166. package/components/base/tree/index.ts +29 -0
  167. package/components/base/tree/props.d.ts +108 -0
  168. package/components/base/tree/tree.ts +263 -0
  169. package/components/base/tree/useTree.ts +114 -0
  170. package/components/message/confirm/api.ts +21 -0
  171. package/components/message/confirm/index.ts +15 -0
  172. package/components/message/confirm/props.d.ts +69 -0
  173. package/components/message/dialog/api.ts +20 -0
  174. package/components/message/dialog/index.ts +15 -0
  175. package/components/message/dialog/props.d.ts +62 -0
  176. package/components/message/drawer/api.ts +33 -0
  177. package/components/message/drawer/index.ts +15 -0
  178. package/components/message/drawer/props.d.ts +80 -0
  179. package/components/message/message/api.ts +27 -0
  180. package/components/message/message/index.ts +20 -0
  181. package/components/message/message/props.d.ts +54 -0
  182. package/components/message/message/useMessage.ts +61 -0
  183. package/components/message/notification/__tests__/useNotification.test.ts +129 -0
  184. package/components/message/notification/api.ts +23 -0
  185. package/components/message/notification/index.ts +19 -0
  186. package/components/message/notification/props.d.ts +64 -0
  187. package/components/message/notification/useNotification.ts +79 -0
  188. package/components/message/popover/MPopover.tsx +94 -0
  189. package/components/message/popover/api.ts +54 -0
  190. package/components/message/popover/index.ts +17 -0
  191. package/components/message/popover/popover.css +21 -0
  192. package/components/message/popover/props.d.ts +76 -0
  193. package/components/message/popover/usePopover.ts +234 -0
  194. package/components/other/darkMode/api.ts +17 -0
  195. package/components/other/darkMode/index.ts +17 -0
  196. package/components/other/darkMode/props.d.ts +37 -0
  197. package/components/other/darkMode/useDarkMode.ts +129 -0
  198. package/components/template/border/api.ts +18 -0
  199. package/components/template/border/index.ts +15 -0
  200. package/components/template/border/props.d.ts +41 -0
  201. package/components/template/breadcrumb/api.ts +15 -0
  202. package/components/template/breadcrumb/index.ts +15 -0
  203. package/components/template/breadcrumb/props.d.ts +45 -0
  204. package/components/template/descriptions/api.ts +23 -0
  205. package/components/template/descriptions/index.ts +16 -0
  206. package/components/template/descriptions/props.d.ts +54 -0
  207. package/components/template/form/api.ts +23 -0
  208. package/components/template/form/index.ts +20 -0
  209. package/components/template/form/props.d.ts +60 -0
  210. package/components/template/grid/api.ts +20 -0
  211. package/components/template/grid/index.ts +15 -0
  212. package/components/template/grid/props.d.ts +48 -0
  213. package/components/template/menu/__tests__/useMenu.test.ts +157 -0
  214. package/components/template/menu/api.ts +26 -0
  215. package/components/template/menu/index.ts +18 -0
  216. package/components/template/menu/props.d.ts +93 -0
  217. package/components/template/menu/useMenu.ts +155 -0
  218. package/components/template/pagination/__tests__/usePagination.test.ts +138 -0
  219. package/components/template/pagination/api.ts +22 -0
  220. package/components/template/pagination/index.ts +19 -0
  221. package/components/template/pagination/props.d.ts +65 -0
  222. package/components/template/pagination/usePagination.ts +186 -0
  223. package/components/template/table/__tests__/useTable.test.ts +138 -0
  224. package/components/template/table/api.ts +18 -0
  225. package/components/template/table/index.ts +18 -0
  226. package/components/template/table/props.d.ts +36 -0
  227. package/components/template/table/useTable.ts +136 -0
  228. package/components/template/tableColumn/api.ts +17 -0
  229. package/components/template/tableColumn/index.ts +15 -0
  230. package/components/template/tableColumn/props.d.ts +32 -0
  231. package/components/template/virtualList/api.ts +16 -0
  232. package/components/template/virtualList/index.ts +17 -0
  233. package/components/template/virtualList/props.d.ts +25 -0
  234. package/components/template/virtualList/useVirtualList.ts +237 -0
  235. package/components/types/hook.d.ts +24 -0
  236. package/components/types/props.d.ts +57 -0
  237. package/components/types/template.d.ts +59 -0
  238. package/compositions/common/__tests__/useDebounceFn.test.ts +62 -0
  239. package/compositions/common/__tests__/useEventListener.test.ts +98 -0
  240. package/compositions/common/__tests__/usePopover.test.ts +43 -0
  241. package/compositions/common/__tests__/useTeleport.test.ts +32 -0
  242. package/compositions/common/defineCore.ts +55 -0
  243. package/compositions/common/testAnchor.ts +211 -0
  244. package/compositions/common/useComponentSize.ts +17 -0
  245. package/compositions/common/useDebounceFn.ts +27 -0
  246. package/compositions/common/useDrag.ts +65 -0
  247. package/compositions/common/useElementSize.ts +37 -0
  248. package/compositions/common/useEventListener.ts +48 -0
  249. package/compositions/common/useLocale.ts +53 -0
  250. package/compositions/common/usePopover.ts +45 -0
  251. package/compositions/common/useResizeObserver.ts +47 -0
  252. package/compositions/common/useTeleport.ts +24 -0
  253. package/compositions/input/__tests__/useBooleanInput.test.ts +73 -0
  254. package/compositions/input/useBooleanInput.ts +52 -0
  255. package/compositions/modal/__tests__/useModal.test.ts +110 -0
  256. package/compositions/modal/useModal.ts +72 -0
  257. package/compositions/popper/useClickAway.ts +41 -0
  258. package/compositions/popper/usePopper.ts +63 -0
  259. package/compositions/utils/__tests__/filters.test.ts +136 -0
  260. package/compositions/utils/filters.ts +135 -0
  261. package/compositions/virtualList/__tests__/useHeightCache.test.ts +97 -0
  262. package/compositions/virtualList/enums.ts +52 -0
  263. package/compositions/virtualList/useContainerObserver.ts +89 -0
  264. package/compositions/virtualList/useEntries.ts +248 -0
  265. package/compositions/virtualList/useHeightCache.ts +83 -0
  266. package/compositions/virtualList/useSentinelObserver.ts +81 -0
  267. package/dist/components/base/affix/index.d.ts +2 -1
  268. package/dist/components/base/affix/useAffix.d.ts +7 -5
  269. package/dist/components/base/anchor/index.d.ts +2 -1
  270. package/dist/components/base/anchor/useAnchor.d.ts +3 -2
  271. package/dist/components/base/autoComplete/useAutoComplete.d.ts +14 -5
  272. package/dist/components/base/avatar/index.d.ts +1 -0
  273. package/dist/components/base/backTop/index.d.ts +2 -1
  274. package/dist/components/base/backTop/useBackTop.d.ts +2 -2
  275. package/dist/components/base/button/index.d.ts +3 -21
  276. package/dist/components/base/button/useButton.d.ts +5 -2
  277. package/dist/components/base/carousel/useCarousel.d.ts +7 -3
  278. package/dist/components/base/cascader/useCascader.d.ts +25 -12
  279. package/dist/components/base/checkbox/index.d.ts +2 -1
  280. package/dist/components/base/checkbox/useCheckbox.d.ts +5 -3
  281. package/dist/components/base/collapse/index.d.ts +2 -1
  282. package/dist/components/base/collapse/useCollapse.d.ts +4 -3
  283. package/dist/components/base/datePicker/__tests__/useDatePicker.test.d.ts +1 -0
  284. package/dist/components/base/datePicker/index.d.ts +1 -1
  285. package/dist/components/base/datePicker/useDatePicker.d.ts +140 -15
  286. package/dist/components/base/dropdown/index.d.ts +2 -1
  287. package/dist/components/base/dropdown/useDropdown.d.ts +13 -6
  288. package/dist/components/base/image/__tests__/useImage.test.d.ts +1 -0
  289. package/dist/components/base/image/useImage.d.ts +5 -5
  290. package/dist/components/base/input/index.d.ts +2 -1
  291. package/dist/components/base/input/useInput.d.ts +4 -2
  292. package/dist/components/base/inputNumber/__tests__/useInputNumber.test.d.ts +1 -0
  293. package/dist/components/base/inputNumber/index.d.ts +2 -1
  294. package/dist/components/base/inputNumber/useInputNumber.d.ts +4 -3
  295. package/dist/components/base/li/index.d.ts +1 -0
  296. package/dist/components/base/list/index.d.ts +2 -1
  297. package/dist/components/base/list/useList.d.ts +1 -1
  298. package/dist/components/base/popover/index.d.ts +2 -1
  299. package/dist/components/base/popover/usePopover.d.ts +10 -9
  300. package/dist/components/base/progress/index.d.ts +2 -1
  301. package/dist/components/base/progress/useProgress.d.ts +2 -2
  302. package/dist/components/base/rate/index.d.ts +2 -1
  303. package/dist/components/base/rate/useRate.d.ts +3 -2
  304. package/dist/components/base/select/useSelect.d.ts +10 -9
  305. package/dist/components/base/slider/index.d.ts +2 -1
  306. package/dist/components/base/slider/useSlider.d.ts +5 -4
  307. package/dist/components/base/steps/__tests__/useSteps.test.d.ts +1 -0
  308. package/dist/components/base/steps/index.d.ts +1 -1
  309. package/dist/components/base/steps/useSteps.d.ts +5 -5
  310. package/dist/components/base/switch/index.d.ts +2 -1
  311. package/dist/components/base/switch/useSwitch.d.ts +9 -3
  312. package/dist/components/base/tabs/index.d.ts +1 -1
  313. package/dist/components/base/tabs/useTabs.d.ts +4 -3
  314. package/dist/components/base/tag/index.d.ts +1 -0
  315. package/dist/components/base/timePicker/__tests__/useTimePicker.test.d.ts +1 -0
  316. package/dist/components/base/timePicker/useTimePicker.d.ts +14 -6
  317. package/dist/components/base/tooltip/index.d.ts +1 -1
  318. package/dist/components/base/tooltip/useTooltip.d.ts +15 -5
  319. package/dist/components/base/transfer/useTransfer.d.ts +17 -16
  320. package/dist/components/base/tree/__tests__/tree.test.d.ts +1 -0
  321. package/dist/components/base/tree/index.d.ts +1 -1
  322. package/dist/components/base/tree/useTree.d.ts +2 -1
  323. package/dist/components/message/drawer/index.d.ts +2 -2
  324. package/dist/components/message/message/useMessage.d.ts +11 -1
  325. package/dist/components/message/notification/__tests__/useNotification.test.d.ts +1 -0
  326. package/dist/components/message/notification/useNotification.d.ts +17 -1
  327. package/dist/components/message/popover/MPopover.d.ts +6 -1
  328. package/dist/components/message/popover/index.d.ts +1 -1
  329. package/dist/components/message/popover/usePopover.d.ts +7 -7
  330. package/dist/components/other/darkMode/useDarkMode.d.ts +3 -4
  331. package/dist/components/template/menu/__tests__/useMenu.test.d.ts +1 -0
  332. package/dist/components/template/menu/index.d.ts +0 -1
  333. package/dist/components/template/menu/useMenu.d.ts +2 -1
  334. package/dist/components/template/pagination/__tests__/usePagination.test.d.ts +1 -0
  335. package/dist/components/template/pagination/index.d.ts +2 -1
  336. package/dist/components/template/table/__tests__/useTable.test.d.ts +1 -0
  337. package/dist/components/template/virtualList/index.d.ts +0 -1
  338. package/dist/components/template/virtualList/useVirtualList.d.ts +10 -7
  339. package/dist/compositions/common/__tests__/useDebounceFn.test.d.ts +1 -0
  340. package/dist/compositions/common/__tests__/useEventListener.test.d.ts +1 -0
  341. package/dist/compositions/common/__tests__/usePopover.test.d.ts +1 -0
  342. package/dist/compositions/common/__tests__/useTeleport.test.d.ts +1 -0
  343. package/dist/compositions/common/testAnchor.d.ts +40 -0
  344. package/dist/compositions/common/useComponentSize.d.ts +6 -0
  345. package/dist/compositions/common/useDrag.d.ts +1 -1
  346. package/dist/compositions/common/useElementSize.d.ts +2 -2
  347. package/dist/compositions/common/useEventListener.d.ts +2 -2
  348. package/dist/compositions/common/useLocale.d.ts +14 -0
  349. package/dist/compositions/common/useTeleport.d.ts +4 -2
  350. package/dist/compositions/input/__tests__/useBooleanInput.test.d.ts +1 -0
  351. package/dist/compositions/modal/__tests__/useModal.test.d.ts +1 -0
  352. package/dist/compositions/modal/useModal.d.ts +3 -2
  353. package/dist/compositions/popper/useClickAway.d.ts +3 -3
  354. package/dist/compositions/utils/__tests__/filters.test.d.ts +1 -0
  355. package/dist/compositions/virtualList/__tests__/useHeightCache.test.d.ts +1 -0
  356. package/dist/core.js +6697 -4188
  357. package/dist/index.d.ts +2 -0
  358. package/dist/locale/en.d.ts +3 -0
  359. package/dist/locale/index.d.ts +9 -0
  360. package/dist/locale/types.d.ts +222 -0
  361. package/dist/locale/zh.d.ts +3 -0
  362. package/dist/runtime/defineHook.d.ts +1 -1
  363. package/dist/tools/__tests__/empty.test.d.ts +1 -0
  364. package/dist/tools/empty.d.ts +2 -2
  365. package/dist/tools/types.d.ts +1 -1
  366. package/dist/vitest.config.d.ts +10 -0
  367. package/index.css +1 -0
  368. package/index.ts +81 -0
  369. package/locale/.vlaude/last-session-id +1 -0
  370. package/locale/en.ts +187 -0
  371. package/locale/index.ts +29 -0
  372. package/locale/types.ts +214 -0
  373. package/locale/zh.ts +190 -0
  374. package/package.json +23 -17
  375. package/runtime/defineHook.ts +21 -0
  376. package/tools/__tests__/empty.test.ts +91 -0
  377. package/tools/empty.ts +81 -0
  378. package/tools/index.ts +15 -0
  379. package/tools/types.ts +11 -0
  380. package/tsconfig.json +8 -0
  381. package/types/common/common.d.ts +25 -0
  382. package/types/common/model.d.ts +25 -0
  383. package/types/index.d.ts +11 -0
  384. package/types/props.d.ts +13 -0
  385. package/vite.config.build.ts +41 -0
  386. package/vitest.config.ts +17 -0
  387. package/dist/vite.config.build.d.ts +0 -2
@@ -0,0 +1,211 @@
1
+ /**
2
+ * @description Test anchor system: provide/inject keys, types, and kDefineComponent wrapper
3
+ * @author kine-design
4
+ * @date 2026/4/28
5
+ * @version v1.0.0
6
+ *
7
+ * Renders business-semantic `data-k` attributes on DOM elements when testAnchor is enabled,
8
+ * allowing E2E tests to target components by stable identifiers.
9
+ */
10
+ import {
11
+ cloneVNode,
12
+ defineComponent,
13
+ inject,
14
+ type ComponentPropsOptions,
15
+ type EmitsOptions,
16
+ type InjectionKey,
17
+ type Ref,
18
+ type SetupContext,
19
+ type VNode,
20
+ } from 'vue';
21
+
22
+ // ---------------------------------------------------------------------------
23
+ // Injection keys
24
+ // ---------------------------------------------------------------------------
25
+
26
+ /** Global switch provided by KConfigProvider to enable data-k rendering */
27
+ export const K_TEST_ANCHOR_KEY: InjectionKey<Ref<boolean>> = Symbol('k-test-anchor');
28
+
29
+ /** Field identity provided by KFormItem so child inputs inherit field name */
30
+ export const K_FIELD_KEY: InjectionKey<Ref<string | undefined>> = Symbol('k-field');
31
+
32
+ // ---------------------------------------------------------------------------
33
+ // Types
34
+ // ---------------------------------------------------------------------------
35
+
36
+ export interface KAnchorConfig {
37
+ /** Semantic type: 'field' | 'action' | 'table' | 'col' | 'dialog' | 'drawer' | 'tab' */
38
+ type: string;
39
+ /** Which prop to derive the identity from (e.g., 'prop' for KFormItem, 'title' for KDialog) */
40
+ prop?: string;
41
+ /** Derive identity from default slot text content (for KButton) */
42
+ slotText?: boolean;
43
+ }
44
+
45
+ interface KDefineComponentOptions {
46
+ name: string;
47
+ props?: ComponentPropsOptions;
48
+ emits?: EmitsOptions;
49
+ kAnchor?: KAnchorConfig;
50
+ }
51
+
52
+ // ---------------------------------------------------------------------------
53
+ // Helpers
54
+ // ---------------------------------------------------------------------------
55
+
56
+ /**
57
+ * Extract text content from a VNode tree (for slotText mode).
58
+ * Walks children recursively, concatenating string segments.
59
+ */
60
+ function extractSlotText(nodes: VNode[] | undefined): string {
61
+ if (!nodes) return '';
62
+ let text = '';
63
+ for (const node of nodes) {
64
+ if (typeof node.children === 'string') {
65
+ text += node.children;
66
+ } else if (Array.isArray(node.children)) {
67
+ text += extractSlotText(node.children as VNode[]);
68
+ }
69
+ }
70
+ return text.trim();
71
+ }
72
+
73
+ /**
74
+ * Resolve the data-k value for a component instance.
75
+ * Returns undefined when testAnchor is off or no identity can be derived.
76
+ */
77
+ function resolveDataK(
78
+ config: KAnchorConfig,
79
+ props: Record<string, unknown>,
80
+ attrs: Record<string, unknown>,
81
+ fieldFromParent: string | undefined,
82
+ slotNodes?: VNode[],
83
+ ): string | undefined {
84
+ // Developer override via k-{type} attr (e.g., k-action="approve")
85
+ const overrideKey = `k-${config.type}`;
86
+ const override = attrs[overrideKey];
87
+ if (typeof override === 'string' && override) {
88
+ return `${config.type}:${override}`;
89
+ }
90
+
91
+ // Derive from prop
92
+ if (config.prop) {
93
+ const val = props[config.prop];
94
+ if (typeof val === 'string' && val) {
95
+ return `${config.type}:${val}`;
96
+ }
97
+ }
98
+
99
+ // Derive from slot text (e.g., KButton default slot)
100
+ if (config.slotText && slotNodes) {
101
+ const text = extractSlotText(slotNodes);
102
+ if (text) {
103
+ return `${config.type}:${text}`;
104
+ }
105
+ }
106
+
107
+ // Fallback: check props.text (for KButton text prop)
108
+ if (config.slotText && typeof props.text === 'string' && props.text) {
109
+ return `${config.type}:${props.text}`;
110
+ }
111
+
112
+ // Inherit from parent KFormItem for input-type components
113
+ if (config.type === 'field' && !config.prop && fieldFromParent) {
114
+ return `${config.type}:${fieldFromParent}`;
115
+ }
116
+
117
+ return undefined;
118
+ }
119
+
120
+ /**
121
+ * Inject data-k attribute into a VNode.
122
+ * Uses cloneVNode to avoid mutating the original.
123
+ */
124
+ function injectDataK(vnode: VNode, dataK: string): VNode {
125
+ return cloneVNode(vnode, { 'data-k': dataK });
126
+ }
127
+
128
+ // ---------------------------------------------------------------------------
129
+ // kDefineComponent
130
+ // ---------------------------------------------------------------------------
131
+
132
+ /**
133
+ * Wrapper around Vue's defineComponent that automatically injects `data-k`
134
+ * test anchor attributes when testAnchor is enabled via KConfigProvider.
135
+ *
136
+ * Usage:
137
+ * ```tsx
138
+ * export default kDefineComponent((_props, ctx) => {
139
+ * return () => <div class="k-form-item">...</div>;
140
+ * }, {
141
+ * name: 'KFormItem',
142
+ * props: FormCore.formItemProps,
143
+ * kAnchor: { type: 'field', prop: 'prop' },
144
+ * });
145
+ * ```
146
+ */
147
+ export function kDefineComponent<P extends Record<string, unknown>>(
148
+ setup: (props: P, ctx: SetupContext) => () => VNode | VNode[] | null | undefined,
149
+ options: KDefineComponentOptions,
150
+ ) {
151
+ const { kAnchor, ...defineOptions } = options;
152
+
153
+ return defineComponent((rawProps: P, ctx: SetupContext) => {
154
+ // Call the original setup to get the render function
155
+ const render = setup(rawProps, ctx);
156
+
157
+ // If no kAnchor config, skip entirely
158
+ if (!kAnchor) {
159
+ return render;
160
+ }
161
+
162
+ // Read the global testAnchor switch
163
+ const testAnchor = inject(K_TEST_ANCHOR_KEY, undefined);
164
+
165
+ // For field-type components without own prop, inject parent field identity
166
+ const parentField = (kAnchor.type === 'field' && !kAnchor.prop)
167
+ ? inject(K_FIELD_KEY, undefined)
168
+ : undefined;
169
+
170
+ return () => {
171
+ const vnode = render();
172
+
173
+ // When testAnchor is off (default), render as-is
174
+ if (!testAnchor?.value) {
175
+ return vnode;
176
+ }
177
+
178
+ // Resolve the data-k value
179
+ const props = rawProps as Record<string, unknown>;
180
+ const slotNodes = kAnchor.slotText ? (ctx.slots.default?.() ?? undefined) : undefined;
181
+ const dataK = resolveDataK(
182
+ kAnchor,
183
+ props,
184
+ ctx.attrs,
185
+ parentField?.value,
186
+ slotNodes,
187
+ );
188
+
189
+ if (!dataK) {
190
+ return vnode;
191
+ }
192
+
193
+ // Inject into root vnode
194
+ if (vnode === null || vnode === undefined) {
195
+ return vnode;
196
+ }
197
+
198
+ // Handle array of vnodes (Fragment) — inject into first element
199
+ if (Array.isArray(vnode)) {
200
+ if (vnode.length === 0) return vnode;
201
+ const first = vnode[0];
202
+ if (first && typeof first === 'object') {
203
+ return [injectDataK(first, dataK), ...vnode.slice(1)];
204
+ }
205
+ return vnode;
206
+ }
207
+
208
+ return injectDataK(vnode, dataK);
209
+ };
210
+ }, defineOptions as Parameters<typeof defineComponent>[1]);
211
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @description composable for unified component size with global injection support
3
+ * @author 阿怪
4
+ * @date 2026/4/7
5
+ * @version v1.0.0
6
+ *
7
+ * 江湖的业务千篇一律,复杂的代码好几百行。
8
+ */
9
+ import { computed, inject, type InjectionKey, type Ref } from 'vue';
10
+ import { KineSize } from '../../components/types/props';
11
+
12
+ export const KINE_SIZE_KEY: InjectionKey<Ref<KineSize>> = Symbol('kine-size');
13
+
14
+ export function useComponentSize(props: { size?: KineSize }): Ref<KineSize> {
15
+ const globalSize = inject(KINE_SIZE_KEY, undefined);
16
+ return computed(() => props.size ?? globalSize?.value ?? 'medium');
17
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @description 防抖hook
3
+ * @author youus
4
+ * @date 2022/8/19 23:47
5
+ * @version v1.0.0
6
+ *
7
+ * Hello, humor
8
+ */
9
+ import type { DebounceFilterOptions, FunctionArgs } from '../utils/filters';
10
+ import { createFilterWrapper, debounceFilter } from '../utils/filters';
11
+
12
+ /**
13
+ * Debounce execution of a function.
14
+ *
15
+ * @see https://vueuse.org/useDebounceFn
16
+ * @param fn A function to be executed after delay milliseconds debounced.
17
+ * @param ms A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.
18
+ * @param opts options
19
+ *
20
+ * @return A new, debounce, function.
21
+ */
22
+ export default function useDebounceFn<T extends FunctionArgs>(fn: T, ms: number = 200, options: DebounceFilterOptions = {}): T {
23
+ return createFilterWrapper(
24
+ debounceFilter(ms, options),
25
+ fn,
26
+ );
27
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @description drag hook
3
+ * @author 阿怪
4
+ * @date 2023/5/23 16:42
5
+ * @version v1.0.0
6
+ *
7
+ * 江湖的业务千篇一律,复杂的代码好几百行。
8
+ */
9
+ import * as _interactjsModule from 'interactjs';
10
+ // interactjs 是 UMD 格式,Vite ESM 不提供 default export,需兼容处理
11
+ const interactjs = (_interactjsModule as any).default ?? _interactjsModule;
12
+ import { Ref, ref } from 'vue';
13
+
14
+ // 方向类型,内联定义避免引用 lib 的 MessageDirectionType
15
+ export type DragDirectionType = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | string;
16
+ export type InteractEvent = any;
17
+ export type DragPosition = { x: number, y: number };
18
+ export type DragOption = { startAxis: 'x' | 'y', lockAxis: 'x' | 'y' };
19
+
20
+
21
+ export default function useDrag(config: {
22
+ direction: DragDirectionType,
23
+ value?: {
24
+ domRef?: Ref<HTMLElement | null>
25
+ },
26
+ event?: {
27
+ getOption?: () => DragOption,
28
+ movePositionHandler?: (event: InteractEvent, position: DragPosition) => DragPosition,
29
+ onDragLeave?: (event: InteractEvent) => void
30
+ }
31
+ }) {
32
+ const domRef = config.value?.domRef ?? ref();
33
+
34
+ const init = (basePosition?: { x?: number, y?: number }) => {
35
+ if (!domRef.value) {
36
+ return;
37
+ }
38
+ const position: DragPosition = { x: basePosition?.x ?? 0, y: basePosition?.y ?? 0 };
39
+ return interactjs(domRef.value)
40
+ .styleCursor(false)
41
+ .draggable({
42
+ ...config.event?.getOption?.(),
43
+ listeners: {
44
+ end: (event: InteractEvent) => {
45
+ config.event?.onDragLeave?.(event);
46
+ },
47
+ move: (event: InteractEvent) => {
48
+ const { x, y } = config.event?.movePositionHandler?.(event, position) ?? {
49
+ x: position.x + event.dx, y: position.y + event.dy,
50
+ };
51
+ position.x = x;
52
+ position.y = y;
53
+ event.target.style.transform = `translate(${position.x}px, ${position.y}px)`;
54
+ },
55
+ },
56
+ });
57
+ };
58
+
59
+
60
+ return {
61
+ domRef,
62
+ init,
63
+ };
64
+
65
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @description element size hook
3
+ * @author 阿怪
4
+ * @date 2023/6/24 16:17
5
+ * @version v1.0.0
6
+ *
7
+ * 江湖的业务千篇一律,复杂的代码好几百行。
8
+ *
9
+ * Learn from vueuse useElementSize
10
+ */
11
+ import { Ref, ref } from 'vue';
12
+ import { useResizeObserver } from './useResizeObserver';
13
+
14
+
15
+ export function useElementSize(
16
+ target: Ref<HTMLElement | null>,
17
+ // initialSize = { w: 0, h: 0 },
18
+ // options: ResizeObserverOptions = {},
19
+ ) {
20
+
21
+ const w = ref(0);
22
+ const h = ref(0);
23
+
24
+ useResizeObserver(target, () => {
25
+ const ele = target.value;
26
+ if (window && ele) {
27
+ const styles = window.getComputedStyle(ele);
28
+ w.value = Number.parseFloat(styles.width);
29
+ h.value = Number.parseFloat(styles.height);
30
+ }
31
+ });
32
+
33
+
34
+ return {
35
+ w, h,
36
+ };
37
+ }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @description event listener hook
3
+ * @author 阿怪
4
+ * @date 2023/5/12 00:57
5
+ * @version v1.0.0
6
+ *
7
+ * 江湖的业务千篇一律,复杂的代码好几百行。
8
+ */
9
+
10
+
11
+ export type EventListenerOptions = {
12
+ target: EventTarget | (() => EventTarget),
13
+ event: string,
14
+ handler: EventListenerOrEventListenerObject,
15
+ };
16
+
17
+ export default function useEventListener(options: EventListenerOptions) {
18
+
19
+ const getTarget = () => {
20
+ if (typeof options.target === 'function') {
21
+ return options.target();
22
+ }
23
+ return options.target;
24
+ };
25
+
26
+ const add = () => {
27
+ getTarget().addEventListener(options.event, options.handler);
28
+ };
29
+
30
+ const remove = () => {
31
+ getTarget().removeEventListener(options.event, options.handler);
32
+ };
33
+
34
+ const onMounted = () => {
35
+ add();
36
+ };
37
+
38
+ const onBeforeUnmount = () => {
39
+ remove();
40
+ };
41
+
42
+ return {
43
+ add, remove,
44
+ onMounted,
45
+ onBeforeUnmount,
46
+ };
47
+
48
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @description composable for unified component locale with global injection
3
+ * support — the i18n counterpart of `useComponentSize`. Components call
4
+ * `useLocale()` to get the active message dictionary (a computed ref) and read
5
+ * their user-facing strings from it instead of hardcoding text.
6
+ * @author kine-design
7
+ * @version v1.0.0
8
+ *
9
+ * 江湖的业务千篇一律,复杂的代码好几百行。
10
+ */
11
+ import { computed, inject, type ComputedRef, type InjectionKey, type Ref } from 'vue';
12
+ import type { KineLocaleName, KineLocaleMessages } from '../../locale/types';
13
+ import { DEFAULT_LOCALE, locales } from '../../locale';
14
+
15
+ /** Accepted `locale` values: a built-in name, or a full custom dictionary. */
16
+ export type KineLocaleConfig = KineLocaleName | KineLocaleMessages;
17
+
18
+ export const KINE_LOCALE_KEY: InjectionKey<Ref<KineLocaleConfig | undefined>> = Symbol('kine-locale');
19
+
20
+ function resolveMessages(config: KineLocaleConfig | undefined): KineLocaleMessages {
21
+ if (!config) return locales[DEFAULT_LOCALE];
22
+ if (typeof config === 'string') return locales[config] ?? locales[DEFAULT_LOCALE];
23
+ return config;
24
+ }
25
+
26
+ /**
27
+ * Resolve the active message dictionary from the nearest `KConfigProvider`.
28
+ * Falls back to the default (zh) pack when no provider is present.
29
+ */
30
+ export function useLocale(): ComputedRef<KineLocaleMessages> {
31
+ const injected = inject(KINE_LOCALE_KEY, undefined);
32
+ return computed(() => resolveMessages(injected?.value));
33
+ }
34
+
35
+ // ── Global singleton ─────────────────────────────────────────────────────────
36
+ // Components read locale through useLocale() (provide/inject, scoped + reactive).
37
+ // But non-component code — the crud request/error feedback functions — has no
38
+ // component context and cannot inject. Those read this module-level singleton
39
+ // instead. KConfigProvider keeps it in sync inside its setup, so under a single
40
+ // root provider the two are always consistent; with nested providers the global
41
+ // reflects whichever was set last (an acceptable trade-off, since feedback text
42
+ // is app-global by nature).
43
+ let activeLocaleMessages: KineLocaleMessages = locales[DEFAULT_LOCALE];
44
+
45
+ /** Set the global active dictionary. Called by KConfigProvider on locale change. */
46
+ export function setActiveLocaleMessages(config: KineLocaleConfig | undefined): void {
47
+ activeLocaleMessages = resolveMessages(config);
48
+ }
49
+
50
+ /** Read the global active dictionary from non-component (pure-function) code. */
51
+ export function getActiveLocaleMessages(): KineLocaleMessages {
52
+ return activeLocaleMessages;
53
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @description popover hook, for component like select, datepicker, etc.
3
+ * @author 阿怪
4
+ * @date 2023/5/19 00:12
5
+ * @version v1.0.0
6
+ *
7
+ * 江湖的业务千篇一律,复杂的代码好几百行。
8
+ */
9
+ import { PopoverProps } from '../../components/message/popover/props';
10
+ import { arrow, flip, offset, type OffsetOptions, shift } from '@floating-ui/dom';
11
+
12
+ export {
13
+ flip,
14
+ offset,
15
+ shift,
16
+ arrow,
17
+ };
18
+
19
+ export default function usePopover(
20
+ props?: Partial<PopoverProps>,
21
+ middleware?: {
22
+ offset?: OffsetOptions
23
+ extends?: any[]
24
+ },
25
+ ) {
26
+
27
+ const offsetOptions = middleware?.offset ?? { crossAxis: 3 };
28
+
29
+
30
+ const popoverOptions: PopoverProps = {
31
+ placement: props?.placement ?? 'bottom-start',
32
+ popper: {
33
+ middleware: [
34
+ offset(offsetOptions),
35
+ flip(),
36
+ shift(),
37
+ ...middleware?.extends ?? [],
38
+ ],
39
+ },
40
+ };
41
+
42
+ return {
43
+ popoverOptions,
44
+ };
45
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @description resizeObserver hook
3
+ * @author 阿怪
4
+ * @date 2023/6/24 16:08
5
+ * @version v1.0.0
6
+ *
7
+ * 江湖的业务千篇一律,复杂的代码好几百行。
8
+ *
9
+ * Learn from vueuse useResizeObserver
10
+ */
11
+
12
+ import { onBeforeUnmount, Ref, watch } from 'vue';
13
+
14
+ export function useResizeObserver(
15
+ target: Ref<HTMLElement | null>,
16
+ callback: ResizeObserverCallback,
17
+ options: ResizeObserverOptions = {},
18
+ ) {
19
+
20
+ let observer: ResizeObserver | undefined;
21
+
22
+ const cleanup = () => {
23
+ if (observer) {
24
+ observer.disconnect();
25
+ observer = undefined;
26
+ }
27
+ };
28
+
29
+ // vueuse used watch
30
+ const stopWatch = watch(target, () => {
31
+ if (target.value) {
32
+ cleanup();
33
+ observer = new ResizeObserver(callback);
34
+ observer.observe(target.value, options);
35
+ }
36
+ });
37
+
38
+ onBeforeUnmount(() => {
39
+ cleanup();
40
+ stopWatch();
41
+ });
42
+
43
+ return {
44
+ cleanup,
45
+ };
46
+
47
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @description teleport hook
3
+ * @author 阿怪
4
+ * @date 2023/5/5 10:40
5
+ * @version v1.0.0
6
+ *
7
+ * 江湖的业务千篇一律,复杂的代码好几百行。
8
+ */
9
+ import { h, Teleport, TeleportProps, VNode } from 'vue';
10
+ import { MTeleportProps } from '../../types/common/common';
11
+
12
+ export default function useTeleport(options: {
13
+ teleportProps?: MTeleportProps | true,
14
+ slot: VNode | VNode[]
15
+ }) {
16
+ return h(Teleport, initTeleportOptions(options.teleportProps as TeleportProps), options.slot);
17
+ }
18
+
19
+ export const initTeleportOptions = (options: TeleportProps | true | undefined) => {
20
+ if (options === true || options === undefined) {
21
+ return { to: 'body' };
22
+ }
23
+ return options;
24
+ };
@@ -0,0 +1,73 @@
1
+ /**
2
+ * @description initChecked / getNewModelValue 测试
3
+ * @author 阿怪
4
+ * @date 2026/3/23
5
+ * @version v1.0.0
6
+ *
7
+ * 江湖的业务千篇一律,复杂的代码好几百行。
8
+ */
9
+ import { describe, expect, it } from 'vitest';
10
+ import { initChecked, getNewModelValue } from '../useBooleanInput';
11
+
12
+ describe('initChecked', () => {
13
+ it('checked 为 true 时直接返回 true', () => {
14
+ expect(initChecked({ checked: true, modelValue: undefined, value: undefined })).toBe(true);
15
+ });
16
+
17
+ it('modelValue 为 boolean 时返回该值', () => {
18
+ expect(initChecked({ checked: undefined, modelValue: true, value: undefined })).toBe(true);
19
+ expect(initChecked({ checked: undefined, modelValue: false, value: undefined })).toBe(false);
20
+ });
21
+
22
+ it('modelValue 和 value 相等时返回 true', () => {
23
+ expect(initChecked({ checked: undefined, modelValue: 'a', value: 'a' })).toBe(true);
24
+ });
25
+
26
+ it('modelValue 和 value 不等时返回 false', () => {
27
+ expect(initChecked({ checked: undefined, modelValue: 'a', value: 'b' })).toBe(false);
28
+ });
29
+
30
+ it('modelValue 为数组时,检查 value 是否在数组中', () => {
31
+ expect(initChecked({ checked: undefined, modelValue: ['a', 'b'], value: 'a' })).toBe(true);
32
+ expect(initChecked({ checked: undefined, modelValue: ['a', 'b'], value: 'c' })).toBe(false);
33
+ });
34
+
35
+ it('所有值为空时返回 false', () => {
36
+ expect(initChecked({ checked: undefined, modelValue: undefined, value: undefined })).toBe(false);
37
+ expect(initChecked({ checked: null, modelValue: null, value: null })).toBe(false);
38
+ });
39
+ });
40
+
41
+ describe('getNewModelValue', () => {
42
+ // 有 value 且 modelValue 为数组
43
+ it('checked=true 且 modelValue 为数组时添加 value', () => {
44
+ expect(getNewModelValue({ value: 'c', modelValue: ['a', 'b'] }, true)).toEqual(['a', 'b', 'c']);
45
+ });
46
+
47
+ it('checked=false 且 modelValue 为数组时移除 value', () => {
48
+ expect(getNewModelValue({ value: 'b', modelValue: ['a', 'b'] }, false)).toEqual(['a']);
49
+ });
50
+
51
+ it('不重复添加已存在的 value', () => {
52
+ expect(getNewModelValue({ value: 'a', modelValue: ['a', 'b'] }, true)).toEqual(['a', 'b']);
53
+ });
54
+
55
+ it('移除不存在的 value 不报错', () => {
56
+ expect(getNewModelValue({ value: 'c', modelValue: ['a', 'b'] }, false)).toEqual(['a', 'b']);
57
+ });
58
+
59
+ // 有 value 且 modelValue 非数组
60
+ it('checked=true 返回 value', () => {
61
+ expect(getNewModelValue({ value: 'a', modelValue: undefined }, true)).toBe('a');
62
+ });
63
+
64
+ it('checked=false 返回 undefined', () => {
65
+ expect(getNewModelValue({ value: 'a', modelValue: undefined }, false)).toBeUndefined();
66
+ });
67
+
68
+ // 无 value
69
+ it('无 value 时直接返回 checked 布尔值', () => {
70
+ expect(getNewModelValue({ value: undefined, modelValue: undefined }, true)).toBe(true);
71
+ expect(getNewModelValue({ value: undefined, modelValue: undefined }, false)).toBe(false);
72
+ });
73
+ });