@rainbow-oh/yee-c 0.1.0 → 0.3.0

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 (419) hide show
  1. package/dist/cjs/Alert/alert.js +10 -4
  2. package/dist/cjs/Alert/style/index.less +3 -0
  3. package/dist/cjs/Anchor/anchor-item.js +6 -4
  4. package/dist/cjs/Anchor/anchor.js +38 -22
  5. package/dist/cjs/Anchor/demo/auto.d.ts +11 -0
  6. package/dist/cjs/Anchor/demo/auto.js +85 -0
  7. package/dist/cjs/Anchor/demo/basic.js +7 -1
  8. package/dist/cjs/Anchor/demo/controlled.js +42 -30
  9. package/dist/cjs/Anchor/interface.d.ts +2 -0
  10. package/dist/cjs/Anchor/style/index.less +2 -2
  11. package/dist/cjs/Button/button.d.ts +1 -1
  12. package/dist/cjs/Button/button.js +2 -2
  13. package/dist/cjs/Button/style/index.less +23 -8
  14. package/dist/cjs/Card/demo/collapsible.js +2 -1
  15. package/dist/cjs/Carousel/demo/arrows.js +1 -1
  16. package/dist/cjs/Carousel/demo/autoplay.js +1 -1
  17. package/dist/cjs/Carousel/demo/effect.js +1 -1
  18. package/dist/cjs/Carousel/demo/position.js +1 -1
  19. package/dist/cjs/Checkbox/checkbox-group.js +4 -1
  20. package/dist/cjs/Checkbox/demo/group.js +1 -0
  21. package/dist/cjs/Checkbox/interface.d.ts +5 -0
  22. package/dist/cjs/Checkbox/style/index.less +21 -1
  23. package/dist/cjs/Config-Provider/interface.d.ts +4 -0
  24. package/dist/cjs/Dropdown/demo/placement.js +2 -1
  25. package/dist/cjs/Dropdown/dropdown.js +3 -0
  26. package/dist/cjs/Dropdown/style/index.less +6 -0
  27. package/dist/cjs/Form/Field.js +64 -12
  28. package/dist/cjs/Form/Group.js +3 -2
  29. package/dist/cjs/Form/demo/form-table.js +1 -8
  30. package/dist/cjs/Form/demo/tooltip.d.ts +3 -0
  31. package/dist/cjs/Form/demo/tooltip.js +84 -0
  32. package/dist/cjs/Form/interface.d.ts +51 -2
  33. package/dist/cjs/Form/style/index.less +22 -7
  34. package/dist/cjs/Menu/style/index.less +2 -2
  35. package/dist/cjs/Popconfirm/popconfirm.js +1 -1
  36. package/dist/cjs/Popconfirm/style/index.less +6 -0
  37. package/dist/cjs/Popover/popover.js +1 -1
  38. package/dist/cjs/Popover/style/index.less +6 -0
  39. package/dist/cjs/Progress/progress.js +2 -2
  40. package/dist/cjs/Radio/demo/button.js +1 -0
  41. package/dist/cjs/Radio/interface.d.ts +4 -0
  42. package/dist/cjs/Radio/radio-group.js +28 -14
  43. package/dist/cjs/Radio/radio.js +3 -1
  44. package/dist/cjs/Radio/style/index.less +26 -5
  45. package/dist/cjs/Segmented/demo/basic.d.ts +3 -0
  46. package/dist/cjs/Segmented/demo/basic.js +51 -0
  47. package/dist/cjs/Segmented/demo/block.d.ts +3 -0
  48. package/dist/cjs/Segmented/demo/block.js +49 -0
  49. package/dist/cjs/Segmented/demo/disabled.d.ts +3 -0
  50. package/dist/cjs/Segmented/demo/disabled.js +47 -0
  51. package/dist/cjs/Segmented/demo/size.d.ts +3 -0
  52. package/dist/cjs/Segmented/demo/size.js +37 -0
  53. package/dist/cjs/Segmented/index.d.ts +3 -0
  54. package/dist/cjs/Segmented/index.js +36 -0
  55. package/dist/cjs/Segmented/interface.d.ts +82 -0
  56. package/dist/cjs/Segmented/interface.js +17 -0
  57. package/dist/cjs/Segmented/segmented.d.ts +5 -0
  58. package/dist/cjs/Segmented/segmented.js +177 -0
  59. package/dist/cjs/Segmented/style/index.less +104 -0
  60. package/dist/cjs/Select/option.js +3 -2
  61. package/dist/cjs/Select/options.js +9 -1
  62. package/dist/cjs/Select/select.js +1 -0
  63. package/dist/cjs/Skeleton/demo/basic.js +1 -1
  64. package/dist/cjs/Space/interface.d.ts +4 -0
  65. package/dist/cjs/Space/space.js +36 -16
  66. package/dist/cjs/Spin/spin.js +2 -1
  67. package/dist/cjs/Splitter/demo/basic.js +1 -1
  68. package/dist/cjs/Splitter/demo/vertical.js +23 -1
  69. package/dist/cjs/Splitter/index.d.ts +1 -1
  70. package/dist/cjs/Splitter/interface.d.ts +9 -3
  71. package/dist/cjs/Splitter/splitter-handler.d.ts +1 -1
  72. package/dist/cjs/Splitter/splitter-handler.js +2 -1
  73. package/dist/cjs/Splitter/splitter.d.ts +2 -9
  74. package/dist/cjs/Splitter/splitter.js +53 -50
  75. package/dist/cjs/Splitter/style/index.less +21 -0
  76. package/dist/cjs/Steps/step.js +1 -1
  77. package/dist/cjs/Steps/style/index.less +8 -2
  78. package/dist/cjs/Switch/demo/content.js +22 -1
  79. package/dist/cjs/Switch/style/index.less +16 -0
  80. package/dist/cjs/Switch/switch.js +9 -2
  81. package/dist/cjs/Table/demo/size.js +1 -1
  82. package/dist/cjs/Table/interface.d.ts +5 -1
  83. package/dist/cjs/Table/theader/cell.js +4 -5
  84. package/dist/cjs/Tabs/hooks/useTabScroll.d.ts +1 -1
  85. package/dist/cjs/Tabs/interface.d.ts +1 -1
  86. package/dist/cjs/Tabs/style/index.less +4 -0
  87. package/dist/cjs/Tabs/tab-header/index.js +56 -25
  88. package/dist/cjs/Tag/demo/size.js +1 -1
  89. package/dist/cjs/Tag/style/index.less +1 -0
  90. package/dist/cjs/Tooltip/interface.d.ts +4 -0
  91. package/dist/cjs/Tooltip/style/index.less +8 -8
  92. package/dist/cjs/Tooltip/tooltip.js +11 -3
  93. package/dist/cjs/Tour/demo/basic.d.ts +3 -0
  94. package/dist/cjs/Tour/demo/basic.js +69 -0
  95. package/dist/cjs/Tour/demo/indicators.d.ts +3 -0
  96. package/dist/cjs/Tour/demo/indicators.js +76 -0
  97. package/dist/cjs/Tour/demo/placement.d.ts +3 -0
  98. package/dist/cjs/Tour/demo/placement.js +80 -0
  99. package/dist/cjs/Tour/demo/scroll.d.ts +3 -0
  100. package/dist/cjs/Tour/demo/scroll.js +72 -0
  101. package/dist/cjs/Tour/index.d.ts +3 -0
  102. package/dist/cjs/Tour/index.js +36 -0
  103. package/dist/cjs/Tour/interface.d.ts +118 -0
  104. package/dist/cjs/Tour/interface.js +17 -0
  105. package/dist/cjs/Tour/style/index.less +103 -0
  106. package/dist/cjs/Tour/tour.d.ts +5 -0
  107. package/dist/cjs/Tour/tour.js +403 -0
  108. package/dist/cjs/Tree/demo/checkable.js +6 -6
  109. package/dist/cjs/Tree/demo/draggable.d.ts +3 -0
  110. package/dist/cjs/Tree/demo/draggable.js +88 -0
  111. package/dist/cjs/Tree/demo/expanded.js +6 -6
  112. package/dist/cjs/Tree/index.d.ts +1 -0
  113. package/dist/cjs/Tree/index.js +3 -1
  114. package/dist/cjs/Tree/interface.d.ts +26 -0
  115. package/dist/cjs/Tree/style/index.less +25 -0
  116. package/dist/cjs/Tree/tree-node.js +38 -4
  117. package/dist/cjs/Tree/tree.d.ts +12 -1
  118. package/dist/cjs/Tree/tree.js +174 -18
  119. package/dist/cjs/Tree/utils/tree-tools.d.ts +21 -0
  120. package/dist/cjs/Tree/utils/tree-tools.js +88 -0
  121. package/dist/cjs/Trigger/style/index.less +17 -0
  122. package/dist/cjs/Trigger/trigger.js +3 -1
  123. package/dist/cjs/hooks/useDebounceFunction.d.ts +1 -1
  124. package/dist/cjs/hooks/useLayoutEffect.d.ts +1 -1
  125. package/dist/cjs/index.d.ts +4 -0
  126. package/dist/cjs/index.js +6 -0
  127. package/dist/cjs/locale/interface.d.ts +7 -0
  128. package/dist/cjs/locale/lang/en_US.js +6 -0
  129. package/dist/cjs/locale/lang/ja_JP.js +6 -0
  130. package/dist/cjs/locale/lang/zh_CN.js +6 -0
  131. package/dist/cjs/locale/lang/zh_TW.js +6 -0
  132. package/dist/cjs/style/color.blue.css +1 -1
  133. package/dist/cjs/style/color.crimson.css +1 -1
  134. package/dist/cjs/style/color.css +18 -1
  135. package/dist/cjs/style/size.css +51 -4
  136. package/dist/cjs/style/themes.css +3 -3
  137. package/dist/cjs/style/variables.css +70 -6
  138. package/dist/cjs/utils/debounce.d.ts +6 -1
  139. package/dist/cjs/utils/debounce.js +9 -1
  140. package/dist/cjs/version.d.ts +1 -1
  141. package/dist/cjs/version.js +1 -1
  142. package/dist/esm/Alert/alert.js +24 -8
  143. package/dist/esm/Alert/style/index.less +3 -0
  144. package/dist/esm/Anchor/anchor-item.js +6 -3
  145. package/dist/esm/Anchor/anchor.js +38 -19
  146. package/dist/esm/Anchor/demo/auto.d.ts +11 -0
  147. package/dist/esm/Anchor/demo/auto.js +62 -0
  148. package/dist/esm/Anchor/demo/basic.js +3 -1
  149. package/dist/esm/Anchor/demo/controlled.js +14 -9
  150. package/dist/esm/Anchor/interface.d.ts +2 -0
  151. package/dist/esm/Anchor/style/index.less +2 -2
  152. package/dist/esm/Button/button.d.ts +1 -1
  153. package/dist/esm/Button/button.js +2 -2
  154. package/dist/esm/Button/style/index.less +23 -8
  155. package/dist/esm/Card/demo/collapsible.js +2 -1
  156. package/dist/esm/Carousel/demo/arrows.js +1 -1
  157. package/dist/esm/Carousel/demo/autoplay.js +1 -1
  158. package/dist/esm/Carousel/demo/effect.js +1 -1
  159. package/dist/esm/Carousel/demo/position.js +1 -1
  160. package/dist/esm/Checkbox/checkbox-group.js +4 -2
  161. package/dist/esm/Checkbox/demo/group.js +1 -0
  162. package/dist/esm/Checkbox/interface.d.ts +5 -0
  163. package/dist/esm/Checkbox/style/index.less +21 -1
  164. package/dist/esm/Config-Provider/interface.d.ts +4 -0
  165. package/dist/esm/Dropdown/demo/placement.js +2 -1
  166. package/dist/esm/Dropdown/dropdown.js +6 -1
  167. package/dist/esm/Dropdown/style/index.less +6 -0
  168. package/dist/esm/Form/Field.js +53 -8
  169. package/dist/esm/Form/Group.js +4 -2
  170. package/dist/esm/Form/demo/form-table.js +8 -6
  171. package/dist/esm/Form/demo/tooltip.d.ts +3 -0
  172. package/dist/esm/Form/demo/tooltip.js +59 -0
  173. package/dist/esm/Form/interface.d.ts +51 -2
  174. package/dist/esm/Form/style/index.less +22 -7
  175. package/dist/esm/Menu/style/index.less +2 -2
  176. package/dist/esm/Popconfirm/popconfirm.js +3 -1
  177. package/dist/esm/Popconfirm/style/index.less +6 -0
  178. package/dist/esm/Popover/popover.js +3 -1
  179. package/dist/esm/Popover/style/index.less +6 -0
  180. package/dist/esm/Progress/progress.js +5 -5
  181. package/dist/esm/Radio/demo/button.js +1 -0
  182. package/dist/esm/Radio/interface.d.ts +4 -0
  183. package/dist/esm/Radio/radio-group.js +9 -2
  184. package/dist/esm/Radio/radio.js +3 -1
  185. package/dist/esm/Radio/style/index.less +26 -5
  186. package/dist/esm/Segmented/demo/basic.d.ts +3 -0
  187. package/dist/esm/Segmented/demo/basic.js +33 -0
  188. package/dist/esm/Segmented/demo/block.d.ts +3 -0
  189. package/dist/esm/Segmented/demo/block.js +29 -0
  190. package/dist/esm/Segmented/demo/disabled.d.ts +3 -0
  191. package/dist/esm/Segmented/demo/disabled.js +22 -0
  192. package/dist/esm/Segmented/demo/size.d.ts +3 -0
  193. package/dist/esm/Segmented/demo/size.js +15 -0
  194. package/dist/esm/Segmented/index.d.ts +3 -0
  195. package/dist/esm/Segmented/index.js +2 -0
  196. package/dist/esm/Segmented/interface.d.ts +82 -0
  197. package/dist/esm/Segmented/interface.js +1 -0
  198. package/dist/esm/Segmented/segmented.d.ts +5 -0
  199. package/dist/esm/Segmented/segmented.js +110 -0
  200. package/dist/esm/Segmented/style/index.less +104 -0
  201. package/dist/esm/Select/option.js +4 -2
  202. package/dist/esm/Select/options.js +5 -3
  203. package/dist/esm/Select/select.js +1 -0
  204. package/dist/esm/Skeleton/demo/basic.js +2 -8
  205. package/dist/esm/Space/interface.d.ts +4 -0
  206. package/dist/esm/Space/space.js +24 -13
  207. package/dist/esm/Spin/spin.js +2 -1
  208. package/dist/esm/Splitter/demo/basic.js +2 -0
  209. package/dist/esm/Splitter/demo/vertical.js +13 -5
  210. package/dist/esm/Splitter/index.d.ts +1 -1
  211. package/dist/esm/Splitter/interface.d.ts +9 -3
  212. package/dist/esm/Splitter/splitter-handler.d.ts +1 -1
  213. package/dist/esm/Splitter/splitter-handler.js +3 -1
  214. package/dist/esm/Splitter/splitter.d.ts +2 -9
  215. package/dist/esm/Splitter/splitter.js +59 -56
  216. package/dist/esm/Splitter/style/index.less +21 -0
  217. package/dist/esm/Steps/step.js +4 -1
  218. package/dist/esm/Steps/style/index.less +8 -2
  219. package/dist/esm/Switch/demo/content.js +12 -3
  220. package/dist/esm/Switch/style/index.less +16 -0
  221. package/dist/esm/Switch/switch.js +7 -5
  222. package/dist/esm/Table/demo/size.js +2 -7
  223. package/dist/esm/Table/interface.d.ts +5 -1
  224. package/dist/esm/Table/theader/cell.js +2 -3
  225. package/dist/esm/Tabs/hooks/useTabScroll.d.ts +1 -1
  226. package/dist/esm/Tabs/interface.d.ts +1 -1
  227. package/dist/esm/Tabs/style/index.less +4 -0
  228. package/dist/esm/Tabs/tab-header/index.js +11 -5
  229. package/dist/esm/Tag/demo/size.js +6 -2
  230. package/dist/esm/Tag/style/index.less +1 -0
  231. package/dist/esm/Tooltip/interface.d.ts +4 -0
  232. package/dist/esm/Tooltip/style/index.less +8 -8
  233. package/dist/esm/Tooltip/tooltip.js +14 -2
  234. package/dist/esm/Tour/demo/basic.d.ts +3 -0
  235. package/dist/esm/Tour/demo/basic.js +69 -0
  236. package/dist/esm/Tour/demo/indicators.d.ts +3 -0
  237. package/dist/esm/Tour/demo/indicators.js +73 -0
  238. package/dist/esm/Tour/demo/placement.d.ts +3 -0
  239. package/dist/esm/Tour/demo/placement.js +53 -0
  240. package/dist/esm/Tour/demo/scroll.d.ts +3 -0
  241. package/dist/esm/Tour/demo/scroll.js +58 -0
  242. package/dist/esm/Tour/index.d.ts +3 -0
  243. package/dist/esm/Tour/index.js +2 -0
  244. package/dist/esm/Tour/interface.d.ts +118 -0
  245. package/dist/esm/Tour/interface.js +1 -0
  246. package/dist/esm/Tour/style/index.less +103 -0
  247. package/dist/esm/Tour/tour.d.ts +5 -0
  248. package/dist/esm/Tour/tour.js +383 -0
  249. package/dist/esm/Tree/demo/checkable.js +6 -6
  250. package/dist/esm/Tree/demo/draggable.d.ts +3 -0
  251. package/dist/esm/Tree/demo/draggable.js +61 -0
  252. package/dist/esm/Tree/demo/expanded.js +6 -6
  253. package/dist/esm/Tree/index.d.ts +1 -0
  254. package/dist/esm/Tree/index.js +1 -0
  255. package/dist/esm/Tree/interface.d.ts +26 -0
  256. package/dist/esm/Tree/style/index.less +25 -0
  257. package/dist/esm/Tree/tree-node.js +29 -4
  258. package/dist/esm/Tree/tree.d.ts +12 -1
  259. package/dist/esm/Tree/tree.js +135 -4
  260. package/dist/esm/Tree/utils/tree-tools.d.ts +21 -0
  261. package/dist/esm/Tree/utils/tree-tools.js +128 -1
  262. package/dist/esm/Trigger/style/index.less +17 -0
  263. package/dist/esm/Trigger/trigger.js +4 -3
  264. package/dist/esm/hooks/useDebounceFunction.d.ts +1 -1
  265. package/dist/esm/hooks/useLayoutEffect.d.ts +1 -1
  266. package/dist/esm/index.d.ts +4 -0
  267. package/dist/esm/index.js +4 -0
  268. package/dist/esm/locale/interface.d.ts +7 -0
  269. package/dist/esm/locale/lang/en_US.js +6 -0
  270. package/dist/esm/locale/lang/ja_JP.js +6 -0
  271. package/dist/esm/locale/lang/zh_CN.js +6 -0
  272. package/dist/esm/locale/lang/zh_TW.js +6 -0
  273. package/dist/esm/style/color.blue.css +1 -1
  274. package/dist/esm/style/color.crimson.css +1 -1
  275. package/dist/esm/style/color.css +18 -1
  276. package/dist/esm/style/size.css +51 -4
  277. package/dist/esm/style/themes.css +3 -3
  278. package/dist/esm/style/variables.css +70 -6
  279. package/dist/esm/utils/debounce.d.ts +6 -1
  280. package/dist/esm/utils/debounce.js +9 -2
  281. package/dist/esm/version.d.ts +1 -1
  282. package/dist/esm/version.js +1 -1
  283. package/dist/umd/yee-c.min.css +3 -3
  284. package/dist/umd/yee-c.min.js +1 -1
  285. package/package.json +21 -23
  286. package/src/Alert/alert.tsx +10 -4
  287. package/src/Alert/style/index.less +3 -0
  288. package/src/Anchor/anchor-item.tsx +7 -2
  289. package/src/Anchor/anchor.tsx +49 -23
  290. package/src/Anchor/demo/auto.tsx +55 -0
  291. package/src/Anchor/demo/basic.tsx +7 -1
  292. package/src/Anchor/demo/controlled.tsx +18 -14
  293. package/src/Anchor/index.en-US.md +17 -0
  294. package/src/Anchor/index.zh-CN.md +17 -0
  295. package/src/Anchor/interface.ts +2 -0
  296. package/src/Anchor/style/index.less +2 -2
  297. package/src/Button/button.tsx +2 -2
  298. package/src/Button/style/index.less +23 -8
  299. package/src/Card/demo/collapsible.tsx +1 -0
  300. package/src/Carousel/demo/arrows.tsx +1 -1
  301. package/src/Carousel/demo/autoplay.tsx +1 -1
  302. package/src/Carousel/demo/effect.tsx +1 -1
  303. package/src/Carousel/demo/position.tsx +1 -1
  304. package/src/Checkbox/checkbox-group.tsx +5 -1
  305. package/src/Checkbox/demo/group.tsx +1 -0
  306. package/src/Checkbox/interface.ts +5 -0
  307. package/src/Checkbox/style/index.less +21 -1
  308. package/src/Config-Provider/index.en-US.md +2 -0
  309. package/src/Config-Provider/index.zh-CN.md +2 -0
  310. package/src/Config-Provider/interface.ts +4 -0
  311. package/src/Dropdown/demo/placement.tsx +1 -0
  312. package/src/Dropdown/dropdown.tsx +2 -0
  313. package/src/Dropdown/style/index.less +6 -0
  314. package/src/Form/Field.tsx +70 -9
  315. package/src/Form/Group.tsx +4 -1
  316. package/src/Form/demo/form-table.tsx +7 -7
  317. package/src/Form/demo/tooltip.tsx +72 -0
  318. package/src/Form/form-store.ts +1 -1
  319. package/src/Form/index.en-US.md +6 -0
  320. package/src/Form/index.zh-CN.md +87 -85
  321. package/src/Form/interface.ts +53 -2
  322. package/src/Form/style/index.less +22 -7
  323. package/src/Menu/style/index.less +2 -2
  324. package/src/Popconfirm/popconfirm.tsx +1 -1
  325. package/src/Popconfirm/style/index.less +6 -0
  326. package/src/Popover/popover.tsx +1 -1
  327. package/src/Popover/style/index.less +6 -0
  328. package/src/Progress/progress.tsx +2 -2
  329. package/src/Radio/demo/button.tsx +1 -0
  330. package/src/Radio/index.en-US.md +2 -0
  331. package/src/Radio/index.zh-CN.md +2 -0
  332. package/src/Radio/interface.ts +4 -0
  333. package/src/Radio/radio-group.tsx +9 -1
  334. package/src/Radio/radio.tsx +2 -1
  335. package/src/Radio/style/index.less +26 -5
  336. package/src/Segmented/demo/basic.tsx +24 -0
  337. package/src/Segmented/demo/block.tsx +17 -0
  338. package/src/Segmented/demo/disabled.tsx +18 -0
  339. package/src/Segmented/demo/size.tsx +10 -0
  340. package/src/Segmented/index.en-US.md +47 -0
  341. package/src/Segmented/index.ts +12 -0
  342. package/src/Segmented/index.zh-CN.md +47 -0
  343. package/src/Segmented/interface.ts +87 -0
  344. package/src/Segmented/segmented.tsx +134 -0
  345. package/src/Segmented/style/index.less +104 -0
  346. package/src/Select/option.tsx +2 -1
  347. package/src/Select/options.tsx +7 -2
  348. package/src/Select/select.tsx +1 -0
  349. package/src/Skeleton/demo/basic.tsx +3 -3
  350. package/src/Space/interface.ts +4 -0
  351. package/src/Space/space.tsx +40 -16
  352. package/src/Spin/spin.tsx +1 -0
  353. package/src/Splitter/demo/basic.tsx +2 -2
  354. package/src/Splitter/demo/vertical.tsx +19 -5
  355. package/src/Splitter/index.ts +5 -1
  356. package/src/Splitter/interface.ts +10 -3
  357. package/src/Splitter/splitter-handler.tsx +4 -2
  358. package/src/Splitter/splitter.tsx +55 -60
  359. package/src/Splitter/style/index.less +21 -0
  360. package/src/Steps/step.tsx +1 -1
  361. package/src/Steps/style/index.less +8 -2
  362. package/src/Switch/demo/content.tsx +15 -5
  363. package/src/Switch/style/index.less +16 -0
  364. package/src/Switch/switch.tsx +14 -6
  365. package/src/Table/demo/size.tsx +3 -3
  366. package/src/Table/index.en-US.md +1 -0
  367. package/src/Table/index.zh-CN.md +51 -50
  368. package/src/Table/interface.ts +5 -1
  369. package/src/Table/theader/cell.tsx +2 -9
  370. package/src/Tabs/interface.ts +1 -1
  371. package/src/Tabs/style/index.less +4 -0
  372. package/src/Tabs/tab-header/index.tsx +26 -5
  373. package/src/Tag/demo/size.tsx +2 -2
  374. package/src/Tag/style/index.less +1 -0
  375. package/src/Tooltip/index.en-US.md +1 -0
  376. package/src/Tooltip/index.zh-CN.md +1 -0
  377. package/src/Tooltip/interface.ts +4 -0
  378. package/src/Tooltip/style/index.less +8 -8
  379. package/src/Tooltip/tooltip.tsx +10 -1
  380. package/src/Tour/demo/basic.tsx +52 -0
  381. package/src/Tour/demo/indicators.tsx +63 -0
  382. package/src/Tour/demo/placement.tsx +55 -0
  383. package/src/Tour/demo/scroll.tsx +49 -0
  384. package/src/Tour/index.en-US.md +61 -0
  385. package/src/Tour/index.ts +10 -0
  386. package/src/Tour/index.zh-CN.md +61 -0
  387. package/src/Tour/interface.ts +126 -0
  388. package/src/Tour/style/index.less +103 -0
  389. package/src/Tour/tour.tsx +399 -0
  390. package/src/Tree/demo/checkable.tsx +6 -6
  391. package/src/Tree/demo/draggable.tsx +58 -0
  392. package/src/Tree/demo/expanded.tsx +7 -7
  393. package/src/Tree/index.en-US.md +3 -0
  394. package/src/Tree/index.ts +1 -0
  395. package/src/Tree/index.zh-CN.md +3 -0
  396. package/src/Tree/interface.ts +28 -0
  397. package/src/Tree/style/index.less +25 -0
  398. package/src/Tree/tree-node.tsx +26 -0
  399. package/src/Tree/tree.tsx +183 -2
  400. package/src/Tree/utils/tree-tools.ts +107 -0
  401. package/src/Trigger/style/index.less +17 -0
  402. package/src/Trigger/trigger.tsx +3 -1
  403. package/src/index.ts +6 -0
  404. package/src/locale/interface.ts +9 -0
  405. package/src/locale/lang/en_US.ts +7 -0
  406. package/src/locale/lang/ja_JP.ts +7 -0
  407. package/src/locale/lang/zh_CN.ts +7 -0
  408. package/src/locale/lang/zh_TW.ts +7 -0
  409. package/src/style/color.blue.css +1 -1
  410. package/src/style/color.crimson.css +1 -1
  411. package/src/style/color.css +18 -1
  412. package/src/style/size.css +51 -4
  413. package/src/utils/debounce.ts +22 -3
  414. package/src/version.ts +1 -1
  415. package/dist/cjs/utils/x.d.ts +0 -11
  416. package/dist/cjs/utils/x.js +0 -51
  417. package/dist/esm/utils/x.d.ts +0 -11
  418. package/dist/esm/utils/x.js +0 -49
  419. package/src/utils/x.ts +0 -33
@@ -0,0 +1,103 @@
1
+ @pls: .yee-tour;
2
+
3
+ @{pls} {
4
+ position: fixed;
5
+ inset: 0;
6
+ z-index: var(--yee-tour-mask-z-index);
7
+ pointer-events: none;
8
+
9
+ // ① click-intercept layer (box-shadow receives no pointer events, so a
10
+ // transparent full-screen layer is needed to lock interaction + carry maskClosable)
11
+ &-mask {
12
+ position: absolute;
13
+ inset: 0;
14
+ pointer-events: auto;
15
+ background-color: transparent;
16
+
17
+ // No target to cut out → the mask itself becomes the full-screen dim layer.
18
+ &-full {
19
+ background-color: var(--yee-tour-mask-color);
20
+ }
21
+ }
22
+
23
+ // ② highlight cutout via a huge box-shadow; top/left/width/height come from
24
+ // motion inline styles, position/shape/visuals from here
25
+ &-highlight {
26
+ position: fixed;
27
+ box-sizing: border-box;
28
+ border-radius: var(--yee-tour-highlight-border-radius);
29
+ box-shadow: 0 0 0 9999px var(--yee-tour-mask-color);
30
+ z-index: 1;
31
+ pointer-events: none;
32
+ }
33
+ }
34
+
35
+ // card
36
+ .yee-tour-content {
37
+ position: fixed;
38
+ z-index: 2;
39
+ pointer-events: auto;
40
+ box-sizing: border-box;
41
+ width: var(--yee-tour-content-width);
42
+ max-width: calc(100vw - 48px);
43
+ padding: var(--yee-tour-content-padding);
44
+ background-color: var(--yee-tour-content-bg-color);
45
+ border-radius: var(--yee-tour-content-border-radius);
46
+ box-shadow: var(--yee-tour-content-box-shadow);
47
+
48
+ .yee-tour-close {
49
+ position: absolute;
50
+ top: var(--yee-tour-close-top);
51
+ inset-inline-end: var(--yee-tour-close-right);
52
+ display: inline-flex;
53
+ align-items: center;
54
+ justify-content: center;
55
+ padding: 0;
56
+ border: none;
57
+ background: transparent;
58
+ color: var(--yee-tour-close-color);
59
+ cursor: pointer;
60
+ opacity: 0.55;
61
+ transition: opacity var(--yee-tour-transition-duration) linear;
62
+
63
+ &:hover {
64
+ opacity: 1;
65
+ }
66
+ }
67
+
68
+ .yee-tour-header {
69
+ margin-bottom: var(--yee-tour-header-margin-bottom);
70
+ padding-inline-end: var(--yee-tour-close-size);
71
+ color: var(--yee-tour-title-color);
72
+ font-size: var(--yee-tour-title-font-size);
73
+ font-weight: var(--yee-tour-title-font-weight);
74
+ line-height: var(--yee-tour-title-line-height);
75
+ }
76
+
77
+ .yee-tour-body {
78
+ color: var(--yee-tour-description-color);
79
+ font-size: var(--yee-tour-description-font-size);
80
+ line-height: var(--yee-tour-description-line-height);
81
+ }
82
+
83
+ .yee-tour-footer {
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: space-between;
87
+ gap: var(--yee-tour-button-gap);
88
+ margin-top: var(--yee-tour-footer-margin-top);
89
+ }
90
+
91
+ .yee-tour-indicators {
92
+ display: inline-flex;
93
+ align-items: center;
94
+ gap: var(--yee-tour-indicator-gap);
95
+ }
96
+
97
+ .yee-tour-buttons {
98
+ display: inline-flex;
99
+ align-items: center;
100
+ gap: var(--yee-tour-button-gap);
101
+ margin-left: auto;
102
+ }
103
+ }
@@ -0,0 +1,399 @@
1
+ import clsx from 'clsx';
2
+ import { X } from 'lucide-react';
3
+ import { motion } from 'motion/react';
4
+ import React, {
5
+ useCallback,
6
+ useContext,
7
+ useLayoutEffect,
8
+ useMemo,
9
+ useRef,
10
+ useState,
11
+ } from 'react';
12
+ import { createPortal } from 'react-dom';
13
+ import Button from '../Button';
14
+ import { GlobalContext } from '../Config-Provider';
15
+ import type { Placement } from '../Trigger/interface';
16
+ import useEsc from '../hooks/useEsc';
17
+ import useLatest from '../hooks/useLatest';
18
+ import useMergedState from '../hooks/useMergedState';
19
+ import { useLocale } from '../locale';
20
+ import mergeContextToProps from '../utils/mergeContextToProps';
21
+ import type { TourProps, TourTarget } from './interface';
22
+
23
+ import './style/index.less';
24
+
25
+ const GAP = 12;
26
+
27
+ const resolveTarget = (target: TourTarget | undefined): HTMLElement | null => {
28
+ if (!target) return null;
29
+ if (typeof target === 'function') {
30
+ try {
31
+ return target();
32
+ } catch {
33
+ return null;
34
+ }
35
+ }
36
+ if (typeof target === 'string') {
37
+ if (typeof document === 'undefined') return null;
38
+ return document.querySelector<HTMLElement>(target);
39
+ }
40
+ return target;
41
+ };
42
+
43
+ type TourSide = 'top' | 'bottom' | 'left' | 'right';
44
+ type TourAlign = 'start' | 'center' | 'end';
45
+
46
+ const SIDE_PREFIXES: readonly TourSide[] = ['top', 'bottom', 'left', 'right'];
47
+
48
+ // Split a 12-way Placement into a base side + cross-axis alignment.
49
+ // 'bottom' -> { side: 'bottom', align: 'center' }
50
+ // 'topLeft' -> { side: 'top', align: 'start' }
51
+ // 'leftBottom' -> { side: 'left', align: 'end' }
52
+ const parsePlacement = (
53
+ p: Placement | undefined,
54
+ ): { side: TourSide; align: TourAlign } => {
55
+ if (!p) return { side: 'bottom', align: 'center' };
56
+ const side = SIDE_PREFIXES.find((s) => p.startsWith(s)) ?? 'bottom';
57
+ const rest = p.slice(side.length);
58
+ let align: TourAlign = 'center';
59
+ if (side === 'top' || side === 'bottom') {
60
+ if (rest === 'Left') align = 'start';
61
+ else if (rest === 'Right') align = 'end';
62
+ } else if (rest === 'Top') {
63
+ align = 'start';
64
+ } else if (rest === 'Bottom') {
65
+ align = 'end';
66
+ }
67
+ return { side, align };
68
+ };
69
+
70
+ const OPPOSITE_SIDE: Record<TourSide, TourSide> = {
71
+ top: 'bottom',
72
+ bottom: 'top',
73
+ left: 'right',
74
+ right: 'left',
75
+ };
76
+
77
+ // Compute the card's fixed position from the highlight rect + placement, with
78
+ // viewport flip + clamp. Returning rect's origin while size is unknown lets the
79
+ // caller keep the card hidden until measured.
80
+ const computeCardPos = (
81
+ rect: DOMRect,
82
+ placement: Placement | undefined,
83
+ size: { width: number; height: number },
84
+ gap: number,
85
+ ): { top: number; left: number } => {
86
+ const { width: cw, height: ch } = size;
87
+ const { top, left, width, height } = rect;
88
+
89
+ if (cw === 0 || ch === 0) {
90
+ return { top, left };
91
+ }
92
+
93
+ const vw = window.innerWidth;
94
+ const vh = window.innerHeight;
95
+
96
+ const { side: preferredSide, align } = parsePlacement(placement);
97
+
98
+ // Lay the card out for a given side; align shifts it along the cross axis.
99
+ const layoutFor = (side: TourSide): { top: number; left: number } => {
100
+ if (side === 'top' || side === 'bottom') {
101
+ const main = side === 'top' ? top - ch - gap : top + height + gap;
102
+ let cross: number;
103
+ if (align === 'start') cross = left;
104
+ else if (align === 'end') cross = left + width - cw;
105
+ else cross = left + width / 2 - cw / 2;
106
+ return { top: main, left: cross };
107
+ }
108
+ const main = side === 'left' ? left - cw - gap : left + width + gap;
109
+ let cross: number;
110
+ if (align === 'start') cross = top;
111
+ else if (align === 'end') cross = top + height - ch;
112
+ else cross = top + height / 2 - ch / 2;
113
+ return { top: cross, left: main };
114
+ };
115
+
116
+ // True when the card fits on the main axis for this side.
117
+ const fits = (
118
+ side: TourSide,
119
+ pos: { top: number; left: number },
120
+ ): boolean => {
121
+ if (side === 'top') return pos.top >= gap;
122
+ if (side === 'bottom') return pos.top + ch <= vh - gap;
123
+ if (side === 'left') return pos.left >= gap;
124
+ return pos.left + cw <= vw - gap;
125
+ };
126
+
127
+ let side = preferredSide;
128
+ let pos = layoutFor(side);
129
+
130
+ // Flip to the opposite side when the preferred one overflows and the
131
+ // opposite fits. Alignment is preserved across the flip.
132
+ const flippedSide = OPPOSITE_SIDE[side];
133
+ const flipped = layoutFor(flippedSide);
134
+ if (!fits(side, pos) && fits(flippedSide, flipped)) {
135
+ side = flippedSide;
136
+ pos = flipped;
137
+ }
138
+
139
+ // Clamp into the viewport (mostly fixes cross-axis overflow).
140
+ return {
141
+ top: Math.max(gap, Math.min(pos.top, vh - ch - gap)),
142
+ left: Math.max(gap, Math.min(pos.left, vw - cw - gap)),
143
+ };
144
+ };
145
+
146
+ const Tour: React.FC<TourProps> = (baseprops) => {
147
+ const { tour: tourCtx } = useContext(GlobalContext);
148
+ const props = mergeContextToProps<TourProps>(baseprops, tourCtx);
149
+ const { locale } = useLocale();
150
+ const tourLocale = locale?.tour ?? {
151
+ previous: 'Previous',
152
+ next: 'Next',
153
+ finish: 'Finish',
154
+ skip: 'Skip',
155
+ };
156
+
157
+ const {
158
+ prefixCls = 'yee-tour',
159
+ className,
160
+ style,
161
+ classNames,
162
+ styles,
163
+ open,
164
+ steps = [],
165
+ current,
166
+ defaultCurrent = 0,
167
+ onClose,
168
+ onFinish,
169
+ onChange,
170
+ placement = 'bottom',
171
+ mask = true,
172
+ closable = true,
173
+ closeIcon,
174
+ maskClosable = false,
175
+ indicatorsRender,
176
+ scrollIntoViewOptions = true,
177
+ ...rest
178
+ } = props;
179
+
180
+ const [mergedCurrent, setMergedCurrent] = useMergedState<number>(
181
+ defaultCurrent,
182
+ {
183
+ value: current,
184
+ defaultValue: defaultCurrent,
185
+ },
186
+ );
187
+
188
+ const step = steps[mergedCurrent];
189
+ const total = steps.length;
190
+ const isLast = mergedCurrent >= total - 1;
191
+ const stepPlacement = step?.placement ?? placement;
192
+
193
+ const targetEl = useMemo<HTMLElement | null>(
194
+ () => resolveTarget(step?.target),
195
+ [step, open],
196
+ );
197
+
198
+ const [rect, setRect] = useState<DOMRect | null>(null);
199
+ const rafRef = useRef<number | null>(null);
200
+
201
+ // Keep the latest scrollIntoViewOptions in a ref so the tracking effect below
202
+ // doesn't re-run (and re-scroll) when the caller passes an inline object on
203
+ // every render — that would loop with rAF → setRect → re-render forever.
204
+ const scrollIntoViewOptionsRef = useLatest(scrollIntoViewOptions);
205
+
206
+ // Track target rect: recompute on open / step / scroll / resize (rAF throttled).
207
+ useLayoutEffect(() => {
208
+ if (!open || !targetEl) {
209
+ setRect(null);
210
+ return;
211
+ }
212
+ const update = () => {
213
+ if (rafRef.current !== null) cancelAnimationFrame(rafRef.current);
214
+ rafRef.current = requestAnimationFrame(() => {
215
+ setRect(targetEl.getBoundingClientRect() as DOMRect);
216
+ });
217
+ };
218
+ update();
219
+ // Bring the target into view, but only when it isn't already — the default
220
+ // (`true` ≈ `{ block: 'start' }`) would otherwise yank an already-visible
221
+ // element to the top of the viewport on every step change. A custom options
222
+ // object is honored as-is (its own `nearest` alignment handles the visible
223
+ // case), and `false` disables auto-scroll entirely.
224
+ const scrollTargetIfNeeded = () => {
225
+ const opts = scrollIntoViewOptionsRef.current;
226
+ if (opts === false) return;
227
+ if (opts === true) {
228
+ const vr = targetEl.getBoundingClientRect();
229
+ const inViewport =
230
+ vr.top >= 0 &&
231
+ vr.left >= 0 &&
232
+ vr.bottom <= window.innerHeight &&
233
+ vr.right <= window.innerWidth;
234
+ if (inViewport) return;
235
+ }
236
+ try {
237
+ targetEl.scrollIntoView?.(opts as ScrollIntoViewOptions);
238
+ } catch {
239
+ // noop
240
+ }
241
+ };
242
+ scrollTargetIfNeeded();
243
+ window.addEventListener('resize', update);
244
+ window.addEventListener('scroll', update, true);
245
+ return () => {
246
+ if (rafRef.current !== null) cancelAnimationFrame(rafRef.current);
247
+ window.removeEventListener('resize', update);
248
+ window.removeEventListener('scroll', update, true);
249
+ };
250
+ }, [open, targetEl, mergedCurrent]);
251
+
252
+ useEsc({ enabled: open, onEsc: () => onClose?.() });
253
+
254
+ const handleNext = useCallback(() => {
255
+ if (isLast) {
256
+ onFinish?.();
257
+ return;
258
+ }
259
+ const nextCur = mergedCurrent + 1;
260
+ setMergedCurrent(nextCur);
261
+ onChange?.(nextCur);
262
+ }, [isLast, mergedCurrent, onChange, onFinish, setMergedCurrent]);
263
+
264
+ const handlePrev = useCallback(() => {
265
+ if (mergedCurrent <= 0) return;
266
+ const prevCur = mergedCurrent - 1;
267
+ setMergedCurrent(prevCur);
268
+ onChange?.(prevCur);
269
+ }, [mergedCurrent, onChange, setMergedCurrent]);
270
+
271
+ // Measure the card so we can position it against the highlight rect.
272
+ const cardRef = useRef<HTMLDivElement>(null);
273
+ const [cardSize, setCardSize] = useState({ width: 0, height: 0 });
274
+ useLayoutEffect(() => {
275
+ if (!open) return;
276
+ const node = cardRef.current;
277
+ if (!node) return;
278
+ const r = node.getBoundingClientRect();
279
+ setCardSize({ width: r.width, height: r.height });
280
+ }, [open, step]);
281
+
282
+ const cardPos = useMemo(() => {
283
+ if (!cardSize.width || !cardSize.height) return null;
284
+ if (rect) return computeCardPos(rect, stepPlacement, cardSize, GAP);
285
+ // No target: center the card in the viewport.
286
+ return {
287
+ top: window.innerHeight / 2 - cardSize.height / 2,
288
+ left: window.innerWidth / 2 - cardSize.width / 2,
289
+ };
290
+ }, [rect, stepPlacement, cardSize]);
291
+
292
+ if (!open || typeof document === 'undefined' || !step) {
293
+ return null;
294
+ }
295
+
296
+ return createPortal(
297
+ <div className={clsx(prefixCls, className)} style={style} {...rest}>
298
+ {/* 1 click-intercept mask (box-shadow itself receives no pointer events).
299
+ When there's no target to cut out, the mask dims the full screen. */}
300
+ {mask ? (
301
+ <div
302
+ className={clsx(
303
+ `${prefixCls}-mask`,
304
+ !rect && `${prefixCls}-mask-full`,
305
+ )}
306
+ onClick={maskClosable ? onClose : undefined}
307
+ />
308
+ ) : null}
309
+
310
+ {/* 2 highlight cutout via box-shadow, animated between steps */}
311
+ {mask && rect ? (
312
+ <motion.div
313
+ className={clsx(`${prefixCls}-highlight`, classNames?.highlight)}
314
+ initial={false}
315
+ animate={{
316
+ top: rect.top,
317
+ left: rect.left,
318
+ width: rect.width,
319
+ height: rect.height,
320
+ }}
321
+ transition={{ type: 'spring', visualDuration: 0.3, bounce: 0.2 }}
322
+ style={styles?.highlight}
323
+ />
324
+ ) : null}
325
+
326
+ {/* 3 card: position computed from the highlight rect + placement */}
327
+ <motion.div
328
+ ref={cardRef}
329
+ className={clsx(
330
+ `${prefixCls}-content`,
331
+ classNames?.content,
332
+ step?.className,
333
+ )}
334
+ initial={false}
335
+ animate={
336
+ cardPos
337
+ ? { top: cardPos.top, left: cardPos.left }
338
+ : { top: 0, left: 0 }
339
+ }
340
+ transition={{ type: 'spring', visualDuration: 0.3, bounce: 0.2 }}
341
+ style={{
342
+ position: 'fixed',
343
+ visibility: cardPos ? 'visible' : 'hidden',
344
+ ...(styles?.content as React.CSSProperties),
345
+ }}
346
+ >
347
+ {closable ? (
348
+ <Button
349
+ type="text"
350
+ className={`${prefixCls}-close`}
351
+ onClick={onClose}
352
+ size="small"
353
+ icon={closeIcon ?? <X size={16} />}
354
+ aria-label={tourLocale.skip}
355
+ />
356
+ ) : null}
357
+ {step?.title ? (
358
+ <div
359
+ className={clsx(`${prefixCls}-header`, classNames?.header)}
360
+ style={styles?.header}
361
+ >
362
+ {step.title}
363
+ </div>
364
+ ) : null}
365
+ <div
366
+ className={clsx(`${prefixCls}-body`, classNames?.body)}
367
+ style={styles?.body}
368
+ >
369
+ {step?.description}
370
+ </div>
371
+ <div
372
+ className={clsx(`${prefixCls}-footer`, classNames?.footer)}
373
+ style={styles?.footer}
374
+ >
375
+ <span className={`${prefixCls}-indicators`}>
376
+ {indicatorsRender
377
+ ? indicatorsRender(mergedCurrent, total)
378
+ : `${mergedCurrent + 1} / ${total}`}
379
+ </span>
380
+ <span className={`${prefixCls}-buttons`}>
381
+ {mergedCurrent > 0 ? (
382
+ <Button size="small" onClick={handlePrev}>
383
+ {tourLocale.previous}
384
+ </Button>
385
+ ) : null}
386
+ <Button type="primary" size="small" onClick={handleNext}>
387
+ {isLast ? tourLocale.finish : tourLocale.next}
388
+ </Button>
389
+ </span>
390
+ </div>
391
+ </motion.div>
392
+ </div>,
393
+ document.body,
394
+ );
395
+ };
396
+
397
+ Tour.displayName = 'Tour';
398
+
399
+ export default Tour;
@@ -7,29 +7,29 @@ export default () => {
7
7
  const treeData = [
8
8
  {
9
9
  label: 'parent 1',
10
- key: '0-0',
10
+ key: 1,
11
11
  children: [
12
12
  {
13
13
  label: 'parent 1-0',
14
- key: '0-0-0',
14
+ key: 10,
15
15
  children: [
16
16
  {
17
17
  label: 'leaf',
18
- key: '0-0-0-0',
18
+ key: 100,
19
19
  },
20
20
  {
21
21
  label: 'leaf',
22
- key: '0-0-0-1',
22
+ key: 101,
23
23
  },
24
24
  ],
25
25
  },
26
26
  {
27
27
  label: 'parent 1-1',
28
- key: '0-0-1',
28
+ key: 20,
29
29
  children: [
30
30
  {
31
31
  label: 'leaf',
32
- key: '0-0-1-0',
32
+ key: 201,
33
33
  },
34
34
  ],
35
35
  },
@@ -0,0 +1,58 @@
1
+ import { Tree, moveTreeNode } from '@rainbow-oh/yee-c';
2
+ import React, { useState } from 'react';
3
+
4
+ const FIELD_NAMES = {
5
+ key: 'key',
6
+ label: 'label',
7
+ children: 'children',
8
+ } as const;
9
+
10
+ export default () => {
11
+ const [data, setData] = useState([
12
+ {
13
+ label: 'parent 1',
14
+ key: '0-0',
15
+ children: [
16
+ {
17
+ label: 'parent 1-0',
18
+ key: '0-0-0',
19
+ children: [
20
+ { label: 'leaf-1', key: '0-0-0-0' },
21
+ { label: 'leaf-2', key: '0-0-0-1' },
22
+ ],
23
+ },
24
+ {
25
+ label: 'parent 1-1',
26
+ key: '0-0-1',
27
+ children: [{ label: 'leaf-3', key: '0-0-1-0' }],
28
+ },
29
+ ],
30
+ },
31
+ {
32
+ label: 'parent 2',
33
+ key: '0-1',
34
+ children: [{ label: 'leaf-4', key: '0-1-0' }],
35
+ },
36
+ ]);
37
+
38
+ return (
39
+ <Tree
40
+ draggable
41
+ defaultExpandAll
42
+ dataSource={data}
43
+ onDrop={(info) =>
44
+ setData((prev) =>
45
+ moveTreeNode(
46
+ prev,
47
+ {
48
+ dragKey: info.dragKey,
49
+ dropKey: info.dropKey,
50
+ position: info.position,
51
+ },
52
+ FIELD_NAMES,
53
+ ),
54
+ )
55
+ }
56
+ />
57
+ );
58
+ };
@@ -6,29 +6,29 @@ export default () => {
6
6
 
7
7
  const treeData = [
8
8
  {
9
- title: 'parent 1',
9
+ label: 'parent 1',
10
10
  key: '0-0',
11
11
  children: [
12
12
  {
13
- title: 'parent 1-0',
13
+ label: 'parent 1-0',
14
14
  key: '0-0-0',
15
15
  children: [
16
16
  {
17
- title: 'leaf',
17
+ label: 'leaf',
18
18
  key: '0-0-0-0',
19
19
  },
20
20
  {
21
- title: 'leaf',
21
+ label: 'leaf',
22
22
  key: '0-0-0-1',
23
23
  },
24
24
  ],
25
25
  },
26
26
  {
27
- title: 'parent 1-1',
27
+ label: 'parent 1-1',
28
28
  key: '0-0-1',
29
29
  children: [
30
30
  {
31
- title: 'leaf',
31
+ label: 'leaf',
32
32
  key: '0-0-1-0',
33
33
  },
34
34
  ],
@@ -39,7 +39,7 @@ export default () => {
39
39
 
40
40
  const handleExpandAll = () => {
41
41
  type TreeNodeData = {
42
- title: string;
42
+ label: string;
43
43
  key: string;
44
44
  children?: TreeNodeData[];
45
45
  };
@@ -20,6 +20,7 @@ Tree is a hierarchical data display component.
20
20
  <code src="./demo/icon.tsx" title="Icon" description="Tree with custom icons"></code>
21
21
  <code src="./demo/line.tsx" title="Line" description="Tree with connecting lines"></code>
22
22
  <code src="./demo/expanded.tsx" title="Expanded" description="Controlled expanded tree"></code>
23
+ <code src="./demo/draggable.tsx" title="Draggable" description="Drag and drop to reorder"></code>
23
24
 
24
25
  ## API
25
26
 
@@ -36,6 +37,8 @@ Tree is a hierarchical data display component.
36
37
  | expandedKeys | `string[]` | Controlled expanded tree nodes | - |
37
38
  | disabled | `boolean` | Disabled | - |
38
39
  | draggable | `boolean` | Whether allow drag | - |
40
+ | allowDrop | `(info: { dragNode: T; dropNode: T; position: 'before' \| 'after' \| 'inside' }) => boolean` | Whether to allow dropping at the given position; return false to forbid (shows no-drop cursor) | - |
41
+ | onDrop | `(info: { dragNode: T; dropNode: T; dragKey: string \| number; dropKey: string \| number; position: 'before' \| 'after' \| 'inside'; dropToGap: boolean }) => void` | Callback after a node is dropped. Controlled: reorder `dataSource` yourself, e.g. with the exported `moveTreeNode` helper. When dropping `inside` while `expandedKeys` is controlled, add the `dropKey` to the expanded set yourself | - |
39
42
  | showLine | `boolean` | Show connecting lines | - |
40
43
  | showIcon | `boolean` | Show node icons | `true` |
41
44
  | icon | `React.ReactNode \| ((props: TreeProps<T>) => React.ReactNode)` | Icon before title (requires showIcon) | - |
package/src/Tree/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import Tree from './tree';
2
2
 
3
3
  export type { TreeProps } from './interface';
4
+ export { moveTreeNode } from './utils/tree-tools';
4
5
  export default Tree;
@@ -20,6 +20,7 @@ toc: 'content'
20
20
  <code src="./demo/icon.tsx" title="自定义图标" description="带自定义图标的树"></code>
21
21
  <code src="./demo/line.tsx" title="连接线" description="带连接线的树"></code>
22
22
  <code src="./demo/expanded.tsx" title="受控展开" description="受控展开的树"></code>
23
+ <code src="./demo/draggable.tsx" title="拖拽排序" description="拖拽节点进行排序"></code>
23
24
 
24
25
  ## API
25
26
 
@@ -36,6 +37,8 @@ toc: 'content'
36
37
  | expandedKeys | `string[]` | 受控展开的树节点 | - |
37
38
  | disabled | `boolean` | 禁用 | - |
38
39
  | draggable | `boolean` | 是否允许拖拽 | - |
40
+ | allowDrop | `(info: { dragNode: T; dropNode: T; position: 'before' \| 'after' \| 'inside' }) => boolean` | 是否允许在指定位置放置,返回 false 则禁止(显示禁止符) | - |
41
+ | onDrop | `(info: { dragNode: T; dropNode: T; dragKey: string \| number; dropKey: string \| number; position: 'before' \| 'after' \| 'inside'; dropToGap: boolean }) => void` | 拖拽完成回调。受控模式需自行重排 `dataSource`,可配合导出的 `moveTreeNode` 工具。当 `expandedKeys` 受控且以 `inside` 方式放置时,需自行把 `dropKey` 加入展开集合 | - |
39
42
  | showLine | `boolean` | 是否显示连接线 | - |
40
43
  | showIcon | `boolean` | 是否显示节点图标 | `true` |
41
44
  | icon | `React.ReactNode \| ((props: TreeProps<T>) => React.ReactNode)` | 标题前的图标,需设置showIcon为true | - |