@chenzy-design/svelte 0.3.0 → 0.4.1

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 (1299) hide show
  1. package/dist/_floating/use-floating.d.ts +6 -0
  2. package/dist/_floating/use-floating.d.ts.map +1 -1
  3. package/dist/_floating/use-floating.js +38 -0
  4. package/dist/ai-chat-dialogue/AIChatDialogue.svelte +243 -0
  5. package/dist/ai-chat-dialogue/AIChatDialogue.svelte.d.ts +60 -0
  6. package/dist/ai-chat-dialogue/AIChatDialogue.svelte.d.ts.map +1 -0
  7. package/dist/ai-chat-dialogue/ContentItemRenderer.svelte +318 -0
  8. package/dist/ai-chat-dialogue/ContentItemRenderer.svelte.d.ts +18 -0
  9. package/dist/ai-chat-dialogue/ContentItemRenderer.svelte.d.ts.map +1 -0
  10. package/dist/ai-chat-dialogue/DialogueBox.svelte +403 -0
  11. package/dist/ai-chat-dialogue/DialogueBox.svelte.d.ts +50 -0
  12. package/dist/ai-chat-dialogue/DialogueBox.svelte.d.ts.map +1 -0
  13. package/dist/ai-chat-dialogue/index.d.ts +8 -0
  14. package/dist/ai-chat-dialogue/index.d.ts.map +1 -0
  15. package/dist/ai-chat-dialogue/index.js +6 -0
  16. package/dist/ai-chat-dialogue/meta.d.ts +174 -0
  17. package/dist/ai-chat-dialogue/meta.d.ts.map +1 -0
  18. package/dist/ai-chat-dialogue/meta.js +66 -0
  19. package/dist/ai-chat-dialogue/render-config.d.ts +57 -0
  20. package/dist/ai-chat-dialogue/render-config.d.ts.map +1 -0
  21. package/dist/ai-chat-input/AIChatInput.svelte +1196 -0
  22. package/dist/ai-chat-input/AIChatInput.svelte.d.ts +146 -0
  23. package/dist/ai-chat-input/AIChatInput.svelte.d.ts.map +1 -0
  24. package/dist/ai-chat-input/AIChatInputConfigureButton.svelte +94 -0
  25. package/dist/ai-chat-input/AIChatInputConfigureButton.svelte.d.ts +17 -0
  26. package/dist/ai-chat-input/AIChatInputConfigureButton.svelte.d.ts.map +1 -0
  27. package/dist/ai-chat-input/AIChatInputConfigureItem.svelte +40 -0
  28. package/dist/ai-chat-input/AIChatInputConfigureItem.svelte.d.ts +16 -0
  29. package/dist/ai-chat-input/AIChatInputConfigureItem.svelte.d.ts.map +1 -0
  30. package/dist/ai-chat-input/AIChatInputConfigureMcp.svelte +94 -0
  31. package/dist/ai-chat-input/AIChatInputConfigureMcp.svelte.d.ts +18 -0
  32. package/dist/ai-chat-input/AIChatInputConfigureMcp.svelte.d.ts.map +1 -0
  33. package/dist/ai-chat-input/AIChatInputConfigureRadioButton.svelte +52 -0
  34. package/dist/ai-chat-input/AIChatInputConfigureRadioButton.svelte.d.ts +17 -0
  35. package/dist/ai-chat-input/AIChatInputConfigureRadioButton.svelte.d.ts.map +1 -0
  36. package/dist/ai-chat-input/AIChatInputConfigureSelect.svelte +50 -0
  37. package/dist/ai-chat-input/AIChatInputConfigureSelect.svelte.d.ts +16 -0
  38. package/dist/ai-chat-input/AIChatInputConfigureSelect.svelte.d.ts.map +1 -0
  39. package/dist/ai-chat-input/InputSlotNode.svelte +50 -0
  40. package/dist/ai-chat-input/InputSlotNode.svelte.d.ts +5 -0
  41. package/dist/ai-chat-input/InputSlotNode.svelte.d.ts.map +1 -0
  42. package/dist/ai-chat-input/SelectSlotNode.svelte +54 -0
  43. package/dist/ai-chat-input/SelectSlotNode.svelte.d.ts +5 -0
  44. package/dist/ai-chat-input/SelectSlotNode.svelte.d.ts.map +1 -0
  45. package/dist/ai-chat-input/SkillSlotNode.svelte +82 -0
  46. package/dist/ai-chat-input/SkillSlotNode.svelte.d.ts +5 -0
  47. package/dist/ai-chat-input/SkillSlotNode.svelte.d.ts.map +1 -0
  48. package/dist/ai-chat-input/configure-context.d.ts +12 -0
  49. package/dist/ai-chat-input/configure-context.d.ts.map +1 -0
  50. package/dist/ai-chat-input/configure-context.js +14 -0
  51. package/dist/ai-chat-input/index.d.ts +9 -0
  52. package/dist/ai-chat-input/index.d.ts.map +1 -0
  53. package/dist/ai-chat-input/index.js +9 -0
  54. package/dist/ai-chat-input/input-slot-extension.d.ts +18 -0
  55. package/dist/ai-chat-input/input-slot-extension.d.ts.map +1 -0
  56. package/dist/ai-chat-input/input-slot-extension.js +55 -0
  57. package/dist/ai-chat-input/input-slot-plugins.d.ts +34 -0
  58. package/dist/ai-chat-input/input-slot-plugins.d.ts.map +1 -0
  59. package/dist/ai-chat-input/input-slot-plugins.js +478 -0
  60. package/dist/ai-chat-input/meta.d.ts +284 -0
  61. package/dist/ai-chat-input/meta.d.ts.map +1 -0
  62. package/dist/ai-chat-input/meta.js +106 -0
  63. package/dist/ai-chat-input/select-slot-extension.d.ts +16 -0
  64. package/dist/ai-chat-input/select-slot-extension.d.ts.map +1 -0
  65. package/dist/ai-chat-input/select-slot-extension.js +35 -0
  66. package/dist/ai-chat-input/skill-slot-extension.d.ts +22 -0
  67. package/dist/ai-chat-input/skill-slot-extension.d.ts.map +1 -0
  68. package/dist/ai-chat-input/skill-slot-extension.js +46 -0
  69. package/dist/anchor/Anchor.svelte +393 -242
  70. package/dist/anchor/Anchor.svelte.d.ts +40 -17
  71. package/dist/anchor/Anchor.svelte.d.ts.map +1 -1
  72. package/dist/anchor/AnchorLink.svelte +226 -0
  73. package/dist/anchor/AnchorLink.svelte.d.ts +19 -0
  74. package/dist/anchor/AnchorLink.svelte.d.ts.map +1 -0
  75. package/dist/anchor/context.d.ts +43 -0
  76. package/dist/anchor/context.d.ts.map +1 -0
  77. package/dist/anchor/context.js +26 -0
  78. package/dist/anchor/index.d.ts +11 -2
  79. package/dist/anchor/index.d.ts.map +1 -1
  80. package/dist/anchor/index.js +10 -1
  81. package/dist/anchor/meta.d.ts +92 -43
  82. package/dist/anchor/meta.d.ts.map +1 -1
  83. package/dist/anchor/meta.js +124 -38
  84. package/dist/anchor/types.d.ts +32 -5
  85. package/dist/anchor/types.d.ts.map +1 -1
  86. package/dist/audio-player/AudioPlayer.svelte +614 -0
  87. package/dist/audio-player/AudioPlayer.svelte.d.ts +21 -0
  88. package/dist/audio-player/AudioPlayer.svelte.d.ts.map +1 -0
  89. package/dist/audio-player/AudioSlider.svelte +162 -0
  90. package/dist/audio-player/AudioSlider.svelte.d.ts +20 -0
  91. package/dist/audio-player/AudioSlider.svelte.d.ts.map +1 -0
  92. package/dist/audio-player/index.d.ts +3 -0
  93. package/dist/audio-player/index.d.ts.map +1 -0
  94. package/dist/audio-player/index.js +2 -0
  95. package/dist/audio-player/meta.d.ts +74 -0
  96. package/dist/audio-player/meta.d.ts.map +1 -0
  97. package/dist/audio-player/meta.js +96 -0
  98. package/dist/autocomplete/AutoComplete.svelte +307 -411
  99. package/dist/autocomplete/AutoComplete.svelte.d.ts +52 -47
  100. package/dist/autocomplete/AutoComplete.svelte.d.ts.map +1 -1
  101. package/dist/autocomplete/meta.d.ts +150 -34
  102. package/dist/autocomplete/meta.d.ts.map +1 -1
  103. package/dist/autocomplete/meta.js +43 -21
  104. package/dist/avatar/Avatar.svelte +784 -211
  105. package/dist/avatar/Avatar.svelte.d.ts +28 -23
  106. package/dist/avatar/Avatar.svelte.d.ts.map +1 -1
  107. package/dist/avatar/AvatarGroup.svelte +151 -70
  108. package/dist/avatar/AvatarGroup.svelte.d.ts +16 -17
  109. package/dist/avatar/AvatarGroup.svelte.d.ts.map +1 -1
  110. package/dist/avatar/TopSlotSvg.svelte +62 -0
  111. package/dist/avatar/TopSlotSvg.svelte.d.ts +8 -0
  112. package/dist/avatar/TopSlotSvg.svelte.d.ts.map +1 -0
  113. package/dist/avatar/context.d.ts +28 -1
  114. package/dist/avatar/context.d.ts.map +1 -1
  115. package/dist/avatar/index.d.ts +2 -1
  116. package/dist/avatar/index.d.ts.map +1 -1
  117. package/dist/avatar/meta.d.ts +124 -36
  118. package/dist/avatar/meta.d.ts.map +1 -1
  119. package/dist/avatar/meta.js +117 -24
  120. package/dist/back-top/BackTop.svelte +81 -231
  121. package/dist/back-top/BackTop.svelte.d.ts +10 -33
  122. package/dist/back-top/BackTop.svelte.d.ts.map +1 -1
  123. package/dist/back-top/meta.d.ts +23 -72
  124. package/dist/back-top/meta.d.ts.map +1 -1
  125. package/dist/back-top/meta.js +19 -79
  126. package/dist/badge/Badge.svelte +187 -249
  127. package/dist/badge/Badge.svelte.d.ts +23 -14
  128. package/dist/badge/Badge.svelte.d.ts.map +1 -1
  129. package/dist/badge/meta.d.ts +52 -44
  130. package/dist/badge/meta.d.ts.map +1 -1
  131. package/dist/badge/meta.js +35 -33
  132. package/dist/banner/Banner.svelte +189 -274
  133. package/dist/banner/Banner.svelte.d.ts +20 -23
  134. package/dist/banner/Banner.svelte.d.ts.map +1 -1
  135. package/dist/banner/index.d.ts +2 -1
  136. package/dist/banner/index.d.ts.map +1 -1
  137. package/dist/banner/meta.d.ts +41 -87
  138. package/dist/banner/meta.d.ts.map +1 -1
  139. package/dist/banner/meta.js +59 -79
  140. package/dist/breadcrumb/Breadcrumb.svelte +240 -118
  141. package/dist/breadcrumb/Breadcrumb.svelte.d.ts +35 -19
  142. package/dist/breadcrumb/Breadcrumb.svelte.d.ts.map +1 -1
  143. package/dist/breadcrumb/Item.svelte +5 -5
  144. package/dist/breadcrumb/meta.d.ts +26 -19
  145. package/dist/breadcrumb/meta.d.ts.map +1 -1
  146. package/dist/breadcrumb/meta.js +51 -16
  147. package/dist/breadcrumb/types.d.ts +11 -1
  148. package/dist/breadcrumb/types.d.ts.map +1 -1
  149. package/dist/button/BaseButton.svelte +479 -0
  150. package/dist/button/BaseButton.svelte.d.ts +29 -0
  151. package/dist/button/BaseButton.svelte.d.ts.map +1 -0
  152. package/dist/button/Button.svelte +166 -296
  153. package/dist/button/Button.svelte.d.ts +12 -7
  154. package/dist/button/Button.svelte.d.ts.map +1 -1
  155. package/dist/button/ButtonGroup.svelte +66 -20
  156. package/dist/button/ButtonGroup.svelte.d.ts.map +1 -1
  157. package/dist/button/SplitButtonGroup.svelte +64 -101
  158. package/dist/button/SplitButtonGroup.svelte.d.ts +1 -21
  159. package/dist/button/SplitButtonGroup.svelte.d.ts.map +1 -1
  160. package/dist/button/meta.d.ts +28 -68
  161. package/dist/button/meta.d.ts.map +1 -1
  162. package/dist/button/meta.js +33 -24
  163. package/dist/calendar/Calendar.svelte +928 -1172
  164. package/dist/calendar/Calendar.svelte.d.ts +34 -104
  165. package/dist/calendar/Calendar.svelte.d.ts.map +1 -1
  166. package/dist/calendar/meta.d.ts +78 -168
  167. package/dist/calendar/meta.d.ts.map +1 -1
  168. package/dist/calendar/meta.js +123 -78
  169. package/dist/card/Card.svelte +171 -233
  170. package/dist/card/Card.svelte.d.ts +30 -24
  171. package/dist/card/Card.svelte.d.ts.map +1 -1
  172. package/dist/card/CardGroup.svelte +74 -0
  173. package/dist/card/CardGroup.svelte.d.ts +20 -0
  174. package/dist/card/CardGroup.svelte.d.ts.map +1 -0
  175. package/dist/card/CardMeta.svelte +38 -28
  176. package/dist/card/CardMeta.svelte.d.ts +5 -0
  177. package/dist/card/CardMeta.svelte.d.ts.map +1 -1
  178. package/dist/card/index.d.ts +3 -1
  179. package/dist/card/index.d.ts.map +1 -1
  180. package/dist/card/index.js +7 -2
  181. package/dist/card/meta.d.ts +177 -75
  182. package/dist/card/meta.d.ts.map +1 -1
  183. package/dist/card/meta.js +102 -45
  184. package/dist/carousel/Carousel.svelte +569 -569
  185. package/dist/carousel/Carousel.svelte.d.ts +37 -29
  186. package/dist/carousel/Carousel.svelte.d.ts.map +1 -1
  187. package/dist/carousel/meta.d.ts +73 -65
  188. package/dist/carousel/meta.d.ts.map +1 -1
  189. package/dist/carousel/meta.js +85 -43
  190. package/dist/cascader/Cascader.svelte +725 -391
  191. package/dist/cascader/Cascader.svelte.d.ts +48 -24
  192. package/dist/cascader/Cascader.svelte.d.ts.map +1 -1
  193. package/dist/cascader/meta.d.ts +281 -32
  194. package/dist/cascader/meta.d.ts.map +1 -1
  195. package/dist/cascader/meta.js +85 -12
  196. package/dist/chat/Chat.svelte +483 -0
  197. package/dist/chat/Chat.svelte.d.ts +76 -0
  198. package/dist/chat/Chat.svelte.d.ts.map +1 -0
  199. package/dist/chat/ChatBox.svelte +207 -0
  200. package/dist/chat/ChatBox.svelte.d.ts +26 -0
  201. package/dist/chat/ChatBox.svelte.d.ts.map +1 -0
  202. package/dist/chat/ChatBoxAction.svelte +190 -0
  203. package/dist/chat/ChatBoxAction.svelte.d.ts +18 -0
  204. package/dist/chat/ChatBoxAction.svelte.d.ts.map +1 -0
  205. package/dist/chat/ChatBoxAvatar.svelte +40 -0
  206. package/dist/chat/ChatBoxAvatar.svelte.d.ts +13 -0
  207. package/dist/chat/ChatBoxAvatar.svelte.d.ts.map +1 -0
  208. package/dist/chat/ChatBoxContent.svelte +238 -0
  209. package/dist/chat/ChatBoxContent.svelte.d.ts +17 -0
  210. package/dist/chat/ChatBoxContent.svelte.d.ts.map +1 -0
  211. package/dist/chat/ChatBoxTitle.svelte +40 -0
  212. package/dist/chat/ChatBoxTitle.svelte.d.ts +13 -0
  213. package/dist/chat/ChatBoxTitle.svelte.d.ts.map +1 -0
  214. package/dist/chat/ChatCode.svelte +139 -0
  215. package/dist/chat/ChatCode.svelte.d.ts +9 -0
  216. package/dist/chat/ChatCode.svelte.d.ts.map +1 -0
  217. package/dist/chat/Hint.svelte +82 -0
  218. package/dist/chat/Hint.svelte.d.ts +13 -0
  219. package/dist/chat/Hint.svelte.d.ts.map +1 -0
  220. package/dist/chat/InputBox.svelte +365 -0
  221. package/dist/chat/InputBox.svelte.d.ts +30 -0
  222. package/dist/chat/InputBox.svelte.d.ts.map +1 -0
  223. package/dist/chat/index.d.ts +7 -0
  224. package/dist/chat/index.d.ts.map +1 -0
  225. package/dist/chat/index.js +5 -0
  226. package/dist/chat/meta.d.ts +297 -0
  227. package/dist/chat/meta.d.ts.map +1 -0
  228. package/dist/chat/meta.js +230 -0
  229. package/dist/chat/types.d.ts +94 -0
  230. package/dist/chat/types.d.ts.map +1 -0
  231. package/dist/chat/types.js +1 -0
  232. package/dist/checkbox/Checkbox.svelte +339 -148
  233. package/dist/checkbox/Checkbox.svelte.d.ts +27 -8
  234. package/dist/checkbox/Checkbox.svelte.d.ts.map +1 -1
  235. package/dist/checkbox/CheckboxGroup.svelte +52 -20
  236. package/dist/checkbox/CheckboxGroup.svelte.d.ts +7 -4
  237. package/dist/checkbox/CheckboxGroup.svelte.d.ts.map +1 -1
  238. package/dist/checkbox/context.d.ts +17 -7
  239. package/dist/checkbox/context.d.ts.map +1 -1
  240. package/dist/checkbox/index.d.ts +1 -1
  241. package/dist/checkbox/index.d.ts.map +1 -1
  242. package/dist/checkbox/meta.d.ts +49 -22
  243. package/dist/checkbox/meta.d.ts.map +1 -1
  244. package/dist/checkbox/meta.js +15 -13
  245. package/dist/code-highlight/CodeHighlight.svelte +298 -0
  246. package/dist/code-highlight/CodeHighlight.svelte.d.ts +18 -0
  247. package/dist/code-highlight/CodeHighlight.svelte.d.ts.map +1 -0
  248. package/dist/code-highlight/index.d.ts +4 -0
  249. package/dist/code-highlight/index.d.ts.map +1 -0
  250. package/dist/code-highlight/index.js +3 -0
  251. package/dist/code-highlight/meta.d.ts +61 -0
  252. package/dist/code-highlight/meta.d.ts.map +1 -0
  253. package/dist/code-highlight/meta.js +51 -0
  254. package/dist/code-highlight/prism-modules.d.ts +15 -0
  255. package/dist/collapse/Collapse.svelte +134 -324
  256. package/dist/collapse/Collapse.svelte.d.ts +24 -38
  257. package/dist/collapse/Collapse.svelte.d.ts.map +1 -1
  258. package/dist/collapse/CollapsePanel.svelte +143 -73
  259. package/dist/collapse/CollapsePanel.svelte.d.ts +16 -7
  260. package/dist/collapse/CollapsePanel.svelte.d.ts.map +1 -1
  261. package/dist/collapse/context.d.ts +18 -32
  262. package/dist/collapse/context.d.ts.map +1 -1
  263. package/dist/collapse/index.d.ts +1 -2
  264. package/dist/collapse/index.d.ts.map +1 -1
  265. package/dist/collapse/meta.d.ts +71 -54
  266. package/dist/collapse/meta.d.ts.map +1 -1
  267. package/dist/collapse/meta.js +55 -52
  268. package/dist/collapsible/Collapsible.svelte +224 -0
  269. package/dist/collapsible/Collapsible.svelte.d.ts +35 -0
  270. package/dist/collapsible/Collapsible.svelte.d.ts.map +1 -0
  271. package/dist/collapsible/index.d.ts +3 -0
  272. package/dist/collapsible/index.d.ts.map +1 -0
  273. package/dist/collapsible/index.js +2 -0
  274. package/dist/collapsible/meta.d.ts +115 -0
  275. package/dist/collapsible/meta.d.ts.map +1 -0
  276. package/dist/collapsible/meta.js +89 -0
  277. package/dist/color-picker/ColorPicker.svelte +395 -839
  278. package/dist/color-picker/ColorPicker.svelte.d.ts +29 -39
  279. package/dist/color-picker/ColorPicker.svelte.d.ts.map +1 -1
  280. package/dist/color-picker/index.d.ts +1 -0
  281. package/dist/color-picker/index.d.ts.map +1 -1
  282. package/dist/color-picker/index.js +1 -0
  283. package/dist/color-picker/meta.d.ts +43 -90
  284. package/dist/color-picker/meta.d.ts.map +1 -1
  285. package/dist/color-picker/meta.js +49 -37
  286. package/dist/components.d.ts +1773 -422
  287. package/dist/components.json +17159 -9219
  288. package/dist/config-provider/ConfigProvider.svelte +186 -151
  289. package/dist/config-provider/ConfigProvider.svelte.d.ts +12 -44
  290. package/dist/config-provider/ConfigProvider.svelte.d.ts.map +1 -1
  291. package/dist/config-provider/context.d.ts +21 -13
  292. package/dist/config-provider/context.d.ts.map +1 -1
  293. package/dist/config-provider/index.d.ts +9 -7
  294. package/dist/config-provider/index.d.ts.map +1 -1
  295. package/dist/config-provider/index.js +21 -7
  296. package/dist/config-provider/meta.d.ts +30 -75
  297. package/dist/config-provider/meta.d.ts.map +1 -1
  298. package/dist/config-provider/meta.js +30 -73
  299. package/dist/cropper/Cropper.svelte +536 -0
  300. package/dist/cropper/Cropper.svelte.d.ts +47 -0
  301. package/dist/cropper/Cropper.svelte.d.ts.map +1 -0
  302. package/dist/cropper/index.d.ts +4 -0
  303. package/dist/cropper/index.d.ts.map +1 -0
  304. package/dist/cropper/index.js +2 -0
  305. package/dist/cropper/meta.d.ts +136 -0
  306. package/dist/cropper/meta.d.ts.map +1 -0
  307. package/dist/cropper/meta.js +97 -0
  308. package/dist/date-picker/DatePicker.svelte +1646 -360
  309. package/dist/date-picker/DatePicker.svelte.d.ts +90 -37
  310. package/dist/date-picker/DatePicker.svelte.d.ts.map +1 -1
  311. package/dist/date-picker/index.d.ts +0 -2
  312. package/dist/date-picker/index.d.ts.map +1 -1
  313. package/dist/date-picker/index.js +0 -2
  314. package/dist/date-picker/meta.d.ts +309 -26
  315. package/dist/date-picker/meta.d.ts.map +1 -1
  316. package/dist/date-picker/meta.js +89 -14
  317. package/dist/descriptions/Descriptions.svelte +213 -223
  318. package/dist/descriptions/Descriptions.svelte.d.ts +16 -25
  319. package/dist/descriptions/Descriptions.svelte.d.ts.map +1 -1
  320. package/dist/descriptions/DescriptionsItem.svelte +58 -28
  321. package/dist/descriptions/DescriptionsItem.svelte.d.ts +12 -4
  322. package/dist/descriptions/DescriptionsItem.svelte.d.ts.map +1 -1
  323. package/dist/descriptions/context.d.ts +9 -5
  324. package/dist/descriptions/context.d.ts.map +1 -1
  325. package/dist/descriptions/index.d.ts +2 -2
  326. package/dist/descriptions/index.d.ts.map +1 -1
  327. package/dist/descriptions/meta.d.ts +51 -49
  328. package/dist/descriptions/meta.d.ts.map +1 -1
  329. package/dist/descriptions/meta.js +41 -20
  330. package/dist/descriptions/types.d.ts +13 -3
  331. package/dist/descriptions/types.d.ts.map +1 -1
  332. package/dist/divider/Divider.svelte +86 -94
  333. package/dist/divider/Divider.svelte.d.ts +2 -2
  334. package/dist/divider/Divider.svelte.d.ts.map +1 -1
  335. package/dist/divider/meta.d.ts +19 -25
  336. package/dist/divider/meta.d.ts.map +1 -1
  337. package/dist/divider/meta.js +29 -11
  338. package/dist/drag-move/DragMove.svelte +106 -0
  339. package/dist/drag-move/DragMove.svelte.d.ts +30 -0
  340. package/dist/drag-move/DragMove.svelte.d.ts.map +1 -0
  341. package/dist/drag-move/index.d.ts +4 -0
  342. package/dist/drag-move/index.d.ts.map +1 -0
  343. package/dist/drag-move/index.js +3 -0
  344. package/dist/drag-move/meta.d.ts +102 -0
  345. package/dist/drag-move/meta.d.ts.map +1 -0
  346. package/dist/drag-move/meta.js +77 -0
  347. package/dist/dropdown/Dropdown.svelte +426 -344
  348. package/dist/dropdown/Dropdown.svelte.d.ts +55 -58
  349. package/dist/dropdown/Dropdown.svelte.d.ts.map +1 -1
  350. package/dist/dropdown/DropdownDivider.svelte +20 -8
  351. package/dist/dropdown/DropdownDivider.svelte.d.ts +7 -16
  352. package/dist/dropdown/DropdownDivider.svelte.d.ts.map +1 -1
  353. package/dist/dropdown/DropdownItem.svelte +163 -91
  354. package/dist/dropdown/DropdownItem.svelte.d.ts +25 -11
  355. package/dist/dropdown/DropdownItem.svelte.d.ts.map +1 -1
  356. package/dist/dropdown/DropdownMenu.svelte +21 -9
  357. package/dist/dropdown/DropdownMenu.svelte.d.ts +6 -1
  358. package/dist/dropdown/DropdownMenu.svelte.d.ts.map +1 -1
  359. package/dist/dropdown/DropdownTitle.svelte +38 -20
  360. package/dist/dropdown/DropdownTitle.svelte.d.ts +6 -1
  361. package/dist/dropdown/DropdownTitle.svelte.d.ts.map +1 -1
  362. package/dist/dropdown/context.d.ts +18 -6
  363. package/dist/dropdown/context.d.ts.map +1 -1
  364. package/dist/dropdown/index.d.ts +3 -6
  365. package/dist/dropdown/index.d.ts.map +1 -1
  366. package/dist/dropdown/index.js +3 -6
  367. package/dist/dropdown/meta.d.ts +183 -63
  368. package/dist/dropdown/meta.d.ts.map +1 -1
  369. package/dist/dropdown/meta.js +122 -73
  370. package/dist/dropdown/types.d.ts +39 -42
  371. package/dist/dropdown/types.d.ts.map +1 -1
  372. package/dist/dropdown/types.js +1 -12
  373. package/dist/empty/Empty.svelte +136 -249
  374. package/dist/empty/Empty.svelte.d.ts +23 -9
  375. package/dist/empty/Empty.svelte.d.ts.map +1 -1
  376. package/dist/empty/meta.d.ts +29 -18
  377. package/dist/empty/meta.d.ts.map +1 -1
  378. package/dist/empty/meta.js +21 -26
  379. package/dist/feedback/Feedback.svelte +330 -0
  380. package/dist/feedback/Feedback.svelte.d.ts +46 -0
  381. package/dist/feedback/Feedback.svelte.d.ts.map +1 -0
  382. package/dist/feedback/index.d.ts +4 -0
  383. package/dist/feedback/index.d.ts.map +1 -0
  384. package/dist/feedback/index.js +2 -0
  385. package/dist/feedback/meta.d.ts +105 -0
  386. package/dist/feedback/meta.d.ts.map +1 -0
  387. package/dist/feedback/meta.js +65 -0
  388. package/dist/float-button/FloatButton.svelte +161 -0
  389. package/dist/float-button/FloatButton.svelte.d.ts +5 -0
  390. package/dist/float-button/FloatButton.svelte.d.ts.map +1 -0
  391. package/dist/float-button/FloatButtonGroup.svelte +90 -0
  392. package/dist/float-button/FloatButtonGroup.svelte.d.ts +5 -0
  393. package/dist/float-button/FloatButtonGroup.svelte.d.ts.map +1 -0
  394. package/dist/float-button/index.d.ts +5 -0
  395. package/dist/float-button/index.d.ts.map +1 -0
  396. package/dist/float-button/index.js +3 -0
  397. package/dist/float-button/meta.d.ts +136 -0
  398. package/dist/float-button/meta.d.ts.map +1 -0
  399. package/dist/float-button/meta.js +104 -0
  400. package/dist/float-button/types.d.ts +59 -0
  401. package/dist/float-button/types.d.ts.map +1 -0
  402. package/dist/float-button/types.js +1 -0
  403. package/dist/form/Field.svelte +315 -192
  404. package/dist/form/Field.svelte.d.ts +70 -2
  405. package/dist/form/Field.svelte.d.ts.map +1 -1
  406. package/dist/form/FieldArray.svelte +115 -21
  407. package/dist/form/FieldArray.svelte.d.ts +21 -3
  408. package/dist/form/FieldArray.svelte.d.ts.map +1 -1
  409. package/dist/form/Form.svelte +260 -52
  410. package/dist/form/Form.svelte.d.ts +84 -12
  411. package/dist/form/Form.svelte.d.ts.map +1 -1
  412. package/dist/form/FormAutoComplete.svelte +52 -0
  413. package/dist/form/FormAutoComplete.svelte.d.ts +17 -0
  414. package/dist/form/FormAutoComplete.svelte.d.ts.map +1 -0
  415. package/dist/form/FormCascader.svelte +25 -55
  416. package/dist/form/FormCascader.svelte.d.ts +2 -13
  417. package/dist/form/FormCascader.svelte.d.ts.map +1 -1
  418. package/dist/form/FormCheckbox.svelte +24 -56
  419. package/dist/form/FormCheckbox.svelte.d.ts +2 -14
  420. package/dist/form/FormCheckbox.svelte.d.ts.map +1 -1
  421. package/dist/form/FormCheckboxGroup.svelte +48 -0
  422. package/dist/form/FormCheckboxGroup.svelte.d.ts +15 -0
  423. package/dist/form/FormCheckboxGroup.svelte.d.ts.map +1 -0
  424. package/dist/form/FormDatePicker.svelte +24 -53
  425. package/dist/form/FormDatePicker.svelte.d.ts +2 -13
  426. package/dist/form/FormDatePicker.svelte.d.ts.map +1 -1
  427. package/dist/form/FormErrorMessage.svelte +75 -29
  428. package/dist/form/FormErrorMessage.svelte.d.ts +17 -4
  429. package/dist/form/FormErrorMessage.svelte.d.ts.map +1 -1
  430. package/dist/form/FormInput.svelte +31 -70
  431. package/dist/form/FormInput.svelte.d.ts +7 -19
  432. package/dist/form/FormInput.svelte.d.ts.map +1 -1
  433. package/dist/form/FormInputGroup.svelte +146 -0
  434. package/dist/form/FormInputGroup.svelte.d.ts +32 -0
  435. package/dist/form/FormInputGroup.svelte.d.ts.map +1 -0
  436. package/dist/form/FormInputNumber.svelte +74 -0
  437. package/dist/form/FormInputNumber.svelte.d.ts +20 -0
  438. package/dist/form/FormInputNumber.svelte.d.ts.map +1 -0
  439. package/dist/form/FormLabel.svelte +133 -24
  440. package/dist/form/FormLabel.svelte.d.ts +17 -4
  441. package/dist/form/FormLabel.svelte.d.ts.map +1 -1
  442. package/dist/form/FormPinCode.svelte +52 -0
  443. package/dist/form/FormPinCode.svelte.d.ts +16 -0
  444. package/dist/form/FormPinCode.svelte.d.ts.map +1 -0
  445. package/dist/form/FormRadio.svelte +23 -55
  446. package/dist/form/FormRadio.svelte.d.ts +2 -14
  447. package/dist/form/FormRadio.svelte.d.ts.map +1 -1
  448. package/dist/form/FormRadioGroup.svelte +54 -0
  449. package/dist/form/FormRadioGroup.svelte.d.ts +16 -0
  450. package/dist/form/FormRadioGroup.svelte.d.ts.map +1 -0
  451. package/dist/form/FormRating.svelte +24 -58
  452. package/dist/form/FormRating.svelte.d.ts +2 -14
  453. package/dist/form/FormRating.svelte.d.ts.map +1 -1
  454. package/dist/form/FormSection.svelte +35 -25
  455. package/dist/form/FormSection.svelte.d.ts +3 -1
  456. package/dist/form/FormSection.svelte.d.ts.map +1 -1
  457. package/dist/form/FormSelect.svelte +44 -68
  458. package/dist/form/FormSelect.svelte.d.ts +5 -16
  459. package/dist/form/FormSelect.svelte.d.ts.map +1 -1
  460. package/dist/form/FormSlider.svelte +33 -65
  461. package/dist/form/FormSlider.svelte.d.ts +2 -14
  462. package/dist/form/FormSlider.svelte.d.ts.map +1 -1
  463. package/dist/form/FormSlot.svelte +61 -20
  464. package/dist/form/FormSlot.svelte.d.ts +16 -2
  465. package/dist/form/FormSlot.svelte.d.ts.map +1 -1
  466. package/dist/form/FormSwitch.svelte +27 -59
  467. package/dist/form/FormSwitch.svelte.d.ts +4 -15
  468. package/dist/form/FormSwitch.svelte.d.ts.map +1 -1
  469. package/dist/form/FormTagInput.svelte +24 -53
  470. package/dist/form/FormTagInput.svelte.d.ts +2 -13
  471. package/dist/form/FormTagInput.svelte.d.ts.map +1 -1
  472. package/dist/form/FormTextArea.svelte +66 -0
  473. package/dist/form/FormTextArea.svelte.d.ts +18 -0
  474. package/dist/form/FormTextArea.svelte.d.ts.map +1 -0
  475. package/dist/form/FormTimePicker.svelte +51 -0
  476. package/dist/form/FormTimePicker.svelte.d.ts +15 -0
  477. package/dist/form/FormTimePicker.svelte.d.ts.map +1 -0
  478. package/dist/form/FormTreeSelect.svelte +26 -57
  479. package/dist/form/FormTreeSelect.svelte.d.ts +3 -14
  480. package/dist/form/FormTreeSelect.svelte.d.ts.map +1 -1
  481. package/dist/form/FormUpload.svelte +22 -63
  482. package/dist/form/FormUpload.svelte.d.ts +3 -15
  483. package/dist/form/FormUpload.svelte.d.ts.map +1 -1
  484. package/dist/form/GroupHookPanel.svelte +21 -0
  485. package/dist/form/GroupHookPanel.svelte.d.ts +19 -0
  486. package/dist/form/GroupHookPanel.svelte.d.ts.map +1 -0
  487. package/dist/form/context.d.ts +0 -3
  488. package/dist/form/context.d.ts.map +1 -1
  489. package/dist/form/field-props.d.ts +84 -0
  490. package/dist/form/field-props.d.ts.map +1 -0
  491. package/dist/form/field-props.js +58 -0
  492. package/dist/form/hooks.d.ts +53 -0
  493. package/dist/form/hooks.d.ts.map +1 -0
  494. package/dist/form/hooks.js +36 -0
  495. package/dist/form/index.d.ts +57 -4
  496. package/dist/form/index.d.ts.map +1 -1
  497. package/dist/form/index.js +60 -3
  498. package/dist/form/input-group-context.d.ts +7 -0
  499. package/dist/form/input-group-context.d.ts.map +1 -0
  500. package/dist/form/input-group-context.js +17 -0
  501. package/dist/form/meta.d.ts +213 -16
  502. package/dist/form/meta.d.ts.map +1 -1
  503. package/dist/form/meta.js +103 -15
  504. package/dist/grid/Col.svelte +1482 -78
  505. package/dist/grid/Col.svelte.d.ts +3 -5
  506. package/dist/grid/Col.svelte.d.ts.map +1 -1
  507. package/dist/grid/Row.svelte +151 -69
  508. package/dist/grid/Row.svelte.d.ts +9 -7
  509. package/dist/grid/Row.svelte.d.ts.map +1 -1
  510. package/dist/grid/meta.d.ts +37 -28
  511. package/dist/grid/meta.d.ts.map +1 -1
  512. package/dist/grid/meta.js +31 -25
  513. package/dist/highlight/Highlight.svelte +46 -66
  514. package/dist/highlight/Highlight.svelte.d.ts +9 -22
  515. package/dist/highlight/Highlight.svelte.d.ts.map +1 -1
  516. package/dist/highlight/meta.d.ts +12 -51
  517. package/dist/highlight/meta.d.ts.map +1 -1
  518. package/dist/highlight/meta.js +16 -46
  519. package/dist/hotkeys/HotKeys.svelte +152 -0
  520. package/dist/hotkeys/HotKeys.svelte.d.ts +28 -0
  521. package/dist/hotkeys/HotKeys.svelte.d.ts.map +1 -0
  522. package/dist/hotkeys/index.d.ts +12 -0
  523. package/dist/hotkeys/index.d.ts.map +1 -0
  524. package/dist/hotkeys/index.js +8 -0
  525. package/dist/hotkeys/meta.d.ts +103 -0
  526. package/dist/hotkeys/meta.d.ts.map +1 -0
  527. package/dist/hotkeys/meta.js +65 -0
  528. package/dist/icon/index.d.ts +1 -1
  529. package/dist/icon/index.d.ts.map +1 -1
  530. package/dist/icon/index.js +1 -1
  531. package/dist/icon/meta.d.ts +20 -28
  532. package/dist/icon/meta.d.ts.map +1 -1
  533. package/dist/icon/meta.js +20 -20
  534. package/dist/iconbutton/IconButton.svelte +89 -0
  535. package/dist/iconbutton/IconButton.svelte.d.ts +53 -0
  536. package/dist/iconbutton/IconButton.svelte.d.ts.map +1 -0
  537. package/dist/iconbutton/index.d.ts +3 -0
  538. package/dist/iconbutton/index.d.ts.map +1 -0
  539. package/dist/iconbutton/index.js +2 -0
  540. package/dist/iconbutton/meta.d.ts +150 -0
  541. package/dist/iconbutton/meta.d.ts.map +1 -0
  542. package/dist/iconbutton/meta.js +53 -0
  543. package/dist/illustrations/IllustrationConstruction.svelte +25 -0
  544. package/dist/illustrations/IllustrationConstruction.svelte.d.ts +8 -0
  545. package/dist/illustrations/IllustrationConstruction.svelte.d.ts.map +1 -0
  546. package/dist/illustrations/IllustrationConstructionDark.svelte +25 -0
  547. package/dist/illustrations/IllustrationConstructionDark.svelte.d.ts +8 -0
  548. package/dist/illustrations/IllustrationConstructionDark.svelte.d.ts.map +1 -0
  549. package/dist/illustrations/IllustrationFailure.svelte +25 -0
  550. package/dist/illustrations/IllustrationFailure.svelte.d.ts +8 -0
  551. package/dist/illustrations/IllustrationFailure.svelte.d.ts.map +1 -0
  552. package/dist/illustrations/IllustrationFailureDark.svelte +25 -0
  553. package/dist/illustrations/IllustrationFailureDark.svelte.d.ts +8 -0
  554. package/dist/illustrations/IllustrationFailureDark.svelte.d.ts.map +1 -0
  555. package/dist/illustrations/IllustrationIdle.svelte +25 -0
  556. package/dist/illustrations/IllustrationIdle.svelte.d.ts +8 -0
  557. package/dist/illustrations/IllustrationIdle.svelte.d.ts.map +1 -0
  558. package/dist/illustrations/IllustrationIdleDark.svelte +25 -0
  559. package/dist/illustrations/IllustrationIdleDark.svelte.d.ts +8 -0
  560. package/dist/illustrations/IllustrationIdleDark.svelte.d.ts.map +1 -0
  561. package/dist/illustrations/IllustrationNoAccess.svelte +25 -0
  562. package/dist/illustrations/IllustrationNoAccess.svelte.d.ts +8 -0
  563. package/dist/illustrations/IllustrationNoAccess.svelte.d.ts.map +1 -0
  564. package/dist/illustrations/IllustrationNoAccessDark.svelte +25 -0
  565. package/dist/illustrations/IllustrationNoAccessDark.svelte.d.ts +8 -0
  566. package/dist/illustrations/IllustrationNoAccessDark.svelte.d.ts.map +1 -0
  567. package/dist/illustrations/IllustrationNoContent.svelte +25 -0
  568. package/dist/illustrations/IllustrationNoContent.svelte.d.ts +8 -0
  569. package/dist/illustrations/IllustrationNoContent.svelte.d.ts.map +1 -0
  570. package/dist/illustrations/IllustrationNoContentDark.svelte +25 -0
  571. package/dist/illustrations/IllustrationNoContentDark.svelte.d.ts +8 -0
  572. package/dist/illustrations/IllustrationNoContentDark.svelte.d.ts.map +1 -0
  573. package/dist/illustrations/IllustrationNoResult.svelte +25 -0
  574. package/dist/illustrations/IllustrationNoResult.svelte.d.ts +8 -0
  575. package/dist/illustrations/IllustrationNoResult.svelte.d.ts.map +1 -0
  576. package/dist/illustrations/IllustrationNoResultDark.svelte +25 -0
  577. package/dist/illustrations/IllustrationNoResultDark.svelte.d.ts +8 -0
  578. package/dist/illustrations/IllustrationNoResultDark.svelte.d.ts.map +1 -0
  579. package/dist/illustrations/IllustrationNotFound.svelte +25 -0
  580. package/dist/illustrations/IllustrationNotFound.svelte.d.ts +8 -0
  581. package/dist/illustrations/IllustrationNotFound.svelte.d.ts.map +1 -0
  582. package/dist/illustrations/IllustrationNotFoundDark.svelte +25 -0
  583. package/dist/illustrations/IllustrationNotFoundDark.svelte.d.ts +8 -0
  584. package/dist/illustrations/IllustrationNotFoundDark.svelte.d.ts.map +1 -0
  585. package/dist/illustrations/IllustrationSuccess.svelte +25 -0
  586. package/dist/illustrations/IllustrationSuccess.svelte.d.ts +8 -0
  587. package/dist/illustrations/IllustrationSuccess.svelte.d.ts.map +1 -0
  588. package/dist/illustrations/IllustrationSuccessDark.svelte +25 -0
  589. package/dist/illustrations/IllustrationSuccessDark.svelte.d.ts +8 -0
  590. package/dist/illustrations/IllustrationSuccessDark.svelte.d.ts.map +1 -0
  591. package/dist/illustrations/index.d.ts +22 -0
  592. package/dist/illustrations/index.d.ts.map +1 -0
  593. package/dist/illustrations/index.js +21 -0
  594. package/dist/image/Image.svelte +260 -283
  595. package/dist/image/Image.svelte.d.ts +20 -21
  596. package/dist/image/Image.svelte.d.ts.map +1 -1
  597. package/dist/image/ImagePreview.svelte +201 -297
  598. package/dist/image/ImagePreview.svelte.d.ts +7 -10
  599. package/dist/image/ImagePreview.svelte.d.ts.map +1 -1
  600. package/dist/image/PreviewFooter.svelte +400 -0
  601. package/dist/image/PreviewFooter.svelte.d.ts +62 -0
  602. package/dist/image/PreviewFooter.svelte.d.ts.map +1 -0
  603. package/dist/image/PreviewHeader.svelte +93 -0
  604. package/dist/image/PreviewHeader.svelte.d.ts +16 -0
  605. package/dist/image/PreviewHeader.svelte.d.ts.map +1 -0
  606. package/dist/image/PreviewImage.svelte +296 -0
  607. package/dist/image/PreviewImage.svelte.d.ts +26 -0
  608. package/dist/image/PreviewImage.svelte.d.ts.map +1 -0
  609. package/dist/image/PreviewInner.svelte +554 -0
  610. package/dist/image/PreviewInner.svelte.d.ts +58 -0
  611. package/dist/image/PreviewInner.svelte.d.ts.map +1 -0
  612. package/dist/image/download.d.ts +8 -0
  613. package/dist/image/download.d.ts.map +1 -0
  614. package/dist/image/download.js +29 -0
  615. package/dist/image/index.d.ts +6 -7
  616. package/dist/image/index.d.ts.map +1 -1
  617. package/dist/image/index.js +5 -5
  618. package/dist/image/meta.d.ts +231 -88
  619. package/dist/image/meta.d.ts.map +1 -1
  620. package/dist/image/meta.js +93 -83
  621. package/dist/image/previewContext.d.ts +29 -0
  622. package/dist/image/previewContext.d.ts.map +1 -0
  623. package/dist/image/previewContext.js +8 -0
  624. package/dist/image/previewGeometry.d.ts +70 -0
  625. package/dist/image/previewGeometry.d.ts.map +1 -0
  626. package/dist/image/previewGeometry.js +184 -0
  627. package/dist/image/types.d.ts +66 -0
  628. package/dist/image/types.d.ts.map +1 -0
  629. package/dist/image/types.js +1 -0
  630. package/dist/index.d.ts +48 -26
  631. package/dist/index.d.ts.map +1 -1
  632. package/dist/index.js +40 -22
  633. package/dist/input/Input.svelte +537 -320
  634. package/dist/input/Input.svelte.d.ts +69 -21
  635. package/dist/input/Input.svelte.d.ts.map +1 -1
  636. package/dist/input/InputGroup.svelte +188 -0
  637. package/dist/input/InputGroup.svelte.d.ts +35 -0
  638. package/dist/input/InputGroup.svelte.d.ts.map +1 -0
  639. package/dist/input/TextArea.svelte +788 -0
  640. package/dist/input/TextArea.svelte.d.ts +104 -0
  641. package/dist/input/TextArea.svelte.d.ts.map +1 -0
  642. package/dist/input/context.d.ts +13 -0
  643. package/dist/input/context.d.ts.map +1 -0
  644. package/dist/input/context.js +5 -0
  645. package/dist/input/index.d.ts +4 -1
  646. package/dist/input/index.d.ts.map +1 -1
  647. package/dist/input/index.js +5 -1
  648. package/dist/input/meta.d.ts +802 -22
  649. package/dist/input/meta.d.ts.map +1 -1
  650. package/dist/input/meta.js +196 -17
  651. package/dist/input-number/InputNumber.svelte +446 -427
  652. package/dist/input-number/InputNumber.svelte.d.ts +73 -45
  653. package/dist/input-number/InputNumber.svelte.d.ts.map +1 -1
  654. package/dist/input-number/meta.d.ts +140 -48
  655. package/dist/input-number/meta.d.ts.map +1 -1
  656. package/dist/input-number/meta.js +39 -22
  657. package/dist/json-viewer/JsonViewer.svelte +528 -0
  658. package/dist/json-viewer/JsonViewer.svelte.d.ts +43 -0
  659. package/dist/json-viewer/JsonViewer.svelte.d.ts.map +1 -0
  660. package/dist/json-viewer/index.d.ts +4 -0
  661. package/dist/json-viewer/index.d.ts.map +1 -0
  662. package/dist/json-viewer/index.js +2 -0
  663. package/dist/json-viewer/meta.d.ts +129 -0
  664. package/dist/{lottie-icon → json-viewer}/meta.d.ts.map +1 -1
  665. package/dist/json-viewer/meta.js +130 -0
  666. package/dist/json-viewer/semi-json-viewer-core.d.ts +94 -0
  667. package/dist/layout/Content.svelte +8 -25
  668. package/dist/layout/Content.svelte.d.ts +1 -3
  669. package/dist/layout/Content.svelte.d.ts.map +1 -1
  670. package/dist/layout/Footer.svelte +7 -40
  671. package/dist/layout/Footer.svelte.d.ts +1 -4
  672. package/dist/layout/Footer.svelte.d.ts.map +1 -1
  673. package/dist/layout/Header.svelte +7 -37
  674. package/dist/layout/Header.svelte.d.ts +1 -4
  675. package/dist/layout/Header.svelte.d.ts.map +1 -1
  676. package/dist/layout/Layout.svelte +30 -17
  677. package/dist/layout/Layout.svelte.d.ts +3 -1
  678. package/dist/layout/Layout.svelte.d.ts.map +1 -1
  679. package/dist/layout/Sider.svelte +71 -186
  680. package/dist/layout/Sider.svelte.d.ts +15 -19
  681. package/dist/layout/Sider.svelte.d.ts.map +1 -1
  682. package/dist/layout/meta.d.ts +28 -91
  683. package/dist/layout/meta.d.ts.map +1 -1
  684. package/dist/layout/meta.js +38 -56
  685. package/dist/list/List.svelte +158 -825
  686. package/dist/list/List.svelte.d.ts +32 -70
  687. package/dist/list/List.svelte.d.ts.map +1 -1
  688. package/dist/list/ListItem.svelte +129 -131
  689. package/dist/list/ListItem.svelte.d.ts +21 -12
  690. package/dist/list/ListItem.svelte.d.ts.map +1 -1
  691. package/dist/list/context.d.ts +32 -23
  692. package/dist/list/context.d.ts.map +1 -1
  693. package/dist/list/index.d.ts +3 -8
  694. package/dist/list/index.d.ts.map +1 -1
  695. package/dist/list/index.js +4 -8
  696. package/dist/list/meta.d.ts +110 -98
  697. package/dist/list/meta.d.ts.map +1 -1
  698. package/dist/list/meta.js +76 -58
  699. package/dist/lottie/Lottie.svelte +138 -0
  700. package/dist/lottie/Lottie.svelte.d.ts +32 -0
  701. package/dist/lottie/Lottie.svelte.d.ts.map +1 -0
  702. package/dist/lottie/index.d.ts +3 -0
  703. package/dist/lottie/index.d.ts.map +1 -0
  704. package/dist/lottie/index.js +2 -0
  705. package/dist/lottie/meta.d.ts +76 -0
  706. package/dist/lottie/meta.d.ts.map +1 -0
  707. package/dist/lottie/meta.js +81 -0
  708. package/dist/markdown-render/HastNode.svelte +66 -0
  709. package/dist/markdown-render/HastNode.svelte.d.ts +11 -0
  710. package/dist/markdown-render/HastNode.svelte.d.ts.map +1 -0
  711. package/dist/markdown-render/MarkdownRender.svelte +152 -0
  712. package/dist/markdown-render/MarkdownRender.svelte.d.ts +26 -0
  713. package/dist/markdown-render/MarkdownRender.svelte.d.ts.map +1 -0
  714. package/dist/markdown-render/components/MdCode.svelte +20 -0
  715. package/dist/markdown-render/components/MdCode.svelte.d.ts +9 -0
  716. package/dist/markdown-render/components/MdCode.svelte.d.ts.map +1 -0
  717. package/dist/markdown-render/components/MdHeading.svelte +29 -0
  718. package/dist/markdown-render/components/MdHeading.svelte.d.ts +11 -0
  719. package/dist/markdown-render/components/MdHeading.svelte.d.ts.map +1 -0
  720. package/dist/markdown-render/components/MdImage.svelte +28 -0
  721. package/dist/markdown-render/components/MdImage.svelte.d.ts +9 -0
  722. package/dist/markdown-render/components/MdImage.svelte.d.ts.map +1 -0
  723. package/dist/markdown-render/components/MdLink.svelte +33 -0
  724. package/dist/markdown-render/components/MdLink.svelte.d.ts +10 -0
  725. package/dist/markdown-render/components/MdLink.svelte.d.ts.map +1 -0
  726. package/dist/markdown-render/components/MdParagraph.svelte +19 -0
  727. package/dist/markdown-render/components/MdParagraph.svelte.d.ts +9 -0
  728. package/dist/markdown-render/components/MdParagraph.svelte.d.ts.map +1 -0
  729. package/dist/markdown-render/components/MdPre.svelte +48 -0
  730. package/dist/markdown-render/components/MdPre.svelte.d.ts +9 -0
  731. package/dist/markdown-render/components/MdPre.svelte.d.ts.map +1 -0
  732. package/dist/markdown-render/components/MdTable.svelte +53 -0
  733. package/dist/markdown-render/components/MdTable.svelte.d.ts +9 -0
  734. package/dist/markdown-render/components/MdTable.svelte.d.ts.map +1 -0
  735. package/dist/markdown-render/components/index.d.ts +26 -0
  736. package/dist/markdown-render/components/index.d.ts.map +1 -0
  737. package/dist/markdown-render/components/index.js +27 -0
  738. package/dist/markdown-render/index.d.ts +4 -0
  739. package/dist/markdown-render/index.d.ts.map +1 -0
  740. package/dist/markdown-render/index.js +2 -0
  741. package/dist/markdown-render/meta.d.ts +81 -0
  742. package/dist/markdown-render/meta.d.ts.map +1 -0
  743. package/dist/markdown-render/meta.js +105 -0
  744. package/dist/markdown-render/props.d.ts +15 -0
  745. package/dist/markdown-render/props.d.ts.map +1 -0
  746. package/dist/markdown-render/props.js +51 -0
  747. package/dist/modal/ConfirmModal.svelte +105 -86
  748. package/dist/modal/ConfirmModal.svelte.d.ts +7 -4
  749. package/dist/modal/ConfirmModal.svelte.d.ts.map +1 -1
  750. package/dist/modal/Modal.svelte +459 -343
  751. package/dist/modal/Modal.svelte.d.ts +71 -41
  752. package/dist/modal/Modal.svelte.d.ts.map +1 -1
  753. package/dist/modal/ModalContextHolder.svelte +22 -0
  754. package/dist/modal/ModalContextHolder.svelte.d.ts +8 -0
  755. package/dist/modal/ModalContextHolder.svelte.d.ts.map +1 -0
  756. package/dist/modal/command.svelte.d.ts +7 -1
  757. package/dist/modal/command.svelte.d.ts.map +1 -1
  758. package/dist/modal/command.svelte.js +1 -1
  759. package/dist/modal/index.d.ts +7 -1
  760. package/dist/modal/index.d.ts.map +1 -1
  761. package/dist/modal/index.js +8 -2
  762. package/dist/modal/meta.d.ts +149 -103
  763. package/dist/modal/meta.d.ts.map +1 -1
  764. package/dist/modal/meta.js +95 -109
  765. package/dist/modal/use-modal.svelte.d.ts +33 -0
  766. package/dist/modal/use-modal.svelte.d.ts.map +1 -0
  767. package/dist/modal/use-modal.svelte.js +44 -0
  768. package/dist/nav/Nav.svelte +329 -146
  769. package/dist/nav/Nav.svelte.d.ts +43 -30
  770. package/dist/nav/Nav.svelte.d.ts.map +1 -1
  771. package/dist/nav/NavCollapseButton.svelte +74 -0
  772. package/dist/nav/NavCollapseButton.svelte.d.ts +12 -0
  773. package/dist/nav/NavCollapseButton.svelte.d.ts.map +1 -0
  774. package/dist/nav/NavFooter.svelte +42 -47
  775. package/dist/nav/NavFooter.svelte.d.ts +6 -2
  776. package/dist/nav/NavFooter.svelte.d.ts.map +1 -1
  777. package/dist/nav/NavHeader.svelte +61 -12
  778. package/dist/nav/NavHeader.svelte.d.ts +8 -2
  779. package/dist/nav/NavHeader.svelte.d.ts.map +1 -1
  780. package/dist/nav/NavItem.svelte +21 -17
  781. package/dist/nav/NavItem.svelte.d.ts +12 -10
  782. package/dist/nav/NavItem.svelte.d.ts.map +1 -1
  783. package/dist/nav/NavItemRender.svelte +420 -0
  784. package/dist/nav/NavItemRender.svelte.d.ts +12 -0
  785. package/dist/nav/NavItemRender.svelte.d.ts.map +1 -0
  786. package/dist/nav/NavPopupNode.svelte +119 -0
  787. package/dist/nav/NavPopupNode.svelte.d.ts +8 -0
  788. package/dist/nav/NavPopupNode.svelte.d.ts.map +1 -0
  789. package/dist/nav/NavSub.svelte +44 -6
  790. package/dist/nav/NavSub.svelte.d.ts +20 -4
  791. package/dist/nav/NavSub.svelte.d.ts.map +1 -1
  792. package/dist/nav/NavSubPopup.svelte +90 -0
  793. package/dist/nav/NavSubPopup.svelte.d.ts +14 -0
  794. package/dist/nav/NavSubPopup.svelte.d.ts.map +1 -0
  795. package/dist/nav/context.d.ts +57 -8
  796. package/dist/nav/context.d.ts.map +1 -1
  797. package/dist/nav/context.js +6 -2
  798. package/dist/nav/index.d.ts +1 -1
  799. package/dist/nav/index.d.ts.map +1 -1
  800. package/dist/nav/meta.d.ts +131 -52
  801. package/dist/nav/meta.d.ts.map +1 -1
  802. package/dist/nav/meta.js +70 -29
  803. package/dist/nav/types.d.ts +89 -22
  804. package/dist/nav/types.d.ts.map +1 -1
  805. package/dist/nav/types.js +47 -26
  806. package/dist/notification/NotificationContainer.svelte +131 -119
  807. package/dist/notification/NotificationContainer.svelte.d.ts.map +1 -1
  808. package/dist/notification/NotificationHolder.svelte +18 -0
  809. package/dist/notification/NotificationHolder.svelte.d.ts +8 -0
  810. package/dist/notification/NotificationHolder.svelte.d.ts.map +1 -0
  811. package/dist/notification/NotificationItem.svelte +235 -289
  812. package/dist/notification/NotificationItem.svelte.d.ts +1 -5
  813. package/dist/notification/NotificationItem.svelte.d.ts.map +1 -1
  814. package/dist/notification/index.d.ts +3 -2
  815. package/dist/notification/index.d.ts.map +1 -1
  816. package/dist/notification/index.js +2 -1
  817. package/dist/notification/meta.d.ts +73 -50
  818. package/dist/notification/meta.d.ts.map +1 -1
  819. package/dist/notification/meta.js +85 -74
  820. package/dist/notification/store.d.ts +59 -44
  821. package/dist/notification/store.d.ts.map +1 -1
  822. package/dist/notification/store.js +68 -74
  823. package/dist/overflow-list/OverflowList.svelte +366 -470
  824. package/dist/overflow-list/OverflowList.svelte.d.ts +37 -40
  825. package/dist/overflow-list/OverflowList.svelte.d.ts.map +1 -1
  826. package/dist/overflow-list/meta.d.ts +71 -71
  827. package/dist/overflow-list/meta.d.ts.map +1 -1
  828. package/dist/overflow-list/meta.js +63 -78
  829. package/dist/pagination/Pagination.svelte +454 -251
  830. package/dist/pagination/Pagination.svelte.d.ts +38 -39
  831. package/dist/pagination/Pagination.svelte.d.ts.map +1 -1
  832. package/dist/pagination/meta.d.ts +75 -83
  833. package/dist/pagination/meta.d.ts.map +1 -1
  834. package/dist/pagination/meta.js +78 -57
  835. package/dist/pincode/PinCode.svelte +348 -0
  836. package/dist/pincode/PinCode.svelte.d.ts +47 -0
  837. package/dist/pincode/PinCode.svelte.d.ts.map +1 -0
  838. package/dist/pincode/index.d.ts +3 -0
  839. package/dist/pincode/index.d.ts.map +1 -0
  840. package/dist/pincode/index.js +2 -0
  841. package/dist/pincode/meta.d.ts +147 -0
  842. package/dist/pincode/meta.d.ts.map +1 -0
  843. package/dist/pincode/meta.js +91 -0
  844. package/dist/popconfirm/Popconfirm.svelte +313 -599
  845. package/dist/popconfirm/Popconfirm.svelte.d.ts +65 -68
  846. package/dist/popconfirm/Popconfirm.svelte.d.ts.map +1 -1
  847. package/dist/popconfirm/meta.d.ts +85 -161
  848. package/dist/popconfirm/meta.d.ts.map +1 -1
  849. package/dist/popconfirm/meta.js +68 -185
  850. package/dist/popover/Popover.svelte +342 -564
  851. package/dist/popover/Popover.svelte.d.ts +82 -52
  852. package/dist/popover/Popover.svelte.d.ts.map +1 -1
  853. package/dist/popover/meta.d.ts +102 -74
  854. package/dist/popover/meta.d.ts.map +1 -1
  855. package/dist/popover/meta.js +103 -62
  856. package/dist/progress/Progress.svelte +248 -309
  857. package/dist/progress/Progress.svelte.d.ts +19 -27
  858. package/dist/progress/Progress.svelte.d.ts.map +1 -1
  859. package/dist/progress/index.d.ts +1 -1
  860. package/dist/progress/index.d.ts.map +1 -1
  861. package/dist/progress/meta.d.ts +70 -62
  862. package/dist/progress/meta.d.ts.map +1 -1
  863. package/dist/progress/meta.js +68 -77
  864. package/dist/radio/Radio.svelte +451 -239
  865. package/dist/radio/Radio.svelte.d.ts +13 -7
  866. package/dist/radio/Radio.svelte.d.ts.map +1 -1
  867. package/dist/radio/RadioGroup.svelte +152 -121
  868. package/dist/radio/RadioGroup.svelte.d.ts +27 -6
  869. package/dist/radio/RadioGroup.svelte.d.ts.map +1 -1
  870. package/dist/radio/context.d.ts +23 -18
  871. package/dist/radio/context.d.ts.map +1 -1
  872. package/dist/radio/index.d.ts +1 -1
  873. package/dist/radio/index.d.ts.map +1 -1
  874. package/dist/radio/meta.d.ts +62 -23
  875. package/dist/radio/meta.d.ts.map +1 -1
  876. package/dist/radio/meta.js +60 -17
  877. package/dist/rating/Rating.svelte +358 -275
  878. package/dist/rating/Rating.svelte.d.ts +25 -18
  879. package/dist/rating/Rating.svelte.d.ts.map +1 -1
  880. package/dist/rating/meta.d.ts +73 -40
  881. package/dist/rating/meta.d.ts.map +1 -1
  882. package/dist/rating/meta.js +55 -28
  883. package/dist/resizable/Resizable.svelte +354 -0
  884. package/dist/resizable/Resizable.svelte.d.ts +61 -0
  885. package/dist/resizable/Resizable.svelte.d.ts.map +1 -0
  886. package/dist/resizable/ResizeGroup.svelte +308 -0
  887. package/dist/resizable/ResizeGroup.svelte.d.ts +13 -0
  888. package/dist/resizable/ResizeGroup.svelte.d.ts.map +1 -0
  889. package/dist/resizable/ResizeHandler.svelte +87 -0
  890. package/dist/resizable/ResizeHandler.svelte.d.ts +13 -0
  891. package/dist/resizable/ResizeHandler.svelte.d.ts.map +1 -0
  892. package/dist/resizable/ResizeItem.svelte +103 -0
  893. package/dist/resizable/ResizeItem.svelte.d.ts +20 -0
  894. package/dist/resizable/ResizeItem.svelte.d.ts.map +1 -0
  895. package/dist/resizable/context.d.ts +39 -0
  896. package/dist/resizable/context.d.ts.map +1 -0
  897. package/dist/resizable/context.js +1 -0
  898. package/dist/resizable/index.d.ts +8 -0
  899. package/dist/resizable/index.d.ts.map +1 -0
  900. package/dist/resizable/index.js +7 -0
  901. package/dist/resizable/meta.d.ts +243 -0
  902. package/dist/resizable/meta.d.ts.map +1 -0
  903. package/dist/resizable/meta.js +90 -0
  904. package/dist/resize-observer/ResizeObserver.svelte +12 -0
  905. package/dist/resize-observer/ResizeObserver.svelte.d.ts +7 -0
  906. package/dist/resize-observer/ResizeObserver.svelte.d.ts.map +1 -1
  907. package/dist/resize-observer/meta.d.ts +5 -0
  908. package/dist/resize-observer/meta.d.ts.map +1 -1
  909. package/dist/resize-observer/meta.js +6 -0
  910. package/dist/scroll-list/ScrollItem.svelte +612 -0
  911. package/dist/scroll-list/ScrollItem.svelte.d.ts +29 -0
  912. package/dist/scroll-list/ScrollItem.svelte.d.ts.map +1 -0
  913. package/dist/scroll-list/ScrollList.svelte +78 -227
  914. package/dist/scroll-list/ScrollList.svelte.d.ts +12 -41
  915. package/dist/scroll-list/ScrollList.svelte.d.ts.map +1 -1
  916. package/dist/scroll-list/index.d.ts +2 -2
  917. package/dist/scroll-list/index.d.ts.map +1 -1
  918. package/dist/scroll-list/index.js +1 -0
  919. package/dist/scroll-list/meta.d.ts +96 -101
  920. package/dist/scroll-list/meta.d.ts.map +1 -1
  921. package/dist/scroll-list/meta.js +84 -65
  922. package/dist/scroll-list/types.d.ts +2 -16
  923. package/dist/scroll-list/types.d.ts.map +1 -1
  924. package/dist/select/Select.svelte +683 -232
  925. package/dist/select/Select.svelte.d.ts +170 -37
  926. package/dist/select/Select.svelte.d.ts.map +1 -1
  927. package/dist/select/meta.d.ts +186 -40
  928. package/dist/select/meta.d.ts.map +1 -1
  929. package/dist/select/meta.js +54 -20
  930. package/dist/side-sheet/SideSheet.svelte +541 -500
  931. package/dist/side-sheet/SideSheet.svelte.d.ts +36 -49
  932. package/dist/side-sheet/SideSheet.svelte.d.ts.map +1 -1
  933. package/dist/side-sheet/meta.d.ts +77 -112
  934. package/dist/side-sheet/meta.d.ts.map +1 -1
  935. package/dist/side-sheet/meta.js +71 -71
  936. package/dist/sidebar/SideBar.svelte +168 -0
  937. package/dist/sidebar/SideBar.svelte.d.ts +28 -0
  938. package/dist/sidebar/SideBar.svelte.d.ts.map +1 -0
  939. package/dist/sidebar/SideBarAnnotation.svelte +453 -0
  940. package/dist/sidebar/SideBarAnnotation.svelte.d.ts +47 -0
  941. package/dist/sidebar/SideBarAnnotation.svelte.d.ts.map +1 -0
  942. package/dist/sidebar/SideBarCodeContent.svelte +201 -0
  943. package/dist/sidebar/SideBarCodeContent.svelte.d.ts +42 -0
  944. package/dist/sidebar/SideBarCodeContent.svelte.d.ts.map +1 -0
  945. package/dist/sidebar/SideBarContainer.svelte +478 -0
  946. package/dist/sidebar/SideBarContainer.svelte.d.ts +38 -0
  947. package/dist/sidebar/SideBarContainer.svelte.d.ts.map +1 -0
  948. package/dist/sidebar/SideBarFileContent.svelte +192 -0
  949. package/dist/sidebar/SideBarFileContent.svelte.d.ts +40 -0
  950. package/dist/sidebar/SideBarFileContent.svelte.d.ts.map +1 -0
  951. package/dist/sidebar/SideBarFileItem.svelte +311 -0
  952. package/dist/sidebar/SideBarFileItem.svelte.d.ts +21 -0
  953. package/dist/sidebar/SideBarFileItem.svelte.d.ts.map +1 -0
  954. package/dist/sidebar/SideBarImageUploadNode.svelte +103 -0
  955. package/dist/sidebar/SideBarImageUploadNode.svelte.d.ts +5 -0
  956. package/dist/sidebar/SideBarImageUploadNode.svelte.d.ts.map +1 -0
  957. package/dist/sidebar/SideBarMcpConfigure.svelte +544 -0
  958. package/dist/sidebar/SideBarMcpConfigure.svelte.d.ts +60 -0
  959. package/dist/sidebar/SideBarMcpConfigure.svelte.d.ts.map +1 -0
  960. package/dist/sidebar/SideBarOptions.svelte +137 -0
  961. package/dist/sidebar/SideBarOptions.svelte.d.ts +10 -0
  962. package/dist/sidebar/SideBarOptions.svelte.d.ts.map +1 -0
  963. package/dist/sidebar/file-extensions.d.ts +37 -0
  964. package/dist/sidebar/file-extensions.d.ts.map +1 -0
  965. package/dist/sidebar/file-extensions.js +45 -0
  966. package/dist/sidebar/index.d.ts +14 -0
  967. package/dist/sidebar/index.d.ts.map +1 -0
  968. package/dist/sidebar/index.js +9 -0
  969. package/dist/sidebar/meta.d.ts +373 -0
  970. package/dist/sidebar/meta.d.ts.map +1 -0
  971. package/dist/sidebar/meta.js +219 -0
  972. package/dist/sidebar/types.d.ts +70 -0
  973. package/dist/sidebar/types.d.ts.map +1 -0
  974. package/dist/sidebar/types.js +1 -0
  975. package/dist/skeleton/Skeleton.svelte +129 -97
  976. package/dist/skeleton/Skeleton.svelte.d.ts +7 -2
  977. package/dist/skeleton/Skeleton.svelte.d.ts.map +1 -1
  978. package/dist/skeleton/SkeletonAvatar.svelte +25 -68
  979. package/dist/skeleton/SkeletonAvatar.svelte.d.ts +6 -2
  980. package/dist/skeleton/SkeletonAvatar.svelte.d.ts.map +1 -1
  981. package/dist/skeleton/SkeletonButton.svelte +6 -77
  982. package/dist/skeleton/SkeletonButton.svelte.d.ts +0 -4
  983. package/dist/skeleton/SkeletonButton.svelte.d.ts.map +1 -1
  984. package/dist/skeleton/SkeletonImage.svelte +6 -87
  985. package/dist/skeleton/SkeletonImage.svelte.d.ts +0 -3
  986. package/dist/skeleton/SkeletonImage.svelte.d.ts.map +1 -1
  987. package/dist/skeleton/SkeletonParagraph.svelte +10 -87
  988. package/dist/skeleton/SkeletonParagraph.svelte.d.ts +1 -1
  989. package/dist/skeleton/SkeletonParagraph.svelte.d.ts.map +1 -1
  990. package/dist/skeleton/SkeletonTitle.svelte +6 -61
  991. package/dist/skeleton/SkeletonTitle.svelte.d.ts +0 -2
  992. package/dist/skeleton/SkeletonTitle.svelte.d.ts.map +1 -1
  993. package/dist/skeleton/index.d.ts +1 -1
  994. package/dist/skeleton/index.d.ts.map +1 -1
  995. package/dist/skeleton/meta.d.ts +99 -23
  996. package/dist/skeleton/meta.d.ts.map +1 -1
  997. package/dist/skeleton/meta.js +70 -28
  998. package/dist/slider/Slider.svelte +418 -419
  999. package/dist/slider/Slider.svelte.d.ts +45 -54
  1000. package/dist/slider/Slider.svelte.d.ts.map +1 -1
  1001. package/dist/slider/meta.d.ts +49 -87
  1002. package/dist/slider/meta.d.ts.map +1 -1
  1003. package/dist/slider/meta.js +50 -26
  1004. package/dist/space/Space.svelte +97 -49
  1005. package/dist/space/Space.svelte.d.ts +17 -4
  1006. package/dist/space/Space.svelte.d.ts.map +1 -1
  1007. package/dist/space/meta.d.ts +30 -17
  1008. package/dist/space/meta.d.ts.map +1 -1
  1009. package/dist/space/meta.js +29 -12
  1010. package/dist/spin/Spin.svelte +160 -195
  1011. package/dist/spin/Spin.svelte.d.ts +8 -12
  1012. package/dist/spin/Spin.svelte.d.ts.map +1 -1
  1013. package/dist/spin/meta.d.ts +36 -53
  1014. package/dist/spin/meta.d.ts.map +1 -1
  1015. package/dist/spin/meta.js +27 -47
  1016. package/dist/steps/Step.svelte +236 -0
  1017. package/dist/steps/Step.svelte.d.ts +5 -0
  1018. package/dist/steps/Step.svelte.d.ts.map +1 -0
  1019. package/dist/steps/Steps.svelte +521 -274
  1020. package/dist/steps/Steps.svelte.d.ts +14 -22
  1021. package/dist/steps/Steps.svelte.d.ts.map +1 -1
  1022. package/dist/steps/context.d.ts +41 -0
  1023. package/dist/steps/context.d.ts.map +1 -0
  1024. package/dist/steps/context.js +8 -0
  1025. package/dist/steps/index.d.ts +8 -2
  1026. package/dist/steps/index.d.ts.map +1 -1
  1027. package/dist/steps/index.js +5 -1
  1028. package/dist/steps/meta.d.ts +67 -42
  1029. package/dist/steps/meta.d.ts.map +1 -1
  1030. package/dist/steps/meta.js +169 -25
  1031. package/dist/steps/types.d.ts +30 -7
  1032. package/dist/steps/types.d.ts.map +1 -1
  1033. package/dist/switch/Switch.svelte +224 -205
  1034. package/dist/switch/Switch.svelte.d.ts +22 -43
  1035. package/dist/switch/Switch.svelte.d.ts.map +1 -1
  1036. package/dist/switch/meta.d.ts +44 -51
  1037. package/dist/switch/meta.d.ts.map +1 -1
  1038. package/dist/switch/meta.js +68 -27
  1039. package/dist/table/Table.svelte +1065 -600
  1040. package/dist/table/Table.svelte.d.ts +95 -1
  1041. package/dist/table/Table.svelte.d.ts.map +1 -1
  1042. package/dist/table/meta.d.ts +221 -2
  1043. package/dist/table/meta.d.ts.map +1 -1
  1044. package/dist/table/meta.js +119 -18
  1045. package/dist/table/types.d.ts +36 -6
  1046. package/dist/table/types.d.ts.map +1 -1
  1047. package/dist/tabs/TabPane.svelte +4 -1
  1048. package/dist/tabs/TabPane.svelte.d.ts +2 -0
  1049. package/dist/tabs/TabPane.svelte.d.ts.map +1 -1
  1050. package/dist/tabs/Tabs.svelte +453 -280
  1051. package/dist/tabs/Tabs.svelte.d.ts +41 -32
  1052. package/dist/tabs/Tabs.svelte.d.ts.map +1 -1
  1053. package/dist/tabs/context.d.ts +3 -0
  1054. package/dist/tabs/context.d.ts.map +1 -1
  1055. package/dist/tabs/meta.d.ts +43 -47
  1056. package/dist/tabs/meta.d.ts.map +1 -1
  1057. package/dist/tabs/meta.js +76 -47
  1058. package/dist/tabs/types.d.ts +3 -0
  1059. package/dist/tabs/types.d.ts.map +1 -1
  1060. package/dist/tag/SplitTagGroup.svelte +62 -0
  1061. package/dist/tag/SplitTagGroup.svelte.d.ts +15 -0
  1062. package/dist/tag/SplitTagGroup.svelte.d.ts.map +1 -0
  1063. package/dist/tag/Tag.svelte +394 -261
  1064. package/dist/tag/Tag.svelte.d.ts +40 -23
  1065. package/dist/tag/Tag.svelte.d.ts.map +1 -1
  1066. package/dist/tag/TagGroup.svelte +208 -0
  1067. package/dist/tag/TagGroup.svelte.d.ts +56 -0
  1068. package/dist/tag/TagGroup.svelte.d.ts.map +1 -0
  1069. package/dist/tag/index.d.ts +2 -0
  1070. package/dist/tag/index.d.ts.map +1 -1
  1071. package/dist/tag/index.js +4 -0
  1072. package/dist/tag/meta.d.ts +157 -51
  1073. package/dist/tag/meta.d.ts.map +1 -1
  1074. package/dist/tag/meta.js +82 -45
  1075. package/dist/tag-input/TagInput.svelte +575 -261
  1076. package/dist/tag-input/TagInput.svelte.d.ts +52 -17
  1077. package/dist/tag-input/TagInput.svelte.d.ts.map +1 -1
  1078. package/dist/tag-input/meta.d.ts +132 -20
  1079. package/dist/tag-input/meta.d.ts.map +1 -1
  1080. package/dist/tag-input/meta.js +49 -21
  1081. package/dist/tag-input/split.d.ts +8 -0
  1082. package/dist/tag-input/split.d.ts.map +1 -0
  1083. package/dist/tag-input/split.js +22 -0
  1084. package/dist/time-picker/TimePicker.svelte +504 -722
  1085. package/dist/time-picker/TimePicker.svelte.d.ts +67 -47
  1086. package/dist/time-picker/TimePicker.svelte.d.ts.map +1 -1
  1087. package/dist/time-picker/meta.d.ts +201 -19
  1088. package/dist/time-picker/meta.d.ts.map +1 -1
  1089. package/dist/time-picker/meta.js +73 -16
  1090. package/dist/timeline/Timeline.svelte +212 -548
  1091. package/dist/timeline/Timeline.svelte.d.ts +9 -22
  1092. package/dist/timeline/Timeline.svelte.d.ts.map +1 -1
  1093. package/dist/timeline/TimelineItem.svelte +101 -143
  1094. package/dist/timeline/TimelineItem.svelte.d.ts +20 -20
  1095. package/dist/timeline/TimelineItem.svelte.d.ts.map +1 -1
  1096. package/dist/timeline/context.d.ts +8 -12
  1097. package/dist/timeline/context.d.ts.map +1 -1
  1098. package/dist/timeline/index.d.ts +2 -2
  1099. package/dist/timeline/index.d.ts.map +1 -1
  1100. package/dist/timeline/meta.d.ts +59 -95
  1101. package/dist/timeline/meta.d.ts.map +1 -1
  1102. package/dist/timeline/meta.js +81 -86
  1103. package/dist/timeline/types.d.ts +16 -5
  1104. package/dist/timeline/types.d.ts.map +1 -1
  1105. package/dist/toast/ToastContainer.svelte +111 -125
  1106. package/dist/toast/ToastContainer.svelte.d.ts +3 -0
  1107. package/dist/toast/ToastContainer.svelte.d.ts.map +1 -1
  1108. package/dist/toast/ToastHolder.svelte +18 -0
  1109. package/dist/toast/ToastHolder.svelte.d.ts +8 -0
  1110. package/dist/toast/ToastHolder.svelte.d.ts.map +1 -0
  1111. package/dist/toast/ToastItem.svelte +209 -191
  1112. package/dist/toast/ToastItem.svelte.d.ts +7 -0
  1113. package/dist/toast/ToastItem.svelte.d.ts.map +1 -1
  1114. package/dist/toast/index.d.ts +3 -2
  1115. package/dist/toast/index.d.ts.map +1 -1
  1116. package/dist/toast/index.js +2 -1
  1117. package/dist/toast/meta.d.ts +84 -53
  1118. package/dist/toast/meta.d.ts.map +1 -1
  1119. package/dist/toast/meta.js +69 -62
  1120. package/dist/toast/store.d.ts +79 -51
  1121. package/dist/toast/store.d.ts.map +1 -1
  1122. package/dist/toast/store.js +179 -116
  1123. package/dist/tooltip/Tooltip.svelte +533 -203
  1124. package/dist/tooltip/Tooltip.svelte.d.ts +90 -20
  1125. package/dist/tooltip/Tooltip.svelte.d.ts.map +1 -1
  1126. package/dist/tooltip/index.d.ts +1 -0
  1127. package/dist/tooltip/index.d.ts.map +1 -1
  1128. package/dist/tooltip/index.js +1 -0
  1129. package/dist/tooltip/meta.d.ts +131 -34
  1130. package/dist/tooltip/meta.d.ts.map +1 -1
  1131. package/dist/tooltip/meta.js +92 -28
  1132. package/dist/tooltip/placement.d.ts +21 -1
  1133. package/dist/tooltip/placement.d.ts.map +1 -1
  1134. package/dist/tooltip/placement.js +57 -1
  1135. package/dist/transfer/Transfer.svelte +686 -1100
  1136. package/dist/transfer/Transfer.svelte.d.ts +68 -73
  1137. package/dist/transfer/Transfer.svelte.d.ts.map +1 -1
  1138. package/dist/transfer/meta.d.ts +44 -65
  1139. package/dist/transfer/meta.d.ts.map +1 -1
  1140. package/dist/transfer/meta.js +76 -31
  1141. package/dist/transfer/types.d.ts +5 -0
  1142. package/dist/transfer/types.d.ts.map +1 -1
  1143. package/dist/tree/Tree.svelte +973 -422
  1144. package/dist/tree/Tree.svelte.d.ts +291 -72
  1145. package/dist/tree/Tree.svelte.d.ts.map +1 -1
  1146. package/dist/tree/meta.d.ts +246 -79
  1147. package/dist/tree/meta.d.ts.map +1 -1
  1148. package/dist/tree/meta.js +238 -58
  1149. package/dist/tree-select/TreeSelect.svelte +591 -240
  1150. package/dist/tree-select/TreeSelect.svelte.d.ts +88 -54
  1151. package/dist/tree-select/TreeSelect.svelte.d.ts.map +1 -1
  1152. package/dist/tree-select/meta.d.ts +344 -57
  1153. package/dist/tree-select/meta.d.ts.map +1 -1
  1154. package/dist/tree-select/meta.js +80 -26
  1155. package/dist/tree-select/types.d.ts +2 -0
  1156. package/dist/tree-select/types.d.ts.map +1 -1
  1157. package/dist/typography/Numeral.svelte +117 -0
  1158. package/dist/typography/Numeral.svelte.d.ts +35 -0
  1159. package/dist/typography/Numeral.svelte.d.ts.map +1 -0
  1160. package/dist/typography/Paragraph.svelte +20 -34
  1161. package/dist/typography/Paragraph.svelte.d.ts +8 -13
  1162. package/dist/typography/Paragraph.svelte.d.ts.map +1 -1
  1163. package/dist/typography/Text.svelte +22 -33
  1164. package/dist/typography/Text.svelte.d.ts +11 -13
  1165. package/dist/typography/Text.svelte.d.ts.map +1 -1
  1166. package/dist/typography/Title.svelte +23 -28
  1167. package/dist/typography/Title.svelte.d.ts +10 -11
  1168. package/dist/typography/Title.svelte.d.ts.map +1 -1
  1169. package/dist/typography/TypographyBase.svelte +534 -479
  1170. package/dist/typography/TypographyBase.svelte.d.ts +44 -29
  1171. package/dist/typography/TypographyBase.svelte.d.ts.map +1 -1
  1172. package/dist/typography/index.d.ts +3 -3
  1173. package/dist/typography/index.d.ts.map +1 -1
  1174. package/dist/typography/index.js +3 -3
  1175. package/dist/typography/meta.d.ts +190 -185
  1176. package/dist/typography/meta.d.ts.map +1 -1
  1177. package/dist/typography/meta.js +112 -85
  1178. package/dist/upload/FileCard.svelte +634 -0
  1179. package/dist/upload/FileCard.svelte.d.ts +40 -0
  1180. package/dist/upload/FileCard.svelte.d.ts.map +1 -0
  1181. package/dist/upload/Upload.svelte +1112 -650
  1182. package/dist/upload/Upload.svelte.d.ts +118 -66
  1183. package/dist/upload/Upload.svelte.d.ts.map +1 -1
  1184. package/dist/upload/index.d.ts +2 -1
  1185. package/dist/upload/index.d.ts.map +1 -1
  1186. package/dist/upload/index.js +1 -0
  1187. package/dist/upload/meta.d.ts +231 -72
  1188. package/dist/upload/meta.d.ts.map +1 -1
  1189. package/dist/upload/meta.js +84 -42
  1190. package/dist/upload/types.d.ts +137 -3
  1191. package/dist/upload/types.d.ts.map +1 -1
  1192. package/dist/user-guide/UserGuide.svelte +655 -0
  1193. package/dist/user-guide/UserGuide.svelte.d.ts +75 -0
  1194. package/dist/user-guide/UserGuide.svelte.d.ts.map +1 -0
  1195. package/dist/user-guide/index.d.ts +4 -0
  1196. package/dist/user-guide/index.d.ts.map +1 -0
  1197. package/dist/user-guide/index.js +2 -0
  1198. package/dist/user-guide/meta.d.ts +162 -0
  1199. package/dist/user-guide/meta.d.ts.map +1 -0
  1200. package/dist/user-guide/meta.js +60 -0
  1201. package/dist/video-player/ErrorSvg.svelte +15 -0
  1202. package/dist/video-player/ErrorSvg.svelte.d.ts +19 -0
  1203. package/dist/video-player/ErrorSvg.svelte.d.ts.map +1 -0
  1204. package/dist/video-player/VideoPlayer.svelte +769 -0
  1205. package/dist/video-player/VideoPlayer.svelte.d.ts +43 -0
  1206. package/dist/video-player/VideoPlayer.svelte.d.ts.map +1 -0
  1207. package/dist/video-player/VideoProgress.svelte +267 -0
  1208. package/dist/video-player/VideoProgress.svelte.d.ts +18 -0
  1209. package/dist/video-player/VideoProgress.svelte.d.ts.map +1 -0
  1210. package/dist/video-player/index.d.ts +4 -0
  1211. package/dist/video-player/index.d.ts.map +1 -0
  1212. package/dist/video-player/index.js +2 -0
  1213. package/dist/video-player/meta.d.ts +200 -0
  1214. package/dist/video-player/meta.d.ts.map +1 -0
  1215. package/dist/video-player/meta.js +159 -0
  1216. package/package.json +29 -4
  1217. package/dist/collapse/types.d.ts +0 -6
  1218. package/dist/collapse/types.d.ts.map +0 -1
  1219. package/dist/date-picker/RangePicker.svelte +0 -775
  1220. package/dist/date-picker/RangePicker.svelte.d.ts +0 -38
  1221. package/dist/date-picker/RangePicker.svelte.d.ts.map +0 -1
  1222. package/dist/date-picker/range-meta.d.ts +0 -100
  1223. package/dist/date-picker/range-meta.d.ts.map +0 -1
  1224. package/dist/date-picker/range-meta.js +0 -43
  1225. package/dist/drawer/Drawer.svelte +0 -554
  1226. package/dist/drawer/Drawer.svelte.d.ts +0 -54
  1227. package/dist/drawer/Drawer.svelte.d.ts.map +0 -1
  1228. package/dist/drawer/index.d.ts +0 -3
  1229. package/dist/drawer/index.d.ts.map +0 -1
  1230. package/dist/drawer/index.js +0 -2
  1231. package/dist/drawer/meta.d.ts +0 -147
  1232. package/dist/drawer/meta.d.ts.map +0 -1
  1233. package/dist/drawer/meta.js +0 -126
  1234. package/dist/dropdown/DropdownItemNode.svelte +0 -355
  1235. package/dist/dropdown/DropdownItemNode.svelte.d.ts +0 -14
  1236. package/dist/dropdown/DropdownItemNode.svelte.d.ts.map +0 -1
  1237. package/dist/dropdown/DropdownSubMenu.svelte +0 -212
  1238. package/dist/dropdown/DropdownSubMenu.svelte.d.ts +0 -15
  1239. package/dist/dropdown/DropdownSubMenu.svelte.d.ts.map +0 -1
  1240. package/dist/grid/use-breakpoint.svelte.d.ts +0 -13
  1241. package/dist/grid/use-breakpoint.svelte.d.ts.map +0 -1
  1242. package/dist/grid/use-breakpoint.svelte.js +0 -41
  1243. package/dist/icon/Icon.svelte +0 -156
  1244. package/dist/icon/Icon.svelte.d.ts +0 -23
  1245. package/dist/icon/Icon.svelte.d.ts.map +0 -1
  1246. package/dist/image/ImagePreviewGroup.svelte +0 -93
  1247. package/dist/image/ImagePreviewGroup.svelte.d.ts +0 -14
  1248. package/dist/image/ImagePreviewGroup.svelte.d.ts.map +0 -1
  1249. package/dist/image/context.d.ts +0 -16
  1250. package/dist/image/context.d.ts.map +0 -1
  1251. package/dist/image/context.js +0 -8
  1252. package/dist/list/ListMeta.svelte +0 -73
  1253. package/dist/list/ListMeta.svelte.d.ts +0 -14
  1254. package/dist/list/ListMeta.svelte.d.ts.map +0 -1
  1255. package/dist/lottie-icon/LottieIcon.svelte +0 -330
  1256. package/dist/lottie-icon/LottieIcon.svelte.d.ts +0 -44
  1257. package/dist/lottie-icon/LottieIcon.svelte.d.ts.map +0 -1
  1258. package/dist/lottie-icon/index.d.ts +0 -4
  1259. package/dist/lottie-icon/index.d.ts.map +0 -1
  1260. package/dist/lottie-icon/index.js +0 -2
  1261. package/dist/lottie-icon/meta.d.ts +0 -147
  1262. package/dist/lottie-icon/meta.js +0 -161
  1263. package/dist/menu/Menu.svelte +0 -843
  1264. package/dist/menu/Menu.svelte.d.ts +0 -95
  1265. package/dist/menu/Menu.svelte.d.ts.map +0 -1
  1266. package/dist/menu/MenuPopupNode.svelte +0 -525
  1267. package/dist/menu/MenuPopupNode.svelte.d.ts +0 -52
  1268. package/dist/menu/MenuPopupNode.svelte.d.ts.map +0 -1
  1269. package/dist/menu/index.d.ts +0 -5
  1270. package/dist/menu/index.d.ts.map +0 -1
  1271. package/dist/menu/index.js +0 -3
  1272. package/dist/menu/meta.d.ts +0 -147
  1273. package/dist/menu/meta.d.ts.map +0 -1
  1274. package/dist/menu/meta.js +0 -141
  1275. package/dist/menu/types.d.ts +0 -88
  1276. package/dist/menu/types.d.ts.map +0 -1
  1277. package/dist/menu/types.js +0 -34
  1278. package/dist/scroll-list/ScrollColumn.svelte +0 -592
  1279. package/dist/scroll-list/ScrollColumn.svelte.d.ts +0 -34
  1280. package/dist/scroll-list/ScrollColumn.svelte.d.ts.map +0 -1
  1281. package/dist/skeleton/context.d.ts +0 -10
  1282. package/dist/skeleton/context.d.ts.map +0 -1
  1283. package/dist/skeleton/context.js +0 -1
  1284. package/dist/textarea/TextArea.svelte +0 -420
  1285. package/dist/textarea/TextArea.svelte.d.ts +0 -69
  1286. package/dist/textarea/TextArea.svelte.d.ts.map +0 -1
  1287. package/dist/textarea/index.d.ts +0 -3
  1288. package/dist/textarea/index.d.ts.map +0 -1
  1289. package/dist/textarea/index.js +0 -2
  1290. package/dist/textarea/meta.d.ts +0 -170
  1291. package/dist/textarea/meta.d.ts.map +0 -1
  1292. package/dist/textarea/meta.js +0 -104
  1293. package/dist/toast/live-region.d.ts +0 -21
  1294. package/dist/toast/live-region.d.ts.map +0 -1
  1295. package/dist/toast/live-region.js +0 -57
  1296. package/dist/typography/Link.svelte +0 -120
  1297. package/dist/typography/Link.svelte.d.ts +0 -35
  1298. package/dist/typography/Link.svelte.d.ts.map +0 -1
  1299. /package/dist/{collapse/types.js → ai-chat-dialogue/render-config.js} +0 -0
@@ -1,22 +1,20 @@
1
1
  <!--
2
- Tree — see specs/components/show/Tree.spec.md
3
- 层级展示:展开/收起、单选/多选、可勾选父子联动(含半选 mixed)、内置搜索高亮。
4
- 受控 value/checkedKeys/expandedKeys 不回写,仅 onChange/onCheck/onExpandedChange 通知。
2
+ Tree — 严格对齐 Semi Design Tree
3
+ 层级展示:展开/收起、单选/多选(multiple 驱动 checkbox 父子联动含半选 mixed)、内置搜索高亮。
4
+ 值通道统一走 value/onChange:单选为节点 key,多选为选中 key 数组(含 conduct 联动结果)。
5
+ 受控 value/expandedKeys 不回写,仅 onChange/onExpand/onSelect/onSearch 通知(红线 #1)。
5
6
  键盘遵循 WAI-ARIA APG Tree View(单一 tab stop + aria-activedescendant)。
6
7
  复用 @chenzy-design/core 的纯函数树算法,不重复实现。
7
8
  loadData:展开未加载的非叶子节点时异步取子节点,结果缓存进本地 SvelteMap
8
9
  并派生合并树喂给所有 core 函数(不写回受控 treeData,红线 #1)。
9
10
  showLine:层级引导线(复用 core FlatNode.isLast/ancestorIsLast,纯 CSS ├/└/竖线)。
10
- virtualized:大数据树虚拟滚动。直接用 core fixedRange 纯函数自建轻量 fixed 定高虚拟化
11
- (非复用 VirtualList 组件——其 role=list/listitem 包裹层会破坏 role=tree→treeitem 的 ARIA
12
- 结构),保持 role=tree 容器 + 行 role=treeitem 语义不变;只渲染视口内切片。滚动监听命令式
13
- + rAF 节流 + cleanup(红线 #3),可见区间 $derived 纯派生(红线 #2)。键盘移动 activeKey 时
14
- scrollToIndex 滚到可见。a11y 取舍:aria-activedescendant 指向的行可能因虚拟化未渲染,故键盘
15
- 移动后命令式滚动确保目标行进入视口并被渲染,保证键盘可用。
16
- fieldNames:自定义节点字段名(key/label/children)映射任意后端数据;派生只读标准化(红线 #1/#2),
11
+ virtualize:大数据树虚拟滚动(传 { itemSize, height?, width? } 对象开启,对齐 Semi)。直接用
12
+ core fixedRange 纯函数自建轻量 fixed 定高虚拟化(非复用 VirtualList 组件——其 role=list/listitem
13
+ 包裹层会破坏 role=tree→treeitem 的 ARIA 结构),保持 role=tree 容器 + 行 role=treeitem 语义不变;
14
+ 只渲染视口内切片。滚动监听命令式 + rAF 节流 + cleanup(红线 #3),可见区间 $derived 纯派生(红线 #2)。
15
+ 键盘移动 activeKey scrollToIndex 滚到可见,确保目标行进入视口并被渲染,保证键盘可用。
16
+ keyMaps:自定义节点字段名(key/label/children)映射任意后端数据;派生只读标准化(红线 #1/#2),
17
17
  默认字段名时零开销直接用原 treeData,回调回传原始节点(__orig)。
18
- accordion:手风琴模式,同层级最多展开一个——展开某节点时用 core 的 accordionExpand 纯函数
19
- 计算并收起其同父级 siblings(不同层级互不影响)。受控时只 onExpandedChange 回传新集不回写(红线 #1)。
20
18
  -->
21
19
  <script lang="ts">
22
20
  import type { Snippet } from 'svelte';
@@ -24,37 +22,116 @@
24
22
  useId,
25
23
  flattenVisible,
26
24
  collectExpandable,
27
- collectExpandableToDepth,
28
25
  conduct,
29
26
  toggleCheck,
27
+ collectLeafKeys,
28
+ findNode,
30
29
  computeFilteredKeys,
31
30
  fixedRange,
32
31
  scrollOffsetForIndex,
33
32
  computeDropPosition,
34
33
  isAncestorOrSelf,
35
- accordionExpand,
36
34
  type TreeKey,
37
35
  type TreeNodeData,
38
36
  type FlatNode,
39
37
  type DropPosition,
40
38
  } from '@chenzy-design/core';
41
39
  import { SvelteMap, SvelteSet } from 'svelte/reactivity';
40
+ import {
41
+ IconSearch,
42
+ IconTreeTriangleDown,
43
+ IconFile,
44
+ IconFolder,
45
+ IconFolderOpen,
46
+ } from '@chenzy-design/icons';
42
47
  import { useLocale } from '../locale-provider/index.js';
43
-
44
- type Size = 'small' | 'default' | 'large';
45
- type Status = 'default' | 'warning' | 'error';
46
-
47
- type ChangeInfo = { value: TreeKey | TreeKey[]; node: TreeNodeData; selected: boolean };
48
- type CheckInfo = { checked: TreeKey[]; node: TreeNodeData; halfChecked: TreeKey[] };
49
- type ExpandInfo = { expanded: TreeKey[]; node: TreeNodeData; expand: boolean };
48
+ import Input from '../input/Input.svelte';
49
+ import Checkbox from '../checkbox/Checkbox.svelte';
50
+ import Spin from '../spin/Spin.svelte';
51
+ import Highlight from '../highlight/Highlight.svelte';
52
+
53
+ /** 值通道类型(对齐 Semi `Value`):单选为标量或节点对象,多选为其数组。 */
54
+ type TreeValue =
55
+ | TreeKey
56
+ | TreeNodeData
57
+ | Array<TreeKey | TreeNodeData>;
50
58
  type DropInfo = {
51
59
  dragNode: TreeNodeData;
52
60
  dropNode: TreeNodeData;
53
61
  dropPosition: DropPosition;
54
62
  };
55
63
 
64
+ /** 虚拟化配置对象(对齐 Semi `Virtualize`)。itemSize 必传。 */
65
+ type Virtualize = {
66
+ /** 每行高度(px),必传 */
67
+ itemSize: number;
68
+ /** 视口高度,默认 '100%'(需父节点有确定高度)或数字 px */
69
+ height?: number | string;
70
+ /** 视口宽度,默认 '100%' */
71
+ width?: number | string;
72
+ };
73
+
56
74
  /** 自定义节点字段名映射(适配任意后端数据结构)。默认 key/label/children。 */
57
- type FieldNames = { key?: string; label?: string; children?: string };
75
+ type KeyMaps = { key?: string; label?: string; children?: string };
76
+
77
+ /**
78
+ * renderFullLabel 整行接管渲染的上下文(对齐 Semi `renderFullLabel` 参数)。
79
+ * 暴露节点数据、层级、内置计算好的 class、展开图标 snippet 与全部行为回调,
80
+ * 让使用者完全自定义整行 option 的渲染结构(叶子分组、单选高亮子节点等高级场景)。
81
+ */
82
+ type FullLabelContext = {
83
+ /** 节点数据(自定义 keyMaps 时为原始节点) */
84
+ data: TreeNodeData;
85
+ /** 层级,从 0 开始 */
86
+ level: number;
87
+ /** 虚拟化时必须赋给渲染 DOM 的定位样式(否则行错位) */
88
+ style: string | undefined;
89
+ /** 内置样式类名(含缩进/选中/禁用等状态类) */
90
+ className: string;
91
+ /**
92
+ * 内置展开图标 snippet。可展开节点渲染可点击的箭头(点击触发展开/收起),叶子节点为占位。
93
+ * 用法:`{@render ctx.expandIcon(ctx.expandStatus)}`(传入展开态以渲染正确朝向)。
94
+ */
95
+ expandIcon: Snippet<[{ expanded: boolean; loading: boolean }]>;
96
+ /** 是否叶子节点 */
97
+ isLeaf: boolean;
98
+ /** 选中状态 */
99
+ checkStatus: { checked: boolean; halfChecked: boolean };
100
+ /** 展开状态 */
101
+ expandStatus: { expanded: boolean; loading: boolean };
102
+ /** 该节点是否命中当前搜索 */
103
+ filtered: boolean;
104
+ /** 当前搜索框输入值 */
105
+ searchWord: string;
106
+ /** 单选/行点击回调 */
107
+ onClick: (e: MouseEvent) => void;
108
+ /** 勾选回调 */
109
+ onCheck: (e: MouseEvent) => void;
110
+ /** 展开/收起回调 */
111
+ onExpand: (e: MouseEvent) => void;
112
+ /** 右键回调 */
113
+ onContextMenu: (e: MouseEvent) => void;
114
+ /** 双击回调 */
115
+ onDoubleClick: (e: MouseEvent) => void;
116
+ };
117
+
118
+ /**
119
+ * searchRender 自定义搜索框渲染上下文(对齐 Semi `searchRender` 收到的 inputProps)。
120
+ * Semi 把这些 props spread 给内置 Input;本库同样透传,snippet 可原样传给我们的 `Input` 组件。
121
+ */
122
+ type SearchRenderContext = {
123
+ value: string;
124
+ placeholder: string;
125
+ /** 值变化回调(等价 Input 的 onChange/onInput) */
126
+ onChange: (value: string) => void;
127
+ /** 清除回调 */
128
+ onClear: () => void;
129
+ /** 是否显示清除按钮(对齐 Semi showClear,映射 Input 的 clearable) */
130
+ showClear: boolean;
131
+ className: string | undefined;
132
+ style: string | undefined;
133
+ disabled: boolean;
134
+ };
58
135
 
59
136
  /** 标准节点附带原始节点引用,用于回调时回传用户原始数据。 */
60
137
  type NormalizedNode = TreeNodeData & { __orig: Record<string, unknown> };
@@ -62,104 +139,248 @@
62
139
  interface Props {
63
140
  /**
64
141
  * 树数据源。默认节点字段为 key/label/children;
65
- * 用 fieldNames 自定义字段名时可传任意后端结构(如 { id, name, sub })。
142
+ * 用 keyMaps 自定义字段名时可传任意后端结构(如 { id, name, sub })。
66
143
  */
67
144
  treeData?: TreeNodeData[];
145
+ /**
146
+ * 简单 JSON 形式的树数据(对齐 Semi `treeDataSimpleJson`)。传入扁平 `{ key: value }` 键值对,
147
+ * key 同时作为 `TreeNodeData` 的 `key` 与 `label`,value 作为节点的 `value`;
148
+ * 嵌套对象自动转为子树。与 `treeData` 二选一,`treeData` 非空时优先,忽略此项。
149
+ * 例如 `{ 中国: { 北京: 'beijing', 上海: 'shanghai' } }` → 一层「中国」含两个叶子。
150
+ */
151
+ treeDataSimpleJson?: Record<string, unknown>;
68
152
  /** 自定义节点字段名映射,如 { key:'id', label:'name', children:'sub' }。默认全部为标准名。 */
69
- fieldNames?: FieldNames;
70
- value?: TreeKey | TreeKey[] | null;
71
- defaultValue?: TreeKey | TreeKey[] | null;
153
+ keyMaps?: KeyMaps;
154
+ /**
155
+ * 受控选中值(对齐 Semi `value`)。传入即为受控(不回写,红线 #1)。
156
+ * - 单选(multiple=false):选中节点的 key(或 onChangeWithObject 时为节点对象);
157
+ * - 多选(multiple=true):选中节点 key 数组(含父子联动结果;onChangeWithObject 时为对象数组)。
158
+ */
159
+ value?: TreeValue | null;
160
+ /** 非受控初始选中值(对齐 Semi `defaultValue`);形态同 value。 */
161
+ defaultValue?: TreeValue | null;
162
+ /**
163
+ * 以对象形态回传/接收选中项(对齐 Semi `onChangeWithObject`)。开启后:
164
+ * - `onChange` 回调入参的 `value` 从 key(或 key 数组)变为**节点对象**(含 label/value/其它字段,
165
+ * 即原始节点 `toOrig`),多选时为对象数组;
166
+ * - 受控 `value` 与非受控 `defaultValue` 也须传对象形态(对象须含节点标识——优先取 `value` 字段,
167
+ * 缺省回退 `key`)。组件内部据此提取标识匹配节点。
168
+ * 默认 false(value 收发均为 key)。
169
+ */
170
+ onChangeWithObject?: boolean;
171
+ /**
172
+ * 是否多选(对齐 Semi `multiple`)。默认 false。
173
+ * 开启后每行渲染勾选框(checkbox),父子联动勾选(含半选 mixed),选中值经 `value`/`onChange`
174
+ * 作为选中 key 数组收发。关闭为单选(点击整行选中,值为单个 key)。
175
+ */
72
176
  multiple?: boolean;
73
- checkable?: boolean;
74
- checkedKeys?: TreeKey[];
75
- defaultCheckedKeys?: TreeKey[];
76
177
  /**
77
- * 父子勾选是否联动。'related'(默认):勾选父全选子、子全选则父选中、部分选中半选;
78
- * 'unRelated':父子勾选互不影响,每个节点独立勾选、无半选态。
79
- * 与 checkStrictly 的关系:两者都旁路 conduct 联动算法,效果上 unRelated ≡ checkStrictly 的
80
- * 「父子状态独立」。checkRelation 是枚举(对齐 Semi 语义),checkStrictly 是 boolean;
81
- * 任一开启(unRelated 或 checkStrictly=true)即关闭父子联动。默认 related + checkStrictly=false 保持联动。
178
+ * 多选时父子勾选联动关系(对齐 Semi `checkRelation`)。默认 'related'
179
+ * - 'related':勾选父全选子、子全选则父选中、部分选中半选(默认联动);
180
+ * - 'unRelated':父子勾选互不影响,每个节点独立勾选、无半选态。
181
+ * multiple 时有意义。
82
182
  */
83
183
  checkRelation?: 'related' | 'unRelated';
84
- checkStrictly?: boolean;
184
+ /**
185
+ * 严格禁用(对齐 Semi `disableStrictly`)。开启后,disabled 节点的勾选态被「严格锁定」:
186
+ * 不能通过父级/子级联动改变——已勾选的 disabled 节点不会被父级取消,未勾选的不会被父级勾上。
187
+ * 与普通 `disabled` 的区别:普通 disabled 仅禁止直接点击该节点,其勾选态仍可能因父级联动被改;
188
+ * `disableStrictly` 则连联动也锁死。仅在 multiple 联动(related)下有意义。默认 false。
189
+ */
190
+ disableStrictly?: boolean;
191
+ /**
192
+ * 仅叶子回传(对齐 Semi `leafOnly`)。多选(multiple)时,`onChange` 回传的 value(选中集)
193
+ * 只含叶子节点,不含父/半选节点。适合「父节点仅作分组、值只关心叶子」的场景。
194
+ * 仅在 multiple 联动(related)下有意义;解耦(unRelated)下本就是各节点独立态,leafOnly 仍滤成只留叶子。
195
+ * 默认 false(回传全部命中节点)。
196
+ */
197
+ leafOnly?: boolean;
198
+ /**
199
+ * 目录树模式(对齐 Semi `directory`)。开启后:
200
+ * - 默认整行块(等价 blockNode=true),点击整行即选中;
201
+ * - 内置目录/文件图标(可展开节点为文件夹、叶子为文件),可用 `icon` snippet 覆盖;
202
+ * - 默认展开触发方式为点击整行(expandAction 未显式指定时按 'click')。
203
+ * 默认 false。
204
+ */
205
+ directory?: boolean;
206
+ /** 是否开启展开/收起动画(对齐 Semi `motion`)。默认 true;virtualize 时强制关闭。 */
207
+ motion?: boolean;
85
208
  expandedKeys?: TreeKey[];
86
209
  defaultExpandedKeys?: TreeKey[];
87
210
  defaultExpandAll?: boolean;
88
211
  /**
89
- * 默认展开到第 N 层(仅初始化非受控展开集时生效,1 表示展开根层使其子节点可见)。
90
- * 优先级低于 defaultExpandAll;与 defaultExpandedKeys 取并集。受控 expandedKeys 时忽略(红线 #1)。
212
+ * 展开全部(对齐 Semi `expandAll`)。与 `defaultExpandAll` 的区别:defaultExpandAll 仅初始化生效,
213
+ * 数据(treeData)后续变化不再影响;expandAll 在数据变化时**仍然生效**(每次数据变化都重新展开全部)。
214
+ * 仅在非受控展开(未传 expandedKeys)时有意义。默认 false。
91
215
  */
92
- expandedDepth?: number;
216
+ expandAll?: boolean;
93
217
  /**
94
- * 受控展开时自动展开父节点:expandedKeys 更新时若 autoExpandParent=true,
95
- * 自动把所有展开节点的祖先链也加入展开集(派生,不写回受控 expandedKeys,红线 #1)。
96
- * 默认 true,与 Semi Design 行为一致。
218
+ * 自动展开父节点(对齐 Semi `autoExpandParent`,默认 false)。
219
+ * - 初次挂载:把初始展开节点的祖先链一次性并入展开集,使其可见(非受控经 initExpanded);
220
+ * - 开启后交互约束:收起某父节点时,若它仍有展开的子孙,则**阻止收起**——需先收起所有
221
+ * 子节点才能收起父节点(对齐 Semi「需先收起子节点」)。
222
+ * 默认 false(收起不受此约束,父节点可直接收起)。
97
223
  */
98
224
  autoExpandParent?: boolean;
99
225
  /**
100
- * 手风琴模式:同一层级最多展开一个节点。展开某节点时自动收起其同父级(siblings)
101
- * 的其它已展开节点;不同层级互不影响。受控 expandedKeys 同样生效(通过 onExpandedChange
102
- * 回传收起 siblings 后的新展开集,不自行回写——红线 #1)。默认 false(展开行为不变)。
226
+ * 展开触发方式(对齐 Semi `expandAction`)。
227
+ * - `false`(默认):仅点击展开箭头(switcher)才展开/收起,点击行只做选中;
228
+ * - `'click'`:点击整行即展开/收起;
229
+ * - `'doubleClick'`:双击整行才展开/收起。
230
+ * 注意:switcher 箭头在任意模式下都可点击展开。
231
+ */
232
+ expandAction?: false | 'click' | 'doubleClick';
233
+ /**
234
+ * 多选 value 自动合并父子(对齐 Semi `autoMergeValue`)。默认 true。
235
+ * 开启后,当某父节点被完全选中时,`onChange` 回传的 value 不再包含其子孙节点(仅保留父节点);
236
+ * 关闭则回传全部命中节点。仅在 `multiple` 联动(related)且 `leafOnly=false` 时有意义。
103
237
  */
104
- accordion?: boolean;
105
- selectable?: boolean;
106
- showIcon?: boolean;
107
- /** 显示层级连接线(父子引导线) */
238
+ autoMergeValue?: boolean;
239
+ /**
240
+ * label 超长省略(对齐 Semi `labelEllipsis`)。默认 false;`virtualize` 时默认 true。
241
+ * 开启后单行 label 超出容器宽度以省略号截断;关闭则不截断(可换行/溢出由外部控制)。
242
+ */
243
+ labelEllipsis?: boolean;
244
+ /**
245
+ * 聚焦组件内节点时是否阻止浏览器滚动文档(对齐 Semi `preventScroll`,作用于内部 focus 调用)。
246
+ * 默认 false(聚焦时按需滚动至可见)。
247
+ */
248
+ preventScroll?: boolean;
249
+ /** 显示层级连接线(父子引导线,对齐 Semi `showLine`)。默认 false。 */
108
250
  showLine?: boolean;
109
- /** 虚拟滚动:仅渲染视口内的可见节点行,适合大数据树(1000+ 节点)。默认 false(行为不变) */
110
- virtualized?: boolean;
111
- /** 虚拟滚动视口高度(px)。virtualized 时生效,默认 320 */
112
- height?: number;
113
- /** 虚拟滚动行高(px)。virtualized 时生效,默认取 token 行高 32 */
114
- itemHeight?: number;
115
- filterable?: boolean;
116
251
  /**
117
- * 自定义搜索过滤谓词。`(input, node) => boolean` 返回该节点是否命中关键词;
118
- * 命中节点的祖先链自动展开(沿用内置过滤行为)。传函数即开启搜索(无需再传 filterable);
119
- * 不传时回退到内置「label 包含关键词(不区分大小写)」。boolean 形态等价于 filterable 开关。
252
+ * 列表虚拟化(对齐 Semi `virtualize`)。传入 `{ itemSize, height?, width? }` 对象即开启:
253
+ * 仅渲染视口内可见节点行,适合大数据树(1000+ 节点)。`itemSize`(行高 px)必传;
254
+ * `height` 默认 '100%'(需父节点有确定高度);开启后强制关闭动画。默认 undefined(不虚拟化)。
255
+ */
256
+ virtualize?: Virtualize;
257
+ /**
258
+ * 是否根据输入项筛选(对齐 Semi `filterTreeNode`)。传 `true` 用内置谓词(按 `treeNodeFilterProp`
259
+ * 字段包含关键词,不区分大小写);传函数 `(input, node) => boolean` 自定义命中逻辑。
260
+ * 命中节点的祖先链自动展开。默认 false(不渲染搜索框、不过滤)。
120
261
  */
121
262
  filterTreeNode?: boolean | ((input: string, node: TreeNodeData) => boolean);
122
263
  /**
123
- * 受控搜索关键词。传入时走受控模式:搜索框 value 绑定到此 prop,
124
- * 输入变化仅触发 onSearch 回调,不更新内部 state。不传则保留内部非受控 state。
264
+ * 内置搜索过滤匹配节点的哪个字段(对齐 Semi `treeNodeFilterProp`)。默认 `'label'`。
265
+ * 仅在使用内置谓词(未传 filterTreeNode 函数)时生效;传自定义谓词时由该函数自行决定匹配逻辑。
266
+ * 例如设 `'value'` 则按节点 value 字段匹配关键词。
125
267
  */
126
- searchValue?: string;
268
+ treeNodeFilterProp?: string;
269
+ /** 搜索框占位文案(对齐 Semi `searchPlaceholder`)。不传时用内置 i18n 文案。 */
270
+ searchPlaceholder?: string;
127
271
  /**
128
- * 搜索关键词变化回调。参数 (value, filteredKeys):
272
+ * 自定义搜索框渲染(对齐 Semi `searchRender`)。
273
+ * - 传 snippet:用它替换内置搜索框,snippet 收到 { value, placeholder, onChange, onClear, className, style };
274
+ * - 传 `false`:隐藏内置搜索框(仍可经组件实例 `search()` 方法驱动过滤)。
275
+ * 仅在搜索开启(filterTreeNode)时有意义。
276
+ */
277
+ searchRender?: false | Snippet<[SearchRenderContext]>;
278
+ /** 搜索框内联样式(对齐 Semi `searchStyle`,透传到搜索框 input 的 style)。 */
279
+ searchStyle?: string;
280
+ /** 搜索框附加 class(对齐 Semi `searchClassName`,追加到搜索框 input 的 class)。 */
281
+ searchClassName?: string;
282
+ /**
283
+ * 搜索框是否显示清除按钮(对齐 Semi `showClear`)。默认 true。
284
+ * 有输入内容时在搜索框尾部显示清除按钮,点击清空搜索词。
285
+ */
286
+ showClear?: boolean;
287
+ /**
288
+ * 搜索状态下是否只展示过滤后的结果(对齐 Semi `showFilteredOnly`)。
289
+ * 默认 false:命中节点的祖先链自动展开,全树可见(未命中节点也渲染,仅命中项高亮)。
290
+ * true:搜索激活时只渲染命中节点及其祖先链,隐藏其它未命中且无命中后代的节点;
291
+ * 配合虚拟化可减少大数据树的多余渲染。默认 false(行为不变)。
292
+ */
293
+ showFilteredOnly?: boolean;
294
+ /**
295
+ * 搜索关键词变化回调(对齐 Semi `onSearch`)。参数 (value, filteredExpandedKeys):
129
296
  * - value:当前搜索词;
130
- * - filteredKeys:所有命中节点(matched)的 key 列表,供受控外层决定渲染。
297
+ * - filteredExpandedKeys:因搜索而展开的节点 key(命中节点的祖先链),配合展开受控使用。
131
298
  */
132
- onSearch?: (value: string, filteredKeys: string[]) => void;
299
+ onSearch?: (value: string, filteredExpandedKeys: string[]) => void;
133
300
  blockNode?: boolean;
134
301
  disabled?: boolean;
135
- size?: Size;
136
- status?: Status;
137
302
  emptyContent?: string;
138
303
  ariaLabel?: string;
304
+ /** 根容器内联样式(对齐 Semi `style`)。可设 width/height/border 等;设 height 时列表区自动限高滚动。 */
305
+ style?: string;
306
+ /** 根元素自定义类名(对齐 Semi `className`;本库/Svelte 惯例用 `class`,叠加在内置 class 之后)。 */
307
+ class?: string;
139
308
  /** 异步加载子节点:展开未加载的非叶子节点时调用,返回该节点的子节点数组 */
140
309
  loadData?: (node: TreeNodeData) => Promise<TreeNodeData[]>;
310
+ /**
311
+ * 受控已加载节点 key(对齐 Semi `loadedKeys`)。传入时以此为准判断哪些节点已加载,
312
+ * 已在集合内的节点展开时不再触发 loadData。配合 loadData 使用;不传则由组件内部维护加载态。
313
+ */
314
+ loadedKeys?: TreeKey[];
141
315
  /** 异步加载完成回调 */
142
316
  onLoad?: (loadedKeys: string[], info: { event: 'load'; node: TreeNodeData }) => void;
143
317
  /** 启用 HTML5 拖拽排序:节点可拖动改变层级/顺序。默认 false(行为不变) */
144
318
  draggable?: boolean;
319
+ /**
320
+ * 拖拽到节点上(inside)时是否自动展开该节点(对齐 Semi `autoExpandWhenDragEnter`)。默认 true。
321
+ * 关闭后拖到可展开节点内部时不再延时自动展开(需手动展开后再拖入)。仅 draggable 时有意义。
322
+ */
323
+ autoExpandWhenDragEnter?: boolean;
324
+ /**
325
+ * 是否隐藏拖拽时跟随光标的拖拽影像 dragImg(对齐 Semi `hideDraggingNode`)。默认 false。
326
+ * 开启后设置透明 drag image,只保留组件内的插入指示线/高亮,不显示浏览器默认幽灵。仅 draggable 时有意义。
327
+ */
328
+ hideDraggingNode?: boolean;
329
+ /**
330
+ * 自定义拖拽影像 dragImg 的 DOM 元素(对齐 Semi `renderDraggingNode`)。
331
+ * `(nodeInstance, node) => HTMLElement`:传入被拖拽行的 DOM 元素与节点数据,返回用作 drag image 的 HTML 元素。
332
+ * 优先级高于 `hideDraggingNode`;返回的元素须已在文档中(或离屏挂载)以便浏览器拾取。仅 draggable 时有意义。
333
+ */
334
+ renderDraggingNode?: (nodeInstance: HTMLElement, node: TreeNodeData) => HTMLElement;
145
335
  /** 放下时回调(受控数据,组件不内部改 treeData,由父组件按 info 重排)。 */
146
336
  onDrop?: (info: DropInfo) => void;
147
- /** 节点右键菜单回调 */
148
- onRightClick?: (e: MouseEvent, node: TreeNodeData) => void;
337
+ /** 节点双击回调(对齐 Semi `onDoubleClick`)。 */
338
+ onDoubleClick?: (e: MouseEvent, node: TreeNodeData) => void;
339
+ /** 节点右键菜单回调(对齐 Semi `onContextMenu`)。 */
340
+ onContextMenu?: (e: MouseEvent, node: TreeNodeData) => void;
149
341
  /** 开始拖拽节点 */
150
342
  onDragStart?: (node: TreeNodeData) => void;
151
343
  /** 拖拽进入候选目标节点 */
152
344
  onDragEnter?: (info: { dragNode: TreeNodeData; dropNode: TreeNodeData }) => void;
153
- onChange?: (info: ChangeInfo) => void;
154
- onCheck?: (info: CheckInfo) => void;
155
- onExpandedChange?: (info: ExpandInfo) => void;
156
- label?: Snippet<
345
+ /** 拖拽悬停在候选目标节点上(对齐 Semi `onDragOver`)。 */
346
+ onDragOver?: (info: { dragNode: TreeNodeData; dropNode: TreeNodeData }) => void;
347
+ /** 拖拽离开候选目标节点(对齐 Semi `onDragLeave`)。 */
348
+ onDragLeave?: (info: { dragNode: TreeNodeData; dropNode: TreeNodeData }) => void;
349
+ /** 拖拽结束(无论是否成功放下,对齐 Semi `onDragEnd`)。 */
350
+ onDragEnd?: (info: { dragNode: TreeNodeData }) => void;
351
+ /**
352
+ * 单个节点被选中时回调(对齐 Semi `onSelect`)。参数 (key, selected, node):
353
+ * 选中节点时触发,早于 onChange。key 为该节点 key,selected 为选中后状态。
354
+ */
355
+ onSelect?: (key: TreeKey, selected: boolean, node: TreeNodeData) => void;
356
+ /**
357
+ * 选中变更回调(对齐 Semi `onChange`)。参数 value:
358
+ * - 单选:选中节点的 key(或 onChangeWithObject 时的节点对象);
359
+ * - 多选:选中节点 key 数组(含父子联动 / autoMergeValue / leafOnly 处理结果)。
360
+ */
361
+ onChange?: (value: TreeValue) => void;
362
+ /**
363
+ * 展开/收起回调(对齐 Semi `onExpand`)。参数 (expandedKeys, { expanded, node }):
364
+ * expandedKeys 为变更后的全部展开 key,第二参含本次操作的展开态与节点。
365
+ */
366
+ onExpand?: (
367
+ expandedKeys: TreeKey[],
368
+ info: { expanded: boolean; node: TreeNodeData },
369
+ ) => void;
370
+ /** 自定义节点内容渲染(对齐 Semi `renderLabel`);参数含节点、层级、当前搜索词、选中/勾选态。 */
371
+ renderLabel?: Snippet<
157
372
  [{ node: TreeNodeData; level: number; searchValue: string; selected: boolean; checked: boolean }]
158
373
  >;
159
- /** 自定义节点图标(showIcon 为真时渲染在 label 前);参数含节点、展开态与是否叶子 */
374
+ /**
375
+ * 完全接管整行渲染(对齐 Semi `renderFullLabel`)。传入后忽略内置的 switcher/checkbox/icon/label
376
+ * 结构,由 snippet 用 FullLabelContext 自绘整行(含 class/expandIcon/checkStatus/回调)。
377
+ * 用于「叶子分组勾选」「单选高亮子节点」等高级场景。虚拟化时须把 ctx.style 赋给渲染根节点。
378
+ */
379
+ renderFullLabel?: Snippet<[FullLabelContext]>;
380
+ /** 自定义节点图标(对齐 Semi `icon`);参数含节点、展开态与是否叶子。传入时渲染在 label 前。 */
160
381
  icon?: Snippet<[{ node: TreeNodeData; expanded: boolean; isLeaf: boolean }]>;
161
382
  /** 自定义展开/收起箭头;参数含节点、展开态与加载态 */
162
- switcher?: Snippet<[{ node: TreeNodeData; expanded: boolean; loading: boolean }]>;
383
+ expandIcon?: Snippet<[{ node: TreeNodeData; expanded: boolean; loading: boolean }]>;
163
384
  /** 节点尾部操作区(渲染在 label 右侧) */
164
385
  suffix?: Snippet<[{ node: TreeNodeData }]>;
165
386
  /** 自定义拖拽幽灵节点 */
@@ -168,54 +389,78 @@
168
389
 
169
390
  let {
170
391
  treeData = [],
171
- fieldNames,
392
+ treeDataSimpleJson,
393
+ keyMaps,
172
394
  value,
173
395
  defaultValue = null,
396
+ onChangeWithObject = false,
174
397
  multiple = false,
175
- checkable = false,
176
- checkedKeys,
177
- defaultCheckedKeys = [],
178
398
  checkRelation = 'related',
179
- checkStrictly = false,
399
+ disableStrictly = false,
400
+ leafOnly = false,
401
+ directory = false,
402
+ motion = true,
180
403
  expandedKeys,
181
404
  defaultExpandedKeys = [],
182
405
  defaultExpandAll = false,
183
- expandedDepth,
184
- autoExpandParent = true,
185
- accordion = false,
186
- selectable = true,
187
- showIcon = true,
406
+ expandAll = false,
407
+ autoExpandParent = false,
408
+ expandAction,
409
+ autoMergeValue = true,
410
+ labelEllipsis,
411
+ preventScroll = false,
188
412
  showLine = false,
189
- virtualized = false,
190
- height = 320,
191
- itemHeight = 32,
192
- filterable = false,
413
+ virtualize,
193
414
  filterTreeNode,
194
- searchValue: searchValueProp,
415
+ treeNodeFilterProp = 'label',
416
+ searchPlaceholder,
417
+ searchRender,
418
+ searchStyle,
419
+ searchClassName,
420
+ showClear = true,
421
+ showFilteredOnly = false,
195
422
  onSearch,
196
- blockNode = false,
423
+ blockNode = true,
197
424
  disabled = false,
198
- size = 'default',
199
- status = 'default',
200
425
  emptyContent,
201
426
  ariaLabel,
427
+ style: rootStyle,
428
+ class: rootClassName,
202
429
  loadData,
430
+ loadedKeys: loadedKeysProp,
203
431
  onLoad,
204
432
  draggable = false,
433
+ autoExpandWhenDragEnter = true,
434
+ hideDraggingNode = false,
435
+ renderDraggingNode,
205
436
  onDrop,
206
- onRightClick,
437
+ onDoubleClick,
438
+ onContextMenu,
207
439
  onDragStart,
208
440
  onDragEnter,
441
+ onDragOver,
442
+ onDragLeave,
443
+ onDragEnd,
444
+ onSelect,
209
445
  onChange,
210
- onCheck,
211
- onExpandedChange,
212
- label,
446
+ onExpand,
447
+ renderLabel,
448
+ renderFullLabel,
213
449
  icon,
214
- switcher,
450
+ expandIcon,
215
451
  suffix,
216
452
  dragGhost,
217
453
  }: Props = $props();
218
454
 
455
+ // directory 目录树:默认整行块 + 点击整行展开(expandAction 未显式指定时按 'click')。
456
+ const effBlockNode = $derived(blockNode || directory);
457
+ const effExpandAction = $derived(expandAction ?? (directory ? 'click' : false));
458
+ // 虚拟化:virtualize 对象存在即开启;行高取 itemSize,视口高取 height(数字 px,字符串走 CSS)。
459
+ const virtualized = $derived(virtualize != null);
460
+ const virtualItemSize = $derived(virtualize?.itemSize ?? 32);
461
+ // motion:virtualize 时强制关闭动画(对齐 Semi)。
462
+ const motionEnabled = $derived(motion && !virtualized);
463
+
219
464
  const loc = useLocale();
220
465
 
221
466
  const baseId = useId('cd-tree-item');
@@ -224,16 +469,36 @@
224
469
  return `${baseId}-${String(key)}`;
225
470
  }
226
471
 
227
- // --- fieldNames 字段映射:把用户自定义字段名的数据派生为标准 {key,label,children} 结构 ---
472
+ // --- keyMaps 字段映射:把用户自定义字段名的数据派生为标准 {key,label,children} 结构 ---
228
473
  // 默认(全标准名)时直接返回原 treeData 引用,零额外开销(红线 #3);映射为纯 $derived(红线 #2),
229
474
  // 不写回 treeData(红线 #1)。每个标准节点附带 __orig 指向用户原始节点,回调时回传原始数据。
230
- const keyField = $derived(fieldNames?.key ?? 'key');
231
- const labelField = $derived(fieldNames?.label ?? 'label');
232
- const childrenField = $derived(fieldNames?.children ?? 'children');
233
- const fieldNamesDefault = $derived(
475
+ const keyField = $derived(keyMaps?.key ?? 'key');
476
+ const labelField = $derived(keyMaps?.label ?? 'label');
477
+ const childrenField = $derived(keyMaps?.children ?? 'children');
478
+ const keyMapsDefault = $derived(
234
479
  keyField === 'key' && labelField === 'label' && childrenField === 'children',
235
480
  );
236
481
 
482
+ // treeDataSimpleJson → TreeNodeData[]:扁平 { key: value } 转树(对齐 Semi)。
483
+ // key 同时作 key/label;原始值为对象则递归成子树,否则作叶子的 value。纯函数、不依赖响应式。
484
+ function simpleJsonToTree(json: Record<string, unknown>): TreeNodeData[] {
485
+ return Object.entries(json).map(([k, v]) => {
486
+ if (v !== null && typeof v === 'object' && !Array.isArray(v)) {
487
+ return {
488
+ key: k,
489
+ label: k,
490
+ children: simpleJsonToTree(v as Record<string, unknown>),
491
+ } as TreeNodeData;
492
+ }
493
+ return { key: k, label: k, value: v } as unknown as TreeNodeData;
494
+ });
495
+ }
496
+
497
+ // 实际数据源:treeData 非空时优先用它;否则若传了 treeDataSimpleJson 则转换之。
498
+ const sourceData = $derived<TreeNodeData[]>(
499
+ treeData.length > 0 || !treeDataSimpleJson ? treeData : simpleJsonToTree(treeDataSimpleJson),
500
+ );
501
+
237
502
  function normalizeNodes(nodes: TreeNodeData[]): NormalizedNode[] {
238
503
  const kf = keyField;
239
504
  const lf = labelField;
@@ -253,21 +518,31 @@
253
518
  });
254
519
  }
255
520
 
256
- // 标准化后的树:默认时即 treeData 原引用(零开销),否则递归映射字段名。
521
+ // 标准化后的树:默认时即数据源原引用(零开销),否则递归映射字段名。
257
522
  const normalizedData = $derived<TreeNodeData[]>(
258
- fieldNamesDefault ? treeData : normalizeNodes(treeData),
523
+ keyMapsDefault ? sourceData : normalizeNodes(sourceData),
259
524
  );
260
525
 
261
- /** 回调回传:自定义 fieldNames 时回原始节点,否则回标准节点本身。 */
526
+ /** 回调回传:自定义 keyMaps 时回原始节点,否则回标准节点本身。 */
262
527
  function toOrig(node: TreeNodeData): TreeNodeData {
263
528
  const orig = (node as Partial<NormalizedNode>).__orig;
264
529
  return (orig as TreeNodeData | undefined) ?? node;
265
530
  }
266
531
 
532
+ /** 在合并树中按 key 查标准化节点(供 onChangeWithObject 还原节点对象等使用)。 */
533
+ function findMerged(key: TreeKey): TreeNodeData | undefined {
534
+ return findNode(mergedData, key);
535
+ }
536
+
267
537
  // --- 异步加载:本地缓存子节点 + loading/loaded 标记(不写回受控 treeData,红线 #1)---
268
538
  const loadedChildren = new SvelteMap<TreeKey, TreeNodeData[]>();
269
539
  const loadingKeys = new SvelteSet<TreeKey>();
270
540
  const loadedKeys = new SvelteSet<TreeKey>();
541
+ // 受控 loadedKeys(对齐 Semi):并入内部已加载集,判断加载态时两者取并。
542
+ const controlledLoaded = $derived(new Set<TreeKey>(loadedKeysProp ?? []));
543
+ function isLoaded(key: TreeKey): boolean {
544
+ return loadedKeys.has(key) || controlledLoaded.has(key);
545
+ }
271
546
 
272
547
  // 合并树:把已加载的子节点注入对应节点,喂给所有 core 纯函数。
273
548
  // 无加载时返回原 treeData 引用,零开销。
@@ -288,17 +563,17 @@
288
563
  if (flatHasChildren) return true;
289
564
  if (!loadData || node.isLeaf === true) return false;
290
565
  // 已加载且为空 → 不可展开;未加载 → 显示箭头(异步占位)
291
- if (loadedKeys.has(node.key)) return (loadedChildren.get(node.key)?.length ?? 0) > 0;
566
+ if (isLoaded(node.key)) return (loadedChildren.get(node.key)?.length ?? 0) > 0;
292
567
  return true;
293
568
  }
294
569
 
295
570
  async function loadChildren(node: TreeNodeData) {
296
- if (!loadData || loadingKeys.has(node.key) || loadedKeys.has(node.key)) return;
571
+ if (!loadData || loadingKeys.has(node.key) || isLoaded(node.key)) return;
297
572
  loadingKeys.add(node.key);
298
573
  try {
299
- // loadData 收到用户原始节点(自定义字段名形态),返回结果按 fieldNames 标准化后缓存。
574
+ // loadData 收到用户原始节点(自定义字段名形态),返回结果按 keyMaps 标准化后缓存。
300
575
  const kids = await loadData(toOrig(node));
301
- loadedChildren.set(node.key, fieldNamesDefault ? kids : normalizeNodes(kids));
576
+ loadedChildren.set(node.key, keyMapsDefault ? kids : normalizeNodes(kids));
302
577
  } finally {
303
578
  loadingKeys.delete(node.key);
304
579
  loadedKeys.add(node.key);
@@ -307,127 +582,156 @@
307
582
  }
308
583
 
309
584
  // --- selection: 受控 value 不回写 (红线 #1) ---
585
+ // onChangeWithObject 时 value/defaultValue 为节点对象(或对象数组);内部 state 统一按 key 存储,
586
+ // 收发对象时用下面的 helper 在「对象 ↔ key」间转换。对象标识优先取 value 字段,缺省回退 key。
587
+ type ValueEntry = TreeKey | TreeNodeData;
588
+ /**
589
+ * 从一个 value 项(原始 key 或对象)提取内部节点标识 key。
590
+ * 本库节点身份为 key:对象优先取 `key`,缺省回退 `value`(对齐 Semi 对象含 value 键的约定)。
591
+ */
592
+ function entryToKey(entry: ValueEntry): TreeKey | null {
593
+ if (entry !== null && typeof entry === 'object') {
594
+ const obj = entry as unknown as Record<string, unknown>;
595
+ const id = (obj.key ?? obj.value) as TreeKey | undefined;
596
+ return id ?? null;
597
+ }
598
+ return entry as TreeKey;
599
+ }
600
+ /** 把内部 key 转成回调/受控所需的输出形态:onChangeWithObject 时回原始节点对象,否则回 key。 */
601
+ function keyToOutput(key: TreeKey): TreeKey | TreeNodeData {
602
+ if (!onChangeWithObject) return key;
603
+ const node = findMerged(key);
604
+ return node ? toOrig(node) : key;
605
+ }
310
606
  function initValue(): TreeKey | TreeKey[] | null {
311
- if (multiple) return Array.isArray(defaultValue) ? [...defaultValue] : [];
312
- return Array.isArray(defaultValue) ? (defaultValue[0] ?? null) : defaultValue;
607
+ const dv = defaultValue as ValueEntry | ValueEntry[] | null;
608
+ if (multiple) {
609
+ if (Array.isArray(dv)) return dv.map(entryToKey).filter((k): k is TreeKey => k !== null);
610
+ return dv === null || dv === undefined ? [] : ([entryToKey(dv)].filter((k): k is TreeKey => k !== null));
611
+ }
612
+ if (Array.isArray(dv)) return dv.length > 0 ? entryToKey(dv[0] as ValueEntry) : null;
613
+ return dv === null ? null : entryToKey(dv);
313
614
  }
314
615
  const isValueControlled = $derived(value !== undefined);
315
616
  let innerValue = $state<TreeKey | TreeKey[] | null>(initValue());
316
- const currentValue = $derived(isValueControlled ? (value ?? null) : innerValue);
317
- const selectedSet = $derived.by(() => {
617
+ // 受控 value:onChangeWithObject 时为对象形态,统一归一为内部 key 集合。
618
+ // 单选时集合含 0/1 key;多选时含全部选中 key(父子联动结果的 value 侧输入)。
619
+ const valueSet = $derived.by(() => {
318
620
  const set = new Set<TreeKey>();
319
- if (Array.isArray(currentValue)) for (const k of currentValue) set.add(k);
320
- else if (currentValue !== null) set.add(currentValue);
621
+ const src: TreeKey | TreeKey[] | null = isValueControlled
622
+ ? (() => {
623
+ const v = value as ValueEntry | ValueEntry[] | null | undefined;
624
+ if (v === undefined || v === null) return multiple ? [] : null;
625
+ if (Array.isArray(v))
626
+ return v.map(entryToKey).filter((k): k is TreeKey => k !== null);
627
+ return entryToKey(v);
628
+ })()
629
+ : innerValue;
630
+ if (Array.isArray(src)) for (const k of src) set.add(k);
631
+ else if (src !== null) set.add(src);
321
632
  return set;
322
633
  });
323
-
324
- // --- check: 受控 checkedKeys 不回写 (红线 #1)。base 为叶子级显式勾选 ---
325
- function initCheckedBase(): Set<TreeKey> {
326
- return new Set(defaultCheckedKeys);
327
- }
328
- const isCheckControlled = $derived(checkedKeys !== undefined);
329
- let innerCheckedBase = $state<Set<TreeKey>>(initCheckedBase());
330
- const currentCheckedBase = $derived(
331
- isCheckControlled ? new Set(checkedKeys ?? []) : innerCheckedBase,
332
- );
333
- // 父子是否联动:checkStrictly 或 checkRelation==='unRelated' 任一开启即解耦(无联动、无半选)。
334
- const checkLinked = $derived(!checkStrictly && checkRelation !== 'unRelated');
335
- // 解耦时直接用 base 当 checked,无半选;联动时用 conduct 归一
634
+ // 单选高亮集:仅单选模式使用(多选无「选中高亮」,靠 checkbox 表达)。
635
+ const selectedSet = $derived(multiple ? new Set<TreeKey>() : valueSet);
636
+
637
+ // --- check(多选,对齐 Semi:multiple 驱动勾选,值走 value 通道)---
638
+ // 父子是否联动:checkRelation==='related'(默认)联动含半选;'unRelated' 解耦无联动无半选。
639
+ const checkLinked = $derived(checkRelation !== 'unRelated');
640
+ // 勾选态由 value(valueSet)派生:related 时用 conduct 归一(value 里的 key 视为已勾选,
641
+ // 补齐 checked/halfChecked,disableStrictly 锁定禁用节点);unRelated 时直接用 valueSet。
336
642
  const checkState = $derived.by(() => {
643
+ if (!multiple) return { checked: new Set<TreeKey>(), half: new Set<TreeKey>() };
337
644
  if (!checkLinked) {
338
- return { checked: new Set(currentCheckedBase), half: new Set<TreeKey>() };
645
+ return { checked: new Set(valueSet), half: new Set<TreeKey>() };
339
646
  }
340
- return conduct(mergedData, currentCheckedBase);
647
+ return conduct(mergedData, valueSet, disableStrictly);
341
648
  });
342
649
 
343
650
  // --- expand: 受控 expandedKeys 不回写 (红线 #1) ---
344
651
  function initExpanded(): Set<TreeKey> {
345
- // 需用标准化后的 key(fieldNames 自定义时 collectExpandable* 才能识别 children)。
346
- const base = fieldNamesDefault ? treeData : normalizeNodes(treeData);
347
- if (defaultExpandAll) {
652
+ // 需用标准化后的 key(keyMaps 自定义时 collectExpandable* 才能识别 children)。
653
+ const rawSource =
654
+ treeData.length > 0 || !treeDataSimpleJson
655
+ ? treeData
656
+ : simpleJsonToTree(treeDataSimpleJson);
657
+ const base = keyMapsDefault ? rawSource : normalizeNodes(rawSource);
658
+ if (defaultExpandAll || expandAll) {
348
659
  return new Set(collectExpandable(base));
349
660
  }
350
- // expandedDepth:展开 ≤N 层的有子节点(与 defaultExpandedKeys 取并集)。优先级低于 defaultExpandAll。
351
661
  const init = new Set<TreeKey>(defaultExpandedKeys);
352
- if (typeof expandedDepth === 'number' && expandedDepth > 0) {
353
- for (const k of collectExpandableToDepth(base, expandedDepth)) init.add(k);
662
+ // autoExpandParent:初次挂载时把初始展开节点的祖先链一次性并入(对齐 Semi「初次挂载为 true」)。
663
+ // 仅初始化做一次,此后交互不再强制(否则父节点收不起)。受控 expandedKeys 由外部自行含父节点。
664
+ if (autoExpandParent && init.size > 0) {
665
+ for (const k of [...init]) collectAncestorsInto(base, k, init);
354
666
  }
355
667
  return init;
356
668
  }
357
- const isExpandControlled = $derived(expandedKeys !== undefined);
358
- let innerExpanded = $state<Set<TreeKey>>(initExpanded());
359
- const baseExpandedSet = $derived(
360
- isExpandControlled ? new Set(expandedKeys ?? []) : innerExpanded,
361
- );
362
- // autoExpandParent:展开节点的所有祖先也纳入展开集(派生,不写回,红线 #1)。
363
- // 实现:对 baseExpandedSet 中每个 key,递归向上收集祖先 key(深度优先搜索)。
364
- function collectAncestors(data: TreeNodeData[], targetKey: TreeKey, acc: Set<TreeKey>): boolean {
669
+ // 收集 targetKey 的祖先链并入 acc(DFS)。纯函数辅助,供 autoExpandParent 初始化用。
670
+ function collectAncestorsInto(data: TreeNodeData[], targetKey: TreeKey, acc: Set<TreeKey>): boolean {
365
671
  for (const node of data) {
366
672
  if (node.key === targetKey) return true;
367
- if (node.children && collectAncestors(node.children, targetKey, acc)) {
673
+ if (node.children && collectAncestorsInto(node.children, targetKey, acc)) {
368
674
  acc.add(node.key);
369
675
  return true;
370
676
  }
371
677
  }
372
678
  return false;
373
679
  }
374
- const currentExpandedSet = $derived.by(() => {
375
- if (!autoExpandParent || baseExpandedSet.size === 0) return baseExpandedSet;
376
- const withAncestors = new Set(baseExpandedSet);
377
- for (const key of baseExpandedSet) {
378
- collectAncestors(mergedData, key, withAncestors);
379
- }
380
- return withAncestors;
680
+ const isExpandControlled = $derived(expandedKeys !== undefined);
681
+ let innerExpanded = $state<Set<TreeKey>>(initExpanded());
682
+ // expandAll(对齐 Semi):数据(mergedData)变化时,非受控展开集重新展开全部——区别于
683
+ // defaultExpandAll 仅初始化生效。仅在 expandAll 且非受控时挂载此 effect(红线 #3 无副作用泄漏)。
684
+ $effect(() => {
685
+ if (!expandAll || isExpandControlled) return;
686
+ // 读取 mergedData 建立依赖:数据变化即重算全展开集。
687
+ innerExpanded = new Set(collectExpandable(mergedData));
381
688
  });
689
+ const baseExpandedSet = $derived(
690
+ isExpandControlled ? new Set(expandedKeys ?? []) : innerExpanded,
691
+ );
692
+ // autoExpandParent(对齐 Semi:默认 false,「初次挂载时为 true」——仅初始化阶段把展开节点的
693
+ // 祖先链一次性并入展开集,使其可见;此后用户交互(收起父节点)以实际展开集为准,不再强制把
694
+ // 祖先加回,否则父节点将「收不起来」。实现:并祖先只在 initExpanded 里做一次;currentExpandedSet
695
+ // 直接用 baseExpandedSet(受控 expandedKeys 或非受控 innerExpanded),不再持续派生强制。
696
+ const currentExpandedSet = $derived(baseExpandedSet);
382
697
 
383
- // --- 搜索:支持受控(searchValueProp)和非受控(内部 state)两种模式 ---
384
- // 受控:searchValueProp 传入时直接用,input 事件仅触发 onSearch 回调,不更新内部 state(红线 #1)。
385
- // 非受控:用内部 state,input 事件更新 innerSearchValue 并触发 onSearch。
386
- const isSearchControlled = $derived(searchValueProp !== undefined);
698
+ // --- 搜索(对齐 Semi):内部非受控 state,input 事件更新 innerSearchValue 并触发 onSearch。---
387
699
  let innerSearchValue = $state('');
388
- const searchValue = $derived(isSearchControlled ? (searchValueProp ?? '') : innerSearchValue);
700
+ const searchValue = $derived(innerSearchValue);
389
701
  const trimmedSearch = $derived(searchValue.trim());
390
- // 搜索框是否渲染/启用:filterable filterTreeNode(true 或自定义谓词函数)任一开启。
391
- const searchEnabled = $derived(filterable || filterTreeNode === true || typeof filterTreeNode === 'function');
702
+ // 搜索框是否渲染/启用:filterTreeNode true 或自定义谓词函数即开启(对齐 Semi)。
703
+ const searchEnabled = $derived(filterTreeNode === true || typeof filterTreeNode === 'function');
392
704
  const searchActive = $derived(searchEnabled && trimmedSearch.length > 0);
393
705
  // 过滤谓词:传函数则用自定义 (input, node);否则内置 label 包含(不区分大小写)。
706
+ // 内置谓词按 treeNodeFilterProp 指定字段匹配(默认 label);字段缺省回退 label。
707
+ function nodeFilterText(node: TreeNodeData): string {
708
+ const raw = (node as unknown as Record<string, unknown>)[treeNodeFilterProp];
709
+ const v = raw ?? node.label;
710
+ return v == null ? '' : String(v);
711
+ }
394
712
  const matchPredicate = $derived.by(() => {
395
713
  if (typeof filterTreeNode === 'function') {
396
714
  const fn = filterTreeNode;
397
- // 回传原始节点(fieldNames 自定义时),与其它回调一致。
715
+ // 回传原始节点(keyMaps 自定义时),与其它回调一致。
398
716
  return (node: TreeNodeData) => fn(trimmedSearch, toOrig(node));
399
717
  }
400
718
  const lower = trimmedSearch.toLowerCase();
401
- return (node: TreeNodeData) => node.label.toLowerCase().includes(lower);
719
+ return (node: TreeNodeData) => nodeFilterText(node).toLowerCase().includes(lower);
402
720
  });
403
721
  const filterResult = $derived.by(() => {
404
722
  if (!searchActive) return { matched: new Set<TreeKey>(), expand: new Set<TreeKey>() };
405
723
  return computeFilteredKeys(mergedData, matchPredicate);
406
724
  });
407
725
 
408
- // 搜索输入处理:受控时只触发 onSearch,非受控时同时更新 innerSearchValue。
409
- function handleSearchInput(e: Event) {
410
- const val = (e.target as HTMLInputElement).value;
411
- if (!isSearchControlled) innerSearchValue = val;
412
- // 计算 filteredKeys 并回调(基于当前 filterResult,但此时 val 可能还未更新到 derived)。
413
- // 为使 filteredKeys 与新 val 同步,临时基于新 val 计算一次。
414
- if (onSearch) {
415
- const trimmed = val.trim();
416
- let fKeys: string[] = [];
417
- if (trimmed.length > 0 && searchEnabled) {
418
- let pred: (node: TreeNodeData) => boolean;
419
- if (typeof filterTreeNode === 'function') {
420
- const fn = filterTreeNode;
421
- pred = (node: TreeNodeData) => fn(trimmed, toOrig(node));
422
- } else {
423
- const lower = trimmed.toLowerCase();
424
- pred = (node: TreeNodeData) => node.label.toLowerCase().includes(lower);
425
- }
426
- const result = computeFilteredKeys(mergedData, pred);
427
- fKeys = [...result.matched].map(String);
428
- }
429
- onSearch(val, fKeys);
430
- }
726
+ // searchRender 自定义搜索框的 onChange 回调(直接接受值)。
727
+ function handleSearchValue(val: string) {
728
+ search(val);
729
+ }
730
+
731
+ // 清除搜索:清空内部 state 并回调 onSearch('')。
732
+ function clearSearch() {
733
+ innerSearchValue = '';
734
+ onSearch?.('', []);
431
735
  }
432
736
 
433
737
  // 搜索激活时把过滤展开集并入可见展开集(派生,不写回)
@@ -440,9 +744,10 @@
440
744
 
441
745
  // --- 可见扁平节点 ---
442
746
  const flat = $derived(flattenVisible(mergedData, effectiveExpanded));
443
- // 搜索时仅保留命中或其祖先链上的节点(expand 集即祖先链 + 自身有命中后代者)
747
+ // showFilteredOnly(对齐 Semi):搜索激活时仅保留命中节点及其祖先链(expand 集即祖先链 +
748
+ // 自身有命中后代者),隐藏其它未命中节点。默认 false 时展示全树(命中项高亮、祖先自动展开)。
444
749
  const visibleFlat = $derived.by(() => {
445
- if (!searchActive) return flat;
750
+ if (!searchActive || !showFilteredOnly) return flat;
446
751
  return flat.filter(
447
752
  (f) => filterResult.matched.has(f.node.key) || filterResult.expand.has(f.node.key),
448
753
  );
@@ -467,17 +772,64 @@
467
772
  const VIRTUAL_OVERSCAN = 4;
468
773
  // viewport 元素普通引用(bind:this),不参与响应式几何读取。
469
774
  let viewportEl = $state<HTMLDivElement | null>(null);
775
+ // 非虚拟化时的 role=tree 容器引用,供命令式 focus() 使用(preventScroll 传递给此处)。
776
+ let listEl = $state<HTMLDivElement | null>(null);
777
+
778
+ /**
779
+ * 命令式聚焦树容器(对齐 Semi 组件内 focus 方法)。
780
+ * 尊重 preventScroll:为 true 时聚焦不触发浏览器滚动文档。可经组件实例调用。
781
+ */
782
+ export function focus(): void {
783
+ const el = viewportEl ?? listEl;
784
+ el?.focus({ preventScroll });
785
+ }
786
+
787
+ /**
788
+ * 命令式触发搜索(对齐 Semi `search` 方法)。写入内部搜索词并触发过滤/回调。
789
+ * 常配合 searchRender={false}(隐藏内置搜索框)使用,由外部输入框驱动。
790
+ * onSearch 第二参回传 filteredExpandedKeys(因搜索而展开的祖先链 key,对齐 Semi)。
791
+ */
792
+ export function search(value: string): void {
793
+ innerSearchValue = value;
794
+ if (onSearch) {
795
+ const trimmed = value.trim();
796
+ let expandKeys: string[] = [];
797
+ if (trimmed.length > 0 && searchEnabled) {
798
+ let pred: (node: TreeNodeData) => boolean;
799
+ if (typeof filterTreeNode === 'function') {
800
+ const fn = filterTreeNode;
801
+ pred = (n: TreeNodeData) => fn(trimmed, toOrig(n));
802
+ } else {
803
+ const lower = trimmed.toLowerCase();
804
+ pred = (n: TreeNodeData) => nodeFilterText(n).toLowerCase().includes(lower);
805
+ }
806
+ // filteredExpandedKeys:命中节点的祖先链(computeFilteredKeys 的 expand 集),供展开受控回写。
807
+ expandKeys = [...computeFilteredKeys(mergedData, pred).expand].map(String);
808
+ }
809
+ onSearch(value, expandKeys);
810
+ }
811
+ }
470
812
  // 仅由命令式 scroll 回调写入的本地 scrollTop,render 期只读。
471
813
  let scrollTop = $state(0);
472
814
  // rAF 节流句柄(非响应式)。
473
815
  let rafId = 0;
474
816
 
475
- const rowHeight = $derived(itemHeight > 0 ? itemHeight : 32);
817
+ // labelEllipsis:未显式传时默认跟随虚拟化(虚拟化下默认省略,对齐 Semi)。
818
+ const ellipsis = $derived(labelEllipsis ?? virtualized);
819
+
820
+ // 虚拟化视口高度(数字 px 用于几何计算;字符串 '100%' 走 CSS,几何回退 320)。
821
+ const virtualHeightCss = $derived<string>(
822
+ typeof virtualize?.height === 'number'
823
+ ? `${virtualize.height}px`
824
+ : (virtualize?.height as string | undefined) ?? '100%',
825
+ );
826
+ const virtualHeightPx = $derived(typeof virtualize?.height === 'number' ? virtualize.height : 320);
827
+ const rowHeight = $derived(virtualItemSize > 0 ? virtualItemSize : 32);
476
828
  const totalHeight = $derived(visibleFlat.length * rowHeight);
477
829
  // 可视区间:纯 $derived,仅依赖本地 $state,render-safe(不读 DOM)(红线 #2)。
478
830
  const vRange = $derived(
479
831
  virtualized
480
- ? fixedRange(scrollTop, height, rowHeight, visibleFlat.length, VIRTUAL_OVERSCAN)
832
+ ? fixedRange(scrollTop, virtualHeightPx, rowHeight, visibleFlat.length, VIRTUAL_OVERSCAN)
481
833
  : { startIndex: 0, endIndex: visibleFlat.length },
482
834
  );
483
835
  // 实际喂给 #each 的行集合:virtualized 时只取视口内切片,否则全量。
@@ -528,83 +880,162 @@
528
880
  scrollIndexIntoView(i);
529
881
  }
530
882
 
883
+ /**
884
+ * 命令式滚动到指定节点(对齐 Semi `scrollTo` 方法)。仅虚拟化 Tree 生效,
885
+ * 目标须为当前已展开(可见)节点。align 决定对齐位置,默认 'center'。
886
+ */
887
+ export function scrollTo(opts: {
888
+ key: TreeKey;
889
+ align?: 'center' | 'start' | 'end' | 'smart' | 'auto';
890
+ }): void {
891
+ const el = viewportEl;
892
+ if (!el || !virtualized) return;
893
+ const index = visibleFlat.findIndex((f) => f.node.key === opts.key);
894
+ if (index < 0) return;
895
+ const align = opts.align ?? 'center';
896
+ const itemStart = index * rowHeight;
897
+ if (align === 'center') {
898
+ const target = itemStart - (el.clientHeight - rowHeight) / 2;
899
+ const clamped = Math.max(0, Math.min(target, totalHeight - el.clientHeight));
900
+ el.scrollTop = clamped;
901
+ scrollTop = clamped;
902
+ return;
903
+ }
904
+ if (align === 'auto' || align === 'smart') {
905
+ scrollIndexIntoView(index);
906
+ return;
907
+ }
908
+ // start / end:复用 core scrollOffsetForIndex。
909
+ const target = scrollOffsetForIndex(itemStart, rowHeight, el.clientHeight, totalHeight, align);
910
+ el.scrollTop = target;
911
+ scrollTop = target;
912
+ }
913
+
531
914
  function isNodeDisabled(node: TreeNodeData): boolean {
532
915
  return disabled || !!node.disabled;
533
916
  }
534
917
 
918
+ // 单选:非多选模式下、未禁用的节点可点击选中。
535
919
  function isSelectable(node: TreeNodeData): boolean {
536
- return selectable && node.selectable !== false && !isNodeDisabled(node);
920
+ return !multiple && !isNodeDisabled(node);
537
921
  }
538
922
 
923
+ // 多选勾选:多选模式下、未禁用的节点可勾选。
539
924
  function isCheckableNode(node: TreeNodeData): boolean {
540
- return checkable && node.checkable !== false && !isNodeDisabled(node);
925
+ return multiple && !isNodeDisabled(node);
541
926
  }
542
927
 
543
928
  function isExpanded(key: TreeKey): boolean {
544
929
  return effectiveExpanded.has(key);
545
930
  }
546
931
 
932
+ // autoMergeValue(对齐 Semi):从 checked 集中剔除「有已选中祖先」的后代 key,
933
+ // 使某父节点被完全选中时输出仅保留该父节点,不含其子孙。纯函数,不修改入参。
934
+ function mergeCheckedKeys(data: TreeNodeData[], checked: Set<TreeKey>): TreeKey[] {
935
+ const out: TreeKey[] = [];
936
+ const walk = (nodes: TreeNodeData[], ancestorChecked: boolean) => {
937
+ for (const n of nodes) {
938
+ const selfChecked = checked.has(n.key);
939
+ const isLeaf = !n.children || n.children.length === 0;
940
+ // 仅当自身被选中且无已选中祖先时保留(顶层完全选中节点)。
941
+ if (selfChecked && !ancestorChecked) out.push(n.key);
942
+ // disableStrictly 下,被选中的 disabled 叶子必须显式保留——即便其父级已完全选中:
943
+ // 受控回填时父级 key 经 conduct 无法把 disabled 叶子重新联动勾上(disabled 不受父级联动),
944
+ // 若被合并剔除就会丢失该叶子的勾选态(对齐 Semi disableStrictly 语义)。
945
+ else if (
946
+ disableStrictly &&
947
+ selfChecked &&
948
+ ancestorChecked &&
949
+ isLeaf &&
950
+ !!n.disabled
951
+ ) {
952
+ out.push(n.key);
953
+ }
954
+ if (n.children && n.children.length > 0) {
955
+ walk(n.children, ancestorChecked || selfChecked);
956
+ }
957
+ }
958
+ };
959
+ walk(data, false);
960
+ return out;
961
+ }
962
+
547
963
  // --- 状态写入:仅非受控写 inner,受控只回调 (红线 #1) ---
964
+ // 把内部选中 key 集转成 onChange/受控所需的 value 输出形态(多选数组 / 单选标量;
965
+ // onChangeWithObject 时元素转节点对象)。
966
+ function toChangeValue(keys: TreeKey[], singleKey: TreeKey | null): TreeValue {
967
+ if (multiple) return keys.map(keyToOutput) as Array<TreeKey | TreeNodeData>;
968
+ return singleKey === null ? ('' as TreeKey) : keyToOutput(singleKey);
969
+ }
970
+
971
+ // 单选:点击整行选中该节点(对齐 Semi 单选,值为单个 key)。
548
972
  function emitSelect(node: TreeNodeData) {
549
973
  if (!isSelectable(node)) return;
550
- let next: TreeKey | TreeKey[];
551
- let selected: boolean;
552
- if (multiple) {
553
- const arr = Array.isArray(currentValue) ? [...currentValue] : [];
554
- const idx = arr.indexOf(node.key);
555
- if (idx >= 0) {
556
- arr.splice(idx, 1);
557
- selected = false;
558
- } else {
559
- arr.push(node.key);
560
- selected = true;
561
- }
562
- next = arr;
563
- } else {
564
- // 单选:点击直接选中该节点(不取消),selected 恒为 true
565
- next = node.key;
566
- selected = true;
567
- }
568
- if (!isValueControlled) innerValue = next;
569
- onChange?.({ value: next, node: toOrig(node), selected });
974
+ const nextKey = node.key;
975
+ if (!isValueControlled) innerValue = nextKey;
976
+ // onSelect(对齐 Semi):早于 onChange,回传 (key, selected, node)。单选点击恒为选中。
977
+ onSelect?.(node.key, true, toOrig(node));
978
+ onChange?.(toChangeValue([nextKey], nextKey));
570
979
  }
571
980
 
981
+ // 多选:勾选/取消勾选该节点,父子联动,值走 value 通道(对齐 Semi multiple + onChange)。
572
982
  function emitCheck(node: TreeNodeData) {
573
983
  if (!isCheckableNode(node)) return;
574
- let nextBase: Set<TreeKey>;
984
+ // 以当前 checkState.checked 作为勾选基集切换(valueSet 经 conduct 归一后的完整勾选集)。
985
+ let nextChecked: Set<TreeKey>;
575
986
  if (!checkLinked) {
576
- // 解耦(checkStrictly 或 unRelated):仅翻转该节点自身,不触达父子。
577
- nextBase = new Set(currentCheckedBase);
578
- if (nextBase.has(node.key)) nextBase.delete(node.key);
579
- else nextBase.add(node.key);
987
+ // 解耦(unRelated):仅翻转该节点自身,不触达父子。
988
+ nextChecked = new Set(checkState.checked);
989
+ if (nextChecked.has(node.key)) nextChecked.delete(node.key);
990
+ else nextChecked.add(node.key);
580
991
  } else {
581
- nextBase = toggleCheck(mergedData, currentCheckedBase, node.key);
992
+ nextChecked = toggleCheck(mergedData, checkState.checked, node.key, disableStrictly);
582
993
  }
583
- if (!isCheckControlled) innerCheckedBase = nextBase;
584
994
  const resolved = !checkLinked
585
- ? { checked: new Set(nextBase), half: new Set<TreeKey>() }
586
- : conduct(mergedData, nextBase);
587
- onCheck?.({
588
- checked: [...resolved.checked],
589
- node: toOrig(node),
590
- halfChecked: [...resolved.half],
591
- });
995
+ ? { checked: new Set(nextChecked), half: new Set<TreeKey>() }
996
+ : conduct(mergedData, nextChecked, disableStrictly);
997
+ // 是否勾选后为选中态(供 onSelect 语义)。
998
+ const selected = resolved.checked.has(node.key);
999
+ // 输出优先级:leafOnly(只留叶子)> autoMergeValue(合并父子、剔除已选祖先的后代)> 全量。
1000
+ let checkedOut: TreeKey[];
1001
+ if (leafOnly) {
1002
+ checkedOut = collectLeafKeys(mergedData, resolved.checked);
1003
+ } else if (autoMergeValue && checkLinked) {
1004
+ checkedOut = mergeCheckedKeys(mergedData, resolved.checked);
1005
+ } else {
1006
+ checkedOut = [...resolved.checked];
1007
+ }
1008
+ if (!isValueControlled) innerValue = checkedOut;
1009
+ // onSelect(对齐 Semi):早于 onChange,回传 (key, selected, node)。
1010
+ onSelect?.(node.key, selected, toOrig(node));
1011
+ onChange?.(toChangeValue(checkedOut, null));
592
1012
  }
593
1013
 
594
1014
  function emitExpand(node: TreeNodeData, expand: boolean) {
595
- // accordion:展开时同层级只保留一个,自动收起同父级其它已展开节点(纯函数 core,红线 #2)。
596
- // 不同层级互不影响;收起仅移除自身。受控时也只回调收起 siblings 后的新集,不回写(红线 #1)。
597
1015
  let next: Set<TreeKey>;
598
1016
  if (expand) {
599
- next = accordion
600
- ? accordionExpand(mergedData, currentExpandedSet, node.key)
601
- : new Set(currentExpandedSet).add(node.key);
1017
+ next = new Set(currentExpandedSet).add(node.key);
602
1018
  } else {
1019
+ // autoExpandParent(对齐 Semi):收起某节点时,若其仍有展开中的子孙,则阻止收起——
1020
+ // 需先收起所有子节点才能收起父节点。无展开子孙时正常收起。
1021
+ if (autoExpandParent && hasExpandedDescendant(node, currentExpandedSet)) {
1022
+ return;
1023
+ }
603
1024
  next = new Set(currentExpandedSet);
604
1025
  next.delete(node.key);
605
1026
  }
606
1027
  if (!isExpandControlled) innerExpanded = next;
607
- onExpandedChange?.({ expanded: [...next], node: toOrig(node), expand });
1028
+ onExpand?.([...next], { expanded: expand, node: toOrig(node) });
1029
+ }
1030
+
1031
+ // 节点是否有仍在展开集中的子孙(供 autoExpandParent 判断「父节点能否收起」)。
1032
+ function hasExpandedDescendant(node: TreeNodeData, expandedSet: ReadonlySet<TreeKey>): boolean {
1033
+ if (!node.children) return false;
1034
+ for (const child of node.children) {
1035
+ if (expandedSet.has(child.key)) return true;
1036
+ if (hasExpandedDescendant(child, expandedSet)) return true;
1037
+ }
1038
+ return false;
608
1039
  }
609
1040
 
610
1041
  function toggleExpand(node: TreeNodeData) {
@@ -612,7 +1043,7 @@
612
1043
  if (!isExpandable(node, hasOwnKids)) return;
613
1044
  const willExpand = !isExpanded(node.key);
614
1045
  // 展开未加载的异步节点:先取数据再展开(数据到位后合并树派生即显示子节点)
615
- if (willExpand && !hasOwnKids && loadData && !loadedKeys.has(node.key)) {
1046
+ if (willExpand && !hasOwnKids && loadData && !isLoaded(node.key)) {
616
1047
  void loadChildren(node);
617
1048
  }
618
1049
  emitExpand(node, willExpand);
@@ -621,8 +1052,24 @@
621
1052
  function onRowClick(node: TreeNodeData) {
622
1053
  if (isNodeDisabled(node)) return;
623
1054
  activeKey = node.key;
624
- if (isSelectable(node)) emitSelect(node);
625
- else if (isExpandable(node, (node.children?.length ?? 0) > 0)) toggleExpand(node);
1055
+ const expandable = isExpandable(node, (node.children?.length ?? 0) > 0);
1056
+ if (isSelectable(node)) {
1057
+ emitSelect(node);
1058
+ // expandAction='click':可选中节点点击整行时,选中与展开同时发生(对齐 Semi)。
1059
+ if (effExpandAction === 'click' && expandable) toggleExpand(node);
1060
+ } else if (expandable) {
1061
+ // 不可选中的可展开节点:默认点击即展开(沿用原行为),expandAction='click' 语义一致,不重复触发。
1062
+ toggleExpand(node);
1063
+ }
1064
+ }
1065
+
1066
+ // 节点双击:先回调 onDoubleClick;expandAction='doubleClick' 时再触发展开/收起。
1067
+ function onRowDblClick(e: MouseEvent, node: TreeNodeData) {
1068
+ if (isNodeDisabled(node)) return;
1069
+ onDoubleClick?.(e, toOrig(node));
1070
+ if (effExpandAction === 'doubleClick' && isExpandable(node, (node.children?.length ?? 0) > 0)) {
1071
+ toggleExpand(node);
1072
+ }
626
1073
  }
627
1074
 
628
1075
  // --- 键盘导航 (红线 #2: 全部基于派生 visibleFlat 与 activeKey) ---
@@ -684,7 +1131,7 @@
684
1131
  if (next.has(sib.node.key)) continue;
685
1132
  // 触发未加载异步节点的子节点拉取(数据到位后合并树派生显示)。
686
1133
  const hasOwnKids = (sib.node.children?.length ?? 0) > 0;
687
- if (!hasOwnKids && loadData && !loadedKeys.has(sib.node.key)) {
1134
+ if (!hasOwnKids && loadData && !isLoaded(sib.node.key)) {
688
1135
  void loadChildren(sib.node);
689
1136
  }
690
1137
  next.add(sib.node.key);
@@ -693,8 +1140,8 @@
693
1140
  }
694
1141
  if (!changed || lastNode === null) return;
695
1142
  if (!isExpandControlled) innerExpanded = next;
696
- // 一次性回调(node 取最后展开者,expand=true);受控时不回写(红线 #1)。
697
- onExpandedChange?.({ expanded: [...next], node: toOrig(lastNode), expand: true });
1143
+ // 一次性回调(node 取最后展开者,expanded=true);受控时不回写(红线 #1)。
1144
+ onExpand?.([...next], { expanded: true, node: toOrig(lastNode) });
698
1145
  }
699
1146
 
700
1147
  // typeahead:连续输入字符在可见节点间按 label 前缀跳转(APG,spec §6)。
@@ -866,6 +1313,18 @@
866
1313
  e.dataTransfer.effectAllowed = 'move';
867
1314
  // 必须 setData 否则部分浏览器不触发 drop。
868
1315
  e.dataTransfer.setData('text/plain', String(node.key));
1316
+ // 自定义拖拽影像:renderDraggingNode 优先,其次 hideDraggingNode 用透明图隐藏默认幽灵。
1317
+ const rowEl = e.currentTarget as HTMLElement;
1318
+ if (renderDraggingNode) {
1319
+ const custom = renderDraggingNode(rowEl, toOrig(node));
1320
+ if (custom) e.dataTransfer.setDragImage(custom, 0, 0);
1321
+ } else if (hideDraggingNode) {
1322
+ // 1x1 透明图片:绝大多数浏览器据此隐藏默认 dragImg。
1323
+ const img = new Image();
1324
+ img.src =
1325
+ 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
1326
+ e.dataTransfer.setDragImage(img, 0, 0);
1327
+ }
869
1328
  }
870
1329
  onDragStart?.(toOrig(node));
871
1330
  }
@@ -894,8 +1353,18 @@
894
1353
  }
895
1354
  dropKey = node.key;
896
1355
  dropPos = pos;
897
- // 拖到内部时自动展开目标(便于放入),延时避免误触。
898
- if (pos === 'inside' && isExpandable(node, f.hasChildren) && !isExpanded(node.key)) {
1356
+ // onDragOver(对齐 Semi):每次悬停在候选目标上回传。
1357
+ if (onDragOver) {
1358
+ const dragNode = findFlatNode(dragKey);
1359
+ if (dragNode) onDragOver({ dragNode: toOrig(dragNode), dropNode: toOrig(node) });
1360
+ }
1361
+ // 拖到内部时自动展开目标(便于放入),延时避免误触。autoExpandWhenDragEnter=false 时关闭。
1362
+ if (
1363
+ autoExpandWhenDragEnter &&
1364
+ pos === 'inside' &&
1365
+ isExpandable(node, f.hasChildren) &&
1366
+ !isExpanded(node.key)
1367
+ ) {
899
1368
  if (expandTimer === undefined) {
900
1369
  expandTimer = setTimeout(() => {
901
1370
  expandTimer = undefined;
@@ -912,6 +1381,11 @@
912
1381
  const related = e.relatedTarget as Node | null;
913
1382
  const cur = e.currentTarget as HTMLElement;
914
1383
  if (related && cur.contains(related)) return;
1384
+ // onDragLeave(对齐 Semi):真正离开该行时回传。
1385
+ if (onDragLeave && dragKey !== null) {
1386
+ const dragNode = findFlatNode(dragKey);
1387
+ if (dragNode) onDragLeave({ dragNode: toOrig(dragNode), dropNode: toOrig(node) });
1388
+ }
915
1389
  if (dropKey === node.key) {
916
1390
  clearExpandTimer();
917
1391
  dropKey = null;
@@ -938,6 +1412,11 @@
938
1412
  }
939
1413
 
940
1414
  function onNodeDragEnd() {
1415
+ // onDragEnd(对齐 Semi):拖拽结束无论是否成功放下都回传被拖节点。
1416
+ if (onDragEnd && dragKey !== null) {
1417
+ const dragNode = findFlatNode(dragKey);
1418
+ if (dragNode) onDragEnd({ dragNode: toOrig(dragNode) });
1419
+ }
941
1420
  resetDrag();
942
1421
  }
943
1422
 
@@ -946,25 +1425,6 @@
946
1425
  return f?.node;
947
1426
  }
948
1427
 
949
- // --- 搜索高亮:把命中子串包 <mark>,返回片段数组供模板渲染 ---
950
- type Part = { text: string; mark: boolean };
951
- function highlightParts(text: string): Part[] {
952
- if (!searchActive) return [{ text, mark: false }];
953
- const lower = text.toLowerCase();
954
- const term = trimmedSearch.toLowerCase();
955
- const parts: Part[] = [];
956
- let from = 0;
957
- let idx = lower.indexOf(term, from);
958
- while (idx !== -1) {
959
- if (idx > from) parts.push({ text: text.slice(from, idx), mark: false });
960
- parts.push({ text: text.slice(idx, idx + term.length), mark: true });
961
- from = idx + term.length;
962
- idx = lower.indexOf(term, from);
963
- }
964
- if (from < text.length) parts.push({ text: text.slice(from), mark: false });
965
- return parts;
966
- }
967
-
968
1428
  function rowChecked(node: TreeNodeData): boolean {
969
1429
  return checkState.checked.has(node.key);
970
1430
  }
@@ -980,28 +1440,69 @@
980
1440
  const cls = $derived(
981
1441
  [
982
1442
  'cd-tree',
983
- `cd-tree--${size}`,
984
- `cd-tree--${status}`,
985
1443
  disabled && 'cd-tree--disabled',
986
1444
  showLine && 'cd-tree--line',
1445
+ effBlockNode && 'cd-tree--block',
1446
+ directory && 'cd-tree--directory',
1447
+ motionEnabled && 'cd-tree--motion',
1448
+ rootClassName,
987
1449
  ]
988
1450
  .filter(Boolean)
989
1451
  .join(' '),
990
1452
  );
1453
+
1454
+ // renderFullLabel 上下文构造:把内置计算好的状态与行为回调封装给使用者 snippet。
1455
+ // className 汇总内置状态类(缩进由 padding 处理,此处给状态类),供自定义渲染沿用内置样式。
1456
+ function fullLabelClass(f: FlatNode, selected: boolean, nodeDisabled: boolean, active: boolean): string {
1457
+ return [
1458
+ 'cd-tree__node',
1459
+ `cd-tree__node--fulllabel`,
1460
+ `cd-tree__node--level-${f.level + 1}`,
1461
+ selected && 'cd-tree__node--selected',
1462
+ nodeDisabled && 'cd-tree__node--disabled',
1463
+ active && 'cd-tree__node--active',
1464
+ ]
1465
+ .filter(Boolean)
1466
+ .join(' ');
1467
+ }
991
1468
  </script>
992
1469
 
993
- <div class={cls}>
994
- {#if searchEnabled}
995
- <div class="cd-tree__search">
996
- <input
997
- class="cd-tree__search-input"
998
- type="text"
999
- placeholder={loc().t('Tree.searchPlaceholder')}
1000
- aria-label={loc().t('Tree.searchPlaceholder')}
1001
- value={searchValue}
1002
- oninput={handleSearchInput}
1003
- {disabled}
1004
- />
1470
+ <div class={cls} style={rootStyle}>
1471
+ {#if searchEnabled && searchRender !== false}
1472
+ {@const placeholder = searchPlaceholder ?? loc().t('Tree.searchPlaceholder')}
1473
+ <!-- 搜索框容器(对齐 Semi tree-search-wrapper:paddingY 8 / paddingX 12) -->
1474
+ <div
1475
+ class={['cd-tree__search', searchClassName].filter(Boolean).join(' ')}
1476
+ style={searchStyle}
1477
+ >
1478
+ {#if searchRender}
1479
+ <!-- 自定义搜索框(对齐 Semi searchRender):透传 inputProps,使用者可原样传给 Input。 -->
1480
+ {@render searchRender({
1481
+ value: searchValue,
1482
+ placeholder,
1483
+ onChange: handleSearchValue,
1484
+ onClear: clearSearch,
1485
+ showClear,
1486
+ className: searchClassName,
1487
+ style: searchStyle,
1488
+ disabled,
1489
+ })}
1490
+ {:else}
1491
+ <!-- 内置搜索框复用库内 Input:IconSearch 前缀 + clearable(对齐 Semi 用 Input + showClear)。 -->
1492
+ <Input
1493
+ value={searchValue}
1494
+ {placeholder}
1495
+ ariaLabel={placeholder}
1496
+ {disabled}
1497
+ {showClear}
1498
+ onInput={handleSearchValue}
1499
+ onClear={clearSearch}
1500
+ >
1501
+ {#snippet prefix()}
1502
+ <IconSearch />
1503
+ {/snippet}
1504
+ </Input>
1505
+ {/if}
1005
1506
  </div>
1006
1507
  {/if}
1007
1508
 
@@ -1014,12 +1515,12 @@
1014
1515
  class="cd-tree__list cd-tree__list--virtual"
1015
1516
  role="tree"
1016
1517
  aria-label={ariaLabel}
1017
- aria-multiselectable={multiple || checkable}
1518
+ aria-multiselectable={multiple}
1018
1519
  aria-activedescendant={activeDescId}
1019
1520
  aria-disabled={disabled || undefined}
1020
1521
  tabindex={disabled ? -1 : 0}
1021
1522
  bind:this={viewportEl}
1022
- style={`block-size:${height}px; overflow:auto`}
1523
+ style={`block-size:${virtualHeightCss}; overflow:auto`}
1023
1524
  onkeydown={onKeydown}
1024
1525
  >
1025
1526
  <div class="cd-tree__spacer" style={`block-size:${totalHeight}px`}>
@@ -1033,10 +1534,11 @@
1033
1534
  class="cd-tree__list"
1034
1535
  role="tree"
1035
1536
  aria-label={ariaLabel}
1036
- aria-multiselectable={multiple || checkable}
1537
+ aria-multiselectable={multiple}
1037
1538
  aria-activedescendant={activeDescId}
1038
1539
  aria-disabled={disabled || undefined}
1039
1540
  tabindex={disabled ? -1 : 0}
1541
+ bind:this={listEl}
1040
1542
  onkeydown={onKeydown}
1041
1543
  >
1042
1544
  {#each visibleFlat as f (f.node.key)}
@@ -1046,6 +1548,18 @@
1046
1548
  {/if}
1047
1549
  </div>
1048
1550
 
1551
+ {#snippet fullLabelSwitcher(s: { expanded: boolean; loading: boolean })}
1552
+ {#if s.loading}
1553
+ <span class="cd-tree__switcher cd-tree__switcher--loading" aria-hidden="true">
1554
+ <Spin size="small" />
1555
+ </span>
1556
+ {:else}
1557
+ <span class="cd-tree__switcher" class:cd-tree__switcher--open={s.expanded} aria-hidden="true">
1558
+ <IconTreeTriangleDown size="small" />
1559
+ </span>
1560
+ {/if}
1561
+ {/snippet}
1562
+
1049
1563
  {#snippet row(f: FlatNode, posStyle: string | undefined)}
1050
1564
  {@const node = f.node}
1051
1565
  {@const expandable = isExpandable(node, f.hasChildren)}
@@ -1057,7 +1571,28 @@
1057
1571
  {@const active = activeKey === node.key}
1058
1572
  {@const dragging = dragKey === node.key}
1059
1573
  {@const isDropTarget = dropKey === node.key}
1060
- {@const indentStyle = showLine ? '' : `padding-inline-start: calc(${f.level} * var(--cd-tree-indent))`}
1574
+ {@const indentStyle = showLine ? '' : `padding-inline-start: calc(var(--cd-spacing-tree-option-level1-padding-left) + ${f.level} * var(--cd-spacing-tree-option-level-padding-left))`}
1575
+ {#if renderFullLabel}
1576
+ <!-- renderFullLabel:整行完全由使用者接管(对齐 Semi)。提供内置状态类/图标/回调,
1577
+ 使用者自绘结构;虚拟化时须把 ctx.style 赋给渲染根节点。 -->
1578
+ {@render renderFullLabel({
1579
+ data: toOrig(node),
1580
+ level: f.level,
1581
+ style: [posStyle, indentStyle].filter(Boolean).join('; ') || undefined,
1582
+ className: fullLabelClass(f, selected, nodeDisabled, active),
1583
+ expandIcon: fullLabelSwitcher,
1584
+ isLeaf: !expandable,
1585
+ checkStatus: { checked, halfChecked: rowHalf(node) },
1586
+ expandStatus: { expanded, loading },
1587
+ filtered: searchActive && filterResult.matched.has(node.key),
1588
+ searchWord: trimmedSearch,
1589
+ onClick: () => onRowClick(node),
1590
+ onCheck: () => emitCheck(node),
1591
+ onExpand: () => toggleExpand(node),
1592
+ onContextMenu: (e: MouseEvent) => { e.preventDefault(); onContextMenu?.(e, toOrig(node)); },
1593
+ onDoubleClick: (e: MouseEvent) => onRowDblClick(e, node),
1594
+ })}
1595
+ {:else}
1061
1596
  <!-- treeitem 焦点经容器 aria-activedescendant 漫游管理,行本身 tabindex=-1,键盘统一在 role=tree 容器处理 -->
1062
1597
  <!-- svelte-ignore a11y_click_events_have_key_events -->
1063
1598
  <div
@@ -1066,7 +1601,7 @@
1066
1601
  class:cd-tree__node--selected={selected}
1067
1602
  class:cd-tree__node--disabled={nodeDisabled}
1068
1603
  class:cd-tree__node--active={active}
1069
- class:cd-tree__node--block={blockNode}
1604
+ class:cd-tree__node--block={effBlockNode}
1070
1605
  class:cd-tree__node--dragging={dragging}
1071
1606
  class:cd-tree__node--drop-before={isDropTarget && dropPos === 'before'}
1072
1607
  class:cd-tree__node--drop-inside={isDropTarget && dropPos === 'inside'}
@@ -1078,12 +1613,15 @@
1078
1613
  aria-setsize={f.setSize}
1079
1614
  aria-posinset={f.posInSet}
1080
1615
  aria-expanded={expandable ? expanded : undefined}
1081
- aria-selected={selectable ? selected : undefined}
1082
- aria-checked={checkable ? ariaCheckedValue(node) : undefined}
1616
+ aria-selected={!multiple ? selected : undefined}
1617
+ aria-checked={multiple ? ariaCheckedValue(node) : undefined}
1083
1618
  aria-disabled={nodeDisabled || undefined}
1084
1619
  style={[posStyle, indentStyle].filter(Boolean).join('; ') || undefined}
1085
1620
  onclick={() => onRowClick(node)}
1086
- oncontextmenu={onRightClick ? (e) => { e.preventDefault(); onRightClick(e, toOrig(node)); } : undefined}
1621
+ ondblclick={onDoubleClick || effExpandAction === 'doubleClick'
1622
+ ? (e) => onRowDblClick(e, node)
1623
+ : undefined}
1624
+ oncontextmenu={onContextMenu ? (e) => { e.preventDefault(); onContextMenu(e, toOrig(node)); } : undefined}
1087
1625
  ondragstart={draggable ? (e) => onNodeDragStart(e, node) : undefined}
1088
1626
  ondragover={draggable ? (e) => onNodeDragOver(e, f) : undefined}
1089
1627
  ondragleave={draggable ? (e) => onNodeDragLeave(e, node) : undefined}
@@ -1104,15 +1642,16 @@
1104
1642
  {/each}
1105
1643
  {/if}
1106
1644
  {#if loading}
1107
- {#if switcher}
1108
- {@render switcher({ node, expanded: false, loading: true })}
1645
+ {#if expandIcon}
1646
+ {@render expandIcon({ node, expanded: false, loading: true })}
1109
1647
  {:else}
1648
+ <!-- 加载态复用 Spin 组件(对齐 Semi Tree 内部用 Spin) -->
1110
1649
  <span class="cd-tree__switcher cd-tree__switcher--loading" aria-hidden="true">
1111
- <span class="cd-tree__spinner"></span>
1650
+ <Spin size="small" />
1112
1651
  </span>
1113
1652
  {/if}
1114
1653
  {:else if expandable}
1115
- {#if switcher}
1654
+ {#if expandIcon}
1116
1655
  <!-- svelte-ignore a11y_click_events_have_key_events -->
1117
1656
  <span
1118
1657
  role="button"
@@ -1123,7 +1662,7 @@
1123
1662
  if (!nodeDisabled) toggleExpand(node);
1124
1663
  }}
1125
1664
  >
1126
- {@render switcher({ node, expanded, loading: false })}
1665
+ {@render expandIcon({ node, expanded, loading: false })}
1127
1666
  </span>
1128
1667
  {:else}
1129
1668
  <!-- svelte-ignore a11y_click_events_have_key_events -->
@@ -1138,69 +1677,68 @@
1138
1677
  if (!nodeDisabled) toggleExpand(node);
1139
1678
  }}
1140
1679
  >
1141
- <svg viewBox="0 0 16 16" width="10" height="10" aria-hidden="true" focusable="false">
1142
- <path fill="currentColor" d="M6 4l4 4-4 4V4Z" />
1143
- </svg>
1680
+ <IconTreeTriangleDown size="small" />
1144
1681
  </span>
1145
1682
  {/if}
1146
1683
  {:else}
1147
- {#if switcher}
1148
- {@render switcher({ node, expanded: false, loading: false })}
1684
+ {#if expandIcon}
1685
+ {@render expandIcon({ node, expanded: false, loading: false })}
1149
1686
  {:else}
1150
1687
  <span class="cd-tree__switcher cd-tree__switcher--leaf" aria-hidden="true"></span>
1151
1688
  {/if}
1152
1689
  {/if}
1153
1690
 
1154
- {#if checkable}
1691
+ {#if multiple}
1692
+ <!-- 勾选框复用 Checkbox 组件(对齐 Semi Tree 内部用 Checkbox)。
1693
+ 交互由 Checkbox 自身的 onChange 触发 emitCheck(不要在外层容器加 onclick——
1694
+ Checkbox 内部是 label+input,点 label 会双触发 click,导致 toggle 抵消)。
1695
+ 外层 span 仅阻止点击冒泡到行(避免额外触发行选中/展开)。 -->
1696
+ <!-- span 仅拦截冒泡、非交互元素(交互由内部 Checkbox 承载),故忽略静态元素交互告警 -->
1697
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
1698
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
1155
1699
  <span
1156
1700
  class="cd-tree__checkbox"
1157
- class:cd-tree__checkbox--checked={checked}
1158
- class:cd-tree__checkbox--half={!checked && rowHalf(node)}
1159
- class:cd-tree__checkbox--disabled={!isCheckableNode(node)}
1160
- role="button"
1161
- tabindex="-1"
1162
- aria-hidden="true"
1163
- onclick={(e) => {
1164
- e.stopPropagation();
1165
- emitCheck(node);
1166
- }}
1701
+ onclick={(e) => e.stopPropagation()}
1167
1702
  >
1168
- {#if checked}
1169
- <svg viewBox="0 0 16 16" width="12" height="12" aria-hidden="true" focusable="false">
1170
- <path
1171
- fill="none"
1172
- stroke="currentColor"
1173
- stroke-width="2"
1174
- stroke-linecap="round"
1175
- stroke-linejoin="round"
1176
- d="M3.5 8.5l3 3 6-6.5"
1177
- />
1178
- </svg>
1179
- {:else if rowHalf(node)}
1180
- <svg viewBox="0 0 16 16" width="12" height="12" aria-hidden="true" focusable="false">
1181
- <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M4 8h8" />
1182
- </svg>
1183
- {/if}
1703
+ <Checkbox
1704
+ checked={checked}
1705
+ indeterminate={!checked && rowHalf(node)}
1706
+ disabled={!isCheckableNode(node)}
1707
+ ariaLabel={node.label}
1708
+ onChange={() => emitCheck(node)}
1709
+ />
1184
1710
  </span>
1185
1711
  {/if}
1186
1712
 
1187
- {#if showIcon}
1713
+ {#if icon || directory}
1188
1714
  {@const isLeaf = !expandable}
1189
- <span class="cd-tree__icon" aria-hidden="true">
1190
- {#if icon}{@render icon({ node, expanded, isLeaf })}{/if}
1715
+ <span class="cd-tree__icon" class:cd-tree__icon--directory={directory && !icon} aria-hidden="true">
1716
+ {#if icon}
1717
+ {@render icon({ node, expanded, isLeaf })}
1718
+ {:else if directory}
1719
+ <!-- directory 模式内置目录/文件图标(对齐 Semi IconFolder/IconFolderOpen/IconFile);可用 icon snippet 覆盖 -->
1720
+ {#if isLeaf}
1721
+ <IconFile />
1722
+ {:else if expanded}
1723
+ <IconFolderOpen />
1724
+ {:else}
1725
+ <IconFolder />
1726
+ {/if}
1727
+ {/if}
1191
1728
  </span>
1192
1729
  {/if}
1193
1730
 
1194
- <span class="cd-tree__label">
1195
- {#if label}
1196
- {@render label({ node, level: f.level, searchValue: trimmedSearch, selected, checked })}
1197
- {:else}
1198
- {#each highlightParts(node.label) as part, i (i)}
1199
- {#if part.mark}
1200
- <mark class="cd-tree__highlight">{part.text}</mark>
1201
- {:else}{part.text}{/if}
1202
- {/each}
1203
- {/if}
1731
+ <span class="cd-tree__label" class:cd-tree__label--ellipsis={ellipsis}>
1732
+ {#if renderLabel}
1733
+ {@render renderLabel({ node, level: f.level, searchValue: trimmedSearch, selected, checked })}
1734
+ {:else if searchActive}
1735
+ <!-- 搜索命中高亮复用 Highlight 组件(对齐 Semi Tree 内部用 Highlight) -->
1736
+ <Highlight
1737
+ sourceString={node.label}
1738
+ searchWords={trimmedSearch}
1739
+ highlightClassName="cd-tree__highlight"
1740
+ />
1741
+ {:else}{node.label}{/if}
1204
1742
  </span>
1205
1743
 
1206
1744
  {#if suffix}
@@ -1215,6 +1753,7 @@
1215
1753
  </span>
1216
1754
  {/if}
1217
1755
  </div>
1756
+ {/if}
1218
1757
  {/snippet}
1219
1758
 
1220
1759
  <style>
@@ -1223,8 +1762,11 @@
1223
1762
  display: flex;
1224
1763
  flex-direction: column;
1225
1764
  gap: var(--cd-spacing-extra-tight);
1226
- color: var(--cd-tree-node-color);
1227
- font-size: var(--cd-font-size-body);
1765
+ color: var(--cd-color-tree-option-text-default);
1766
+ font-size: var(--cd-tree-node-font-size);
1767
+ box-sizing: border-box;
1768
+ /* 通过 style prop 设 height 时生效:容器不溢出,由列表区自身滚动 */
1769
+ overflow: hidden;
1228
1770
  }
1229
1771
  .cd-tree--small {
1230
1772
  --cd-tree-row-height: var(--cd-tree-node-height-small);
@@ -1233,39 +1775,30 @@
1233
1775
  --cd-tree-row-height: var(--cd-tree-node-height-large);
1234
1776
  }
1235
1777
  .cd-tree--disabled {
1236
- color: var(--cd-tree-node-color-disabled);
1778
+ color: var(--cd-color-tree-option-disabled-text-default);
1237
1779
  }
1238
1780
 
1239
- .cd-tree__search-input {
1240
- inline-size: 100%;
1241
- block-size: var(--cd-tree-row-height);
1242
- padding-inline: var(--cd-spacing-tight);
1243
- color: inherit;
1244
- background: var(--cd-color-bg-1, transparent);
1245
- border: 1px solid var(--cd-tree-border-color);
1246
- border-radius: var(--cd-radius-small, 4px);
1247
- font: inherit;
1248
- }
1249
- .cd-tree--warning .cd-tree__search-input {
1250
- border-color: var(--cd-tree-border-color-warning);
1251
- }
1252
- .cd-tree--error .cd-tree__search-input {
1253
- border-color: var(--cd-tree-border-color-error);
1254
- }
1255
- .cd-tree__search-input:focus-visible {
1256
- outline: none;
1257
- border-color: var(--cd-tree-focus-ring);
1258
- box-shadow: 0 0 0 2px var(--cd-tree-focus-ring);
1781
+ /* 搜索框容器:对齐 Semi tree-search-wrapper(paddingY 8 / paddingX 12)。
1782
+ 内部搜索框复用 Input 组件,边框/清除/聚焦样式由 Input 自带(无需 Tree 再写)。 */
1783
+ .cd-tree__search {
1784
+ padding: var(--cd-spacing-tree-search-wrapper-padding-y)
1785
+ var(--cd-spacing-tree-search-wrapper-padding-x);
1259
1786
  }
1260
1787
 
1261
1788
  .cd-tree__list {
1262
1789
  display: flex;
1263
1790
  flex-direction: column;
1264
1791
  outline: none;
1792
+ /* 对齐 Semi tree-option-list(paddingY 8 / paddingX 0;flex:1 占满剩余高度,超出滚动) */
1793
+ padding: var(--cd-spacing-tree-option-list-padding-y) var(--cd-spacing-tree-option-list-padding-x);
1794
+ flex: 1 1 auto;
1795
+ min-block-size: 0;
1796
+ overflow-y: auto;
1797
+ overflow-x: hidden;
1265
1798
  }
1266
1799
  .cd-tree__list:focus-visible {
1267
1800
  box-shadow: 0 0 0 2px var(--cd-tree-focus-ring);
1268
- border-radius: var(--cd-radius-small, 4px);
1801
+ border-radius: var(--cd-radius-tree-checkbox-addon);
1269
1802
  }
1270
1803
  /* 虚拟滚动:容器自身滚动,display block 以便 spacer 绝对定位行布局生效 */
1271
1804
  .cd-tree__list--virtual {
@@ -1282,23 +1815,38 @@
1282
1815
  align-items: center;
1283
1816
  gap: var(--cd-spacing-extra-tight);
1284
1817
  block-size: var(--cd-tree-row-height);
1285
- padding-inline-end: var(--cd-spacing-tight);
1286
- border-radius: var(--cd-radius-small, 4px);
1818
+ /* 首层左内边距 + 行右内边距(对齐 Semi $spacing-tree_option_level1-paddingLeft 8px) */
1819
+ padding-inline: var(--cd-spacing-tree-option-level1-padding-left);
1820
+ border-radius: var(--cd-radius-tree-checkbox-addon);
1287
1821
  cursor: pointer;
1288
1822
  transition: background-color var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
1289
1823
  }
1290
1824
  .cd-tree__node:hover {
1291
- background: var(--cd-tree-node-bg-hover);
1825
+ background: var(--cd-color-tree-option-bg-hover);
1826
+ }
1827
+ /* 按下态(对齐 Semi $color-tree_option_selected-bg-default = fill-1) */
1828
+ .cd-tree__node:active {
1829
+ background: var(--cd-color-tree-option-selected-bg-default);
1292
1830
  }
1293
1831
  .cd-tree__node--selected {
1294
- color: var(--cd-tree-node-color-selected);
1295
- background: var(--cd-tree-node-bg-selected);
1832
+ color: var(--cd-color-tree-option-text-default);
1833
+ background: var(--cd-color-tree-option-bg-active);
1834
+ }
1835
+ .cd-tree__node--selected:hover,
1836
+ .cd-tree__node--selected:active {
1837
+ background: var(--cd-color-tree-option-bg-active);
1296
1838
  }
1297
- .cd-tree__node--active {
1298
- box-shadow: inset 0 0 0 1px var(--cd-tree-focus-ring);
1839
+ /* 键盘 roving 焦点(当前项):对齐 Semi 无 border,仅用背景区分;焦点可见性靠背景差异。 */
1840
+ .cd-tree__node--active:not(.cd-tree__node--selected) {
1841
+ background: var(--cd-color-tree-option-bg-hover);
1842
+ }
1843
+ /* 键盘操作时(容器 focus-visible 内)给当前项一个可见焦点环,鼠标交互不显示 border。 */
1844
+ .cd-tree__list:focus-visible .cd-tree__node--active {
1845
+ outline: 2px solid var(--cd-tree-focus-ring);
1846
+ outline-offset: -2px;
1299
1847
  }
1300
1848
  .cd-tree__node--disabled {
1301
- color: var(--cd-tree-node-color-disabled);
1849
+ color: var(--cd-color-tree-option-disabled-text-default);
1302
1850
  cursor: not-allowed;
1303
1851
  }
1304
1852
  .cd-tree__node--disabled:hover {
@@ -1306,6 +1854,14 @@
1306
1854
  }
1307
1855
 
1308
1856
  /* --- 拖拽排序:被拖节点半透明 + 插入指示线 / 内部高亮 --- */
1857
+ /* 可拖拽行的内边距(对齐 Semi $spacing-tree_option_draggable-paddingY 2 / paddingX 0) */
1858
+ .cd-tree__node[draggable='true'] {
1859
+ padding-block: var(--cd-spacing-tree-option-draggable-padding-y);
1860
+ padding-inline-end: calc(
1861
+ var(--cd-spacing-tree-option-level1-padding-left) +
1862
+ var(--cd-spacing-tree-option-draggable-padding-x)
1863
+ );
1864
+ }
1309
1865
  .cd-tree__node--dragging {
1310
1866
  opacity: 0.5;
1311
1867
  }
@@ -1315,8 +1871,8 @@
1315
1871
  content: '';
1316
1872
  position: absolute;
1317
1873
  inset-inline: 0;
1318
- block-size: 2px;
1319
- background: var(--cd-tree-focus-ring, var(--cd-color-primary));
1874
+ block-size: var(--cd-width-tree-option-draggable-border);
1875
+ background: var(--cd-color-tree-option-draggable-insert-border-default);
1320
1876
  border-radius: 1px;
1321
1877
  pointer-events: none;
1322
1878
  }
@@ -1328,8 +1884,8 @@
1328
1884
  }
1329
1885
  /* inside:成为子节点 → 整行高亮框 */
1330
1886
  .cd-tree__node--drop-inside {
1331
- background: var(--cd-tree-node-bg-hover);
1332
- box-shadow: inset 0 0 0 1px var(--cd-tree-focus-ring, var(--cd-color-primary));
1887
+ background: var(--cd-color-tree-option-bg-hover);
1888
+ box-shadow: inset 0 0 0 1px var(--cd-color-tree-option-draggable-insert-border-default);
1333
1889
  }
1334
1890
  /* 节点需相对定位以承载绝对定位的指示线;虚拟化行已 position:absolute,非虚拟行设 relative */
1335
1891
  .cd-tree__node {
@@ -1340,7 +1896,7 @@
1340
1896
  .cd-tree__line {
1341
1897
  position: relative;
1342
1898
  flex: 0 0 auto;
1343
- inline-size: var(--cd-tree-indent);
1899
+ inline-size: var(--cd-spacing-tree-option-level-padding-left);
1344
1900
  align-self: stretch;
1345
1901
  }
1346
1902
  /* 贯穿竖线(祖先非末层) */
@@ -1349,8 +1905,8 @@
1349
1905
  position: absolute;
1350
1906
  inset-block: 0;
1351
1907
  inset-inline-start: 50%;
1352
- inline-size: 1px;
1353
- background: var(--cd-tree-line-color, var(--cd-color-border));
1908
+ inline-size: var(--cd-width-tree-option-line);
1909
+ background: var(--cd-color-tree-option-line);
1354
1910
  }
1355
1911
  /* ├ 形:竖线贯穿 + 横线到右 */
1356
1912
  .cd-tree__line--tee::before {
@@ -1358,8 +1914,8 @@
1358
1914
  position: absolute;
1359
1915
  inset-block: 0;
1360
1916
  inset-inline-start: 50%;
1361
- inline-size: 1px;
1362
- background: var(--cd-tree-line-color, var(--cd-color-border));
1917
+ inline-size: var(--cd-width-tree-option-line);
1918
+ background: var(--cd-color-tree-option-line);
1363
1919
  }
1364
1920
  /* └ 形:竖线 top→中 + 横线到右 */
1365
1921
  .cd-tree__line--elbow::before {
@@ -1368,8 +1924,8 @@
1368
1924
  inset-block-start: 0;
1369
1925
  block-size: 50%;
1370
1926
  inset-inline-start: 50%;
1371
- inline-size: 1px;
1372
- background: var(--cd-tree-line-color, var(--cd-color-border));
1927
+ inline-size: var(--cd-width-tree-option-line);
1928
+ background: var(--cd-color-tree-option-line);
1373
1929
  }
1374
1930
  .cd-tree__line--tee::after,
1375
1931
  .cd-tree__line--elbow::after {
@@ -1378,8 +1934,8 @@
1378
1934
  inset-block-start: 50%;
1379
1935
  inset-inline-start: 50%;
1380
1936
  inset-inline-end: 0;
1381
- block-size: 1px;
1382
- background: var(--cd-tree-line-color, var(--cd-color-border));
1937
+ block-size: var(--cd-width-tree-option-line);
1938
+ background: var(--cd-color-tree-option-line);
1383
1939
  }
1384
1940
 
1385
1941
  .cd-tree__switcher {
@@ -1387,56 +1943,43 @@
1387
1943
  align-items: center;
1388
1944
  justify-content: center;
1389
1945
  flex: 0 0 auto;
1390
- inline-size: 1rem;
1391
- block-size: 1rem;
1392
- color: var(--cd-tree-expand-icon-color);
1946
+ /* 对齐 Semi $width-tree_emptyIcon(展开图标宽 12)+ marginRight 8 */
1947
+ inline-size: var(--cd-width-tree-empty-icon);
1948
+ block-size: var(--cd-width-tree-empty-icon);
1949
+ margin-inline-end: var(--cd-spacing-tree-icon-margin-right);
1950
+ color: var(--cd-color-tree-option-icon-default);
1393
1951
  cursor: pointer;
1394
1952
  transition: transform var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
1953
+ /* IconTreeTriangleDown 默认朝下(=展开态外观,对齐 Semi);收起态旋转 -90deg 指向右侧。 */
1954
+ transform: rotate(-90deg);
1955
+ }
1956
+ .cd-tree__switcher:hover {
1957
+ color: var(--cd-color-tree-option-icon-hover);
1958
+ }
1959
+ .cd-tree__switcher:active {
1960
+ color: var(--cd-color-tree-option-icon-active);
1395
1961
  }
1396
1962
  .cd-tree__switcher--open {
1397
- transform: rotate(90deg);
1963
+ transform: rotate(0deg);
1398
1964
  }
1399
1965
  .cd-tree__switcher--leaf {
1400
1966
  cursor: default;
1967
+ transform: none;
1401
1968
  }
1402
1969
  .cd-tree__switcher--loading {
1403
1970
  cursor: default;
1404
- }
1405
- .cd-tree__spinner {
1406
- inline-size: 0.75rem;
1407
- block-size: 0.75rem;
1408
- border: 2px solid var(--cd-color-border, currentColor);
1409
- border-block-start-color: var(--cd-color-primary);
1410
- border-radius: 50%;
1411
- animation: cd-tree-spin 0.7s linear infinite;
1412
- }
1413
- @keyframes cd-tree-spin {
1414
- to {
1415
- transform: rotate(360deg);
1416
- }
1971
+ transform: none;
1972
+ /* 加载 spin 尺寸对齐 Semi $width-tree_spinIcon(12) */
1973
+ inline-size: var(--cd-width-tree-spin-icon);
1974
+ block-size: var(--cd-width-tree-spin-icon);
1417
1975
  }
1418
1976
 
1977
+ /* 勾选框:框体样式由 Checkbox 组件自带,此处仅负责在行内的定位与右间距(对齐 Semi label withIcon marginRight 8) */
1419
1978
  .cd-tree__checkbox {
1420
1979
  display: inline-flex;
1421
1980
  align-items: center;
1422
- justify-content: center;
1423
1981
  flex: 0 0 auto;
1424
- inline-size: 1rem;
1425
- block-size: 1rem;
1426
- color: #fff;
1427
- background: var(--cd-color-bg-1, #fff);
1428
- border: 1px solid var(--cd-color-border);
1429
- border-radius: var(--cd-radius-small, 3px);
1430
- cursor: pointer;
1431
- }
1432
- .cd-tree__checkbox--checked,
1433
- .cd-tree__checkbox--half {
1434
- background: var(--cd-color-primary);
1435
- border-color: var(--cd-color-primary);
1436
- }
1437
- .cd-tree__checkbox--disabled {
1438
- cursor: not-allowed;
1439
- opacity: 0.5;
1982
+ margin-inline-end: var(--cd-spacing-tree-label-with-icon-margin-right);
1440
1983
  }
1441
1984
 
1442
1985
  .cd-tree__icon {
@@ -1445,20 +1988,24 @@
1445
1988
  justify-content: center;
1446
1989
  flex: 0 0 auto;
1447
1990
  inline-size: 0;
1448
- block-size: 1rem;
1449
- color: var(--cd-tree-node-color);
1991
+ block-size: var(--cd-width-tree-empty-icon);
1992
+ color: var(--cd-color-tree-option-icon-default);
1450
1993
  }
1451
- /* 有自定义图标内容时撑开尺寸 */
1994
+ /* 有自定义图标内容时撑开尺寸 + 右间距(对齐 Semi label withIcon marginRight 8) */
1452
1995
  .cd-tree__icon:not(:empty) {
1453
- inline-size: 1rem;
1996
+ inline-size: var(--cd-width-tree-empty-icon);
1997
+ margin-inline-end: var(--cd-spacing-tree-label-with-icon-margin-right);
1454
1998
  }
1455
1999
 
1456
2000
  .cd-tree__label {
2001
+ flex: 1 1 auto;
2002
+ min-inline-size: 0;
2003
+ }
2004
+ /* labelEllipsis:超长单行省略(默认关闭;虚拟化下默认开启) */
2005
+ .cd-tree__label--ellipsis {
1457
2006
  overflow: hidden;
1458
2007
  white-space: nowrap;
1459
2008
  text-overflow: ellipsis;
1460
- flex: 1 1 auto;
1461
- min-inline-size: 0;
1462
2009
  }
1463
2010
 
1464
2011
  .cd-tree__suffix {
@@ -1476,26 +2023,30 @@
1476
2023
  pointer-events: none;
1477
2024
  }
1478
2025
 
1479
- .cd-tree__highlight {
2026
+ /* 搜索命中高亮:class 注入到 Highlight 子组件内部的 mark,需 :global 穿透 scoped CSS。
2027
+ 对齐 Semi:primary 文字 + bold + 无独立背景(inherit)。 */
2028
+ .cd-tree__label :global(.cd-tree__highlight) {
1480
2029
  padding: 0;
1481
- color: var(--cd-tree-search-highlight-color);
1482
- background: var(--cd-tree-search-highlight-bg);
1483
- font-weight: var(--cd-tree-search-highlight-weight); /* 对齐 Semi 高亮字重 bold */
2030
+ color: var(--cd-color-tree-option-highlight-text);
2031
+ background: inherit;
2032
+ font-weight: var(--cd-font-tree-option-highlight-weight);
1484
2033
  }
1485
2034
 
1486
2035
  .cd-tree__empty {
1487
2036
  padding: var(--cd-spacing-base-tight);
1488
- color: var(--cd-tree-node-color-disabled);
2037
+ color: var(--cd-color-tree-option-disabled-text-default);
1489
2038
  text-align: center;
1490
2039
  }
1491
2040
 
2041
+ /* motion 开关(对齐 Semi motion):仅 cd-tree--motion 时启用 switcher 旋转过渡。 */
2042
+ .cd-tree:not(.cd-tree--motion) .cd-tree__switcher {
2043
+ transition: none;
2044
+ }
2045
+
1492
2046
  @media (prefers-reduced-motion: reduce) {
1493
2047
  .cd-tree__node,
1494
2048
  .cd-tree__switcher {
1495
2049
  transition: none;
1496
2050
  }
1497
- .cd-tree__spinner {
1498
- animation: none;
1499
- }
1500
2051
  }
1501
2052
  </style>