@chenzy-design/svelte 0.3.1 → 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,206 +1,170 @@
1
1
  <!--
2
- Transfer — see specs/components/input/Transfer.spec.md
3
- Basic subset: type='list' two-column transfer, checkbox multi-select,
4
- move buttons, local search filter. Controlled / uncontrolled `value`.
5
- groupList: `dataSource` accepts grouped `{ title, items }[]` (or flat items
6
- with an optional `group` field) — each side renders group headers + items.
7
- treeList: `dataSource` accepts `TransferTreeNode[]` (items with `children`).
8
- The source panel renders a tree (indent + expand/collapse); checking a parent
9
- conducts to all enabled leaf descendants (core `conduct`/`toggleCheck`), with
10
- tri-state half-check. Only leaves migrate to the (flat) target panel; migrated
11
- leaves are greyed/disabled in the source tree.
12
- oneWay: left→right only — each target row has its own remove button; no
13
- right→left batch button.
14
- virtualize: `virtualize` (+`itemHeight`) renders only the in-viewport slice of
15
- *both* flat panels (reuses core `fixedRange`); scrollTop is written by an
16
- imperative rAF-throttled scroll listener into local $state, the visible range
17
- is a pure $derived (红线 #2/#3). Falls back to full render for tree/group panels.
18
- draggable: `draggable` lets target (selected) rows be reordered by mouse via
19
- HTML5 DnD; the new order is computed by the `reorder` pure fn (红线 #2) and only
20
- propagated via `onChange` — controlled `value` is never written (红线 #1).
21
- remote onSearch: providing `onSearch(query, direction)` switches to remote mode
22
- (debounced via `searchDebounce`, imperative timer + cleanup, 红线 #3); the parent
23
- updates `dataSource`, local filtering is skipped, `loading` shows a spinner.
2
+ Transfer 穿梭框 严格对齐 Semi Design(semi-ui/transfer)。
3
+ 双栏(左 source / 右 selected)间迁移条目;type='list'|'groupList'|'treeList'。
4
+ - list/groupList:左侧 Checkbox 列表(groupList 带分组标题),右侧已选列表带删除按钮。
5
+ - treeList:左侧内嵌复用本库 Tree 组件(multiple + leafOnly + disableStrictly),
6
+ 仅叶子迁移到平铺右侧;已选叶子在源树 disabled 置灰。showPath 时右侧显示完整路径。
7
+ 受控 value:父拥有值,组件只经 onChange(values, items) 通知,绝不回写 value(红线 #1)。
8
+ draggable:右侧已选列可鼠标拖拽重排(HTML5 DnD),新顺序仅经 onChange 通知(reorder 纯函数)。
9
+ virtualize={height,width,itemSize}:仅右侧已选列虚拟化(对齐 Semi,复用 core fixedRange)。
10
+ onSearch(input):提供后切远程模式,本地不再过滤,由父按 input 更新 dataSource,loading 显示 Spin。
24
11
  -->
25
12
  <script lang="ts">
26
- import { tick } from 'svelte';
13
+ import { IconClose, IconSearch, IconHandle } from '@chenzy-design/icons';
27
14
  import Checkbox from '../checkbox/Checkbox.svelte';
28
15
  import Input from '../input/Input.svelte';
29
16
  import Button from '../button/Button.svelte';
17
+ import Tree from '../tree/Tree.svelte';
18
+ import Pagination from '../pagination/Pagination.svelte';
30
19
  import { useLocale } from '../locale-provider/index.js';
31
- import {
32
- conduct,
33
- toggleCheck,
34
- flattenVisible,
35
- collectExpandable,
36
- computeFilteredKeys,
37
- useId,
38
- useLiveAnnouncer,
39
- rovingKeyFromEvent,
40
- nextRovingIndex,
41
- type TreeNodeData,
42
- type FlatNode,
43
- } from '@chenzy-design/core';
20
+ import { fixedRange, useId, type TreeNodeData } from '@chenzy-design/core';
44
21
  import type { Snippet } from 'svelte';
45
- import Pagination from '../pagination/Pagination.svelte';
22
+ import type { Attachment } from 'svelte/attachments';
46
23
  import type {
47
24
  TransferGroup,
48
25
  TransferItem,
49
26
  TransferRenderGroup,
50
27
  TransferTreeNode,
51
28
  } from './types.js';
52
- import { fixedRange } from '@chenzy-design/core';
53
29
  import { buildGroups, hasGroups, normalizeData } from './group.js';
54
30
  import { isTreeData, flattenLeaves } from './tree.js';
55
31
  import { computeInsertSide, reorder, type InsertSide } from './reorder.js';
56
- import type { Attachment } from 'svelte/attachments';
57
32
 
58
33
  type TransferKey = string | number;
59
- type Size = 'small' | 'default' | 'large';
60
- type Status = 'default' | 'warning' | 'error';
61
34
  type TransferType = 'list' | 'groupList' | 'treeList';
62
35
 
63
- /** emptyContent: custom empty state renderers */
36
+ const DEFAULT_PAGE_SIZE = 10; // 对齐 Semi numbers.DEFAULT_PAGE_SIZE
37
+
38
+ /** emptyContent: custom empty state renderers(对齐 Semi {left,right,search})。 */
64
39
  interface EmptyContent {
65
40
  left?: Snippet | string;
66
41
  right?: Snippet | string;
67
42
  search?: Snippet | string;
68
43
  }
69
44
 
70
- /** pagination config for left panel */
45
+ /** pagination config for left panel(对齐 Semi PaginationProps)。 */
71
46
  interface PaginationConfig {
72
47
  pageSize?: number;
73
48
  currentPage?: number;
74
49
  defaultCurrentPage?: number;
75
- onPageChange?: (page: number) => void;
50
+ onPageChange?: (currentPage: number) => void;
51
+ }
52
+
53
+ /** virtualize config,仅作用于右侧已选列(对齐 Semi VirtualizeProps)。 */
54
+ interface VirtualizeProps {
55
+ height?: number;
56
+ width?: number | string;
57
+ itemSize: number;
76
58
  }
77
59
 
78
- /** Source panel header render args */
60
+ /** Source panel header render args(对齐 Semi renderSourceHeader)。 */
79
61
  interface SourceHeaderProps {
80
- totalContent: string;
81
- allContent: string;
82
- onAllClick: () => void;
83
- title: string;
84
- allChecked: boolean;
62
+ num: number;
85
63
  showButton: boolean;
64
+ allChecked: boolean;
65
+ onAllClick: () => void;
86
66
  leafOnlyNum?: number | undefined;
87
67
  }
88
68
 
89
- /** Selected panel header render args */
69
+ /** Selected panel header render args(对齐 Semi renderSelectedHeader)。 */
90
70
  interface SelectedHeaderProps {
91
- totalContent: string;
92
- allContent: string;
93
- onAllClick: () => void;
94
- title: string;
71
+ num: number;
72
+ showButton: boolean;
73
+ onClear: () => void;
95
74
  }
96
75
 
97
- /** renderSourcePanel args */
76
+ /** renderSourcePanel args(对齐 Semi SourcePanelProps 常用子集)。 */
98
77
  interface SourcePanelProps {
99
- dataSource: TransferItem[];
100
- selectedItems: TransferItem[];
101
- onChange: (keys: TransferKey[]) => void;
102
- onSearch: (v: string) => void;
78
+ value: TransferKey[];
79
+ loading: boolean;
80
+ noMatch: boolean;
81
+ filterData: TransferItem[];
82
+ sourceData: TransferItem[];
83
+ allChecked: boolean;
84
+ showNumber: number;
103
85
  inputValue: string;
104
- searchResult: TransferItem[];
86
+ onSearch: (v: string) => void;
87
+ onAllClick: () => void;
88
+ onSelectOrRemove: (item: TransferItem) => void;
105
89
  }
106
90
 
107
- /** renderSelectedPanel args */
91
+ /** renderSelectedPanel args(对齐 Semi SelectedPanelProps)。 */
108
92
  interface SelectedPanelProps {
109
- selectedItems: TransferItem[];
110
- onRemove: (key: TransferKey) => void;
93
+ length: number;
94
+ selectedData: TransferItem[];
95
+ onClear: () => void;
96
+ onRemove: (item: TransferItem) => void;
111
97
  onSortEnd: (keys: TransferKey[]) => void;
112
98
  }
113
99
 
114
100
  interface Props {
101
+ style?: string;
102
+ class?: string;
115
103
  value?: TransferKey[];
116
104
  defaultValue?: TransferKey[];
117
105
  dataSource?: TransferItem[] | TransferGroup[] | TransferTreeNode[];
118
- /** 'list' | 'groupList' | 'treeList' controls source panel render mode. */
106
+ /** 'list' | 'groupList' | 'treeList'(对齐 Semi type)。 */
119
107
  type?: TransferType;
120
- filter?: boolean;
121
- searchPlaceholder?: string;
122
- size?: Size;
123
- status?: Status;
108
+ /** 是否显示本地搜索框,或自定义匹配函数(对齐 Semi filter)。 */
109
+ filter?: boolean | ((input: string, item: TransferItem) => boolean);
124
110
  disabled?: boolean;
125
- showPanelTitle?: boolean;
126
- titles?: [string, string];
127
- /** Left→right only: target rows get a remove button, no right→left batch. */
128
- oneWay?: boolean;
129
111
  /**
130
- * Reorder target (selected) rows by mouse drag (HTML5 DnD). New order is
131
- * propagated only via `onChange` (controlled `value` is never written).
132
- * Ignored in tree mode (target panel stays flat but DnD reorder applies).
112
+ * 右侧已选列可鼠标拖拽重排(HTML5 DnD)。新顺序经 reorder 纯函数算出仅经 onChange
113
+ * 通知,受控 value 不回写(红线 #1)。
133
114
  */
134
115
  draggable?: boolean;
135
- /**
136
- * Virtualize both flat panels: render only the in-viewport slice for large
137
- * lists. Reuses core `fixedRange`. Ignored for grouped/tree source panels.
138
- */
139
- virtualize?: boolean;
140
- /** Virtualized row height (px, default 32); must match the real row height. */
141
- itemHeight?: number;
142
- /**
143
- * Remote search: providing this switches to remote mode — input is debounced
144
- * (`searchDebounce` ms) then this is called with the query and which panel
145
- * fired it; the parent updates `dataSource`, local filtering is skipped.
146
- */
147
- onSearch?: (query: string, direction: 'left' | 'right') => void;
148
- /** Remote loading: shows a spinner row in each panel list. */
116
+ /** 右侧已选列虚拟化 {height,width,itemSize}(对齐 Semi,仅右侧)。 */
117
+ virtualize?: VirtualizeProps;
118
+ /** 远程搜索:提供后切远程模式,本地不再过滤,由父更新 dataSource(对齐 Semi onSearch(input))。 */
119
+ onSearch?: (input: string) => void;
120
+ /** 远程加载中:源面板显示 Spin(此处为轻量 spinner 行)。 */
149
121
  loading?: boolean;
150
- /** onSearch debounce in ms (default 300). */
151
- searchDebounce?: number;
152
- onChange?: (targetKeys: TransferKey[]) => void;
153
- /** Custom empty state renderers for left/right/search empty states. */
122
+ /** 选中变更(对齐 Semi):回传 (values, items) */
123
+ onChange?: (values: TransferKey[], items: TransferItem[]) => void;
154
124
  emptyContent?: EmptyContent;
155
- /** Extra props passed to the search Input component. */
125
+ /** 透传给搜索框 Input 的额外参数(对齐 Semi inputProps)。 */
156
126
  inputProps?: Record<string, unknown>;
157
- /** Props passed to the Tree component when type='treeList'. */
127
+ /** type='treeList' 时透传给内部 Tree 的属性(对齐 Semi Omit<TreeProps,'value'|'ref'|'onChange'>)。 */
158
128
  treeProps?: Record<string, unknown>;
159
- /** When type='treeList', show full path in right panel selected items. */
129
+ /** type='treeList' 时右侧已选项显示完整路径(对齐 Semi showPath)。 */
160
130
  showPath?: boolean;
161
- /** Left panel pagination config (only for list/groupList). */
131
+ /** 左侧面板分页(仅 list/groupList,对齐 Semi pagination)。 */
162
132
  pagination?: PaginationConfig;
163
- /** Called when a single item is checked (not bulk select). */
164
133
  onSelect?: (item: TransferItem) => void;
165
- /** Called when a single item is unchecked (not bulk select). */
166
134
  onDeselect?: (item: TransferItem) => void;
167
- /** Custom render for left panel source items. */
135
+ /** 自定义左侧条目渲染(对齐 Semi renderSourceItem)。 */
168
136
  renderSourceItem?: Snippet<[{ item: TransferItem; onChange: () => void; checked: boolean }]>;
169
- /** Custom render for right panel selected items. */
170
- renderSelectedItem?: Snippet<[{ item: TransferItem; onRemove: () => void; sortableHandle?: unknown }]>;
171
- /** Custom render for left panel header. */
137
+ /** 自定义右侧条目渲染(对齐 Semi renderSelectedItem,含 sortableHandle / fullPath)。 */
138
+ renderSelectedItem?: Snippet<
139
+ [{ item: TransferItem; onRemove: () => void; sortableHandle?: unknown; fullPath?: TransferItem['fullPath'] }]
140
+ >;
141
+ /** 自定义左侧面板头部(对齐 Semi renderSourceHeader)。 */
172
142
  renderSourceHeader?: Snippet<[SourceHeaderProps]>;
173
- /** Custom render for right panel header. */
143
+ /** 自定义右侧面板头部(对齐 Semi renderSelectedHeader)。 */
174
144
  renderSelectedHeader?: Snippet<[SelectedHeaderProps]>;
175
- /** Fully custom left panel renderer. */
145
+ /** 完全自定义左侧面板(对齐 Semi renderSourcePanel)。 */
176
146
  renderSourcePanel?: Snippet<[SourcePanelProps]>;
177
- /** Fully custom right panel renderer. */
147
+ /** 完全自定义右侧面板(对齐 Semi renderSelectedPanel)。 */
178
148
  renderSelectedPanel?: Snippet<[SelectedPanelProps]>;
179
149
  }
180
150
 
181
151
  let {
152
+ style,
153
+ class: className,
182
154
  value,
183
155
  defaultValue = [],
184
156
  dataSource = [],
185
157
  type = 'list',
186
158
  filter = true,
187
- searchPlaceholder,
188
- size = 'default',
189
- status = 'default',
190
159
  disabled = false,
191
- showPanelTitle = true,
192
- titles,
193
- oneWay = false,
194
160
  draggable = false,
195
- virtualize = false,
196
- itemHeight = 32,
161
+ virtualize,
197
162
  onSearch,
198
163
  loading = false,
199
- searchDebounce = 300,
200
164
  onChange,
201
165
  emptyContent,
202
166
  inputProps,
203
- treeProps: _treeProps,
167
+ treeProps,
204
168
  showPath = false,
205
169
  pagination,
206
170
  onSelect,
@@ -214,449 +178,200 @@
214
178
  }: Props = $props();
215
179
 
216
180
  const loc = useLocale();
217
-
218
- const announcer = useLiveAnnouncer();
219
181
  const baseId = useId('cd-transfer');
220
- const leftTitleId = `${baseId}-left-title`;
221
- const rightTitleId = `${baseId}-right-title`;
222
-
223
- const searchPlaceholderText = $derived(
224
- searchPlaceholder ?? loc().t('Transfer.searchPlaceholder'),
225
- );
226
182
 
227
183
  const isControlled = $derived(value !== undefined);
228
- let inner = $state<TransferKey[]>(getInitialValue());
229
- // Controlled (`value=`): parent owns the value; we never write the prop, only
230
- // propagate via `onChange`. Uncontrolled: keep our own state in sync.
231
- const current = $derived(isControlled ? (value ?? []) : inner);
232
-
184
+ // getter 一次性取初值,避免 state_referenced_locally 反应式捕获告警。
233
185
  function getInitialValue(): TransferKey[] {
234
186
  return [...defaultValue];
235
187
  }
188
+ let inner = $state<TransferKey[]>(getInitialValue());
189
+ const current = $derived(isControlled ? (value ?? []) : inner);
236
190
 
237
- // Local checked sets — purely local UI state, independent of `value`.
238
- // In tree mode `leftChecked` is the *base* (leaf-level) checked set fed to
239
- // core `conduct`/`toggleCheck`.
240
- let leftChecked = $state<TransferKey[]>([]);
241
- let rightChecked = $state<TransferKey[]>([]);
242
-
243
- // --- Listbox roving focus + range-select anchors (a11y §6 / Listbox APG) ---
244
- // Roving focus key per panel (single Tab stop each). null => first visible row
245
- // is the Tab stop. Owned as $state here; DOM focus() happens in event handlers.
246
- let leftFocusKey = $state<TransferKey | null>(null);
247
- let rightFocusKey = $state<TransferKey | null>(null);
248
- // Shift range-select anchors (plain bookkeeping, not reactive — 红线 #2).
249
- let leftAnchor = -1;
250
- let rightAnchor = -1;
251
- // List roots captured via {@attach} for command focus() (非 render 期读 DOM).
252
- let leftListEl = $state<HTMLUListElement | null>(null);
253
- let rightListEl = $state<HTMLUListElement | null>(null);
254
-
255
- // Local search queries — local UI state.
256
- let leftQuery = $state('');
257
- let rightQuery = $state('');
258
-
259
- // --- Tree mode detection (treeList) -------------------------------------
260
- // type='treeList' OR auto-detect via data shape (backward compat).
191
+ // --- 数据形态判定 -------------------------------------------------------
261
192
  const isTree = $derived(type === 'treeList' || isTreeData(dataSource as readonly unknown[]));
262
193
  const treeData = $derived(isTree ? (dataSource as TransferTreeNode[]) : []);
263
-
264
- // Tree leaves flattened to flat items (the migratable units) for the target
265
- // panel + label lookups. In tree mode this replaces the normalized list.
266
194
  const treeLeaves = $derived(flattenLeaves(treeData));
267
-
268
- // Normalize grouped `{ title, items }[]` or flat items into one flat list,
269
- // tagging each item with `group`. Backward compatible: flat data is untouched.
270
195
  const items = $derived(
271
196
  isTree ? treeLeaves : normalizeData(dataSource as TransferItem[] | TransferGroup[]),
272
197
  );
273
- // type='groupList' forces grouped render; also auto-detect via data shape.
274
198
  const grouped = $derived(!isTree && (type === 'groupList' || hasGroups(items)));
275
199
 
200
+ // key → item 映射(供 onChange 回传 items、右侧渲染)。
201
+ const itemMap = $derived(new Map<TransferKey, TransferItem>(items.map((i) => [i.key, i])));
202
+
276
203
  const leftItems = $derived(items.filter((item) => !current.includes(item.key)));
277
- const rightItems = $derived(items.filter((item) => current.includes(item.key)));
204
+ // 右侧已选保持 current(用户迁移/拖拽)的顺序。
205
+ const rightItems = $derived(
206
+ current.map((k) => itemMap.get(k)).filter((i): i is TransferItem => i !== undefined),
207
+ );
278
208
 
279
- // remote 模式:外部已按 query 更新 dataSource,本地不再过滤(对齐 Select)。
209
+ // --- 搜索 ---------------------------------------------------------------
280
210
  const isRemote = $derived(onSearch !== undefined);
211
+ let inputValue = $state('');
281
212
 
282
- function matches(label: string, query: string): boolean {
283
- return label.toLowerCase().includes(query.trim().toLowerCase());
213
+ function matchItem(item: TransferItem, q: string): boolean {
214
+ if (typeof filter === 'function') return filter(q, item);
215
+ return item.label.toLowerCase().includes(q.trim().toLowerCase());
284
216
  }
285
-
286
- const leftVisible = $derived(
287
- filter && !isRemote && leftQuery
288
- ? leftItems.filter((i) => matches(i.label, leftQuery))
217
+ const filterEnabled = $derived(filter !== false);
218
+ // 源面板过滤后的可见项(remote 模式下父已更新 dataSource,本地不再过滤)。
219
+ const filterData = $derived(
220
+ filterEnabled && !isRemote && inputValue.trim()
221
+ ? leftItems.filter((i) => matchItem(i, inputValue))
289
222
  : leftItems,
290
223
  );
291
- const rightVisible = $derived(
292
- filter && !isRemote && rightQuery
293
- ? rightItems.filter((i) => matches(i.label, rightQuery))
294
- : rightItems,
295
- );
224
+ const inSearchMode = $derived(inputValue.trim() !== '');
225
+ const noMatch = $derived(inSearchMode && filterData.length === 0);
296
226
 
297
- // --- Listbox roving math (flat panels only; tree/group panels stay non-listbox) ---
298
- // Ordered visible row keys per panel — pure derivations (红线 #2: render 期只读).
299
- const leftRowKeys = $derived(leftVisible.map((i) => i.key));
300
- const rightRowKeys = $derived(rightVisible.map((i) => i.key));
227
+ // --- 左侧勾选态(纯本地 UI,独立于 value)-------------------------------
228
+ let leftChecked = $state<TransferKey[]>([]);
301
229
 
302
- function panelItems(side: 'left' | 'right'): TransferItem[] {
303
- return side === 'left' ? leftVisible : rightVisible;
230
+ function commit(next: TransferKey[]) {
231
+ if (!isControlled) inner = next;
232
+ const nextItems = next.map((k) => itemMap.get(k)).filter((i): i is TransferItem => i !== undefined);
233
+ onChange?.(next, nextItems);
304
234
  }
305
235
 
306
- // 纯派生 tabindex:焦点行(或无焦点/失效时首行)为 0,其余 -1。失效焦点回退首行。
307
- function rowTabindex(side: 'left' | 'right', key: TransferKey): 0 | -1 {
308
- const focus = side === 'left' ? leftFocusKey : rightFocusKey;
309
- const keys = side === 'left' ? leftRowKeys : rightRowKeys;
310
- const active = focus != null && keys.includes(focus) ? focus : keys[0];
311
- return active === key ? 0 : -1;
236
+ /** 单项勾选/取消(左侧 Checkbox renderSourceItem 触发)。 */
237
+ function toggleChecked(key: TransferKey) {
238
+ if (disabled) return;
239
+ const item = itemMap.get(key);
240
+ const was = leftChecked.includes(key);
241
+ leftChecked = was ? leftChecked.filter((k) => k !== key) : [...leftChecked, key];
242
+ if (item) {
243
+ if (was) onDeselect?.(item);
244
+ else onSelect?.(item);
245
+ }
312
246
  }
313
247
 
314
- // 命令式 focus()(事件回调内,非 render 期读 DOM)。
315
- function focusRow(side: 'left' | 'right', key: TransferKey): void {
316
- const root = side === 'left' ? leftListEl : rightListEl;
317
- root
318
- ?.querySelector<HTMLElement>(`[data-transfer-key="${CSS.escape(String(key))}"]`)
319
- ?.focus();
320
- }
248
+ // --- 左侧全选 / 取消全选(对齐 Semi handleAll)------------------------
249
+ // filterData 中非禁用、且不在 current(未迁移)的项。
250
+ const selectableLeft = $derived(filterData.filter((i) => !i.disabled && !current.includes(i.key)));
251
+ const leftContainsNotSelected = $derived(selectableLeft.length > 0);
252
+ const filterDataAllDisabled = $derived(filterData.filter((i) => !i.disabled).length === 0);
253
+ const allChecked = $derived(!leftContainsNotSelected && filterData.length > 0);
321
254
 
322
- // Shift 连选:把 [from, to] 闭区间内非禁用项 toggle-on 进 checked 集合。
323
- function setRangeChecked(side: 'left' | 'right', from: number, to: number): void {
324
- const list = panelItems(side);
325
- const lo = Math.min(from, to);
326
- const hi = Math.max(from, to);
327
- const cur = side === 'left' ? leftChecked : rightChecked;
328
- const set = new Set(cur);
329
- for (let i = lo; i <= hi; i += 1) {
330
- const it = list[i];
331
- if (it && !it.disabled && !disabled) set.add(it.key);
255
+ function handleAll() {
256
+ if (disabled) return;
257
+ if (leftContainsNotSelected) {
258
+ // 全选:把可选左项直接迁移到右侧(对齐 Semi handleAll(true))。
259
+ const keys = selectableLeft.map((i) => i.key);
260
+ commit([...current, ...keys]);
261
+ leftChecked = leftChecked.filter((k) => !keys.includes(k));
262
+ } else {
263
+ // 取消全选:把 filterData 中已迁移的项移回左侧。
264
+ const remove = new Set(filterData.map((i) => i.key));
265
+ commit(current.filter((k) => !remove.has(k)));
332
266
  }
333
- if (side === 'left') leftChecked = [...set];
334
- else rightChecked = [...set];
335
267
  }
336
268
 
337
- // keydown:↑↓/Home/End roving、Space 勾选、Enter 移动本面板已勾选、Shift+↑↓ 连选。
338
- // 焦点 $state 在此写、命令式 focus() 也在此(非 render 期)。
339
- function onRowKeydown(e: KeyboardEvent, side: 'left' | 'right', key: TransferKey): void {
340
- const keys = side === 'left' ? leftRowKeys : rightRowKeys;
341
- const list = panelItems(side);
342
- const cur = keys.indexOf(key);
343
- if (cur < 0) return;
344
- const item = list[cur];
345
- // Space:切换当前行勾选(禁用项为 no-op)。
346
- if (e.key === ' ' || e.key === 'Spacebar') {
347
- e.preventDefault();
348
- if (item && !item.disabled && !disabled) {
349
- toggleChecked(side, key);
350
- if (side === 'left') leftAnchor = cur;
351
- else rightAnchor = cur;
352
- }
353
- return;
354
- }
355
- // Enter:把本面板已勾选项移到对侧。
356
- if (e.key === 'Enter') {
357
- e.preventDefault();
358
- if (side === 'left') moveToRight();
359
- else moveToLeft();
360
- return;
361
- }
362
- const intent = rovingKeyFromEvent(e.key);
363
- if (!intent) return;
364
- e.preventDefault();
365
- const next = nextRovingIndex(cur, keys.length, intent);
366
- const nextKey = keys[next];
367
- if (nextKey == null) return;
368
- if (side === 'left') leftFocusKey = nextKey;
369
- else rightFocusKey = nextKey;
370
- // Shift+方向键(仅 prev/next,不含 Home/End):以锚点为基准范围连选。
371
- if (e.shiftKey && (intent === 'prev' || intent === 'next')) {
372
- const anchor = side === 'left' ? leftAnchor : rightAnchor;
373
- const base = anchor >= 0 ? anchor : cur;
374
- if (side === 'left') leftAnchor = base;
375
- else rightAnchor = base;
376
- setRangeChecked(side, base, next);
377
- } else if (!e.shiftKey) {
378
- if (side === 'left') leftAnchor = next;
379
- else rightAnchor = next;
380
- }
381
- focusRow(side, nextKey);
269
+ // --- 迁移 ---------------------------------------------------------------
270
+ function moveToRight() {
271
+ if (disabled) return;
272
+ const movable = leftItems
273
+ .filter((i) => !i.disabled && leftChecked.includes(i.key))
274
+ .map((i) => i.key);
275
+ if (movable.length === 0) return;
276
+ commit([...current, ...movable]);
277
+ leftChecked = leftChecked.filter((k) => !movable.includes(k));
382
278
  }
383
279
 
384
- function onRowFocus(side: 'left' | 'right', key: TransferKey): void {
385
- if (side === 'left') leftFocusKey = key;
386
- else rightFocusKey = key;
280
+ /** 右侧删除单项(对齐 Semi item-close-icon handleSelectOrRemove)。 */
281
+ function removeOne(key: TransferKey) {
282
+ if (disabled) return;
283
+ commit(current.filter((k) => k !== key));
387
284
  }
388
285
 
389
- // 选项行点击:单击 toggle,Shift+click 以锚点为基准范围连选(与键盘一致)。
390
- function onRowOptionClick(e: MouseEvent, side: 'left' | 'right', item: TransferItem): void {
391
- if (disabled || item.disabled) return;
392
- const keys = side === 'left' ? leftRowKeys : rightRowKeys;
393
- const idx = keys.indexOf(item.key);
394
- if (e.shiftKey) {
395
- const anchor = side === 'left' ? leftAnchor : rightAnchor;
396
- if (anchor >= 0) {
397
- setRangeChecked(side, anchor, idx);
398
- } else {
399
- toggleChecked(side, item.key);
400
- if (side === 'left') leftAnchor = idx;
401
- else rightAnchor = idx;
402
- }
403
- } else {
404
- toggleChecked(side, item.key);
405
- if (side === 'left') leftAnchor = idx;
406
- else rightAnchor = idx;
407
- }
408
- if (side === 'left') leftFocusKey = item.key;
409
- else rightFocusKey = item.key;
286
+ /** 单项 select-or-remove(renderSourcePanel 消费方用;勾选后立即迁移,对齐 Semi)。 */
287
+ function onSelectOrRemove(item: TransferItem) {
288
+ if (disabled) return;
289
+ if (current.includes(item.key)) removeOne(item.key);
290
+ else commit([...current, item.key]);
410
291
  }
411
292
 
412
- // 选项行 root 捕获(多个 {@attach} 合法;避免 bind:this 三元)。
413
- function captureList(side: 'left' | 'right'): Attachment<HTMLUListElement> {
414
- return (el) => {
415
- if (side === 'left') leftListEl = el;
416
- else rightListEl = el;
417
- return () => {
418
- if (side === 'left') leftListEl = null;
419
- else rightListEl = null;
420
- };
421
- };
293
+ /** 右侧全部清空(对齐 Semi handleClear)。 */
294
+ function handleClear() {
295
+ if (disabled) return;
296
+ // 保留 disabled 已选项(对齐 Semi:仅清可清项)。
297
+ const keep = current.filter((k) => itemMap.get(k)?.disabled);
298
+ commit(keep);
422
299
  }
423
300
 
424
- // Render groups pure derivations. Empty groups vanish because the input is
425
- // the post-filter visible list. Fallback bucket reuses the panel title.
426
- const sourceFallback = $derived(titles?.[0] ?? loc().t('Transfer.titleSource'));
427
- const targetFallback = $derived(titles?.[1] ?? loc().t('Transfer.titleTarget'));
428
- const leftGroups = $derived(buildGroups(leftVisible, sourceFallback));
429
- const rightGroups = $derived(buildGroups(rightVisible, targetFallback));
430
-
431
- // --- Tree-mode derivations (pure; render never writes state) -------------
301
+ // --- 树模式:内嵌复用 Tree 组件 ----------------------------------------
302
+ // 已迁移叶子在源树 disabled 置灰(不可再勾)。Tree treeData TreeNodeData。
432
303
  const movedSet = $derived(new Set(current));
433
-
434
- // Tree for the source panel: already-migrated leaves are disabled (greyed) so
435
- // they cannot be re-checked (core `conduct` excludes disabled from auto-check).
436
304
  function maskTree(nodes: TransferTreeNode[]): TreeNodeData[] {
437
305
  return nodes.map((n) => {
438
306
  if (n.children && n.children.length > 0) {
439
- return { ...n, children: maskTree(n.children) } as TreeNodeData;
307
+ return { ...n, children: maskTree(n.children) } as unknown as TreeNodeData;
440
308
  }
441
- return { ...n, disabled: !!n.disabled || movedSet.has(n.key) } as TreeNodeData;
309
+ return { ...n, disabled: !!n.disabled || movedSet.has(n.key) } as unknown as TreeNodeData;
442
310
  });
443
311
  }
444
- const sourceTree = $derived(maskTree(treeData));
445
-
446
- // Expansion is local UI state. Default: expand all parents on first paint.
447
- let expandedTouched = $state(false);
448
- let innerExpanded = $state<Set<TransferKey>>(new Set());
449
- const defaultExpanded = $derived(new Set(collectExpandable(sourceTree)));
450
- const baseExpanded = $derived(expandedTouched ? innerExpanded : defaultExpanded);
451
-
452
- // Search expands ancestors of matches without writing the base set (红线 #1/#2).
453
- const treeSearch = $derived(filter && !isRemote ? leftQuery.trim().toLowerCase() : '');
454
- const treeFiltered = $derived(
455
- treeSearch
456
- ? computeFilteredKeys(sourceTree, (n) => n.label.toLowerCase().includes(treeSearch))
457
- : { matched: new Set<TransferKey>(), expand: new Set<TransferKey>() },
458
- );
459
- const searchExpand = $derived(treeFiltered.expand);
460
- const searchMatched = $derived(treeFiltered.matched);
461
- const effectiveExpanded = $derived(
462
- treeSearch ? new Set([...baseExpanded, ...searchExpand]) : baseExpanded,
463
- );
464
-
465
- const flatNodes = $derived(isTree ? flattenVisible(sourceTree, effectiveExpanded) : []);
466
- // Hide nodes that (under active search) neither match nor have a matching
467
- // descendant. A node stays if matched, or is an expanded ancestor of a match.
468
- const visibleFlat = $derived(
469
- treeSearch
470
- ? flatNodes.filter(
471
- (f) => searchMatched.has(f.node.key) || searchExpand.has(f.node.key),
472
- )
473
- : flatNodes,
474
- );
475
-
476
- // Conduction: derive checked/half from the leaf-level base set.
477
- const conducted = $derived(
478
- isTree ? conduct(sourceTree, new Set(leftChecked)) : { checked: new Set<TransferKey>(), half: new Set<TransferKey>() },
479
- );
480
-
481
- function isExpanded(key: TransferKey): boolean {
482
- return effectiveExpanded.has(key);
483
- }
312
+ const sourceTreeData = $derived(maskTree(treeData));
313
+ // Tree value = 当前已选叶子 key(受控给 Tree,但 Transfer 只经 onChange 收 Tree 变更)。
314
+ const treeValue = $derived(current.filter((k) => treeLeaves.some((l) => l.key === k)));
484
315
 
485
- function toggleExpand(key: TransferKey) {
486
- const next = new Set(baseExpanded);
487
- if (next.has(key)) next.delete(key);
488
- else next.add(key);
489
- innerExpanded = next;
490
- expandedTouched = true;
491
- }
492
-
493
- function toggleTreeCheck(node: TreeNodeData) {
494
- if (disabled || node.disabled) return;
495
- leftChecked = [...toggleCheck(sourceTree, new Set(leftChecked), node.key)];
496
- }
497
-
498
- /** Movable (non-disabled, checked) keys within one render group. */
499
- function groupMovable(
500
- side: 'left' | 'right',
501
- group: TransferRenderGroup,
502
- ): TransferKey[] {
503
- const checked = side === 'left' ? leftChecked : rightChecked;
504
- return group.items.filter((i) => !i.disabled && checked.includes(i.key)).map((i) => i.key);
505
- }
506
-
507
- /** Tri-state for a group's header checkbox. */
508
- function groupCheckState(
509
- side: 'left' | 'right',
510
- group: TransferRenderGroup,
511
- ): { checked: boolean; indeterminate: boolean } {
512
- const checked = side === 'left' ? leftChecked : rightChecked;
513
- const selectable = group.items.filter((i) => !disabled && !i.disabled);
514
- if (selectable.length === 0) return { checked: false, indeterminate: false };
515
- const picked = selectable.filter((i) => checked.includes(i.key)).length;
516
- return { checked: picked === selectable.length, indeterminate: picked > 0 && picked < selectable.length };
517
- }
518
-
519
- function toggleGroup(side: 'left' | 'right', group: TransferRenderGroup) {
316
+ function onTreeChange(v: unknown) {
520
317
  if (disabled) return;
521
- const keys = group.items.filter((i) => !i.disabled).map((i) => i.key);
522
- if (keys.length === 0) return;
523
- const checked = side === 'left' ? leftChecked : rightChecked;
524
- const allOn = keys.every((k) => checked.includes(k));
525
- const set = new Set(checked);
526
- if (allOn) keys.forEach((k) => set.delete(k));
527
- else keys.forEach((k) => set.add(k));
528
- if (side === 'left') leftChecked = [...set];
529
- else rightChecked = [...set];
318
+ const keys = (Array.isArray(v) ? v : v == null ? [] : [v]) as TransferKey[];
319
+ // Tree 只回传叶子(leafOnly);直接作为新的 current 中的树部分。
320
+ commit(keys);
530
321
  }
531
322
 
532
- function commit(next: TransferKey[]) {
533
- if (!isControlled) inner = next;
534
- onChange?.(next);
535
- }
323
+ // treeList:搜索交给内嵌 Tree 自身(filterTreeNode 开启即渲染 Tree 内置搜索框)。
324
+ // filter=false 时不开启 Tree 搜索(对齐外层 filter 语义)。treeProps 可覆盖任意项。
325
+ const mergedTreeProps = $derived<Record<string, unknown>>({
326
+ filterTreeNode: filterEnabled,
327
+ defaultExpandAll: true,
328
+ ...(treeProps ?? {}),
329
+ });
536
330
 
537
- function toggleChecked(side: 'left' | 'right', key: TransferKey) {
538
- const list = side === 'left' ? leftVisible : rightVisible;
539
- const item = list.find((i) => i.key === key);
540
- if (side === 'left') {
541
- const wasChecked = leftChecked.includes(key);
542
- leftChecked = wasChecked
543
- ? leftChecked.filter((k) => k !== key)
544
- : [...leftChecked, key];
545
- if (item) {
546
- if (wasChecked) onDeselect?.(item);
547
- else onSelect?.(item);
548
- }
549
- } else {
550
- const wasChecked = rightChecked.includes(key);
551
- rightChecked = wasChecked
552
- ? rightChecked.filter((k) => k !== key)
553
- : [...rightChecked, key];
554
- if (item) {
555
- if (wasChecked) onDeselect?.(item);
556
- else onSelect?.(item);
331
+ // --- showPath:叶子 key 祖先路径 -------------------------------------
332
+ function buildPathMap(
333
+ nodes: TransferTreeNode[],
334
+ ancestors: { key: TransferKey; label: string }[] = [],
335
+ ): Map<TransferKey, { key: TransferKey; label: string }[]> {
336
+ const map = new Map<TransferKey, { key: TransferKey; label: string }[]>();
337
+ for (const node of nodes) {
338
+ const path = [...ancestors, { key: node.key, label: node.label }];
339
+ if (node.children && node.children.length > 0) {
340
+ buildPathMap(node.children, path).forEach((v, k) => map.set(k, v));
341
+ } else {
342
+ map.set(node.key, path);
557
343
  }
558
344
  }
345
+ return map;
559
346
  }
560
-
561
- function moveToRight() {
562
- if (disabled) return;
563
- // In tree mode `leftChecked` is leaf-level; keep only enabled, not-yet-moved.
564
- const movable = leftItems
565
- .filter((i) => !i.disabled && leftChecked.includes(i.key))
566
- .map((i) => i.key);
567
- if (movable.length === 0) return;
568
- commit([...current, ...movable]);
569
- leftChecked = leftChecked.filter((k) => !movable.includes(k));
570
- // Focus retention (spec §6):移动后焦点留在 SOURCE 列相邻选项 + live 播报。
571
- const count = movable.length;
572
- const oldKeys = leftRowKeys;
573
- const firstMovedIdx = oldKeys.findIndex((k) => movable.includes(k));
574
- announcer.announce(loc().t('Transfer.movedToRight', { count }));
575
- void tick().then(() => {
576
- const keys = leftRowKeys;
577
- if (keys.length === 0) return;
578
- const idx = Math.min(Math.max(firstMovedIdx, 0), keys.length - 1);
579
- const k = keys[idx];
580
- if (k == null) return;
581
- leftFocusKey = k;
582
- leftAnchor = idx;
583
- focusRow('left', k);
584
- });
585
- }
586
-
587
- function moveToLeft() {
588
- if (disabled) return;
589
- const movable = rightItems
590
- .filter((i) => !i.disabled && rightChecked.includes(i.key))
591
- .map((i) => i.key);
592
- if (movable.length === 0) return;
593
- const remove = new Set(movable);
594
- const count = movable.length;
595
- const oldKeys = rightRowKeys;
596
- const firstMovedIdx = oldKeys.findIndex((k) => movable.includes(k));
597
- commit(current.filter((k) => !remove.has(k)));
598
- rightChecked = [];
599
- // Focus retention (spec §6):移动后焦点留在 SOURCE(右)列相邻选项 + live 播报。
600
- announcer.announce(loc().t('Transfer.movedToLeft', { count }));
601
- void tick().then(() => {
602
- const keys = rightRowKeys;
603
- if (keys.length === 0) return;
604
- const idx = Math.min(Math.max(firstMovedIdx, 0), keys.length - 1);
605
- const k = keys[idx];
606
- if (k == null) return;
607
- rightFocusKey = k;
608
- rightAnchor = idx;
609
- focusRow('right', k);
610
- });
347
+ const treePathMap = $derived(
348
+ isTree && showPath ? buildPathMap(treeData) : new Map<TransferKey, { key: TransferKey; label: string }[]>(),
349
+ );
350
+ function itemFullPath(key: TransferKey): TransferItem['fullPath'] {
351
+ return isTree && showPath ? treePathMap.get(key) : undefined;
611
352
  }
612
-
613
- /** oneWay: remove a single target item back to the source. */
614
- function removeOne(key: TransferKey) {
615
- if (disabled) return;
616
- commit(current.filter((k) => k !== key));
617
- rightChecked = rightChecked.filter((k) => k !== key);
353
+ function rightLabel(item: TransferItem): string {
354
+ if (isTree && showPath) {
355
+ const p = treePathMap.get(item.key);
356
+ if (p) return p.map((x) => x.label).join(' / ');
357
+ }
358
+ return item.label;
618
359
  }
619
360
 
620
- // --- remote 搜索防抖(命令式定时器 + cleanup,红线 #3)对齐 Select ---
621
- let leftTimer: ReturnType<typeof setTimeout> | undefined;
622
- let rightTimer: ReturnType<typeof setTimeout> | undefined;
623
- function scheduleSearch(direction: 'left' | 'right', q: string) {
624
- const timer = direction === 'left' ? leftTimer : rightTimer;
625
- if (timer !== undefined) clearTimeout(timer);
626
- const id = setTimeout(() => {
627
- if (direction === 'left') leftTimer = undefined;
628
- else rightTimer = undefined;
629
- onSearch?.(q, direction);
630
- }, Math.max(0, searchDebounce));
631
- if (direction === 'left') leftTimer = id;
632
- else rightTimer = id;
633
- }
634
- function onQueryInput(direction: 'left' | 'right', v: string) {
635
- if (direction === 'left') leftQuery = v;
636
- else rightQuery = v;
637
- if (isRemote) scheduleSearch(direction, v);
638
- }
639
- // 卸载兜底清理。
640
- $effect(() => () => {
641
- if (leftTimer !== undefined) clearTimeout(leftTimer);
642
- if (rightTimer !== undefined) clearTimeout(rightTimer);
643
- });
361
+ // --- 分组渲染 -----------------------------------------------------------
362
+ const leftGroups = $derived(buildGroups(filterData, loc().t('Transfer.titleSource')));
644
363
 
645
- // --- 目标列拖拽重排(HTML5 DnD,与 TagInput 对齐)---------------------------
646
- // 受控不改 value,仅经 onChange 通知新顺序(红线 #1);拖拽态用 $state,事件
647
- // 处理命令式 + drop/dragend 清理(红线 #3);重排交由 reorder.ts 纯函数(红线 #2)。
648
- // 拖拽作用于「当前 target keys 的顺序」,按可见目标项的全局索引映射回 current。
364
+ // --- 右侧拖拽重排(HTML5 DnD)------------------------------------------
649
365
  const canDrag = $derived(draggable && !disabled);
650
- let dragIndex = $state<number | null>(null); // 被拖拽目标项在 current 中的下标
651
- let dropIndex = $state<number | null>(null); // 当前悬停目标项下标
652
- let dropSide = $state<InsertSide | null>(null); // 插入到目标前/后
366
+ let dragIndex = $state<number | null>(null);
367
+ let dropIndex = $state<number | null>(null);
368
+ let dropSide = $state<InsertSide | null>(null);
653
369
 
654
370
  function resetDrag() {
655
371
  dragIndex = null;
656
372
  dropIndex = null;
657
373
  dropSide = null;
658
374
  }
659
- // 把可见目标项映射回它在 current(已选顺序)中的下标。
660
375
  function targetIndexOf(key: TransferKey): number {
661
376
  return current.indexOf(key);
662
377
  }
@@ -668,13 +383,12 @@
668
383
  dragIndex = targetIndexOf(key);
669
384
  if (e.dataTransfer) {
670
385
  e.dataTransfer.effectAllowed = 'move';
671
- // 必须 setData,否则部分浏览器不触发 drop。
672
386
  e.dataTransfer.setData('text/plain', String(dragIndex));
673
387
  }
674
388
  }
675
389
  function onRowDragOver(e: DragEvent, key: TransferKey) {
676
390
  if (dragIndex === null) return;
677
- e.preventDefault(); // dragover 必须 preventDefault 才能触发 drop。
391
+ e.preventDefault();
678
392
  if (e.dataTransfer) e.dataTransfer.dropEffect = 'move';
679
393
  const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();
680
394
  dropIndex = targetIndexOf(key);
@@ -698,55 +412,34 @@
698
412
  const next = reorder(current, dragIndex, targetIndexOf(key), dropSide);
699
413
  const changed = next.length === current.length && next.some((k, i) => k !== current[i]);
700
414
  resetDrag();
701
- if (changed) commit(next); // 受控仅 onChange(红线 #1)。
415
+ if (changed) commit(next);
702
416
  }
703
417
 
704
- // --- 虚拟化(仅平铺、非分组面板生效;tree/group 回退全量渲染)--------------
705
- // 视口=列表容器自身滚动;scrollTop 由命令式 rAF 节流回调写本地 $state,可见区间
706
- // $derived render 期只读不读 DOM(红线 #2/#3)。对齐 Select 虚拟化范式。
707
- const VIRTUAL_OVERSCAN = 4;
708
- const vItemHeight = $derived(itemHeight > 0 ? itemHeight : 32);
709
- const leftVirtual = $derived(virtualize && !grouped && !isTree);
710
- const rightVirtual = $derived(virtualize && !grouped);
711
- let leftScrollTop = $state(0);
418
+ // --- 右侧虚拟化(仅平铺、非拖拽;对齐 Semi)----------------------------
419
+ const rightVirtual = $derived(!!virtualize && !draggable);
420
+ const vItemSize = $derived(virtualize?.itemSize ?? 36);
712
421
  let rightScrollTop = $state(0);
713
- let leftViewportH = $state(0);
714
422
  let rightViewportH = $state(0);
715
-
716
- const leftVTotal = $derived(leftVisible.length * vItemHeight);
717
- const rightVTotal = $derived(rightVisible.length * vItemHeight);
718
- const leftVRange = $derived(
719
- leftVirtual
720
- ? fixedRange(leftScrollTop, leftViewportH, vItemHeight, leftVisible.length, VIRTUAL_OVERSCAN)
721
- : { startIndex: 0, endIndex: leftVisible.length },
722
- );
423
+ const VIRTUAL_OVERSCAN = 4;
424
+ const rightVTotal = $derived(rightItems.length * vItemSize);
723
425
  const rightVRange = $derived(
724
426
  rightVirtual
725
- ? fixedRange(rightScrollTop, rightViewportH, vItemHeight, rightVisible.length, VIRTUAL_OVERSCAN)
726
- : { startIndex: 0, endIndex: rightVisible.length },
727
- );
728
- const leftVItems = $derived(
729
- leftVirtual ? leftVisible.slice(leftVRange.startIndex, leftVRange.endIndex) : leftVisible,
427
+ ? fixedRange(rightScrollTop, rightViewportH, vItemSize, rightItems.length, VIRTUAL_OVERSCAN)
428
+ : { startIndex: 0, endIndex: rightItems.length },
730
429
  );
731
430
  const rightVItems = $derived(
732
- rightVirtual ? rightVisible.slice(rightVRange.startIndex, rightVRange.endIndex) : rightVisible,
431
+ rightVirtual ? rightItems.slice(rightVRange.startIndex, rightVRange.endIndex) : rightItems,
733
432
  );
734
-
735
- // 滚动容器:用 attachment 绑定列表元素,命令式 rAF 节流监听 scroll,把视口高度与
736
- // scrollTop 写回本地 $state 驱动 vRange 派生;attachment 返回 cleanup(红线 #3)。
737
- function virtualScroll(
738
- setTop: (n: number) => void,
739
- setViewport: (n: number) => void,
740
- ): Attachment<HTMLUListElement> {
433
+ function virtualScroll(): Attachment<HTMLDivElement> {
741
434
  return (el) => {
742
435
  let raf = 0;
743
- setViewport(el.clientHeight);
744
- setTop(el.scrollTop);
436
+ rightViewportH = typeof virtualize?.height === 'number' ? virtualize.height : el.clientHeight;
437
+ rightScrollTop = el.scrollTop;
745
438
  function onScroll() {
746
439
  if (raf) return;
747
440
  raf = requestAnimationFrame(() => {
748
441
  raf = 0;
749
- setTop(el.scrollTop);
442
+ rightScrollTop = el.scrollTop;
750
443
  });
751
444
  }
752
445
  el.addEventListener('scroll', onScroll, { passive: true });
@@ -756,384 +449,330 @@
756
449
  };
757
450
  };
758
451
  }
759
- const noopAttach: Attachment<HTMLUListElement> = () => {};
760
- const leftScrollAttach = $derived(
761
- leftVirtual
762
- ? virtualScroll(
763
- (n) => (leftScrollTop = n),
764
- (n) => (leftViewportH = n),
765
- )
766
- : noopAttach,
767
- );
768
- const rightScrollAttach = $derived(
769
- rightVirtual
770
- ? virtualScroll(
771
- (n) => (rightScrollTop = n),
772
- (n) => (rightViewportH = n),
773
- )
774
- : noopAttach,
775
- );
776
-
777
- // --- showPath: build label path for tree leaves in right panel ---------------
778
- // Map leaf key → ancestor-path label string (e.g. "Parent / Child").
779
- function buildPathMap(
780
- nodes: TransferTreeNode[],
781
- ancestors: string[] = [],
782
- ): Map<TransferKey, string> {
783
- const map = new Map<TransferKey, string>();
784
- for (const node of nodes) {
785
- const path = [...ancestors, node.label];
786
- if (node.children && node.children.length > 0) {
787
- const childMap = buildPathMap(node.children, path);
788
- childMap.forEach((v, k) => map.set(k, v));
789
- } else {
790
- map.set(node.key, path.join(' / '));
791
- }
792
- }
793
- return map;
794
- }
795
- const treePathMap = $derived(isTree && showPath ? buildPathMap(treeData) : new Map<TransferKey, string>());
796
-
797
- function itemDisplayLabel(item: TransferItem, side: 'left' | 'right'): string {
798
- if (side === 'right' && isTree && showPath) {
799
- return treePathMap.get(item.key) ?? item.label;
800
- }
801
- return item.label;
802
- }
452
+ const noopAttach: Attachment<HTMLDivElement> = () => {};
453
+ const rightScrollAttach = $derived(rightVirtual ? virtualScroll() : noopAttach);
803
454
 
804
- // --- Pagination (left panel, list/groupList only) -------------------------
805
- // Use a plain getter to extract defaultCurrentPage once at init time, avoiding
806
- // the "state_referenced_locally" reactive-capture warning.
455
+ // --- 左侧分页(list/groupList 才有)-----------------------------------
807
456
  function getInitialPage(): number {
808
- return pagination?.defaultCurrentPage ?? 1;
457
+ return pagination?.defaultCurrentPage ?? pagination?.currentPage ?? 1;
809
458
  }
810
459
  let paginationPage = $state(getInitialPage());
811
460
  const isControlledPage = $derived(pagination?.currentPage !== undefined);
812
461
  const activePage = $derived(isControlledPage ? (pagination!.currentPage ?? 1) : paginationPage);
813
- const pageSize = $derived(pagination?.pageSize ?? 0);
814
- const hasPagination = $derived(!!pagination && pageSize > 0 && !isTree);
815
-
816
- const leftVisiblePaged = $derived(
462
+ const pageSize = $derived(pagination?.pageSize ?? DEFAULT_PAGE_SIZE);
463
+ const hasPagination = $derived(!!pagination && !isTree);
464
+ const totalPage = $derived(hasPagination ? Math.ceil(filterData.length / pageSize) : 1);
465
+ const pagedData = $derived(
817
466
  hasPagination
818
- ? leftVisible.slice((activePage - 1) * pageSize, activePage * pageSize)
819
- : leftVisible,
467
+ ? filterData.slice((activePage - 1) * pageSize, activePage * pageSize)
468
+ : filterData,
820
469
  );
821
-
470
+ const pagedGroups = $derived(buildGroups(pagedData, loc().t('Transfer.titleSource')));
822
471
  function onPageChange(page: number) {
823
472
  if (!isControlledPage) paginationPage = page;
824
473
  pagination?.onPageChange?.(page);
825
474
  }
475
+ // 搜索变化重置到第 1 页(对齐 Semi updateInput)。
476
+ function onInputChange(v: string) {
477
+ inputValue = v;
478
+ if (!isControlledPage) paginationPage = 1;
479
+ if (isRemote) onSearch?.(v);
480
+ }
481
+
482
+ /** 命令式搜索:置值但不触发 onSearch(对齐 Semi search(value, false))。 */
483
+ export function search(v: string): void {
484
+ inputValue = v;
485
+ if (!isControlledPage) paginationPage = 1;
486
+ }
487
+
488
+ // --- 计数 / 头部文案 ----------------------------------------------------
489
+ const showNumber = $derived(inSearchMode ? filterData.length : leftItems.length);
490
+ // treeList:叶子数(对齐 Semi leafOnlyNum)。
491
+ const leafOnlyNum = $derived(isTree ? filterData.length : undefined);
492
+ const leftShowButton = $derived(!isTree && !filterDataAllDisabled);
493
+ const rightHasValid = $derived(rightItems.some((i) => !i.disabled));
494
+ const rightShowButton = $derived(rightItems.length > 0 && rightHasValid);
826
495
 
827
496
  const moveRightDisabled = $derived(
828
- disabled ||
829
- leftItems.filter((i) => !i.disabled && leftChecked.includes(i.key)).length === 0,
830
- );
831
- const moveLeftDisabled = $derived(
832
- disabled ||
833
- rightItems.filter((i) => !i.disabled && rightChecked.includes(i.key)).length === 0,
497
+ disabled || leftItems.filter((i) => !i.disabled && leftChecked.includes(i.key)).length === 0,
834
498
  );
835
499
 
836
500
  const cls = $derived(
837
- ['cd-transfer', `cd-transfer--${size}`, `cd-transfer--${status}`, disabled && 'cd-transfer--disabled']
501
+ [
502
+ 'cd-transfer',
503
+ disabled && 'cd-transfer-disabled',
504
+ renderSourcePanel && renderSelectedPanel && 'cd-transfer-custom-panel',
505
+ className,
506
+ ]
838
507
  .filter(Boolean)
839
508
  .join(' '),
840
509
  );
841
510
  </script>
842
511
 
843
- {#snippet itemRow(side: 'left' | 'right', item: TransferItem, style = '', asOption = false)}
844
- {@const tIndex = side === 'right' ? targetIndexOf(item.key) : -1}
845
- {@const dragRow = side === 'right' && canDrag && !(item.disabled ?? false)}
846
- {@const isChecked = (side === 'left' ? leftChecked : rightChecked).includes(item.key)}
847
- {@const rowDisabled = disabled || (item.disabled ?? false)}
848
- {@const displayLabel = itemDisplayLabel(item, side)}
849
- <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
850
- <li
851
- class="cd-transfer__item"
852
- class:cd-transfer__item--draggable={dragRow}
853
- class:cd-transfer__item--dragging={side === 'right' && dragIndex !== null && dragIndex === tIndex}
854
- class:cd-transfer__item--drop-before={side === 'right' &&
855
- dropIndex === tIndex &&
856
- dropSide === 'before'}
857
- class:cd-transfer__item--drop-after={side === 'right' &&
858
- dropIndex === tIndex &&
859
- dropSide === 'after'}
860
- {style}
861
- role={asOption ? 'option' : undefined}
862
- aria-label={asOption ? displayLabel : undefined}
863
- aria-selected={asOption ? (side === 'right' && oneWay ? true : isChecked) : undefined}
864
- aria-disabled={asOption ? rowDisabled || undefined : undefined}
865
- data-transfer-key={asOption ? item.key : undefined}
866
- tabindex={asOption ? rowTabindex(side, item.key) : undefined}
867
- onkeydown={asOption ? (e) => onRowKeydown(e, side, item.key) : undefined}
868
- onfocus={asOption ? () => onRowFocus(side, item.key) : undefined}
869
- onclick={asOption && !(side === 'right' && oneWay)
870
- ? (e) => onRowOptionClick(e, side, item)
871
- : undefined}
872
- draggable={dragRow}
873
- ondragstart={dragRow ? (e) => onRowDragStart(e, item.key) : undefined}
874
- ondragover={side === 'right' && canDrag ? (e) => onRowDragOver(e, item.key) : undefined}
875
- ondragleave={side === 'right' && canDrag ? (e) => onRowDragLeave(e, item.key) : undefined}
876
- ondrop={side === 'right' && canDrag ? (e) => onRowDrop(e, item.key) : undefined}
877
- ondragend={side === 'right' && canDrag ? resetDrag : undefined}
878
- >
879
- {#if side === 'right' && oneWay}
880
- {#if renderSelectedItem}
881
- {@render renderSelectedItem({ item, onRemove: () => removeOne(item.key) })}
882
- {:else}
883
- <span class="cd-transfer__item-label">{displayLabel}</span>
884
- <button
885
- type="button"
886
- class="cd-transfer__remove"
887
- aria-label={loc().t('Transfer.remove')}
888
- disabled={disabled || (item.disabled ?? false)}
889
- onclick={() => removeOne(item.key)}
890
- >
891
- <svg viewBox="0 0 16 16" width="12" height="12" aria-hidden="true" focusable="false">
892
- <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M4 4l8 8M12 4l-8 8" />
893
- </svg>
894
- </button>
895
- {/if}
896
- {:else if asOption}
897
- {#if side === 'right' && renderSelectedItem}
898
- {@render renderSelectedItem({ item, onRemove: () => removeOne(item.key) })}
899
- {:else if side === 'left' && renderSourceItem}
900
- {@render renderSourceItem({ item, onChange: () => toggleChecked(side, item.key), checked: isChecked })}
901
- {:else}
902
- <!-- 选项行:单一 Tab 停靠点(行本身可聚焦),勾选框为纯视觉,无 input/无第二停靠点。 -->
903
- <span class="cd-transfer__option-control" aria-hidden="true">
904
- <span class="cd-transfer__check" class:cd-transfer__check--on={isChecked}>
905
- {#if isChecked}
906
- <svg viewBox="0 0 16 16" width="10" height="10" focusable="false">
907
- <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M3.5 8.5 6.5 11.5 12.5 4.5" />
908
- </svg>
909
- {/if}
910
- </span>
911
- <span class="cd-transfer__option-label">{displayLabel}</span>
912
- </span>
913
- {/if}
914
- {:else}
915
- {#if side === 'left' && renderSourceItem}
916
- {@render renderSourceItem({ item, onChange: () => toggleChecked(side, item.key), checked: isChecked })}
917
- {:else}
918
- <Checkbox
919
- {size}
920
- checked={isChecked}
921
- disabled={disabled || (item.disabled ?? false)}
922
- onChange={() => toggleChecked(side, item.key)}
512
+ <!-- ============ 搜索框 ============ -->
513
+ {#snippet filterBox()}
514
+ {#if filterEnabled}
515
+ <div role="search" aria-label="Transfer filter" class="cd-transfer-filter">
516
+ <Input
517
+ value={inputValue}
518
+ placeholder={loc().t('Transfer.searchPlaceholder')}
519
+ showClear
520
+ {disabled}
521
+ ariaLabel={loc().t('Transfer.searchPlaceholder')}
522
+ onInput={onInputChange}
523
+ >
524
+ {#snippet prefix()}
525
+ <IconSearch size="small" />
526
+ {/snippet}
527
+ </Input>
528
+ </div>
529
+ {/if}
530
+ {/snippet}
531
+
532
+ <!-- ============ 头部(total + 全选/清空按钮)============ -->
533
+ {#snippet header(kind: 'left' | 'right')}
534
+ {#if kind === 'left' && renderSourceHeader}
535
+ {@render renderSourceHeader({
536
+ num: showNumber,
537
+ showButton: leftShowButton,
538
+ allChecked,
539
+ onAllClick: handleAll,
540
+ leafOnlyNum,
541
+ })}
542
+ {:else if kind === 'right' && renderSelectedHeader}
543
+ {@render renderSelectedHeader({
544
+ num: rightItems.length,
545
+ showButton: rightShowButton,
546
+ onClear: handleClear,
547
+ })}
548
+ {:else}
549
+ <div class="cd-transfer-header" class:cd-transfer-left-header={kind === 'left'} class:cd-transfer-right-header={kind === 'right'}>
550
+ <span class="cd-transfer-header-total">
551
+ {#if kind === 'left'}
552
+ {loc().t('Transfer.total', { total: showNumber })}
553
+ {:else}
554
+ {loc().t('Transfer.selected', { total: rightItems.length })}
555
+ {/if}
556
+ </span>
557
+ {#if kind === 'left' ? leftShowButton : rightShowButton}
558
+ <Button
559
+ theme="borderless"
560
+ type="tertiary"
561
+ size="small"
562
+ class="cd-transfer-header-all"
563
+ {disabled}
564
+ onclick={kind === 'left' ? handleAll : handleClear}
923
565
  >
924
- {displayLabel}
925
- </Checkbox>
566
+ {#if kind === 'left'}
567
+ {leftContainsNotSelected ? loc().t('Transfer.selectAll') : loc().t('Transfer.clearSelectAll')}
568
+ {:else}
569
+ {loc().t('Transfer.clear')}
570
+ {/if}
571
+ </Button>
926
572
  {/if}
927
- {/if}
928
- </li>
573
+ </div>
574
+ {/if}
929
575
  {/snippet}
930
576
 
931
- {#snippet treeRow(f: FlatNode)}
932
- {@const node = f.node}
933
- {@const checked = conducted.checked.has(node.key)}
934
- {@const half = !checked && conducted.half.has(node.key)}
935
- <li
936
- class="cd-transfer__tree-node"
937
- style="padding-inline-start: calc({f.level} * var(--cd-transfer-tree-indent, 18px))"
577
+ <!-- ============ 空态 ============ -->
578
+ {#snippet emptyBox(kind: 'left' | 'right', isSearch = false)}
579
+ {@const custom = isSearch ? emptyContent?.search : kind === 'left' ? emptyContent?.left : emptyContent?.right}
580
+ <div
581
+ aria-label="empty"
582
+ class="cd-transfer-empty"
583
+ class:cd-transfer-left-empty={kind === 'left'}
584
+ class:cd-transfer-right-empty={kind === 'right'}
938
585
  >
939
- {#if f.hasChildren}
940
- <button
941
- type="button"
942
- class="cd-transfer__switcher"
943
- class:cd-transfer__switcher--open={isExpanded(node.key)}
944
- aria-label={isExpanded(node.key) ? loc().t('Tree.collapse') : loc().t('Tree.expand')}
945
- onclick={() => toggleExpand(node.key)}
946
- >
947
- <svg viewBox="0 0 16 16" width="10" height="10" aria-hidden="true" focusable="false">
948
- <path fill="currentColor" d="M6 4l4 4-4 4V4Z" />
949
- </svg>
950
- </button>
586
+ {#if custom}
587
+ {#if typeof custom === 'string'}{custom}{:else}{@render custom()}{/if}
588
+ {:else if isSearch}
589
+ {loc().t('Transfer.emptySearch')}
590
+ {:else if kind === 'left'}
591
+ {loc().t('Transfer.emptyLeft')}
951
592
  {:else}
952
- <span class="cd-transfer__switcher cd-transfer__switcher--leaf" aria-hidden="true"></span>
593
+ {loc().t('Transfer.emptyRight')}
953
594
  {/if}
954
- <Checkbox
955
- {size}
956
- {checked}
957
- indeterminate={half}
958
- disabled={disabled || (node.disabled ?? false)}
959
- onChange={() => toggleTreeCheck(node)}
960
- >
961
- {node.label}
962
- </Checkbox>
963
- </li>
595
+ </div>
964
596
  {/snippet}
965
597
 
966
- {#snippet emptyNode(side: 'left' | 'right', isSearch = false)}
967
- {@const customEmpty = isSearch ? emptyContent?.search : (side === 'left' ? emptyContent?.left : emptyContent?.right)}
968
- <li class="cd-transfer__empty">
969
- {#if customEmpty}
970
- {#if typeof customEmpty === 'string'}
971
- {customEmpty}
972
- {:else}
973
- {@render customEmpty()}
598
+ <!-- ============ 左侧单项(Checkbox)============ -->
599
+ {#snippet leftItem(item: TransferItem)}
600
+ {@const checked = current.includes(item.key) || leftChecked.includes(item.key)}
601
+ {#if renderSourceItem}
602
+ {@render renderSourceItem({ item, onChange: () => toggleChecked(item.key), checked: leftChecked.includes(item.key) })}
603
+ {:else}
604
+ <div class="cd-transfer-item" class:cd-transfer-item-disabled={item.disabled} role="listitem">
605
+ <Checkbox
606
+ checked={leftChecked.includes(item.key)}
607
+ disabled={disabled || (item.disabled ?? false)}
608
+ onChange={() => toggleChecked(item.key)}
609
+ >
610
+ {item.label}
611
+ </Checkbox>
612
+ </div>
613
+ {/if}
614
+ {/snippet}
615
+
616
+ <!-- ============ 右侧单项 ============ -->
617
+ {#snippet rightItem(item: TransferItem, vStyle = '')}
618
+ {@const tIndex = targetIndexOf(item.key)}
619
+ {@const dragRow = canDrag && !(item.disabled ?? false)}
620
+ {#if renderSelectedItem}
621
+ {@render renderSelectedItem({ item, onRemove: () => removeOne(item.key), sortableHandle: undefined, fullPath: itemFullPath(item.key) })}
622
+ {:else}
623
+ <div
624
+ class="cd-transfer-item cd-transfer-right-item"
625
+ class:cd-transfer-right-item-draggable={dragRow}
626
+ class:cd-transfer-right-item-dragging={dragIndex !== null && dragIndex === tIndex}
627
+ class:cd-transfer-right-item-drop-before={dropIndex === tIndex && dropSide === 'before'}
628
+ class:cd-transfer-right-item-drop-after={dropIndex === tIndex && dropSide === 'after'}
629
+ role="listitem"
630
+ style={vStyle}
631
+ draggable={dragRow}
632
+ ondragstart={dragRow ? (e) => onRowDragStart(e, item.key) : undefined}
633
+ ondragover={canDrag ? (e) => onRowDragOver(e, item.key) : undefined}
634
+ ondragleave={canDrag ? (e) => onRowDragLeave(e, item.key) : undefined}
635
+ ondrop={canDrag ? (e) => onRowDrop(e, item.key) : undefined}
636
+ ondragend={canDrag ? resetDrag : undefined}
637
+ >
638
+ {#if dragRow}
639
+ <span class="cd-transfer-right-item-drag-handler" role="button" aria-label={loc().t('Transfer.dragSort')}>
640
+ <IconHandle size="small" />
641
+ </span>
974
642
  {/if}
975
- {:else}
976
- {isSearch ? loc().t('Transfer.searchEmpty') : loc().t('Transfer.empty')}
977
- {/if}
978
- </li>
643
+ <div class="cd-transfer-item-text">{rightLabel(item)}</div>
644
+ <button
645
+ type="button"
646
+ class="cd-transfer-item-close-icon"
647
+ class:cd-transfer-item-close-icon-disabled={item.disabled}
648
+ aria-label={loc().t('Transfer.remove')}
649
+ disabled={disabled || (item.disabled ?? false)}
650
+ onclick={() => removeOne(item.key)}
651
+ >
652
+ <IconClose size="small" />
653
+ </button>
654
+ </div>
655
+ {/if}
979
656
  {/snippet}
980
657
 
981
- {#snippet panelList(side: 'left' | 'right', visible: TransferItem[], groups: TransferRenderGroup[])}
982
- {@const isVirtual = side === 'left' ? leftVirtual : rightVirtual}
983
- {@const vItems = side === 'left' ? leftVItems : rightVItems}
984
- {@const vRange = side === 'left' ? leftVRange : rightVRange}
985
- {@const vTotal = side === 'left' ? leftVTotal : rightVTotal}
986
- <!-- For left panel with pagination, use paged slice. -->
987
- {@const displayVisible = side === 'left' && hasPagination ? leftVisiblePaged : visible}
988
- <!-- empty state: search-filtered vs truly empty -->
989
- {@const isSearchFiltered = side === 'left' ? (leftQuery.trim() !== '') : (rightQuery.trim() !== '')}
990
- <!-- 空态(仅含 cd-transfer__empty 占位 li)时 listbox 无 option 子节点 → 违反
991
- aria-required-children;空态下退化为普通容器(无 role/listbox ARIA),按 APG
992
- 处理空 listbox。loading 时仍非空(spinner li)但同样不是 option,故并入判定。 -->
993
- {@const isEmptyPanel = !loading && visible.length === 0}
994
- <ul
995
- class="cd-transfer__list"
996
- role={isEmptyPanel ? undefined : 'listbox'}
997
- aria-multiselectable={isEmptyPanel ? undefined : 'true'}
998
- aria-labelledby={!isEmptyPanel && showPanelTitle
999
- ? (side === 'left' ? leftTitleId : rightTitleId)
1000
- : undefined}
1001
- aria-label={!isEmptyPanel && !showPanelTitle
1002
- ? (side === 'left' ? sourceFallback : targetFallback)
1003
- : undefined}
1004
- aria-disabled={disabled || undefined}
1005
- {@attach captureList(side)}
1006
- {@attach side === 'left' ? leftScrollAttach : rightScrollAttach}
1007
- >
1008
- {#if loading}
1009
- <li class="cd-transfer__loading" aria-live="polite">
1010
- <span class="cd-transfer__spinner" aria-hidden="true"></span>
1011
- <span>{loc().t('Transfer.loading')}</span>
1012
- </li>
1013
- {/if}
1014
- {#if side === 'left' && isTree}
1015
- {#each visibleFlat as f (f.node.key)}
1016
- {@render treeRow(f)}
658
+ <!-- ============ 左侧面板 ============ -->
659
+ {#snippet leftPanel()}
660
+ {#if renderSourcePanel}
661
+ {@render renderSourcePanel({
662
+ value: current,
663
+ loading,
664
+ noMatch,
665
+ filterData,
666
+ sourceData: leftItems,
667
+ allChecked,
668
+ showNumber,
669
+ inputValue,
670
+ onSearch: onInputChange,
671
+ onAllClick: handleAll,
672
+ onSelectOrRemove,
673
+ })}
674
+ {:else}
675
+ <section class="cd-transfer-left">
676
+ {#if isTree}
677
+ <!-- 树模式:内嵌 Tree 组件自管搜索/展开/空态(不叠加外层搜索框)。 -->
678
+ {@render header('left')}
679
+ <Tree
680
+ class="cd-transfer-tree"
681
+ treeData={sourceTreeData}
682
+ multiple
683
+ leafOnly
684
+ disableStrictly
685
+ {disabled}
686
+ value={treeValue}
687
+ onChange={onTreeChange}
688
+ {...mergedTreeProps}
689
+ />
1017
690
  {:else}
1018
- {#if !loading}
1019
- {@render emptyNode(side, isSearchFiltered)}
1020
- {/if}
1021
- {/each}
1022
- {:else if grouped}
1023
- {#each groups as group (group.title)}
1024
- {@const state = groupCheckState(side, group)}
1025
- <li class="cd-transfer__group">
1026
- <div class="cd-transfer__group-header">
1027
- <Checkbox
1028
- {size}
1029
- checked={state.checked}
1030
- indeterminate={state.indeterminate}
1031
- disabled={disabled || group.items.every((i) => i.disabled)}
1032
- onChange={() => toggleGroup(side, group)}
1033
- >
1034
- {group.title}
1035
- </Checkbox>
1036
- <span class="cd-transfer__group-count">{group.items.length}</span>
691
+ {@render filterBox()}
692
+ {#if loading}
693
+ <div class="cd-transfer-loading" aria-live="polite">
694
+ <span class="cd-transfer-spinner" aria-hidden="true"></span>
695
+ <span>{loc().t('Transfer.loading')}</span>
1037
696
  </div>
1038
- <ul class="cd-transfer__group-list">
1039
- {#each group.items as item (item.key)}
1040
- {@render itemRow(side, item)}
697
+ {:else if noMatch}
698
+ {@render emptyBox('left', true)}
699
+ {:else if items.length === 0}
700
+ {@render emptyBox('left', false)}
701
+ {:else}
702
+ {@render header('left')}
703
+ <div class="cd-transfer-left-list" role="list" aria-label="Option list">
704
+ {#if grouped}
705
+ {#each pagedGroups as group (group.title)}
706
+ <div class="cd-transfer-group-title">{group.title}</div>
707
+ {#each group.items as item (item.key)}
708
+ {@render leftItem(item)}
709
+ {/each}
1041
710
  {/each}
1042
- </ul>
1043
- </li>
1044
- {:else}
1045
- {#if !loading}
1046
- {@render emptyNode(side, isSearchFiltered)}
1047
- {/if}
1048
- {/each}
1049
- {:else if isVirtual}
1050
- <!-- 虚拟化:spacer 撑总高,可见项绝对定位按全局索引偏移;只渲染视口切片 -->
1051
- <li class="cd-transfer__spacer" style={`block-size:${vTotal}px`} aria-hidden="true"></li>
1052
- {#each vItems as item, i (item.key)}
1053
- {@render itemRow(
1054
- side,
1055
- item,
1056
- `position:absolute; inset-inline:0; transform:translateY(${(vRange.startIndex + i) * vItemHeight}px); block-size:${vItemHeight}px`,
1057
- true,
1058
- )}
1059
- {/each}
1060
- {#if visible.length === 0 && !loading}
1061
- {@render emptyNode(side, isSearchFiltered)}
1062
- {/if}
1063
- {:else}
1064
- {#each displayVisible as item (item.key)}
1065
- {@render itemRow(side, item, '', true)}
1066
- {:else}
1067
- {#if !loading}
1068
- {@render emptyNode(side, isSearchFiltered)}
1069
- {/if}
1070
- {/each}
1071
- {/if}
1072
- </ul>
1073
- {/snippet}
1074
-
1075
- <div class={cls} role="group" aria-disabled={disabled || undefined}>
1076
- <div class="cd-transfer__panel">
1077
- {#if renderSourcePanel}
1078
- {@render renderSourcePanel({
1079
- dataSource: leftItems,
1080
- selectedItems: rightItems,
1081
- onChange: commit,
1082
- onSearch: (v) => onQueryInput('left', v),
1083
- inputValue: leftQuery,
1084
- searchResult: leftVisible,
1085
- })}
1086
- {:else}
1087
- {#if showPanelTitle}
1088
- <div class="cd-transfer__panel-header">
1089
- {#if renderSourceHeader}
1090
- {@render renderSourceHeader({
1091
- totalContent: loc().t('Transfer.itemsUnit', { count: leftItems.length }),
1092
- allContent: loc().t('Transfer.itemsUnit', { count: items.length }),
1093
- onAllClick: () => {},
1094
- title: titles?.[0] ?? loc().t('Transfer.titleSource'),
1095
- allChecked: leftItems.length > 0 && leftItems.filter((i) => !i.disabled).every((i) => leftChecked.includes(i.key)),
1096
- showButton: true,
1097
- leafOnlyNum: isTree ? leftVisible.filter((i) => !current.includes(i.key)).length : undefined,
1098
- })}
1099
711
  {:else}
1100
- <span id={leftTitleId} class="cd-transfer__panel-title">{titles?.[0] ?? loc().t('Transfer.titleSource')}</span>
1101
- <span class="cd-transfer__panel-count">{loc().t('Transfer.itemsUnit', { count: leftItems.length })}</span>
712
+ {#each pagedData as item (item.key)}
713
+ {@render leftItem(item)}
714
+ {/each}
1102
715
  {/if}
1103
716
  </div>
717
+ {#if hasPagination && totalPage > 1}
718
+ <div class="cd-transfer-left-pagination">
719
+ <Pagination
720
+ total={filterData.length}
721
+ currentPage={activePage}
722
+ {pageSize}
723
+ onPageChange={onPageChange}
724
+ size="small"
725
+ />
726
+ </div>
727
+ {/if}
728
+ {/if}
1104
729
  {/if}
1105
- {#if filter}
1106
- <div class="cd-transfer__panel-search">
1107
- <Input
1108
- {size}
1109
- value={leftQuery}
1110
- placeholder={searchPlaceholderText}
1111
- clearable
1112
- disabled={disabled}
1113
- ariaLabel={searchPlaceholderText}
1114
- onInput={(v) => onQueryInput('left', v)}
1115
- {...(inputProps ?? {})}
1116
- />
730
+ </section>
731
+ {/if}
732
+ {/snippet}
733
+
734
+ <!-- ============ 右侧面板 ============ -->
735
+ {#snippet rightPanel()}
736
+ {#if renderSelectedPanel}
737
+ {@render renderSelectedPanel({
738
+ length: rightItems.length,
739
+ selectedData: rightItems,
740
+ onClear: handleClear,
741
+ onRemove: (item: TransferItem) => removeOne(item.key),
742
+ onSortEnd: commit,
743
+ })}
744
+ {:else}
745
+ <section class="cd-transfer-right">
746
+ {@render header('right')}
747
+ {#if rightItems.length === 0}
748
+ {@render emptyBox('right', false)}
749
+ {:else if rightVirtual}
750
+ <div class="cd-transfer-right-list cd-transfer-right-virtual-list" role="list" aria-label="Selected list" {@attach rightScrollAttach}>
751
+ <div class="cd-transfer-spacer" style={`block-size:${rightVTotal}px`} aria-hidden="true"></div>
752
+ {#each rightVItems as item, i (item.key)}
753
+ {@render rightItem(
754
+ item,
755
+ `position:absolute; inset-inline:0; transform:translateY(${(rightVRange.startIndex + i) * vItemSize}px); block-size:${vItemSize}px`,
756
+ )}
757
+ {/each}
1117
758
  </div>
1118
- {/if}
1119
- {@render panelList('left', leftVisible, leftGroups)}
1120
- {#if hasPagination}
1121
- <div class="cd-transfer__pagination">
1122
- <Pagination
1123
- total={leftVisible.length}
1124
- currentPage={activePage}
1125
- pageSize={pageSize}
1126
- onChange={(page) => onPageChange(page)}
1127
- size="small"
1128
- />
759
+ {:else}
760
+ <div class="cd-transfer-right-list" role="list" aria-label="Selected list">
761
+ {#each rightItems as item (item.key)}
762
+ {@render rightItem(item)}
763
+ {/each}
1129
764
  </div>
1130
765
  {/if}
1131
- {/if}
1132
- </div>
766
+ </section>
767
+ {/if}
768
+ {/snippet}
1133
769
 
1134
- <div class="cd-transfer__ops">
770
+ <div class={cls} {style} role="group" aria-disabled={disabled || undefined}>
771
+ {@render leftPanel()}
772
+ <div class="cd-transfer-ops">
1135
773
  <Button
1136
- type="primary"
774
+ theme="borderless"
775
+ type="tertiary"
1137
776
  size="small"
1138
777
  ariaLabel={loc().t('Transfer.moveToRight')}
1139
778
  disabled={moveRightDisabled}
@@ -1141,311 +780,258 @@
1141
780
  >
1142
781
  &gt;
1143
782
  </Button>
1144
- {#if !oneWay}
1145
- <Button
1146
- type="primary"
1147
- size="small"
1148
- ariaLabel={loc().t('Transfer.moveToLeft')}
1149
- disabled={moveLeftDisabled}
1150
- onclick={moveToLeft}
1151
- >
1152
- &lt;
1153
- </Button>
1154
- {/if}
1155
- </div>
1156
-
1157
- <div class="cd-transfer__panel">
1158
- {#if renderSelectedPanel}
1159
- {@render renderSelectedPanel({
1160
- selectedItems: rightItems,
1161
- onRemove: removeOne,
1162
- onSortEnd: commit,
1163
- })}
1164
- {:else}
1165
- {#if showPanelTitle}
1166
- <div class="cd-transfer__panel-header">
1167
- {#if renderSelectedHeader}
1168
- {@render renderSelectedHeader({
1169
- totalContent: loc().t('Transfer.itemsUnit', { count: rightItems.length }),
1170
- allContent: loc().t('Transfer.itemsUnit', { count: items.length }),
1171
- onAllClick: () => {},
1172
- title: titles?.[1] ?? loc().t('Transfer.titleTarget'),
1173
- })}
1174
- {:else}
1175
- <span id={rightTitleId} class="cd-transfer__panel-title">{titles?.[1] ?? loc().t('Transfer.titleTarget')}</span>
1176
- <span class="cd-transfer__panel-count">{loc().t('Transfer.itemsUnit', { count: rightItems.length })}</span>
1177
- {/if}
1178
- </div>
1179
- {/if}
1180
- {#if filter}
1181
- <div class="cd-transfer__panel-search">
1182
- <Input
1183
- {size}
1184
- value={rightQuery}
1185
- placeholder={searchPlaceholderText}
1186
- clearable
1187
- disabled={disabled}
1188
- ariaLabel={searchPlaceholderText}
1189
- onInput={(v) => onQueryInput('right', v)}
1190
- {...(inputProps ?? {})}
1191
- />
1192
- </div>
1193
- {/if}
1194
- {@render panelList('right', rightVisible, rightGroups)}
1195
- {/if}
1196
783
  </div>
784
+ {@render rightPanel()}
1197
785
  </div>
1198
786
 
787
+
1199
788
  <style>
1200
789
  .cd-transfer {
1201
- display: inline-flex;
1202
- align-items: stretch;
1203
- gap: var(--cd-transfer-gap);
1204
- color: var(--cd-color-text-0);
790
+ display: flex;
791
+ box-sizing: border-box;
792
+ min-width: var(--cd-width-transfer-min-width);
793
+ height: var(--cd-height-transfer);
794
+ background-color: var(--cd-color-transfer-bg);
795
+ border: var(--cd-width-transfer-border) solid var(--cd-color-transfer-border);
796
+ border-radius: var(--cd-radius-transfer);
797
+ color: var(--cd-color-transfer-item-text);
798
+ }
799
+ .cd-transfer,
800
+ .cd-transfer * {
801
+ box-sizing: border-box;
802
+ }
803
+ .cd-transfer-custom-panel {
804
+ border: none;
805
+ min-width: inherit;
806
+ height: inherit;
1205
807
  }
1206
- .cd-transfer--disabled {
1207
- opacity: 0.6;
808
+ .cd-transfer-disabled .cd-transfer-header,
809
+ .cd-transfer-disabled .cd-transfer-item {
810
+ color: var(--cd-color-transfer-disabled-text);
811
+ cursor: not-allowed;
1208
812
  }
1209
- .cd-transfer__panel {
813
+
814
+ .cd-transfer-left {
815
+ width: var(--cd-width-transfer-left);
816
+ border-right: var(--cd-width-transfer-left-border) solid var(--cd-color-transfer-border);
1210
817
  display: flex;
1211
818
  flex-direction: column;
1212
- inline-size: var(--cd-transfer-panel-width);
1213
- block-size: var(--cd-transfer-panel-height);
1214
- border: 1px solid var(--cd-transfer-panel-border);
1215
- border-radius: var(--cd-transfer-panel-radius);
1216
- overflow: hidden;
819
+ min-width: 0;
1217
820
  }
1218
- .cd-transfer__panel-header {
821
+ .cd-transfer-right {
822
+ width: var(--cd-width-transfer-right);
1219
823
  display: flex;
1220
- align-items: center;
1221
- justify-content: space-between;
1222
- padding-block: var(--cd-spacing-tight);
1223
- padding-inline: var(--cd-spacing-base-tight);
1224
- background: var(--cd-transfer-panel-header-bg);
1225
- border-block-end: 1px solid var(--cd-transfer-panel-border);
1226
- font-weight: var(--cd-font-weight-medium);
824
+ flex-direction: column;
825
+ position: relative;
826
+ min-width: 0;
1227
827
  }
1228
- .cd-transfer__panel-count {
1229
- color: var(--cd-color-text-2);
828
+
829
+ /* 头部 */
830
+ .cd-transfer-header {
831
+ display: flex;
832
+ align-items: center;
833
+ height: var(--cd-height-transfer-header);
834
+ margin: var(--cd-spacing-transfer-header-margin-top) var(--cd-spacing-transfer-header-margin-right)
835
+ var(--cd-spacing-transfer-header-margin-bottom) var(--cd-spacing-transfer-header-margin-left);
836
+ color: var(--cd-color-transfer-header-text);
1230
837
  font-size: var(--cd-font-size-small);
1231
- font-weight: var(--cd-font-weight-regular);
838
+ flex-shrink: 0;
839
+ }
840
+ .cd-transfer-right-header {
841
+ height: var(--cd-height-transfer-right-header);
842
+ margin-top: var(--cd-spacing-transfer-right-header-margin-top);
843
+ margin-bottom: var(--cd-spacing-transfer-right-header-margin-bottom);
1232
844
  }
1233
- .cd-transfer__panel-search {
1234
- padding: var(--cd-spacing-tight);
1235
- border-block-end: 1px solid var(--cd-transfer-panel-border);
845
+ .cd-transfer-header-total {
846
+ flex: 1;
847
+ }
848
+ .cd-transfer-header :global(.cd-transfer-header-all) {
849
+ font-weight: var(--cd-font-transfer-header-all-font-weight);
850
+ margin-left: var(--cd-spacing-transfer-header-all-margin-left);
851
+ }
852
+
853
+ /* 搜索框 */
854
+ .cd-transfer-filter {
855
+ margin: var(--cd-spacing-transfer-filter-margin-top) var(--cd-spacing-transfer-filter-margin-right)
856
+ var(--cd-spacing-transfer-filter-margin-bottom) var(--cd-spacing-transfer-filter-margin-left);
857
+ flex-shrink: 0;
858
+ }
859
+
860
+ /* 列表 */
861
+ .cd-transfer-left-list,
862
+ .cd-transfer-right-list {
863
+ overflow: auto;
864
+ flex-grow: 1;
1236
865
  }
1237
- .cd-transfer__list {
866
+ .cd-transfer-right-virtual-list {
1238
867
  position: relative;
1239
- flex: 1 1 auto;
1240
- margin: 0;
1241
- padding: 0;
1242
- list-style: none;
1243
- overflow-y: auto;
1244
868
  }
1245
- /* 虚拟化占位:撑出总高度,可见项绝对定位浮于其上。 */
1246
- .cd-transfer__spacer {
869
+ .cd-transfer-spacer {
1247
870
  pointer-events: none;
1248
871
  }
1249
- .cd-transfer__item {
872
+
873
+ /* 条目 */
874
+ .cd-transfer-item {
1250
875
  display: flex;
1251
876
  align-items: center;
1252
877
  justify-content: space-between;
1253
- gap: var(--cd-spacing-tight);
1254
- min-block-size: var(--cd-transfer-item-height);
1255
- padding-inline: var(--cd-spacing-base-tight);
1256
- }
1257
- .cd-transfer__item:hover {
1258
- background: var(--cd-transfer-item-bg-hover);
1259
- }
1260
- .cd-transfer__item--draggable {
1261
- cursor: grab;
1262
- }
1263
- .cd-transfer__item--dragging {
1264
- opacity: 0.5;
1265
- }
1266
- /* 拖拽插入指示线:目标项上/下边缘 2px 主色线。 */
1267
- .cd-transfer__item--drop-before {
1268
- box-shadow: inset 0 2px 0 0 var(--cd-color-primary);
1269
- }
1270
- .cd-transfer__item--drop-after {
1271
- box-shadow: inset 0 -2px 0 0 var(--cd-color-primary);
1272
- }
1273
- /* 选项行(listbox option):可聚焦、选中/禁用强调、纯视觉勾选框。 */
1274
- .cd-transfer__item[role='option'] {
878
+ flex-wrap: nowrap;
879
+ min-height: var(--cd-height-transfer-item-min-height);
880
+ padding: var(--cd-spacing-transfer-item-padding-top) var(--cd-spacing-transfer-item-padding-right)
881
+ var(--cd-spacing-transfer-item-padding-bottom) var(--cd-spacing-transfer-item-padding-left);
882
+ user-select: none;
883
+ font-size: var(--cd-font-size-regular);
884
+ color: var(--cd-color-transfer-item-text);
1275
885
  cursor: pointer;
1276
- outline: none;
886
+ transition: background-color 0.2s ease;
1277
887
  }
1278
- .cd-transfer__item[role='option']:focus-visible {
1279
- box-shadow: inset 0 0 0 2px var(--cd-color-primary);
888
+ .cd-transfer-item:hover {
889
+ background-color: var(--cd-color-transfer-item-bg-hover);
1280
890
  }
1281
- .cd-transfer__item[aria-selected='true'] {
1282
- background: var(--cd-transfer-item-bg-checked, var(--cd-color-primary-light-default));
891
+ .cd-transfer-item:active {
892
+ background-color: var(--cd-color-transfer-item-bg-active);
1283
893
  }
1284
- .cd-transfer__item[aria-disabled='true'] {
1285
- color: var(--cd-transfer-item-disabled-text, var(--cd-color-text-2));
894
+ .cd-transfer-item-disabled {
1286
895
  cursor: not-allowed;
1287
896
  }
1288
- .cd-transfer__option-control {
1289
- display: inline-flex;
1290
- align-items: center;
1291
- gap: var(--cd-spacing-tight);
1292
- pointer-events: none;
1293
- min-inline-size: 0;
1294
- flex: 1 1 auto;
1295
- }
1296
- .cd-transfer__check {
1297
- display: inline-flex;
1298
- align-items: center;
1299
- justify-content: center;
1300
- flex: none;
1301
- inline-size: 16px;
1302
- block-size: 16px;
1303
- border: 1px solid var(--cd-color-border);
1304
- border-radius: var(--cd-radius-small, 4px);
1305
- color: var(--cd-color-bg-0, #fff);
1306
- background: var(--cd-color-bg-0);
1307
- }
1308
- .cd-transfer__check--on {
1309
- background: var(--cd-color-primary);
1310
- border-color: var(--cd-color-primary);
1311
- }
1312
- .cd-transfer__option-label {
1313
- overflow: hidden;
1314
- text-overflow: ellipsis;
1315
- white-space: nowrap;
1316
- }
1317
- .cd-transfer__loading {
1318
- display: flex;
1319
- align-items: center;
1320
- justify-content: center;
1321
- gap: var(--cd-spacing-tight);
1322
- padding-block: var(--cd-spacing-base-tight);
1323
- color: var(--cd-color-text-3);
1324
- font-size: var(--cd-font-size-small);
1325
- }
1326
- .cd-transfer__spinner {
1327
- inline-size: 1em;
1328
- block-size: 1em;
1329
- border: 2px solid var(--cd-color-border);
1330
- border-block-start-color: var(--cd-color-primary);
1331
- border-radius: var(--cd-border-radius-full);
1332
- animation: cd-transfer-spin 0.7s linear infinite;
897
+ .cd-transfer-item-disabled:hover {
898
+ background-color: inherit;
1333
899
  }
1334
- @keyframes cd-transfer-spin {
1335
- to {
1336
- transform: rotate(360deg);
1337
- }
900
+ /* 左侧 Checkbox 整行填充 */
901
+ .cd-transfer-left-list .cd-transfer-item :global(.cd-checkbox) {
902
+ width: 100%;
1338
903
  }
1339
- @media (prefers-reduced-motion: reduce) {
1340
- .cd-transfer__spinner {
1341
- animation: none;
1342
- }
904
+
905
+ .cd-transfer-right-item {
906
+ color: var(--cd-color-transfer-selected-item-text);
907
+ cursor: auto;
1343
908
  }
1344
- .cd-transfer__item-label {
1345
- flex: 1 1 auto;
909
+ .cd-transfer-item-text {
910
+ flex: 1;
911
+ word-break: break-all;
1346
912
  overflow: hidden;
1347
913
  text-overflow: ellipsis;
1348
- white-space: nowrap;
1349
914
  }
1350
- .cd-transfer__remove {
915
+ .cd-transfer-item-close-icon {
1351
916
  display: inline-flex;
1352
917
  align-items: center;
1353
918
  justify-content: center;
1354
- flex: none;
1355
- inline-size: 18px;
1356
- block-size: 18px;
919
+ flex-shrink: 0;
1357
920
  padding: 0;
1358
921
  border: none;
1359
- border-radius: var(--cd-border-radius-small, 4px);
1360
922
  background: transparent;
1361
- color: var(--cd-color-text-2);
923
+ font-size: var(--cd-width-transfer-item-close-icon);
924
+ color: var(--cd-color-transfer-close-icon-icon);
1362
925
  cursor: pointer;
926
+ visibility: hidden;
1363
927
  }
1364
- .cd-transfer__remove:hover:not(:disabled) {
1365
- background: var(--cd-transfer-item-bg-hover);
1366
- color: var(--cd-color-text-0);
1367
- }
1368
- .cd-transfer__remove:disabled {
1369
- cursor: not-allowed;
1370
- opacity: 0.5;
928
+ .cd-transfer-right-item:hover .cd-transfer-item-close-icon {
929
+ visibility: visible;
1371
930
  }
1372
- .cd-transfer__remove:focus-visible {
1373
- outline: none;
1374
- box-shadow: var(--cd-focus-ring);
931
+ .cd-transfer-right-item:hover .cd-transfer-item-close-icon.cd-transfer-item-close-icon-disabled {
932
+ visibility: hidden;
1375
933
  }
1376
- .cd-transfer__tree-node {
1377
- display: flex;
1378
- align-items: center;
1379
- min-block-size: var(--cd-transfer-item-height);
1380
- padding-inline-end: var(--cd-spacing-base-tight);
1381
- }
1382
- .cd-transfer__tree-node:hover {
1383
- background: var(--cd-transfer-item-bg-hover);
934
+ .cd-transfer-item-close-icon:disabled {
935
+ cursor: not-allowed;
1384
936
  }
1385
- .cd-transfer__switcher {
937
+ .cd-transfer-right-item-drag-handler {
1386
938
  display: inline-flex;
1387
939
  align-items: center;
1388
- justify-content: center;
1389
- flex: none;
1390
- inline-size: 18px;
1391
- block-size: 18px;
1392
- padding: 0;
1393
- border: none;
1394
- background: transparent;
940
+ margin-right: var(--cd-spacing-transfer-right-item-drag-handler-margin-right);
941
+ flex-shrink: 0;
942
+ cursor: move;
1395
943
  color: var(--cd-color-text-2);
1396
- cursor: pointer;
1397
- transition: transform 0.15s ease;
1398
944
  }
1399
- .cd-transfer__switcher--open {
1400
- transform: rotate(90deg);
945
+ .cd-transfer-right-item-draggable {
946
+ cursor: grab;
1401
947
  }
1402
- .cd-transfer__switcher--leaf {
1403
- cursor: default;
948
+ .cd-transfer-right-item-dragging {
949
+ opacity: 0.5;
1404
950
  }
1405
- .cd-transfer__switcher:focus-visible {
1406
- outline: none;
1407
- box-shadow: var(--cd-focus-ring);
951
+ .cd-transfer-right-item-drop-before {
952
+ box-shadow: inset 0 2px 0 0 var(--cd-color-primary);
1408
953
  }
1409
- .cd-transfer__group {
1410
- display: block;
954
+ .cd-transfer-right-item-drop-after {
955
+ box-shadow: inset 0 -2px 0 0 var(--cd-color-primary);
1411
956
  }
1412
- .cd-transfer__group-header {
957
+
958
+ /* 分组标题 */
959
+ .cd-transfer-group-title {
1413
960
  display: flex;
1414
961
  align-items: center;
1415
- justify-content: space-between;
1416
- min-block-size: var(--cd-transfer-item-height);
1417
- padding-inline: var(--cd-spacing-base-tight);
1418
- background: var(--cd-transfer-panel-header-bg);
1419
- font-weight: var(--cd-font-weight-medium);
1420
- }
1421
- .cd-transfer__group-count {
1422
- color: var(--cd-color-text-2);
962
+ height: var(--cd-height-transfer-group-title);
963
+ padding-left: var(--cd-spacing-transfer-group-title-padding-left);
964
+ color: var(--cd-color-transfer-group-title-text);
1423
965
  font-size: var(--cd-font-size-small);
1424
- font-weight: var(--cd-font-weight-regular);
1425
- }
1426
- .cd-transfer__group-list {
1427
- margin: 0;
1428
- padding: 0;
1429
- list-style: none;
1430
966
  }
1431
- .cd-transfer__empty {
967
+
968
+ /* 空态 */
969
+ .cd-transfer-empty {
970
+ width: var(--cd-width-transfer-empty);
1432
971
  display: flex;
1433
972
  align-items: center;
1434
973
  justify-content: center;
1435
- padding-block: var(--cd-spacing-base);
1436
- color: var(--cd-color-text-3);
1437
974
  font-size: var(--cd-font-size-small);
975
+ color: var(--cd-color-transfer-empty-text);
1438
976
  }
1439
- .cd-transfer__ops {
977
+ .cd-transfer-left-empty {
978
+ height: var(--cd-height-transfer-left-empty);
979
+ }
980
+ .cd-transfer-right-empty {
981
+ position: absolute;
982
+ height: var(--cd-height-transfer-right-empty);
983
+ }
984
+
985
+ /* 左侧分页 */
986
+ .cd-transfer-left-pagination {
987
+ display: flex;
988
+ justify-content: center;
989
+ padding: var(--cd-spacing-base-tight);
990
+ flex-shrink: 0;
991
+ }
992
+
993
+ /* 中间操作按钮 */
994
+ .cd-transfer-ops {
1440
995
  display: flex;
1441
996
  flex-direction: column;
1442
997
  justify-content: center;
1443
- gap: var(--cd-spacing-tight);
998
+ padding: 0 var(--cd-spacing-tight);
1444
999
  }
1445
- .cd-transfer__pagination {
1000
+
1001
+ /* Tree 复用:撑满剩余高度 */
1002
+ .cd-transfer-left :global(.cd-transfer-tree) {
1003
+ flex: 1;
1004
+ overflow: auto;
1005
+ min-height: 0;
1006
+ }
1007
+
1008
+ /* loading */
1009
+ .cd-transfer-loading {
1446
1010
  display: flex;
1011
+ align-items: center;
1447
1012
  justify-content: center;
1448
- padding-block: var(--cd-spacing-tight);
1449
- border-block-start: 1px solid var(--cd-transfer-panel-border);
1013
+ gap: var(--cd-spacing-tight);
1014
+ flex-grow: 1;
1015
+ padding: var(--cd-spacing-base-tight);
1016
+ color: var(--cd-color-text-3);
1017
+ font-size: var(--cd-font-size-small);
1018
+ }
1019
+ .cd-transfer-spinner {
1020
+ inline-size: 1em;
1021
+ block-size: 1em;
1022
+ border: 2px solid var(--cd-color-border);
1023
+ border-block-start-color: var(--cd-color-primary);
1024
+ border-radius: 50%;
1025
+ animation: cd-transfer-spin 0.7s linear infinite;
1026
+ }
1027
+ @keyframes cd-transfer-spin {
1028
+ to {
1029
+ transform: rotate(360deg);
1030
+ }
1031
+ }
1032
+ @media (prefers-reduced-motion: reduce) {
1033
+ .cd-transfer-spinner {
1034
+ animation: none;
1035
+ }
1450
1036
  }
1451
1037
  </style>