@chenzy-design/svelte 0.1.0 → 0.2.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 (974) hide show
  1. package/README.md +66 -0
  2. package/dist/badge/Badge.svelte +5 -2
  3. package/dist/badge/Badge.svelte.d.ts.map +1 -1
  4. package/dist/components.json +1 -1
  5. package/package.json +9 -9
  6. package/dist/anchor/Anchor.a11y.test.d.ts +0 -2
  7. package/dist/anchor/Anchor.a11y.test.d.ts.map +0 -1
  8. package/dist/anchor/Anchor.a11y.test.js +0 -44
  9. package/dist/anchor/Anchor.kbd.test.d.ts +0 -2
  10. package/dist/anchor/Anchor.kbd.test.d.ts.map +0 -1
  11. package/dist/anchor/Anchor.kbd.test.js +0 -59
  12. package/dist/anchor/AnchorKbdFixture.svelte +0 -24
  13. package/dist/anchor/AnchorKbdFixture.svelte.d.ts +0 -19
  14. package/dist/anchor/AnchorKbdFixture.svelte.d.ts.map +0 -1
  15. package/dist/autocomplete/AutoComplete.a11y.test.d.ts +0 -2
  16. package/dist/autocomplete/AutoComplete.a11y.test.d.ts.map +0 -1
  17. package/dist/autocomplete/AutoComplete.a11y.test.js +0 -45
  18. package/dist/autocomplete/AutoComplete.kbd.test.d.ts +0 -2
  19. package/dist/autocomplete/AutoComplete.kbd.test.d.ts.map +0 -1
  20. package/dist/autocomplete/AutoComplete.kbd.test.js +0 -60
  21. package/dist/autocomplete/AutoCompleteKbdFixture.svelte +0 -24
  22. package/dist/autocomplete/AutoCompleteKbdFixture.svelte.d.ts +0 -4
  23. package/dist/autocomplete/AutoCompleteKbdFixture.svelte.d.ts.map +0 -1
  24. package/dist/avatar/Avatar.a11y.test.d.ts +0 -2
  25. package/dist/avatar/Avatar.a11y.test.d.ts.map +0 -1
  26. package/dist/avatar/Avatar.a11y.test.js +0 -34
  27. package/dist/back-top/BackTop.a11y.test.d.ts +0 -2
  28. package/dist/back-top/BackTop.a11y.test.d.ts.map +0 -1
  29. package/dist/back-top/BackTop.a11y.test.js +0 -37
  30. package/dist/badge/Badge.a11y.test.d.ts +0 -2
  31. package/dist/badge/Badge.a11y.test.d.ts.map +0 -1
  32. package/dist/badge/Badge.a11y.test.js +0 -32
  33. package/dist/badge/BadgeA11yFixture.svelte +0 -18
  34. package/dist/badge/BadgeA11yFixture.svelte.d.ts +0 -7
  35. package/dist/badge/BadgeA11yFixture.svelte.d.ts.map +0 -1
  36. package/dist/banner/Banner.a11y.test.d.ts +0 -2
  37. package/dist/banner/Banner.a11y.test.d.ts.map +0 -1
  38. package/dist/banner/Banner.a11y.test.js +0 -43
  39. package/dist/breadcrumb/Breadcrumb.a11y.test.d.ts +0 -2
  40. package/dist/breadcrumb/Breadcrumb.a11y.test.d.ts.map +0 -1
  41. package/dist/breadcrumb/Breadcrumb.a11y.test.js +0 -31
  42. package/dist/breadcrumb/Breadcrumb.kbd.test.d.ts +0 -2
  43. package/dist/breadcrumb/Breadcrumb.kbd.test.d.ts.map +0 -1
  44. package/dist/breadcrumb/Breadcrumb.kbd.test.js +0 -37
  45. package/dist/breadcrumb/BreadcrumbKbdFixture.svelte +0 -23
  46. package/dist/breadcrumb/BreadcrumbKbdFixture.svelte.d.ts +0 -19
  47. package/dist/breadcrumb/BreadcrumbKbdFixture.svelte.d.ts.map +0 -1
  48. package/dist/button/Button.a11y.test.d.ts +0 -2
  49. package/dist/button/Button.a11y.test.d.ts.map +0 -1
  50. package/dist/button/Button.a11y.test.js +0 -49
  51. package/dist/calendar/Calendar.a11y.test.d.ts +0 -2
  52. package/dist/calendar/Calendar.a11y.test.d.ts.map +0 -1
  53. package/dist/calendar/Calendar.a11y.test.js +0 -46
  54. package/dist/calendar/Calendar.kbd.test.d.ts +0 -2
  55. package/dist/calendar/Calendar.kbd.test.d.ts.map +0 -1
  56. package/dist/calendar/Calendar.kbd.test.js +0 -50
  57. package/dist/calendar/CalendarKbdFixture.svelte +0 -23
  58. package/dist/calendar/CalendarKbdFixture.svelte.d.ts +0 -19
  59. package/dist/calendar/CalendarKbdFixture.svelte.d.ts.map +0 -1
  60. package/dist/card/Card.a11y.test.d.ts +0 -2
  61. package/dist/card/Card.a11y.test.d.ts.map +0 -1
  62. package/dist/card/Card.a11y.test.js +0 -35
  63. package/dist/carousel/Carousel.a11y.test.d.ts +0 -2
  64. package/dist/carousel/Carousel.a11y.test.d.ts.map +0 -1
  65. package/dist/carousel/Carousel.a11y.test.js +0 -43
  66. package/dist/carousel/Carousel.kbd.test.d.ts +0 -2
  67. package/dist/carousel/Carousel.kbd.test.d.ts.map +0 -1
  68. package/dist/carousel/Carousel.kbd.test.js +0 -51
  69. package/dist/carousel/CarouselA11yFixture.svelte +0 -25
  70. package/dist/carousel/CarouselA11yFixture.svelte.d.ts +0 -8
  71. package/dist/carousel/CarouselA11yFixture.svelte.d.ts.map +0 -1
  72. package/dist/carousel/CarouselKbdFixture.svelte +0 -24
  73. package/dist/carousel/CarouselKbdFixture.svelte.d.ts +0 -19
  74. package/dist/carousel/CarouselKbdFixture.svelte.d.ts.map +0 -1
  75. package/dist/cascader/Cascader.a11y.test.d.ts +0 -2
  76. package/dist/cascader/Cascader.a11y.test.d.ts.map +0 -1
  77. package/dist/cascader/Cascader.a11y.test.js +0 -55
  78. package/dist/cascader/Cascader.kbd.test.d.ts +0 -2
  79. package/dist/cascader/Cascader.kbd.test.d.ts.map +0 -1
  80. package/dist/cascader/Cascader.kbd.test.js +0 -47
  81. package/dist/cascader/CascaderKbdFixture.svelte +0 -31
  82. package/dist/cascader/CascaderKbdFixture.svelte.d.ts +0 -19
  83. package/dist/cascader/CascaderKbdFixture.svelte.d.ts.map +0 -1
  84. package/dist/checkbox/CheckboxGroup.a11y.test.d.ts +0 -2
  85. package/dist/checkbox/CheckboxGroup.a11y.test.d.ts.map +0 -1
  86. package/dist/checkbox/CheckboxGroup.a11y.test.js +0 -38
  87. package/dist/checkbox/CheckboxGroup.kbd.test.d.ts +0 -2
  88. package/dist/checkbox/CheckboxGroup.kbd.test.d.ts.map +0 -1
  89. package/dist/checkbox/CheckboxGroup.kbd.test.js +0 -33
  90. package/dist/checkbox/CheckboxGroupKbdFixture.svelte +0 -20
  91. package/dist/checkbox/CheckboxGroupKbdFixture.svelte.d.ts +0 -19
  92. package/dist/checkbox/CheckboxGroupKbdFixture.svelte.d.ts.map +0 -1
  93. package/dist/collapse/Collapse.a11y.test.d.ts +0 -2
  94. package/dist/collapse/Collapse.a11y.test.d.ts.map +0 -1
  95. package/dist/collapse/Collapse.a11y.test.js +0 -46
  96. package/dist/collapse/Collapse.kbd.test.d.ts +0 -2
  97. package/dist/collapse/Collapse.kbd.test.d.ts.map +0 -1
  98. package/dist/collapse/Collapse.kbd.test.js +0 -70
  99. package/dist/collapse/CollapseA11yFixture.svelte +0 -27
  100. package/dist/collapse/CollapseA11yFixture.svelte.d.ts +0 -9
  101. package/dist/collapse/CollapseA11yFixture.svelte.d.ts.map +0 -1
  102. package/dist/collapse/CollapseKbdFixture.svelte +0 -25
  103. package/dist/collapse/CollapseKbdFixture.svelte.d.ts +0 -19
  104. package/dist/collapse/CollapseKbdFixture.svelte.d.ts.map +0 -1
  105. package/dist/color-picker/ColorPicker.a11y.test.d.ts +0 -2
  106. package/dist/color-picker/ColorPicker.a11y.test.d.ts.map +0 -1
  107. package/dist/color-picker/ColorPicker.a11y.test.js +0 -54
  108. package/dist/color-picker/ColorPicker.kbd.test.d.ts +0 -2
  109. package/dist/color-picker/ColorPicker.kbd.test.d.ts.map +0 -1
  110. package/dist/color-picker/ColorPicker.kbd.test.js +0 -59
  111. package/dist/color-picker/ColorPickerKbdFixture.svelte +0 -25
  112. package/dist/color-picker/ColorPickerKbdFixture.svelte.d.ts +0 -4
  113. package/dist/color-picker/ColorPickerKbdFixture.svelte.d.ts.map +0 -1
  114. package/dist/date-picker/DatePicker.a11y.test.d.ts +0 -2
  115. package/dist/date-picker/DatePicker.a11y.test.d.ts.map +0 -1
  116. package/dist/date-picker/DatePicker.a11y.test.js +0 -42
  117. package/dist/date-picker/DatePicker.kbd.test.d.ts +0 -2
  118. package/dist/date-picker/DatePicker.kbd.test.d.ts.map +0 -1
  119. package/dist/date-picker/DatePicker.kbd.test.js +0 -59
  120. package/dist/date-picker/DatePickerKbdFixture.svelte +0 -26
  121. package/dist/date-picker/DatePickerKbdFixture.svelte.d.ts +0 -4
  122. package/dist/date-picker/DatePickerKbdFixture.svelte.d.ts.map +0 -1
  123. package/dist/date-picker/RangePicker.kbd.test.d.ts +0 -2
  124. package/dist/date-picker/RangePicker.kbd.test.d.ts.map +0 -1
  125. package/dist/date-picker/RangePicker.kbd.test.js +0 -60
  126. package/dist/date-picker/RangePickerKbdFixture.svelte +0 -30
  127. package/dist/date-picker/RangePickerKbdFixture.svelte.d.ts +0 -7
  128. package/dist/date-picker/RangePickerKbdFixture.svelte.d.ts.map +0 -1
  129. package/dist/descriptions/Descriptions.a11y.test.d.ts +0 -2
  130. package/dist/descriptions/Descriptions.a11y.test.d.ts.map +0 -1
  131. package/dist/descriptions/Descriptions.a11y.test.js +0 -31
  132. package/dist/divider/Divider.a11y.test.d.ts +0 -2
  133. package/dist/divider/Divider.a11y.test.d.ts.map +0 -1
  134. package/dist/divider/Divider.a11y.test.js +0 -21
  135. package/dist/drawer/Drawer.a11y.test.d.ts +0 -2
  136. package/dist/drawer/Drawer.a11y.test.d.ts.map +0 -1
  137. package/dist/drawer/Drawer.a11y.test.js +0 -33
  138. package/dist/drawer/Drawer.kbd.test.d.ts +0 -2
  139. package/dist/drawer/Drawer.kbd.test.d.ts.map +0 -1
  140. package/dist/drawer/Drawer.kbd.test.js +0 -53
  141. package/dist/drawer/DrawerKbdFixture.svelte +0 -28
  142. package/dist/drawer/DrawerKbdFixture.svelte.d.ts +0 -4
  143. package/dist/drawer/DrawerKbdFixture.svelte.d.ts.map +0 -1
  144. package/dist/dropdown/Dropdown.a11y.test.d.ts +0 -2
  145. package/dist/dropdown/Dropdown.a11y.test.d.ts.map +0 -1
  146. package/dist/dropdown/Dropdown.a11y.test.js +0 -39
  147. package/dist/dropdown/Dropdown.kbd.test.d.ts +0 -2
  148. package/dist/dropdown/Dropdown.kbd.test.d.ts.map +0 -1
  149. package/dist/dropdown/Dropdown.kbd.test.js +0 -47
  150. package/dist/dropdown/DropdownA11yFixture.svelte +0 -24
  151. package/dist/dropdown/DropdownA11yFixture.svelte.d.ts +0 -11
  152. package/dist/dropdown/DropdownA11yFixture.svelte.d.ts.map +0 -1
  153. package/dist/dropdown/DropdownKbdFixture.svelte +0 -26
  154. package/dist/dropdown/DropdownKbdFixture.svelte.d.ts +0 -19
  155. package/dist/dropdown/DropdownKbdFixture.svelte.d.ts.map +0 -1
  156. package/dist/dropdown/types.test.d.ts +0 -2
  157. package/dist/dropdown/types.test.d.ts.map +0 -1
  158. package/dist/dropdown/types.test.js +0 -40
  159. package/dist/empty/Empty.a11y.test.d.ts +0 -2
  160. package/dist/empty/Empty.a11y.test.d.ts.map +0 -1
  161. package/dist/empty/Empty.a11y.test.js +0 -22
  162. package/dist/form/Form.a11y.test.d.ts +0 -2
  163. package/dist/form/Form.a11y.test.d.ts.map +0 -1
  164. package/dist/form/Form.a11y.test.js +0 -36
  165. package/dist/form/FormA11yFixture.svelte +0 -31
  166. package/dist/form/FormA11yFixture.svelte.d.ts +0 -19
  167. package/dist/form/FormA11yFixture.svelte.d.ts.map +0 -1
  168. package/dist/grid/Grid.a11y.test.d.ts +0 -2
  169. package/dist/grid/Grid.a11y.test.d.ts.map +0 -1
  170. package/dist/grid/Grid.a11y.test.js +0 -13
  171. package/dist/grid/GridA11yFixture.svelte +0 -12
  172. package/dist/grid/GridA11yFixture.svelte.d.ts +0 -19
  173. package/dist/grid/GridA11yFixture.svelte.d.ts.map +0 -1
  174. package/dist/highlight/Highlight.a11y.test.d.ts +0 -2
  175. package/dist/highlight/Highlight.a11y.test.d.ts.map +0 -1
  176. package/dist/highlight/Highlight.a11y.test.js +0 -23
  177. package/dist/image/Image.a11y.test.d.ts +0 -2
  178. package/dist/image/Image.a11y.test.d.ts.map +0 -1
  179. package/dist/image/Image.a11y.test.js +0 -27
  180. package/dist/image/ImagePreview.kbd.test.d.ts +0 -2
  181. package/dist/image/ImagePreview.kbd.test.d.ts.map +0 -1
  182. package/dist/image/ImagePreview.kbd.test.js +0 -44
  183. package/dist/image/ImagePreviewKbdFixture.svelte +0 -32
  184. package/dist/image/ImagePreviewKbdFixture.svelte.d.ts +0 -4
  185. package/dist/image/ImagePreviewKbdFixture.svelte.d.ts.map +0 -1
  186. package/dist/input/Input.a11y.test.d.ts +0 -2
  187. package/dist/input/Input.a11y.test.d.ts.map +0 -1
  188. package/dist/input/Input.a11y.test.js +0 -53
  189. package/dist/input-number/InputNumber.a11y.test.d.ts +0 -2
  190. package/dist/input-number/InputNumber.a11y.test.d.ts.map +0 -1
  191. package/dist/input-number/InputNumber.a11y.test.js +0 -40
  192. package/dist/input-number/InputNumber.kbd.test.d.ts +0 -2
  193. package/dist/input-number/InputNumber.kbd.test.d.ts.map +0 -1
  194. package/dist/input-number/InputNumber.kbd.test.js +0 -35
  195. package/dist/input-number/InputNumberKbdFixture.svelte +0 -15
  196. package/dist/input-number/InputNumberKbdFixture.svelte.d.ts +0 -19
  197. package/dist/input-number/InputNumberKbdFixture.svelte.d.ts.map +0 -1
  198. package/dist/layout/Layout.a11y.test.d.ts +0 -2
  199. package/dist/layout/Layout.a11y.test.d.ts.map +0 -1
  200. package/dist/layout/Layout.a11y.test.js +0 -32
  201. package/dist/layout/LayoutA11yFixture.svelte +0 -21
  202. package/dist/layout/LayoutA11yFixture.svelte.d.ts +0 -7
  203. package/dist/layout/LayoutA11yFixture.svelte.d.ts.map +0 -1
  204. package/dist/list/List.a11y.test.d.ts +0 -2
  205. package/dist/list/List.a11y.test.d.ts.map +0 -1
  206. package/dist/list/List.a11y.test.js +0 -62
  207. package/dist/list/List.bench.d.ts +0 -2
  208. package/dist/list/List.bench.d.ts.map +0 -1
  209. package/dist/list/List.bench.js +0 -16
  210. package/dist/list/List.kbd.test.d.ts +0 -2
  211. package/dist/list/List.kbd.test.d.ts.map +0 -1
  212. package/dist/list/List.kbd.test.js +0 -60
  213. package/dist/list/ListA11yFixture.svelte +0 -38
  214. package/dist/list/ListA11yFixture.svelte.d.ts +0 -10
  215. package/dist/list/ListA11yFixture.svelte.d.ts.map +0 -1
  216. package/dist/list/ListBenchFixture.svelte +0 -22
  217. package/dist/list/ListBenchFixture.svelte.d.ts +0 -7
  218. package/dist/list/ListBenchFixture.svelte.d.ts.map +0 -1
  219. package/dist/list/ListKbdFixture.svelte +0 -31
  220. package/dist/list/ListKbdFixture.svelte.d.ts +0 -19
  221. package/dist/list/ListKbdFixture.svelte.d.ts.map +0 -1
  222. package/dist/menu/Menu.a11y.test.d.ts +0 -2
  223. package/dist/menu/Menu.a11y.test.d.ts.map +0 -1
  224. package/dist/menu/Menu.a11y.test.js +0 -49
  225. package/dist/menu/Menu.kbd.test.d.ts +0 -2
  226. package/dist/menu/Menu.kbd.test.d.ts.map +0 -1
  227. package/dist/menu/Menu.kbd.test.js +0 -56
  228. package/dist/menu/MenuKbdFixture.svelte +0 -22
  229. package/dist/menu/MenuKbdFixture.svelte.d.ts +0 -19
  230. package/dist/menu/MenuKbdFixture.svelte.d.ts.map +0 -1
  231. package/dist/meta.test.d.ts +0 -2
  232. package/dist/meta.test.d.ts.map +0 -1
  233. package/dist/meta.test.js +0 -164
  234. package/dist/modal/Modal.a11y.test.d.ts +0 -2
  235. package/dist/modal/Modal.a11y.test.d.ts.map +0 -1
  236. package/dist/modal/Modal.a11y.test.js +0 -38
  237. package/dist/modal/Modal.kbd.test.d.ts +0 -2
  238. package/dist/modal/Modal.kbd.test.d.ts.map +0 -1
  239. package/dist/modal/Modal.kbd.test.js +0 -52
  240. package/dist/modal/ModalKbdFixture.svelte +0 -24
  241. package/dist/modal/ModalKbdFixture.svelte.d.ts +0 -4
  242. package/dist/modal/ModalKbdFixture.svelte.d.ts.map +0 -1
  243. package/dist/notification/NotificationItem.a11y.test.d.ts +0 -2
  244. package/dist/notification/NotificationItem.a11y.test.d.ts.map +0 -1
  245. package/dist/notification/NotificationItem.a11y.test.js +0 -64
  246. package/dist/overflow-list/OverflowList.a11y.test.d.ts +0 -2
  247. package/dist/overflow-list/OverflowList.a11y.test.d.ts.map +0 -1
  248. package/dist/overflow-list/OverflowList.a11y.test.js +0 -41
  249. package/dist/overflow-list/OverflowList.kbd.test.d.ts +0 -2
  250. package/dist/overflow-list/OverflowList.kbd.test.d.ts.map +0 -1
  251. package/dist/overflow-list/OverflowList.kbd.test.js +0 -28
  252. package/dist/overflow-list/OverflowListA11yFixture.svelte +0 -22
  253. package/dist/overflow-list/OverflowListA11yFixture.svelte.d.ts +0 -8
  254. package/dist/overflow-list/OverflowListA11yFixture.svelte.d.ts.map +0 -1
  255. package/dist/overflow-list/OverflowListKbdFixture.svelte +0 -21
  256. package/dist/overflow-list/OverflowListKbdFixture.svelte.d.ts +0 -19
  257. package/dist/overflow-list/OverflowListKbdFixture.svelte.d.ts.map +0 -1
  258. package/dist/pagination/Pagination.a11y.test.d.ts +0 -2
  259. package/dist/pagination/Pagination.a11y.test.d.ts.map +0 -1
  260. package/dist/pagination/Pagination.a11y.test.js +0 -57
  261. package/dist/pagination/Pagination.kbd.test.d.ts +0 -2
  262. package/dist/pagination/Pagination.kbd.test.d.ts.map +0 -1
  263. package/dist/pagination/Pagination.kbd.test.js +0 -54
  264. package/dist/pagination/PaginationKbdFixture.svelte +0 -15
  265. package/dist/pagination/PaginationKbdFixture.svelte.d.ts +0 -19
  266. package/dist/pagination/PaginationKbdFixture.svelte.d.ts.map +0 -1
  267. package/dist/popconfirm/Popconfirm.a11y.test.d.ts +0 -2
  268. package/dist/popconfirm/Popconfirm.a11y.test.d.ts.map +0 -1
  269. package/dist/popconfirm/Popconfirm.a11y.test.js +0 -37
  270. package/dist/popconfirm/Popconfirm.kbd.test.d.ts +0 -2
  271. package/dist/popconfirm/Popconfirm.kbd.test.d.ts.map +0 -1
  272. package/dist/popconfirm/Popconfirm.kbd.test.js +0 -36
  273. package/dist/popconfirm/PopconfirmA11yFixture.svelte +0 -34
  274. package/dist/popconfirm/PopconfirmA11yFixture.svelte.d.ts +0 -11
  275. package/dist/popconfirm/PopconfirmA11yFixture.svelte.d.ts.map +0 -1
  276. package/dist/popconfirm/PopconfirmKbdFixture.svelte +0 -17
  277. package/dist/popconfirm/PopconfirmKbdFixture.svelte.d.ts +0 -19
  278. package/dist/popconfirm/PopconfirmKbdFixture.svelte.d.ts.map +0 -1
  279. package/dist/popover/Popover.a11y.test.d.ts +0 -2
  280. package/dist/popover/Popover.a11y.test.d.ts.map +0 -1
  281. package/dist/popover/Popover.a11y.test.js +0 -47
  282. package/dist/popover/Popover.kbd.test.d.ts +0 -2
  283. package/dist/popover/Popover.kbd.test.d.ts.map +0 -1
  284. package/dist/popover/Popover.kbd.test.js +0 -36
  285. package/dist/popover/PopoverA11yFixture.svelte +0 -35
  286. package/dist/popover/PopoverA11yFixture.svelte.d.ts +0 -11
  287. package/dist/popover/PopoverA11yFixture.svelte.d.ts.map +0 -1
  288. package/dist/popover/PopoverKbdFixture.svelte +0 -18
  289. package/dist/popover/PopoverKbdFixture.svelte.d.ts +0 -19
  290. package/dist/popover/PopoverKbdFixture.svelte.d.ts.map +0 -1
  291. package/dist/progress/Progress.a11y.test.d.ts +0 -2
  292. package/dist/progress/Progress.a11y.test.d.ts.map +0 -1
  293. package/dist/progress/Progress.a11y.test.js +0 -34
  294. package/dist/radio/RadioGroup.a11y.test.d.ts +0 -2
  295. package/dist/radio/RadioGroup.a11y.test.d.ts.map +0 -1
  296. package/dist/radio/RadioGroup.a11y.test.js +0 -38
  297. package/dist/radio/RadioGroup.kbd.test.d.ts +0 -2
  298. package/dist/radio/RadioGroup.kbd.test.d.ts.map +0 -1
  299. package/dist/radio/RadioGroup.kbd.test.js +0 -59
  300. package/dist/radio/RadioGroupKbdFixture.svelte +0 -21
  301. package/dist/radio/RadioGroupKbdFixture.svelte.d.ts +0 -19
  302. package/dist/radio/RadioGroupKbdFixture.svelte.d.ts.map +0 -1
  303. package/dist/rating/Rating.a11y.test.d.ts +0 -2
  304. package/dist/rating/Rating.a11y.test.d.ts.map +0 -1
  305. package/dist/rating/Rating.a11y.test.js +0 -38
  306. package/dist/rating/Rating.kbd.test.d.ts +0 -2
  307. package/dist/rating/Rating.kbd.test.d.ts.map +0 -1
  308. package/dist/rating/Rating.kbd.test.js +0 -41
  309. package/dist/rating/RatingKbdFixture.svelte +0 -15
  310. package/dist/rating/RatingKbdFixture.svelte.d.ts +0 -19
  311. package/dist/rating/RatingKbdFixture.svelte.d.ts.map +0 -1
  312. package/dist/select/Select.a11y.test.d.ts +0 -2
  313. package/dist/select/Select.a11y.test.d.ts.map +0 -1
  314. package/dist/select/Select.a11y.test.js +0 -53
  315. package/dist/select/Select.kbd.test.d.ts +0 -2
  316. package/dist/select/Select.kbd.test.d.ts.map +0 -1
  317. package/dist/select/Select.kbd.test.js +0 -47
  318. package/dist/select/SelectKbdFixture.svelte +0 -29
  319. package/dist/select/SelectKbdFixture.svelte.d.ts +0 -4
  320. package/dist/select/SelectKbdFixture.svelte.d.ts.map +0 -1
  321. package/dist/side-sheet/SideSheet.a11y.test.d.ts +0 -2
  322. package/dist/side-sheet/SideSheet.a11y.test.d.ts.map +0 -1
  323. package/dist/side-sheet/SideSheet.a11y.test.js +0 -46
  324. package/dist/side-sheet/SideSheet.kbd.test.d.ts +0 -2
  325. package/dist/side-sheet/SideSheet.kbd.test.d.ts.map +0 -1
  326. package/dist/side-sheet/SideSheet.kbd.test.js +0 -49
  327. package/dist/side-sheet/SideSheetKbdFixture.svelte +0 -30
  328. package/dist/side-sheet/SideSheetKbdFixture.svelte.d.ts +0 -4
  329. package/dist/side-sheet/SideSheetKbdFixture.svelte.d.ts.map +0 -1
  330. package/dist/skeleton/Skeleton.a11y.test.d.ts +0 -2
  331. package/dist/skeleton/Skeleton.a11y.test.d.ts.map +0 -1
  332. package/dist/skeleton/Skeleton.a11y.test.js +0 -32
  333. package/dist/slider/Slider.a11y.test.d.ts +0 -2
  334. package/dist/slider/Slider.a11y.test.d.ts.map +0 -1
  335. package/dist/slider/Slider.a11y.test.js +0 -40
  336. package/dist/slider/Slider.kbd.test.d.ts +0 -2
  337. package/dist/slider/Slider.kbd.test.d.ts.map +0 -1
  338. package/dist/slider/Slider.kbd.test.js +0 -63
  339. package/dist/slider/SliderKbdFixture.svelte +0 -21
  340. package/dist/slider/SliderKbdFixture.svelte.d.ts +0 -19
  341. package/dist/slider/SliderKbdFixture.svelte.d.ts.map +0 -1
  342. package/dist/space/Space.a11y.test.d.ts +0 -2
  343. package/dist/space/Space.a11y.test.d.ts.map +0 -1
  344. package/dist/space/Space.a11y.test.js +0 -20
  345. package/dist/space/SpaceA11yFixture.svelte +0 -17
  346. package/dist/space/SpaceA11yFixture.svelte.d.ts +0 -7
  347. package/dist/space/SpaceA11yFixture.svelte.d.ts.map +0 -1
  348. package/dist/spin/Spin.a11y.test.d.ts +0 -2
  349. package/dist/spin/Spin.a11y.test.d.ts.map +0 -1
  350. package/dist/spin/Spin.a11y.test.js +0 -27
  351. package/dist/spin/SpinA11yFixture.svelte +0 -18
  352. package/dist/spin/SpinA11yFixture.svelte.d.ts +0 -7
  353. package/dist/spin/SpinA11yFixture.svelte.d.ts.map +0 -1
  354. package/dist/steps/Steps.a11y.test.d.ts +0 -2
  355. package/dist/steps/Steps.a11y.test.d.ts.map +0 -1
  356. package/dist/steps/Steps.a11y.test.js +0 -35
  357. package/dist/steps/Steps.kbd.test.d.ts +0 -2
  358. package/dist/steps/Steps.kbd.test.d.ts.map +0 -1
  359. package/dist/steps/Steps.kbd.test.js +0 -59
  360. package/dist/steps/StepsKbdFixture.svelte +0 -21
  361. package/dist/steps/StepsKbdFixture.svelte.d.ts +0 -19
  362. package/dist/steps/StepsKbdFixture.svelte.d.ts.map +0 -1
  363. package/dist/switch/Switch.a11y.test.d.ts +0 -2
  364. package/dist/switch/Switch.a11y.test.d.ts.map +0 -1
  365. package/dist/switch/Switch.a11y.test.js +0 -42
  366. package/dist/switch/Switch.kbd.test.d.ts +0 -2
  367. package/dist/switch/Switch.kbd.test.d.ts.map +0 -1
  368. package/dist/switch/Switch.kbd.test.js +0 -34
  369. package/dist/switch/SwitchKbdFixture.svelte +0 -22
  370. package/dist/switch/SwitchKbdFixture.svelte.d.ts +0 -4
  371. package/dist/switch/SwitchKbdFixture.svelte.d.ts.map +0 -1
  372. package/dist/table/Table.a11y.test.d.ts +0 -2
  373. package/dist/table/Table.a11y.test.d.ts.map +0 -1
  374. package/dist/table/Table.a11y.test.js +0 -59
  375. package/dist/table/Table.bench.d.ts +0 -2
  376. package/dist/table/Table.bench.d.ts.map +0 -1
  377. package/dist/table/Table.bench.js +0 -31
  378. package/dist/table/Table.kbd.test.d.ts +0 -2
  379. package/dist/table/Table.kbd.test.d.ts.map +0 -1
  380. package/dist/table/Table.kbd.test.js +0 -74
  381. package/dist/table/TableKbdFixture.svelte +0 -35
  382. package/dist/table/TableKbdFixture.svelte.d.ts +0 -19
  383. package/dist/table/TableKbdFixture.svelte.d.ts.map +0 -1
  384. package/dist/table/grid-nav.test.d.ts +0 -2
  385. package/dist/table/grid-nav.test.d.ts.map +0 -1
  386. package/dist/table/grid-nav.test.js +0 -133
  387. package/dist/tabs/Tabs.a11y.test.d.ts +0 -2
  388. package/dist/tabs/Tabs.a11y.test.d.ts.map +0 -1
  389. package/dist/tabs/Tabs.a11y.test.js +0 -43
  390. package/dist/tabs/Tabs.kbd.test.d.ts +0 -2
  391. package/dist/tabs/Tabs.kbd.test.d.ts.map +0 -1
  392. package/dist/tabs/Tabs.kbd.test.js +0 -63
  393. package/dist/tabs/TabsA11yFixture.svelte +0 -20
  394. package/dist/tabs/TabsA11yFixture.svelte.d.ts +0 -8
  395. package/dist/tabs/TabsA11yFixture.svelte.d.ts.map +0 -1
  396. package/dist/tabs/TabsKbdFixture.svelte +0 -25
  397. package/dist/tabs/TabsKbdFixture.svelte.d.ts +0 -7
  398. package/dist/tabs/TabsKbdFixture.svelte.d.ts.map +0 -1
  399. package/dist/tag/Tag.a11y.test.d.ts +0 -2
  400. package/dist/tag/Tag.a11y.test.d.ts.map +0 -1
  401. package/dist/tag/Tag.a11y.test.js +0 -30
  402. package/dist/tag/TagA11yFixture.svelte +0 -18
  403. package/dist/tag/TagA11yFixture.svelte.d.ts +0 -8
  404. package/dist/tag/TagA11yFixture.svelte.d.ts.map +0 -1
  405. package/dist/tag-input/TagInput.a11y.test.d.ts +0 -2
  406. package/dist/tag-input/TagInput.a11y.test.d.ts.map +0 -1
  407. package/dist/tag-input/TagInput.a11y.test.js +0 -38
  408. package/dist/tag-input/reorder.test.d.ts +0 -2
  409. package/dist/tag-input/reorder.test.d.ts.map +0 -1
  410. package/dist/tag-input/reorder.test.js +0 -48
  411. package/dist/test-utils/LocaleHarness.svelte +0 -29
  412. package/dist/test-utils/LocaleHarness.svelte.d.ts +0 -11
  413. package/dist/test-utils/LocaleHarness.svelte.d.ts.map +0 -1
  414. package/dist/test-utils/a11y.d.ts +0 -36
  415. package/dist/test-utils/a11y.d.ts.map +0 -1
  416. package/dist/test-utils/a11y.js +0 -68
  417. package/dist/test-utils/kbd.d.ts +0 -26
  418. package/dist/test-utils/kbd.d.ts.map +0 -1
  419. package/dist/test-utils/kbd.js +0 -38
  420. package/dist/textarea/TextArea.a11y.test.d.ts +0 -2
  421. package/dist/textarea/TextArea.a11y.test.d.ts.map +0 -1
  422. package/dist/textarea/TextArea.a11y.test.js +0 -41
  423. package/dist/time-picker/TimePicker.a11y.test.d.ts +0 -2
  424. package/dist/time-picker/TimePicker.a11y.test.d.ts.map +0 -1
  425. package/dist/time-picker/TimePicker.a11y.test.js +0 -42
  426. package/dist/time-picker/TimePicker.kbd.test.d.ts +0 -2
  427. package/dist/time-picker/TimePicker.kbd.test.d.ts.map +0 -1
  428. package/dist/time-picker/TimePicker.kbd.test.js +0 -59
  429. package/dist/time-picker/TimePickerKbdFixture.svelte +0 -23
  430. package/dist/time-picker/TimePickerKbdFixture.svelte.d.ts +0 -4
  431. package/dist/time-picker/TimePickerKbdFixture.svelte.d.ts.map +0 -1
  432. package/dist/timeline/Timeline.a11y.test.d.ts +0 -2
  433. package/dist/timeline/Timeline.a11y.test.d.ts.map +0 -1
  434. package/dist/timeline/Timeline.a11y.test.js +0 -51
  435. package/dist/toast/Toast.a11y.test.d.ts +0 -2
  436. package/dist/toast/Toast.a11y.test.d.ts.map +0 -1
  437. package/dist/toast/Toast.a11y.test.js +0 -58
  438. package/dist/tooltip/Tooltip.a11y.test.d.ts +0 -2
  439. package/dist/tooltip/Tooltip.a11y.test.d.ts.map +0 -1
  440. package/dist/tooltip/Tooltip.a11y.test.js +0 -33
  441. package/dist/tooltip/Tooltip.kbd.test.d.ts +0 -2
  442. package/dist/tooltip/Tooltip.kbd.test.d.ts.map +0 -1
  443. package/dist/tooltip/Tooltip.kbd.test.js +0 -31
  444. package/dist/tooltip/TooltipA11yFixture.svelte +0 -31
  445. package/dist/tooltip/TooltipA11yFixture.svelte.d.ts +0 -11
  446. package/dist/tooltip/TooltipA11yFixture.svelte.d.ts.map +0 -1
  447. package/dist/tooltip/TooltipKbdFixture.svelte +0 -16
  448. package/dist/tooltip/TooltipKbdFixture.svelte.d.ts +0 -19
  449. package/dist/tooltip/TooltipKbdFixture.svelte.d.ts.map +0 -1
  450. package/dist/transfer/Transfer.a11y.test.d.ts +0 -2
  451. package/dist/transfer/Transfer.a11y.test.d.ts.map +0 -1
  452. package/dist/transfer/Transfer.a11y.test.js +0 -59
  453. package/dist/transfer/Transfer.kbd.test.d.ts +0 -2
  454. package/dist/transfer/Transfer.kbd.test.d.ts.map +0 -1
  455. package/dist/transfer/Transfer.kbd.test.js +0 -64
  456. package/dist/transfer/TransferKbdFixture.svelte +0 -23
  457. package/dist/transfer/TransferKbdFixture.svelte.d.ts +0 -4
  458. package/dist/transfer/TransferKbdFixture.svelte.d.ts.map +0 -1
  459. package/dist/transfer/group.test.d.ts +0 -2
  460. package/dist/transfer/group.test.d.ts.map +0 -1
  461. package/dist/transfer/group.test.js +0 -47
  462. package/dist/transfer/reorder.test.d.ts +0 -2
  463. package/dist/transfer/reorder.test.d.ts.map +0 -1
  464. package/dist/transfer/reorder.test.js +0 -42
  465. package/dist/transfer/tree.test.d.ts +0 -2
  466. package/dist/transfer/tree.test.d.ts.map +0 -1
  467. package/dist/transfer/tree.test.js +0 -39
  468. package/dist/tree/Tree.a11y.test.d.ts +0 -2
  469. package/dist/tree/Tree.a11y.test.d.ts.map +0 -1
  470. package/dist/tree/Tree.a11y.test.js +0 -56
  471. package/dist/tree/Tree.kbd.test.d.ts +0 -2
  472. package/dist/tree/Tree.kbd.test.d.ts.map +0 -1
  473. package/dist/tree/Tree.kbd.test.js +0 -78
  474. package/dist/tree/TreeKbdFixture.svelte +0 -30
  475. package/dist/tree/TreeKbdFixture.svelte.d.ts +0 -19
  476. package/dist/tree/TreeKbdFixture.svelte.d.ts.map +0 -1
  477. package/dist/tree-select/TreeSelect.a11y.test.d.ts +0 -2
  478. package/dist/tree-select/TreeSelect.a11y.test.d.ts.map +0 -1
  479. package/dist/tree-select/TreeSelect.a11y.test.js +0 -48
  480. package/dist/tree-select/TreeSelect.kbd.test.d.ts +0 -2
  481. package/dist/tree-select/TreeSelect.kbd.test.d.ts.map +0 -1
  482. package/dist/tree-select/TreeSelect.kbd.test.js +0 -46
  483. package/dist/tree-select/TreeSelectKbdFixture.svelte +0 -20
  484. package/dist/tree-select/TreeSelectKbdFixture.svelte.d.ts +0 -19
  485. package/dist/tree-select/TreeSelectKbdFixture.svelte.d.ts.map +0 -1
  486. package/dist/tree-select/virtual.test.d.ts +0 -2
  487. package/dist/tree-select/virtual.test.d.ts.map +0 -1
  488. package/dist/tree-select/virtual.test.js +0 -86
  489. package/dist/typography/Typography.a11y.test.d.ts +0 -2
  490. package/dist/typography/Typography.a11y.test.d.ts.map +0 -1
  491. package/dist/typography/Typography.a11y.test.js +0 -31
  492. package/dist/typography/TypographyA11yFixture.svelte +0 -27
  493. package/dist/typography/TypographyA11yFixture.svelte.d.ts +0 -9
  494. package/dist/typography/TypographyA11yFixture.svelte.d.ts.map +0 -1
  495. package/dist/upload/Upload.a11y.test.d.ts +0 -2
  496. package/dist/upload/Upload.a11y.test.d.ts.map +0 -1
  497. package/dist/upload/Upload.a11y.test.js +0 -49
  498. package/dist/upload/UploadA11yFixture.svelte +0 -23
  499. package/dist/upload/UploadA11yFixture.svelte.d.ts +0 -10
  500. package/dist/upload/UploadA11yFixture.svelte.d.ts.map +0 -1
  501. package/src/_floating/use-floating.ts +0 -208
  502. package/src/anchor/Anchor.a11y.test.ts +0 -49
  503. package/src/anchor/Anchor.kbd.test.ts +0 -70
  504. package/src/anchor/Anchor.svelte +0 -359
  505. package/src/anchor/AnchorKbdFixture.svelte +0 -24
  506. package/src/anchor/index.ts +0 -3
  507. package/src/anchor/meta.ts +0 -70
  508. package/src/anchor/types.ts +0 -8
  509. package/src/autocomplete/AutoComplete.a11y.test.ts +0 -49
  510. package/src/autocomplete/AutoComplete.kbd.test.ts +0 -69
  511. package/src/autocomplete/AutoComplete.svelte +0 -706
  512. package/src/autocomplete/AutoCompleteKbdFixture.svelte +0 -24
  513. package/src/autocomplete/index.ts +0 -2
  514. package/src/autocomplete/meta.ts +0 -41
  515. package/src/avatar/Avatar.a11y.test.ts +0 -37
  516. package/src/avatar/Avatar.svelte +0 -315
  517. package/src/avatar/AvatarGroup.svelte +0 -142
  518. package/src/avatar/context.ts +0 -21
  519. package/src/avatar/index.ts +0 -10
  520. package/src/avatar/meta.ts +0 -73
  521. package/src/back-top/BackTop.a11y.test.ts +0 -40
  522. package/src/back-top/BackTop.svelte +0 -314
  523. package/src/back-top/index.ts +0 -2
  524. package/src/back-top/meta.ts +0 -108
  525. package/src/badge/Badge.a11y.test.ts +0 -35
  526. package/src/badge/Badge.svelte +0 -328
  527. package/src/badge/BadgeA11yFixture.svelte +0 -18
  528. package/src/badge/index.ts +0 -2
  529. package/src/badge/meta.ts +0 -62
  530. package/src/banner/Banner.a11y.test.ts +0 -48
  531. package/src/banner/Banner.svelte +0 -368
  532. package/src/banner/index.ts +0 -3
  533. package/src/banner/meta.ts +0 -121
  534. package/src/breadcrumb/Breadcrumb.a11y.test.ts +0 -35
  535. package/src/breadcrumb/Breadcrumb.kbd.test.ts +0 -45
  536. package/src/breadcrumb/Breadcrumb.svelte +0 -414
  537. package/src/breadcrumb/BreadcrumbKbdFixture.svelte +0 -23
  538. package/src/breadcrumb/Item.svelte +0 -77
  539. package/src/breadcrumb/context.ts +0 -27
  540. package/src/breadcrumb/index.ts +0 -21
  541. package/src/breadcrumb/meta.ts +0 -128
  542. package/src/breadcrumb/types.ts +0 -4
  543. package/src/button/Button.a11y.test.ts +0 -54
  544. package/src/button/Button.svelte +0 -176
  545. package/src/button/index.ts +0 -2
  546. package/src/button/meta.ts +0 -28
  547. package/src/calendar/Calendar.a11y.test.ts +0 -51
  548. package/src/calendar/Calendar.kbd.test.ts +0 -59
  549. package/src/calendar/Calendar.svelte +0 -1344
  550. package/src/calendar/CalendarKbdFixture.svelte +0 -23
  551. package/src/calendar/index.ts +0 -3
  552. package/src/calendar/meta.ts +0 -117
  553. package/src/card/Card.a11y.test.ts +0 -38
  554. package/src/card/Card.svelte +0 -341
  555. package/src/card/CardMeta.svelte +0 -60
  556. package/src/card/index.ts +0 -8
  557. package/src/card/meta.ts +0 -83
  558. package/src/carousel/Carousel.a11y.test.ts +0 -53
  559. package/src/carousel/Carousel.kbd.test.ts +0 -67
  560. package/src/carousel/Carousel.svelte +0 -806
  561. package/src/carousel/CarouselA11yFixture.svelte +0 -25
  562. package/src/carousel/CarouselKbdFixture.svelte +0 -24
  563. package/src/carousel/index.ts +0 -2
  564. package/src/carousel/meta.ts +0 -74
  565. package/src/cascader/Cascader.a11y.test.ts +0 -59
  566. package/src/cascader/Cascader.kbd.test.ts +0 -56
  567. package/src/cascader/Cascader.svelte +0 -1570
  568. package/src/cascader/CascaderKbdFixture.svelte +0 -31
  569. package/src/cascader/index.ts +0 -3
  570. package/src/cascader/meta.ts +0 -57
  571. package/src/cascader/types.ts +0 -9
  572. package/src/checkbox/Checkbox.svelte +0 -281
  573. package/src/checkbox/CheckboxGroup.a11y.test.ts +0 -43
  574. package/src/checkbox/CheckboxGroup.kbd.test.ts +0 -40
  575. package/src/checkbox/CheckboxGroup.svelte +0 -122
  576. package/src/checkbox/CheckboxGroupKbdFixture.svelte +0 -20
  577. package/src/checkbox/context.ts +0 -31
  578. package/src/checkbox/index.ts +0 -4
  579. package/src/checkbox/meta.ts +0 -67
  580. package/src/collapse/Collapse.a11y.test.ts +0 -53
  581. package/src/collapse/Collapse.kbd.test.ts +0 -89
  582. package/src/collapse/Collapse.svelte +0 -406
  583. package/src/collapse/CollapseA11yFixture.svelte +0 -27
  584. package/src/collapse/CollapseKbdFixture.svelte +0 -25
  585. package/src/collapse/CollapsePanel.svelte +0 -102
  586. package/src/collapse/context.ts +0 -54
  587. package/src/collapse/index.ts +0 -17
  588. package/src/collapse/meta.ts +0 -79
  589. package/src/collapse/types.ts +0 -5
  590. package/src/color-picker/ColorPicker.a11y.test.ts +0 -60
  591. package/src/color-picker/ColorPicker.kbd.test.ts +0 -73
  592. package/src/color-picker/ColorPicker.svelte +0 -985
  593. package/src/color-picker/ColorPickerKbdFixture.svelte +0 -25
  594. package/src/color-picker/index.ts +0 -2
  595. package/src/color-picker/meta.ts +0 -47
  596. package/src/config-provider/ConfigProvider.svelte +0 -227
  597. package/src/config-provider/context.ts +0 -29
  598. package/src/config-provider/index.ts +0 -48
  599. package/src/config-provider/meta.ts +0 -128
  600. package/src/date-picker/DatePicker.a11y.test.ts +0 -45
  601. package/src/date-picker/DatePicker.kbd.test.ts +0 -71
  602. package/src/date-picker/DatePicker.svelte +0 -1798
  603. package/src/date-picker/DatePickerKbdFixture.svelte +0 -26
  604. package/src/date-picker/RangePicker.kbd.test.ts +0 -69
  605. package/src/date-picker/RangePicker.svelte +0 -775
  606. package/src/date-picker/RangePickerKbdFixture.svelte +0 -30
  607. package/src/date-picker/index.ts +0 -4
  608. package/src/date-picker/meta.ts +0 -67
  609. package/src/date-picker/range-meta.ts +0 -44
  610. package/src/descriptions/Descriptions.a11y.test.ts +0 -33
  611. package/src/descriptions/Descriptions.svelte +0 -287
  612. package/src/descriptions/DescriptionsItem.svelte +0 -43
  613. package/src/descriptions/context.ts +0 -21
  614. package/src/descriptions/index.ts +0 -16
  615. package/src/descriptions/meta.ts +0 -45
  616. package/src/descriptions/types.ts +0 -6
  617. package/src/divider/Divider.a11y.test.ts +0 -23
  618. package/src/divider/Divider.svelte +0 -154
  619. package/src/divider/index.ts +0 -2
  620. package/src/divider/meta.ts +0 -23
  621. package/src/drawer/Drawer.a11y.test.ts +0 -41
  622. package/src/drawer/Drawer.kbd.test.ts +0 -67
  623. package/src/drawer/Drawer.svelte +0 -554
  624. package/src/drawer/DrawerKbdFixture.svelte +0 -28
  625. package/src/drawer/index.ts +0 -2
  626. package/src/drawer/meta.ts +0 -127
  627. package/src/dropdown/Dropdown.a11y.test.ts +0 -46
  628. package/src/dropdown/Dropdown.kbd.test.ts +0 -56
  629. package/src/dropdown/Dropdown.svelte +0 -573
  630. package/src/dropdown/DropdownA11yFixture.svelte +0 -24
  631. package/src/dropdown/DropdownDivider.svelte +0 -17
  632. package/src/dropdown/DropdownItem.svelte +0 -127
  633. package/src/dropdown/DropdownItemNode.svelte +0 -355
  634. package/src/dropdown/DropdownKbdFixture.svelte +0 -26
  635. package/src/dropdown/DropdownMenu.svelte +0 -24
  636. package/src/dropdown/DropdownSubMenu.svelte +0 -212
  637. package/src/dropdown/DropdownTitle.svelte +0 -34
  638. package/src/dropdown/context.ts +0 -13
  639. package/src/dropdown/index.ts +0 -36
  640. package/src/dropdown/meta.ts +0 -97
  641. package/src/dropdown/types.test.ts +0 -50
  642. package/src/dropdown/types.ts +0 -67
  643. package/src/empty/Empty.a11y.test.ts +0 -24
  644. package/src/empty/Empty.svelte +0 -304
  645. package/src/empty/index.ts +0 -2
  646. package/src/empty/meta.ts +0 -41
  647. package/src/form/Field.svelte +0 -492
  648. package/src/form/FieldArray.svelte +0 -75
  649. package/src/form/Form.a11y.test.ts +0 -39
  650. package/src/form/Form.svelte +0 -243
  651. package/src/form/FormA11yFixture.svelte +0 -31
  652. package/src/form/FormCascader.svelte +0 -82
  653. package/src/form/FormCheckbox.svelte +0 -83
  654. package/src/form/FormDatePicker.svelte +0 -80
  655. package/src/form/FormErrorMessage.svelte +0 -44
  656. package/src/form/FormInput.svelte +0 -95
  657. package/src/form/FormLabel.svelte +0 -46
  658. package/src/form/FormRadio.svelte +0 -83
  659. package/src/form/FormRating.svelte +0 -85
  660. package/src/form/FormSection.svelte +0 -45
  661. package/src/form/FormSelect.svelte +0 -96
  662. package/src/form/FormSlider.svelte +0 -95
  663. package/src/form/FormSlot.svelte +0 -51
  664. package/src/form/FormSwitch.svelte +0 -82
  665. package/src/form/FormTagInput.svelte +0 -79
  666. package/src/form/FormTreeSelect.svelte +0 -85
  667. package/src/form/FormUpload.svelte +0 -92
  668. package/src/form/context.ts +0 -47
  669. package/src/form/index.ts +0 -22
  670. package/src/form/meta.ts +0 -85
  671. package/src/grid/Col.svelte +0 -142
  672. package/src/grid/Grid.a11y.test.ts +0 -14
  673. package/src/grid/GridA11yFixture.svelte +0 -12
  674. package/src/grid/Row.svelte +0 -116
  675. package/src/grid/index.ts +0 -3
  676. package/src/grid/meta.ts +0 -72
  677. package/src/grid/use-breakpoint.svelte.ts +0 -48
  678. package/src/highlight/Highlight.a11y.test.ts +0 -25
  679. package/src/highlight/Highlight.svelte +0 -99
  680. package/src/highlight/index.ts +0 -2
  681. package/src/highlight/meta.ts +0 -80
  682. package/src/icon/Icon.svelte +0 -156
  683. package/src/icon/index.ts +0 -2
  684. package/src/icon/meta.ts +0 -41
  685. package/src/image/Image.a11y.test.ts +0 -30
  686. package/src/image/Image.svelte +0 -387
  687. package/src/image/ImagePreview.kbd.test.ts +0 -52
  688. package/src/image/ImagePreview.svelte +0 -309
  689. package/src/image/ImagePreviewGroup.svelte +0 -93
  690. package/src/image/ImagePreviewKbdFixture.svelte +0 -32
  691. package/src/image/context.ts +0 -26
  692. package/src/image/index.ts +0 -15
  693. package/src/image/meta.ts +0 -131
  694. package/src/index.ts +0 -208
  695. package/src/input/Input.a11y.test.ts +0 -58
  696. package/src/input/Input.svelte +0 -505
  697. package/src/input/index.ts +0 -2
  698. package/src/input/meta.ts +0 -40
  699. package/src/input-number/InputNumber.a11y.test.ts +0 -43
  700. package/src/input-number/InputNumber.kbd.test.ts +0 -41
  701. package/src/input-number/InputNumber.svelte +0 -674
  702. package/src/input-number/InputNumberKbdFixture.svelte +0 -15
  703. package/src/input-number/index.ts +0 -2
  704. package/src/input-number/meta.ts +0 -65
  705. package/src/layout/Content.svelte +0 -37
  706. package/src/layout/Footer.svelte +0 -49
  707. package/src/layout/Header.svelte +0 -46
  708. package/src/layout/Layout.a11y.test.ts +0 -34
  709. package/src/layout/Layout.svelte +0 -60
  710. package/src/layout/LayoutA11yFixture.svelte +0 -21
  711. package/src/layout/Sider.svelte +0 -207
  712. package/src/layout/index.ts +0 -26
  713. package/src/layout/meta.ts +0 -116
  714. package/src/list/List.a11y.test.ts +0 -69
  715. package/src/list/List.bench.ts +0 -26
  716. package/src/list/List.kbd.test.ts +0 -71
  717. package/src/list/List.svelte +0 -920
  718. package/src/list/ListA11yFixture.svelte +0 -38
  719. package/src/list/ListBenchFixture.svelte +0 -22
  720. package/src/list/ListItem.svelte +0 -175
  721. package/src/list/ListKbdFixture.svelte +0 -31
  722. package/src/list/ListMeta.svelte +0 -73
  723. package/src/list/context.ts +0 -39
  724. package/src/list/index.ts +0 -21
  725. package/src/list/meta.ts +0 -99
  726. package/src/locale-provider/LocaleProvider.svelte +0 -110
  727. package/src/locale-provider/context.ts +0 -22
  728. package/src/locale-provider/index.ts +0 -21
  729. package/src/locale-provider/meta.ts +0 -93
  730. package/src/locale-provider/use-locale.ts +0 -25
  731. package/src/lottie-icon/LottieIcon.svelte +0 -330
  732. package/src/lottie-icon/index.ts +0 -9
  733. package/src/lottie-icon/meta.ts +0 -162
  734. package/src/menu/Menu.a11y.test.ts +0 -54
  735. package/src/menu/Menu.kbd.test.ts +0 -69
  736. package/src/menu/Menu.svelte +0 -762
  737. package/src/menu/MenuKbdFixture.svelte +0 -22
  738. package/src/menu/MenuPopupNode.svelte +0 -525
  739. package/src/menu/index.ts +0 -4
  740. package/src/menu/meta.ts +0 -137
  741. package/src/menu/types.ts +0 -120
  742. package/src/meta.test.ts +0 -173
  743. package/src/modal/ConfirmModal.svelte +0 -173
  744. package/src/modal/Modal.a11y.test.ts +0 -46
  745. package/src/modal/Modal.kbd.test.ts +0 -65
  746. package/src/modal/Modal.svelte +0 -511
  747. package/src/modal/ModalKbdFixture.svelte +0 -24
  748. package/src/modal/command.svelte.ts +0 -103
  749. package/src/modal/index.ts +0 -30
  750. package/src/modal/meta.ts +0 -165
  751. package/src/modal/z-stack.ts +0 -26
  752. package/src/notification/NotificationContainer.svelte +0 -192
  753. package/src/notification/NotificationItem.a11y.test.ts +0 -73
  754. package/src/notification/NotificationItem.svelte +0 -368
  755. package/src/notification/index.ts +0 -9
  756. package/src/notification/meta.ts +0 -120
  757. package/src/notification/store.ts +0 -191
  758. package/src/overflow-list/OverflowList.a11y.test.ts +0 -46
  759. package/src/overflow-list/OverflowList.kbd.test.ts +0 -34
  760. package/src/overflow-list/OverflowList.svelte +0 -539
  761. package/src/overflow-list/OverflowListA11yFixture.svelte +0 -22
  762. package/src/overflow-list/OverflowListKbdFixture.svelte +0 -21
  763. package/src/overflow-list/index.ts +0 -2
  764. package/src/overflow-list/meta.ts +0 -138
  765. package/src/pagination/Pagination.a11y.test.ts +0 -62
  766. package/src/pagination/Pagination.kbd.test.ts +0 -66
  767. package/src/pagination/Pagination.svelte +0 -428
  768. package/src/pagination/PaginationKbdFixture.svelte +0 -15
  769. package/src/pagination/index.ts +0 -2
  770. package/src/pagination/meta.ts +0 -73
  771. package/src/popconfirm/Popconfirm.a11y.test.ts +0 -46
  772. package/src/popconfirm/Popconfirm.kbd.test.ts +0 -42
  773. package/src/popconfirm/Popconfirm.svelte +0 -724
  774. package/src/popconfirm/PopconfirmA11yFixture.svelte +0 -34
  775. package/src/popconfirm/PopconfirmKbdFixture.svelte +0 -17
  776. package/src/popconfirm/index.ts +0 -2
  777. package/src/popconfirm/meta.ts +0 -200
  778. package/src/popover/Popover.a11y.test.ts +0 -58
  779. package/src/popover/Popover.kbd.test.ts +0 -42
  780. package/src/popover/Popover.svelte +0 -643
  781. package/src/popover/PopoverA11yFixture.svelte +0 -35
  782. package/src/popover/PopoverKbdFixture.svelte +0 -18
  783. package/src/popover/index.ts +0 -2
  784. package/src/popover/meta.ts +0 -103
  785. package/src/progress/Progress.a11y.test.ts +0 -37
  786. package/src/progress/Progress.svelte +0 -423
  787. package/src/progress/index.ts +0 -3
  788. package/src/progress/meta.ts +0 -132
  789. package/src/radio/Radio.svelte +0 -330
  790. package/src/radio/RadioGroup.a11y.test.ts +0 -43
  791. package/src/radio/RadioGroup.kbd.test.ts +0 -75
  792. package/src/radio/RadioGroup.svelte +0 -199
  793. package/src/radio/RadioGroupKbdFixture.svelte +0 -21
  794. package/src/radio/context.ts +0 -42
  795. package/src/radio/index.ts +0 -4
  796. package/src/radio/meta.ts +0 -68
  797. package/src/rating/Rating.a11y.test.ts +0 -41
  798. package/src/rating/Rating.kbd.test.ts +0 -48
  799. package/src/rating/Rating.svelte +0 -407
  800. package/src/rating/RatingKbdFixture.svelte +0 -15
  801. package/src/rating/index.ts +0 -2
  802. package/src/rating/meta.ts +0 -40
  803. package/src/resize-observer/ResizeObserver.svelte +0 -169
  804. package/src/resize-observer/action.ts +0 -80
  805. package/src/resize-observer/index.ts +0 -9
  806. package/src/resize-observer/meta.ts +0 -102
  807. package/src/scroll-list/ScrollColumn.svelte +0 -592
  808. package/src/scroll-list/ScrollList.svelte +0 -257
  809. package/src/scroll-list/index.ts +0 -4
  810. package/src/scroll-list/meta.ts +0 -93
  811. package/src/scroll-list/types.ts +0 -18
  812. package/src/select/Select.a11y.test.ts +0 -59
  813. package/src/select/Select.kbd.test.ts +0 -59
  814. package/src/select/Select.svelte +0 -1155
  815. package/src/select/SelectKbdFixture.svelte +0 -29
  816. package/src/select/index.ts +0 -3
  817. package/src/select/meta.ts +0 -78
  818. package/src/select/types.ts +0 -2
  819. package/src/side-sheet/SideSheet.a11y.test.ts +0 -53
  820. package/src/side-sheet/SideSheet.kbd.test.ts +0 -63
  821. package/src/side-sheet/SideSheet.svelte +0 -659
  822. package/src/side-sheet/SideSheetKbdFixture.svelte +0 -30
  823. package/src/side-sheet/index.ts +0 -2
  824. package/src/side-sheet/meta.ts +0 -116
  825. package/src/skeleton/Skeleton.a11y.test.ts +0 -35
  826. package/src/skeleton/Skeleton.svelte +0 -131
  827. package/src/skeleton/SkeletonAvatar.svelte +0 -82
  828. package/src/skeleton/SkeletonButton.svelte +0 -90
  829. package/src/skeleton/SkeletonImage.svelte +0 -100
  830. package/src/skeleton/SkeletonParagraph.svelte +0 -103
  831. package/src/skeleton/SkeletonTitle.svelte +0 -74
  832. package/src/skeleton/context.ts +0 -11
  833. package/src/skeleton/index.ts +0 -8
  834. package/src/skeleton/meta.ts +0 -65
  835. package/src/slider/Slider.a11y.test.ts +0 -44
  836. package/src/slider/Slider.kbd.test.ts +0 -74
  837. package/src/slider/Slider.svelte +0 -716
  838. package/src/slider/SliderKbdFixture.svelte +0 -21
  839. package/src/slider/index.ts +0 -2
  840. package/src/slider/meta.ts +0 -55
  841. package/src/space/Space.a11y.test.ts +0 -22
  842. package/src/space/Space.svelte +0 -109
  843. package/src/space/SpaceA11yFixture.svelte +0 -17
  844. package/src/space/index.ts +0 -2
  845. package/src/space/meta.ts +0 -27
  846. package/src/spin/Spin.a11y.test.ts +0 -29
  847. package/src/spin/Spin.svelte +0 -293
  848. package/src/spin/SpinA11yFixture.svelte +0 -18
  849. package/src/spin/index.ts +0 -2
  850. package/src/spin/meta.ts +0 -72
  851. package/src/steps/Steps.a11y.test.ts +0 -39
  852. package/src/steps/Steps.kbd.test.ts +0 -73
  853. package/src/steps/Steps.svelte +0 -392
  854. package/src/steps/StepsKbdFixture.svelte +0 -21
  855. package/src/steps/index.ts +0 -3
  856. package/src/steps/meta.ts +0 -59
  857. package/src/steps/types.ts +0 -8
  858. package/src/switch/Switch.a11y.test.ts +0 -46
  859. package/src/switch/Switch.kbd.test.ts +0 -40
  860. package/src/switch/Switch.svelte +0 -310
  861. package/src/switch/SwitchKbdFixture.svelte +0 -22
  862. package/src/switch/index.ts +0 -2
  863. package/src/switch/meta.ts +0 -44
  864. package/src/table/Table.a11y.test.ts +0 -70
  865. package/src/table/Table.bench.ts +0 -51
  866. package/src/table/Table.kbd.test.ts +0 -94
  867. package/src/table/Table.svelte +0 -2327
  868. package/src/table/TableKbdFixture.svelte +0 -35
  869. package/src/table/grid-nav.test.ts +0 -173
  870. package/src/table/grid-nav.ts +0 -146
  871. package/src/table/index.ts +0 -13
  872. package/src/table/meta.ts +0 -121
  873. package/src/table/types.ts +0 -133
  874. package/src/tabs/TabPane.svelte +0 -92
  875. package/src/tabs/Tabs.a11y.test.ts +0 -47
  876. package/src/tabs/Tabs.kbd.test.ts +0 -74
  877. package/src/tabs/Tabs.svelte +0 -1128
  878. package/src/tabs/TabsA11yFixture.svelte +0 -20
  879. package/src/tabs/TabsKbdFixture.svelte +0 -25
  880. package/src/tabs/context.ts +0 -43
  881. package/src/tabs/index.ts +0 -14
  882. package/src/tabs/meta.ts +0 -152
  883. package/src/tabs/types.ts +0 -6
  884. package/src/tag/Tag.a11y.test.ts +0 -33
  885. package/src/tag/Tag.svelte +0 -366
  886. package/src/tag/TagA11yFixture.svelte +0 -18
  887. package/src/tag/index.ts +0 -2
  888. package/src/tag/meta.ts +0 -92
  889. package/src/tag-input/TagInput.a11y.test.ts +0 -41
  890. package/src/tag-input/TagInput.svelte +0 -544
  891. package/src/tag-input/index.ts +0 -2
  892. package/src/tag-input/meta.ts +0 -43
  893. package/src/tag-input/reorder.test.ts +0 -59
  894. package/src/tag-input/reorder.ts +0 -41
  895. package/src/test-utils/LocaleHarness.svelte +0 -29
  896. package/src/test-utils/a11y.ts +0 -108
  897. package/src/test-utils/kbd.ts +0 -52
  898. package/src/textarea/TextArea.a11y.test.ts +0 -44
  899. package/src/textarea/TextArea.svelte +0 -420
  900. package/src/textarea/index.ts +0 -2
  901. package/src/textarea/meta.ts +0 -104
  902. package/src/time-picker/TimePicker.a11y.test.ts +0 -45
  903. package/src/time-picker/TimePicker.kbd.test.ts +0 -70
  904. package/src/time-picker/TimePicker.svelte +0 -1023
  905. package/src/time-picker/TimePickerKbdFixture.svelte +0 -23
  906. package/src/time-picker/index.ts +0 -2
  907. package/src/time-picker/meta.ts +0 -64
  908. package/src/timeline/Timeline.a11y.test.ts +0 -54
  909. package/src/timeline/Timeline.svelte +0 -599
  910. package/src/timeline/TimelineItem.svelte +0 -164
  911. package/src/timeline/context.ts +0 -28
  912. package/src/timeline/index.ts +0 -16
  913. package/src/timeline/meta.ts +0 -129
  914. package/src/timeline/types.ts +0 -9
  915. package/src/toast/Toast.a11y.test.ts +0 -67
  916. package/src/toast/ToastContainer.svelte +0 -184
  917. package/src/toast/ToastItem.svelte +0 -247
  918. package/src/toast/index.ts +0 -9
  919. package/src/toast/live-region.ts +0 -78
  920. package/src/toast/meta.ts +0 -95
  921. package/src/toast/store.ts +0 -187
  922. package/src/tooltip/Tooltip.a11y.test.ts +0 -41
  923. package/src/tooltip/Tooltip.kbd.test.ts +0 -37
  924. package/src/tooltip/Tooltip.svelte +0 -416
  925. package/src/tooltip/TooltipA11yFixture.svelte +0 -31
  926. package/src/tooltip/TooltipKbdFixture.svelte +0 -16
  927. package/src/tooltip/index.ts +0 -2
  928. package/src/tooltip/meta.ts +0 -59
  929. package/src/tooltip/placement.ts +0 -6
  930. package/src/transfer/Transfer.a11y.test.ts +0 -63
  931. package/src/transfer/Transfer.kbd.test.ts +0 -75
  932. package/src/transfer/Transfer.svelte +0 -1451
  933. package/src/transfer/TransferKbdFixture.svelte +0 -23
  934. package/src/transfer/group.test.ts +0 -55
  935. package/src/transfer/group.ts +0 -61
  936. package/src/transfer/index.ts +0 -3
  937. package/src/transfer/meta.ts +0 -55
  938. package/src/transfer/reorder.test.ts +0 -52
  939. package/src/transfer/reorder.ts +0 -42
  940. package/src/transfer/tree.test.ts +0 -44
  941. package/src/transfer/tree.ts +0 -52
  942. package/src/transfer/types.ts +0 -32
  943. package/src/tree/Tree.a11y.test.ts +0 -63
  944. package/src/tree/Tree.kbd.test.ts +0 -91
  945. package/src/tree/Tree.svelte +0 -1500
  946. package/src/tree/TreeKbdFixture.svelte +0 -30
  947. package/src/tree/index.ts +0 -3
  948. package/src/tree/meta.ts +0 -152
  949. package/src/tree-select/TreeSelect.a11y.test.ts +0 -52
  950. package/src/tree-select/TreeSelect.kbd.test.ts +0 -53
  951. package/src/tree-select/TreeSelect.svelte +0 -1611
  952. package/src/tree-select/TreeSelectKbdFixture.svelte +0 -20
  953. package/src/tree-select/index.ts +0 -3
  954. package/src/tree-select/meta.ts +0 -73
  955. package/src/tree-select/types.ts +0 -11
  956. package/src/tree-select/virtual.test.ts +0 -104
  957. package/src/typography/Link.svelte +0 -120
  958. package/src/typography/Paragraph.svelte +0 -92
  959. package/src/typography/Text.svelte +0 -93
  960. package/src/typography/Title.svelte +0 -91
  961. package/src/typography/Typography.a11y.test.ts +0 -34
  962. package/src/typography/TypographyA11yFixture.svelte +0 -27
  963. package/src/typography/TypographyBase.svelte +0 -807
  964. package/src/typography/index.ts +0 -16
  965. package/src/typography/meta.ts +0 -158
  966. package/src/upload/Upload.a11y.test.ts +0 -58
  967. package/src/upload/Upload.svelte +0 -1094
  968. package/src/upload/UploadA11yFixture.svelte +0 -23
  969. package/src/upload/index.ts +0 -3
  970. package/src/upload/meta.ts +0 -64
  971. package/src/upload/types.ts +0 -16
  972. package/src/virtual-list/VirtualList.svelte +0 -401
  973. package/src/virtual-list/index.ts +0 -2
  974. package/src/virtual-list/meta.ts +0 -106
@@ -1,1451 +0,0 @@
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.
24
- -->
25
- <script lang="ts">
26
- import { tick } from 'svelte';
27
- import Checkbox from '../checkbox/Checkbox.svelte';
28
- import Input from '../input/Input.svelte';
29
- import Button from '../button/Button.svelte';
30
- 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';
44
- import type { Snippet } from 'svelte';
45
- import Pagination from '../pagination/Pagination.svelte';
46
- import type {
47
- TransferGroup,
48
- TransferItem,
49
- TransferRenderGroup,
50
- TransferTreeNode,
51
- } from './types.js';
52
- import { fixedRange } from '@chenzy-design/core';
53
- import { buildGroups, hasGroups, normalizeData } from './group.js';
54
- import { isTreeData, flattenLeaves } from './tree.js';
55
- import { computeInsertSide, reorder, type InsertSide } from './reorder.js';
56
- import type { Attachment } from 'svelte/attachments';
57
-
58
- type TransferKey = string | number;
59
- type Size = 'small' | 'default' | 'large';
60
- type Status = 'default' | 'warning' | 'error';
61
- type TransferType = 'list' | 'groupList' | 'treeList';
62
-
63
- /** emptyContent: custom empty state renderers */
64
- interface EmptyContent {
65
- left?: Snippet | string;
66
- right?: Snippet | string;
67
- search?: Snippet | string;
68
- }
69
-
70
- /** pagination config for left panel */
71
- interface PaginationConfig {
72
- pageSize?: number;
73
- currentPage?: number;
74
- defaultCurrentPage?: number;
75
- onPageChange?: (page: number) => void;
76
- }
77
-
78
- /** Source panel header render args */
79
- interface SourceHeaderProps {
80
- totalContent: string;
81
- allContent: string;
82
- onAllClick: () => void;
83
- title: string;
84
- allChecked: boolean;
85
- showButton: boolean;
86
- leafOnlyNum?: number | undefined;
87
- }
88
-
89
- /** Selected panel header render args */
90
- interface SelectedHeaderProps {
91
- totalContent: string;
92
- allContent: string;
93
- onAllClick: () => void;
94
- title: string;
95
- }
96
-
97
- /** renderSourcePanel args */
98
- interface SourcePanelProps {
99
- dataSource: TransferItem[];
100
- selectedItems: TransferItem[];
101
- onChange: (keys: TransferKey[]) => void;
102
- onSearch: (v: string) => void;
103
- inputValue: string;
104
- searchResult: TransferItem[];
105
- }
106
-
107
- /** renderSelectedPanel args */
108
- interface SelectedPanelProps {
109
- selectedItems: TransferItem[];
110
- onRemove: (key: TransferKey) => void;
111
- onSortEnd: (keys: TransferKey[]) => void;
112
- }
113
-
114
- interface Props {
115
- value?: TransferKey[];
116
- defaultValue?: TransferKey[];
117
- dataSource?: TransferItem[] | TransferGroup[] | TransferTreeNode[];
118
- /** 'list' | 'groupList' | 'treeList' — controls source panel render mode. */
119
- type?: TransferType;
120
- filter?: boolean;
121
- searchPlaceholder?: string;
122
- size?: Size;
123
- status?: Status;
124
- 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
- /**
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).
133
- */
134
- 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. */
149
- 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. */
154
- emptyContent?: EmptyContent;
155
- /** Extra props passed to the search Input component. */
156
- inputProps?: Record<string, unknown>;
157
- /** Props passed to the Tree component when type='treeList'. */
158
- treeProps?: Record<string, unknown>;
159
- /** When type='treeList', show full path in right panel selected items. */
160
- showPath?: boolean;
161
- /** Left panel pagination config (only for list/groupList). */
162
- pagination?: PaginationConfig;
163
- /** Called when a single item is checked (not bulk select). */
164
- onSelect?: (item: TransferItem) => void;
165
- /** Called when a single item is unchecked (not bulk select). */
166
- onDeselect?: (item: TransferItem) => void;
167
- /** Custom render for left panel source items. */
168
- 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. */
172
- renderSourceHeader?: Snippet<[SourceHeaderProps]>;
173
- /** Custom render for right panel header. */
174
- renderSelectedHeader?: Snippet<[SelectedHeaderProps]>;
175
- /** Fully custom left panel renderer. */
176
- renderSourcePanel?: Snippet<[SourcePanelProps]>;
177
- /** Fully custom right panel renderer. */
178
- renderSelectedPanel?: Snippet<[SelectedPanelProps]>;
179
- }
180
-
181
- let {
182
- value,
183
- defaultValue = [],
184
- dataSource = [],
185
- type = 'list',
186
- filter = true,
187
- searchPlaceholder,
188
- size = 'default',
189
- status = 'default',
190
- disabled = false,
191
- showPanelTitle = true,
192
- titles,
193
- oneWay = false,
194
- draggable = false,
195
- virtualize = false,
196
- itemHeight = 32,
197
- onSearch,
198
- loading = false,
199
- searchDebounce = 300,
200
- onChange,
201
- emptyContent,
202
- inputProps,
203
- treeProps: _treeProps,
204
- showPath = false,
205
- pagination,
206
- onSelect,
207
- onDeselect,
208
- renderSourceItem,
209
- renderSelectedItem,
210
- renderSourceHeader,
211
- renderSelectedHeader,
212
- renderSourcePanel,
213
- renderSelectedPanel,
214
- }: Props = $props();
215
-
216
- const loc = useLocale();
217
-
218
- const announcer = useLiveAnnouncer();
219
- 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
-
227
- 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
-
233
- function getInitialValue(): TransferKey[] {
234
- return [...defaultValue];
235
- }
236
-
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).
261
- const isTree = $derived(type === 'treeList' || isTreeData(dataSource as readonly unknown[]));
262
- 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
- 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
- const items = $derived(
271
- isTree ? treeLeaves : normalizeData(dataSource as TransferItem[] | TransferGroup[]),
272
- );
273
- // type='groupList' forces grouped render; also auto-detect via data shape.
274
- const grouped = $derived(!isTree && (type === 'groupList' || hasGroups(items)));
275
-
276
- const leftItems = $derived(items.filter((item) => !current.includes(item.key)));
277
- const rightItems = $derived(items.filter((item) => current.includes(item.key)));
278
-
279
- // remote 模式:外部已按 query 更新 dataSource,本地不再过滤(对齐 Select)。
280
- const isRemote = $derived(onSearch !== undefined);
281
-
282
- function matches(label: string, query: string): boolean {
283
- return label.toLowerCase().includes(query.trim().toLowerCase());
284
- }
285
-
286
- const leftVisible = $derived(
287
- filter && !isRemote && leftQuery
288
- ? leftItems.filter((i) => matches(i.label, leftQuery))
289
- : leftItems,
290
- );
291
- const rightVisible = $derived(
292
- filter && !isRemote && rightQuery
293
- ? rightItems.filter((i) => matches(i.label, rightQuery))
294
- : rightItems,
295
- );
296
-
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));
301
-
302
- function panelItems(side: 'left' | 'right'): TransferItem[] {
303
- return side === 'left' ? leftVisible : rightVisible;
304
- }
305
-
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;
312
- }
313
-
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
- }
321
-
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);
332
- }
333
- if (side === 'left') leftChecked = [...set];
334
- else rightChecked = [...set];
335
- }
336
-
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);
382
- }
383
-
384
- function onRowFocus(side: 'left' | 'right', key: TransferKey): void {
385
- if (side === 'left') leftFocusKey = key;
386
- else rightFocusKey = key;
387
- }
388
-
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;
410
- }
411
-
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
- };
422
- }
423
-
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) -------------
432
- 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
- function maskTree(nodes: TransferTreeNode[]): TreeNodeData[] {
437
- return nodes.map((n) => {
438
- if (n.children && n.children.length > 0) {
439
- return { ...n, children: maskTree(n.children) } as TreeNodeData;
440
- }
441
- return { ...n, disabled: !!n.disabled || movedSet.has(n.key) } as TreeNodeData;
442
- });
443
- }
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
- }
484
-
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) {
520
- 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];
530
- }
531
-
532
- function commit(next: TransferKey[]) {
533
- if (!isControlled) inner = next;
534
- onChange?.(next);
535
- }
536
-
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);
557
- }
558
- }
559
- }
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
- });
611
- }
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);
618
- }
619
-
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
- });
644
-
645
- // --- 目标列拖拽重排(HTML5 DnD,与 TagInput 对齐)---------------------------
646
- // 受控不改 value,仅经 onChange 通知新顺序(红线 #1);拖拽态用 $state,事件
647
- // 处理命令式 + drop/dragend 清理(红线 #3);重排交由 reorder.ts 纯函数(红线 #2)。
648
- // 拖拽作用于「当前 target keys 的顺序」,按可见目标项的全局索引映射回 current。
649
- 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); // 插入到目标前/后
653
-
654
- function resetDrag() {
655
- dragIndex = null;
656
- dropIndex = null;
657
- dropSide = null;
658
- }
659
- // 把可见目标项映射回它在 current(已选顺序)中的下标。
660
- function targetIndexOf(key: TransferKey): number {
661
- return current.indexOf(key);
662
- }
663
- function onRowDragStart(e: DragEvent, key: TransferKey) {
664
- if (!canDrag) {
665
- e.preventDefault();
666
- return;
667
- }
668
- dragIndex = targetIndexOf(key);
669
- if (e.dataTransfer) {
670
- e.dataTransfer.effectAllowed = 'move';
671
- // 必须 setData,否则部分浏览器不触发 drop。
672
- e.dataTransfer.setData('text/plain', String(dragIndex));
673
- }
674
- }
675
- function onRowDragOver(e: DragEvent, key: TransferKey) {
676
- if (dragIndex === null) return;
677
- e.preventDefault(); // dragover 必须 preventDefault 才能触发 drop。
678
- if (e.dataTransfer) e.dataTransfer.dropEffect = 'move';
679
- const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();
680
- dropIndex = targetIndexOf(key);
681
- dropSide = computeInsertSide(e.clientY - rect.top, rect.height);
682
- }
683
- function onRowDragLeave(e: DragEvent, key: TransferKey) {
684
- const related = e.relatedTarget as Node | null;
685
- const cur = e.currentTarget as HTMLElement;
686
- if (related && cur.contains(related)) return;
687
- if (dropIndex === targetIndexOf(key)) {
688
- dropIndex = null;
689
- dropSide = null;
690
- }
691
- }
692
- function onRowDrop(e: DragEvent, key: TransferKey) {
693
- if (dragIndex === null || dropSide === null) {
694
- resetDrag();
695
- return;
696
- }
697
- e.preventDefault();
698
- const next = reorder(current, dragIndex, targetIndexOf(key), dropSide);
699
- const changed = next.length === current.length && next.some((k, i) => k !== current[i]);
700
- resetDrag();
701
- if (changed) commit(next); // 受控仅 onChange(红线 #1)。
702
- }
703
-
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);
712
- let rightScrollTop = $state(0);
713
- let leftViewportH = $state(0);
714
- 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
- );
723
- const rightVRange = $derived(
724
- 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,
730
- );
731
- const rightVItems = $derived(
732
- rightVirtual ? rightVisible.slice(rightVRange.startIndex, rightVRange.endIndex) : rightVisible,
733
- );
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> {
741
- return (el) => {
742
- let raf = 0;
743
- setViewport(el.clientHeight);
744
- setTop(el.scrollTop);
745
- function onScroll() {
746
- if (raf) return;
747
- raf = requestAnimationFrame(() => {
748
- raf = 0;
749
- setTop(el.scrollTop);
750
- });
751
- }
752
- el.addEventListener('scroll', onScroll, { passive: true });
753
- return () => {
754
- el.removeEventListener('scroll', onScroll);
755
- if (raf) cancelAnimationFrame(raf);
756
- };
757
- };
758
- }
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
- }
803
-
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.
807
- function getInitialPage(): number {
808
- return pagination?.defaultCurrentPage ?? 1;
809
- }
810
- let paginationPage = $state(getInitialPage());
811
- const isControlledPage = $derived(pagination?.currentPage !== undefined);
812
- 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(
817
- hasPagination
818
- ? leftVisible.slice((activePage - 1) * pageSize, activePage * pageSize)
819
- : leftVisible,
820
- );
821
-
822
- function onPageChange(page: number) {
823
- if (!isControlledPage) paginationPage = page;
824
- pagination?.onPageChange?.(page);
825
- }
826
-
827
- 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,
834
- );
835
-
836
- const cls = $derived(
837
- ['cd-transfer', `cd-transfer--${size}`, `cd-transfer--${status}`, disabled && 'cd-transfer--disabled']
838
- .filter(Boolean)
839
- .join(' '),
840
- );
841
- </script>
842
-
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)}
923
- >
924
- {displayLabel}
925
- </Checkbox>
926
- {/if}
927
- {/if}
928
- </li>
929
- {/snippet}
930
-
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))"
938
- >
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>
951
- {:else}
952
- <span class="cd-transfer__switcher cd-transfer__switcher--leaf" aria-hidden="true"></span>
953
- {/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>
964
- {/snippet}
965
-
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()}
974
- {/if}
975
- {:else}
976
- {isSearch ? loc().t('Transfer.searchEmpty') : loc().t('Transfer.empty')}
977
- {/if}
978
- </li>
979
- {/snippet}
980
-
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)}
1017
- {: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>
1037
- </div>
1038
- <ul class="cd-transfer__group-list">
1039
- {#each group.items as item (item.key)}
1040
- {@render itemRow(side, item)}
1041
- {/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
- {: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>
1102
- {/if}
1103
- </div>
1104
- {/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
- />
1117
- </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
- />
1129
- </div>
1130
- {/if}
1131
- {/if}
1132
- </div>
1133
-
1134
- <div class="cd-transfer__ops">
1135
- <Button
1136
- type="primary"
1137
- size="small"
1138
- ariaLabel={loc().t('Transfer.moveToRight')}
1139
- disabled={moveRightDisabled}
1140
- onclick={moveToRight}
1141
- >
1142
- &gt;
1143
- </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
- </div>
1197
- </div>
1198
-
1199
- <style>
1200
- .cd-transfer {
1201
- display: inline-flex;
1202
- align-items: stretch;
1203
- gap: var(--cd-transfer-gap);
1204
- color: var(--cd-color-text-0);
1205
- }
1206
- .cd-transfer--disabled {
1207
- opacity: 0.6;
1208
- }
1209
- .cd-transfer__panel {
1210
- display: flex;
1211
- 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;
1217
- }
1218
- .cd-transfer__panel-header {
1219
- display: flex;
1220
- align-items: center;
1221
- justify-content: space-between;
1222
- padding-block: var(--cd-spacing-2);
1223
- padding-inline: var(--cd-spacing-3);
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);
1227
- }
1228
- .cd-transfer__panel-count {
1229
- color: var(--cd-color-text-2);
1230
- font-size: var(--cd-font-size-1);
1231
- font-weight: var(--cd-font-weight-regular);
1232
- }
1233
- .cd-transfer__panel-search {
1234
- padding: var(--cd-spacing-2);
1235
- border-block-end: 1px solid var(--cd-transfer-panel-border);
1236
- }
1237
- .cd-transfer__list {
1238
- position: relative;
1239
- flex: 1 1 auto;
1240
- margin: 0;
1241
- padding: 0;
1242
- list-style: none;
1243
- overflow-y: auto;
1244
- }
1245
- /* 虚拟化占位:撑出总高度,可见项绝对定位浮于其上。 */
1246
- .cd-transfer__spacer {
1247
- pointer-events: none;
1248
- }
1249
- .cd-transfer__item {
1250
- display: flex;
1251
- align-items: center;
1252
- justify-content: space-between;
1253
- gap: var(--cd-spacing-2);
1254
- min-block-size: var(--cd-transfer-item-height);
1255
- padding-inline: var(--cd-spacing-3);
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'] {
1275
- cursor: pointer;
1276
- outline: none;
1277
- }
1278
- .cd-transfer__item[role='option']:focus-visible {
1279
- box-shadow: inset 0 0 0 2px var(--cd-color-primary);
1280
- }
1281
- .cd-transfer__item[aria-selected='true'] {
1282
- background: var(--cd-transfer-item-bg-checked, var(--cd-color-primary-light-default));
1283
- }
1284
- .cd-transfer__item[aria-disabled='true'] {
1285
- color: var(--cd-transfer-item-disabled-text, var(--cd-color-text-2));
1286
- cursor: not-allowed;
1287
- }
1288
- .cd-transfer__option-control {
1289
- display: inline-flex;
1290
- align-items: center;
1291
- gap: var(--cd-spacing-2);
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-2);
1322
- padding-block: var(--cd-spacing-3);
1323
- color: var(--cd-color-text-3);
1324
- font-size: var(--cd-font-size-1);
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-radius-full);
1332
- animation: cd-transfer-spin 0.7s linear infinite;
1333
- }
1334
- @keyframes cd-transfer-spin {
1335
- to {
1336
- transform: rotate(360deg);
1337
- }
1338
- }
1339
- @media (prefers-reduced-motion: reduce) {
1340
- .cd-transfer__spinner {
1341
- animation: none;
1342
- }
1343
- }
1344
- .cd-transfer__item-label {
1345
- flex: 1 1 auto;
1346
- overflow: hidden;
1347
- text-overflow: ellipsis;
1348
- white-space: nowrap;
1349
- }
1350
- .cd-transfer__remove {
1351
- display: inline-flex;
1352
- align-items: center;
1353
- justify-content: center;
1354
- flex: none;
1355
- inline-size: 18px;
1356
- block-size: 18px;
1357
- padding: 0;
1358
- border: none;
1359
- border-radius: var(--cd-radius-1, 4px);
1360
- background: transparent;
1361
- color: var(--cd-color-text-2);
1362
- cursor: pointer;
1363
- }
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;
1371
- }
1372
- .cd-transfer__remove:focus-visible {
1373
- outline: none;
1374
- box-shadow: var(--cd-focus-ring);
1375
- }
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-3);
1381
- }
1382
- .cd-transfer__tree-node:hover {
1383
- background: var(--cd-transfer-item-bg-hover);
1384
- }
1385
- .cd-transfer__switcher {
1386
- display: inline-flex;
1387
- 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;
1395
- color: var(--cd-color-text-2);
1396
- cursor: pointer;
1397
- transition: transform 0.15s ease;
1398
- }
1399
- .cd-transfer__switcher--open {
1400
- transform: rotate(90deg);
1401
- }
1402
- .cd-transfer__switcher--leaf {
1403
- cursor: default;
1404
- }
1405
- .cd-transfer__switcher:focus-visible {
1406
- outline: none;
1407
- box-shadow: var(--cd-focus-ring);
1408
- }
1409
- .cd-transfer__group {
1410
- display: block;
1411
- }
1412
- .cd-transfer__group-header {
1413
- display: flex;
1414
- align-items: center;
1415
- justify-content: space-between;
1416
- min-block-size: var(--cd-transfer-item-height);
1417
- padding-inline: var(--cd-spacing-3);
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);
1423
- font-size: var(--cd-font-size-1);
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
- }
1431
- .cd-transfer__empty {
1432
- display: flex;
1433
- align-items: center;
1434
- justify-content: center;
1435
- padding-block: var(--cd-spacing-4);
1436
- color: var(--cd-color-text-3);
1437
- font-size: var(--cd-font-size-1);
1438
- }
1439
- .cd-transfer__ops {
1440
- display: flex;
1441
- flex-direction: column;
1442
- justify-content: center;
1443
- gap: var(--cd-spacing-2);
1444
- }
1445
- .cd-transfer__pagination {
1446
- display: flex;
1447
- justify-content: center;
1448
- padding-block: var(--cd-spacing-2);
1449
- border-block-start: 1px solid var(--cd-transfer-panel-border);
1450
- }
1451
- </style>