@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,1500 +0,0 @@
1
- <!--
2
- Tree — see specs/components/show/Tree.spec.md
3
- 层级展示:展开/收起、单选/多选、可勾选父子联动(含半选 mixed)、内置搜索高亮。
4
- 受控 value/checkedKeys/expandedKeys 不回写,仅 onChange/onCheck/onExpandedChange 通知。
5
- 键盘遵循 WAI-ARIA APG Tree View(单一 tab stop + aria-activedescendant)。
6
- 复用 @chenzy-design/core 的纯函数树算法,不重复实现。
7
- loadData:展开未加载的非叶子节点时异步取子节点,结果缓存进本地 SvelteMap
8
- 并派生合并树喂给所有 core 函数(不写回受控 treeData,红线 #1)。
9
- showLine:层级引导线(复用 core FlatNode.isLast/ancestorIsLast,纯 CSS ├/└/竖线)。
10
- virtualized:大数据树虚拟滚动。直接用 core fixedRange 纯函数自建轻量 fixed 定高虚拟化
11
- (非复用 VirtualList 组件——其 role=list/listitem 包裹层会破坏 role=tree→treeitem 的 ARIA
12
- 结构),保持 role=tree 容器 + 行 role=treeitem 语义不变;只渲染视口内切片。滚动监听命令式
13
- + rAF 节流 + cleanup(红线 #3),可见区间 $derived 纯派生(红线 #2)。键盘移动 activeKey 时
14
- scrollToIndex 滚到可见。a11y 取舍:aria-activedescendant 指向的行可能因虚拟化未渲染,故键盘
15
- 移动后命令式滚动确保目标行进入视口并被渲染,保证键盘可用。
16
- fieldNames:自定义节点字段名(key/label/children)映射任意后端数据;派生只读标准化(红线 #1/#2),
17
- 默认字段名时零开销直接用原 treeData,回调回传原始节点(__orig)。
18
- accordion:手风琴模式,同层级最多展开一个——展开某节点时用 core 的 accordionExpand 纯函数
19
- 计算并收起其同父级 siblings(不同层级互不影响)。受控时只 onExpandedChange 回传新集不回写(红线 #1)。
20
- -->
21
- <script lang="ts">
22
- import type { Snippet } from 'svelte';
23
- import {
24
- useId,
25
- flattenVisible,
26
- collectExpandable,
27
- collectExpandableToDepth,
28
- conduct,
29
- toggleCheck,
30
- computeFilteredKeys,
31
- fixedRange,
32
- scrollOffsetForIndex,
33
- computeDropPosition,
34
- isAncestorOrSelf,
35
- accordionExpand,
36
- type TreeKey,
37
- type TreeNodeData,
38
- type FlatNode,
39
- type DropPosition,
40
- } from '@chenzy-design/core';
41
- import { SvelteMap, SvelteSet } from 'svelte/reactivity';
42
- import { useLocale } from '../locale-provider/index.js';
43
-
44
- type Size = 'small' | 'default' | 'large';
45
- type Status = 'default' | 'warning' | 'error';
46
-
47
- type ChangeInfo = { value: TreeKey | TreeKey[]; node: TreeNodeData; selected: boolean };
48
- type CheckInfo = { checked: TreeKey[]; node: TreeNodeData; halfChecked: TreeKey[] };
49
- type ExpandInfo = { expanded: TreeKey[]; node: TreeNodeData; expand: boolean };
50
- type DropInfo = {
51
- dragNode: TreeNodeData;
52
- dropNode: TreeNodeData;
53
- dropPosition: DropPosition;
54
- };
55
-
56
- /** 自定义节点字段名映射(适配任意后端数据结构)。默认 key/label/children。 */
57
- type FieldNames = { key?: string; label?: string; children?: string };
58
-
59
- /** 标准节点附带原始节点引用,用于回调时回传用户原始数据。 */
60
- type NormalizedNode = TreeNodeData & { __orig: Record<string, unknown> };
61
-
62
- interface Props {
63
- /**
64
- * 树数据源。默认节点字段为 key/label/children;
65
- * 用 fieldNames 自定义字段名时可传任意后端结构(如 { id, name, sub })。
66
- */
67
- treeData?: TreeNodeData[];
68
- /** 自定义节点字段名映射,如 { key:'id', label:'name', children:'sub' }。默认全部为标准名。 */
69
- fieldNames?: FieldNames;
70
- value?: TreeKey | TreeKey[] | null;
71
- defaultValue?: TreeKey | TreeKey[] | null;
72
- multiple?: boolean;
73
- checkable?: boolean;
74
- checkedKeys?: TreeKey[];
75
- defaultCheckedKeys?: TreeKey[];
76
- /**
77
- * 父子勾选是否联动。'related'(默认):勾选父全选子、子全选则父选中、部分选中半选;
78
- * 'unRelated':父子勾选互不影响,每个节点独立勾选、无半选态。
79
- * 与 checkStrictly 的关系:两者都旁路 conduct 联动算法,效果上 unRelated ≡ checkStrictly 的
80
- * 「父子状态独立」。checkRelation 是枚举(对齐 Semi 语义),checkStrictly 是 boolean;
81
- * 任一开启(unRelated 或 checkStrictly=true)即关闭父子联动。默认 related + checkStrictly=false 保持联动。
82
- */
83
- checkRelation?: 'related' | 'unRelated';
84
- checkStrictly?: boolean;
85
- expandedKeys?: TreeKey[];
86
- defaultExpandedKeys?: TreeKey[];
87
- defaultExpandAll?: boolean;
88
- /**
89
- * 默认展开到第 N 层(仅初始化非受控展开集时生效,1 表示展开根层使其子节点可见)。
90
- * 优先级低于 defaultExpandAll;与 defaultExpandedKeys 取并集。受控 expandedKeys 时忽略(红线 #1)。
91
- */
92
- expandedDepth?: number;
93
- /**
94
- * 受控展开时自动展开父节点:expandedKeys 更新时若 autoExpandParent=true,
95
- * 自动把所有展开节点的祖先链也加入展开集(派生,不写回受控 expandedKeys,红线 #1)。
96
- * 默认 true,与 Semi Design 行为一致。
97
- */
98
- autoExpandParent?: boolean;
99
- /**
100
- * 手风琴模式:同一层级最多展开一个节点。展开某节点时自动收起其同父级(siblings)
101
- * 的其它已展开节点;不同层级互不影响。受控 expandedKeys 同样生效(通过 onExpandedChange
102
- * 回传收起 siblings 后的新展开集,不自行回写——红线 #1)。默认 false(展开行为不变)。
103
- */
104
- accordion?: boolean;
105
- selectable?: boolean;
106
- showIcon?: boolean;
107
- /** 显示层级连接线(父子引导线) */
108
- showLine?: boolean;
109
- /** 虚拟滚动:仅渲染视口内的可见节点行,适合大数据树(1000+ 节点)。默认 false(行为不变) */
110
- virtualized?: boolean;
111
- /** 虚拟滚动视口高度(px)。virtualized 时生效,默认 320 */
112
- height?: number;
113
- /** 虚拟滚动行高(px)。virtualized 时生效,默认取 token 行高 32 */
114
- itemHeight?: number;
115
- filterable?: boolean;
116
- /**
117
- * 自定义搜索过滤谓词。`(input, node) => boolean` 返回该节点是否命中关键词;
118
- * 命中节点的祖先链自动展开(沿用内置过滤行为)。传函数即开启搜索(无需再传 filterable);
119
- * 不传时回退到内置「label 包含关键词(不区分大小写)」。boolean 形态等价于 filterable 开关。
120
- */
121
- filterTreeNode?: boolean | ((input: string, node: TreeNodeData) => boolean);
122
- /**
123
- * 受控搜索关键词。传入时走受控模式:搜索框 value 绑定到此 prop,
124
- * 输入变化仅触发 onSearch 回调,不更新内部 state。不传则保留内部非受控 state。
125
- */
126
- searchValue?: string;
127
- /**
128
- * 搜索关键词变化回调。参数 (value, filteredKeys):
129
- * - value:当前搜索词;
130
- * - filteredKeys:所有命中节点(matched)的 key 列表,供受控外层决定渲染。
131
- */
132
- onSearch?: (value: string, filteredKeys: string[]) => void;
133
- blockNode?: boolean;
134
- disabled?: boolean;
135
- size?: Size;
136
- status?: Status;
137
- emptyContent?: string;
138
- ariaLabel?: string;
139
- /** 异步加载子节点:展开未加载的非叶子节点时调用,返回该节点的子节点数组 */
140
- loadData?: (node: TreeNodeData) => Promise<TreeNodeData[]>;
141
- /** 异步加载完成回调 */
142
- onLoad?: (loadedKeys: string[], info: { event: 'load'; node: TreeNodeData }) => void;
143
- /** 启用 HTML5 拖拽排序:节点可拖动改变层级/顺序。默认 false(行为不变) */
144
- draggable?: boolean;
145
- /** 放下时回调(受控数据,组件不内部改 treeData,由父组件按 info 重排)。 */
146
- onDrop?: (info: DropInfo) => void;
147
- /** 节点右键菜单回调 */
148
- onRightClick?: (e: MouseEvent, node: TreeNodeData) => void;
149
- /** 开始拖拽节点 */
150
- onDragStart?: (node: TreeNodeData) => void;
151
- /** 拖拽进入候选目标节点 */
152
- onDragEnter?: (info: { dragNode: TreeNodeData; dropNode: TreeNodeData }) => void;
153
- onChange?: (info: ChangeInfo) => void;
154
- onCheck?: (info: CheckInfo) => void;
155
- onExpandedChange?: (info: ExpandInfo) => void;
156
- label?: Snippet<
157
- [{ node: TreeNodeData; level: number; searchValue: string; selected: boolean; checked: boolean }]
158
- >;
159
- /** 自定义节点图标(showIcon 为真时渲染在 label 前);参数含节点、展开态与是否叶子 */
160
- icon?: Snippet<[{ node: TreeNodeData; expanded: boolean; isLeaf: boolean }]>;
161
- /** 自定义展开/收起箭头;参数含节点、展开态与加载态 */
162
- switcher?: Snippet<[{ node: TreeNodeData; expanded: boolean; loading: boolean }]>;
163
- /** 节点尾部操作区(渲染在 label 右侧) */
164
- suffix?: Snippet<[{ node: TreeNodeData }]>;
165
- /** 自定义拖拽幽灵节点 */
166
- dragGhost?: Snippet<[{ node: TreeNodeData }]>;
167
- }
168
-
169
- let {
170
- treeData = [],
171
- fieldNames,
172
- value,
173
- defaultValue = null,
174
- multiple = false,
175
- checkable = false,
176
- checkedKeys,
177
- defaultCheckedKeys = [],
178
- checkRelation = 'related',
179
- checkStrictly = false,
180
- expandedKeys,
181
- defaultExpandedKeys = [],
182
- defaultExpandAll = false,
183
- expandedDepth,
184
- autoExpandParent = true,
185
- accordion = false,
186
- selectable = true,
187
- showIcon = true,
188
- showLine = false,
189
- virtualized = false,
190
- height = 320,
191
- itemHeight = 32,
192
- filterable = false,
193
- filterTreeNode,
194
- searchValue: searchValueProp,
195
- onSearch,
196
- blockNode = false,
197
- disabled = false,
198
- size = 'default',
199
- status = 'default',
200
- emptyContent,
201
- ariaLabel,
202
- loadData,
203
- onLoad,
204
- draggable = false,
205
- onDrop,
206
- onRightClick,
207
- onDragStart,
208
- onDragEnter,
209
- onChange,
210
- onCheck,
211
- onExpandedChange,
212
- label,
213
- icon,
214
- switcher,
215
- suffix,
216
- dragGhost,
217
- }: Props = $props();
218
-
219
- const loc = useLocale();
220
-
221
- const baseId = useId('cd-tree-item');
222
-
223
- function itemId(key: TreeKey): string {
224
- return `${baseId}-${String(key)}`;
225
- }
226
-
227
- // --- fieldNames 字段映射:把用户自定义字段名的数据派生为标准 {key,label,children} 结构 ---
228
- // 默认(全标准名)时直接返回原 treeData 引用,零额外开销(红线 #3);映射为纯 $derived(红线 #2),
229
- // 不写回 treeData(红线 #1)。每个标准节点附带 __orig 指向用户原始节点,回调时回传原始数据。
230
- const keyField = $derived(fieldNames?.key ?? 'key');
231
- const labelField = $derived(fieldNames?.label ?? 'label');
232
- const childrenField = $derived(fieldNames?.children ?? 'children');
233
- const fieldNamesDefault = $derived(
234
- keyField === 'key' && labelField === 'label' && childrenField === 'children',
235
- );
236
-
237
- function normalizeNodes(nodes: TreeNodeData[]): NormalizedNode[] {
238
- const kf = keyField;
239
- const lf = labelField;
240
- const cf = childrenField;
241
- return nodes.map((raw) => {
242
- const r = raw as unknown as Record<string, unknown>;
243
- const kids = r[cf] as TreeNodeData[] | undefined;
244
- const out: NormalizedNode = {
245
- ...(raw as TreeNodeData),
246
- key: r[kf] as TreeKey,
247
- label: r[lf] as string,
248
- __orig: r,
249
- };
250
- if (kids) out.children = normalizeNodes(kids);
251
- else delete out.children;
252
- return out;
253
- });
254
- }
255
-
256
- // 标准化后的树:默认时即 treeData 原引用(零开销),否则递归映射字段名。
257
- const normalizedData = $derived<TreeNodeData[]>(
258
- fieldNamesDefault ? treeData : normalizeNodes(treeData),
259
- );
260
-
261
- /** 回调回传:自定义 fieldNames 时回原始节点,否则回标准节点本身。 */
262
- function toOrig(node: TreeNodeData): TreeNodeData {
263
- const orig = (node as Partial<NormalizedNode>).__orig;
264
- return (orig as TreeNodeData | undefined) ?? node;
265
- }
266
-
267
- // --- 异步加载:本地缓存子节点 + loading/loaded 标记(不写回受控 treeData,红线 #1)---
268
- const loadedChildren = new SvelteMap<TreeKey, TreeNodeData[]>();
269
- const loadingKeys = new SvelteSet<TreeKey>();
270
- const loadedKeys = new SvelteSet<TreeKey>();
271
-
272
- // 合并树:把已加载的子节点注入对应节点,喂给所有 core 纯函数。
273
- // 无加载时返回原 treeData 引用,零开销。
274
- const mergedData = $derived.by<TreeNodeData[]>(() => {
275
- if (loadedChildren.size === 0) return normalizedData;
276
- const inject = (nodes: TreeNodeData[]): TreeNodeData[] =>
277
- nodes.map((n) => {
278
- const loaded = loadedChildren.get(n.key);
279
- const kids = n.children ?? loaded;
280
- if (!kids) return n;
281
- return { ...n, children: inject(kids) };
282
- });
283
- return inject(normalizedData);
284
- });
285
-
286
- // 行是否可展开:原本有子 → 是;否则有 loadData、非叶子、尚未加载(或加载出非空)→ 是。
287
- function isExpandable(node: TreeNodeData, flatHasChildren: boolean): boolean {
288
- if (flatHasChildren) return true;
289
- if (!loadData || node.isLeaf === true) return false;
290
- // 已加载且为空 → 不可展开;未加载 → 显示箭头(异步占位)
291
- if (loadedKeys.has(node.key)) return (loadedChildren.get(node.key)?.length ?? 0) > 0;
292
- return true;
293
- }
294
-
295
- async function loadChildren(node: TreeNodeData) {
296
- if (!loadData || loadingKeys.has(node.key) || loadedKeys.has(node.key)) return;
297
- loadingKeys.add(node.key);
298
- try {
299
- // loadData 收到用户原始节点(自定义字段名形态),返回结果按 fieldNames 标准化后缓存。
300
- const kids = await loadData(toOrig(node));
301
- loadedChildren.set(node.key, fieldNamesDefault ? kids : normalizeNodes(kids));
302
- } finally {
303
- loadingKeys.delete(node.key);
304
- loadedKeys.add(node.key);
305
- onLoad?.([...loadedKeys].map(String), { event: 'load', node: toOrig(node) });
306
- }
307
- }
308
-
309
- // --- selection: 受控 value 不回写 (红线 #1) ---
310
- function initValue(): TreeKey | TreeKey[] | null {
311
- if (multiple) return Array.isArray(defaultValue) ? [...defaultValue] : [];
312
- return Array.isArray(defaultValue) ? (defaultValue[0] ?? null) : defaultValue;
313
- }
314
- const isValueControlled = $derived(value !== undefined);
315
- let innerValue = $state<TreeKey | TreeKey[] | null>(initValue());
316
- const currentValue = $derived(isValueControlled ? (value ?? null) : innerValue);
317
- const selectedSet = $derived.by(() => {
318
- const set = new Set<TreeKey>();
319
- if (Array.isArray(currentValue)) for (const k of currentValue) set.add(k);
320
- else if (currentValue !== null) set.add(currentValue);
321
- return set;
322
- });
323
-
324
- // --- check: 受控 checkedKeys 不回写 (红线 #1)。base 为叶子级显式勾选 ---
325
- function initCheckedBase(): Set<TreeKey> {
326
- return new Set(defaultCheckedKeys);
327
- }
328
- const isCheckControlled = $derived(checkedKeys !== undefined);
329
- let innerCheckedBase = $state<Set<TreeKey>>(initCheckedBase());
330
- const currentCheckedBase = $derived(
331
- isCheckControlled ? new Set(checkedKeys ?? []) : innerCheckedBase,
332
- );
333
- // 父子是否联动:checkStrictly 或 checkRelation==='unRelated' 任一开启即解耦(无联动、无半选)。
334
- const checkLinked = $derived(!checkStrictly && checkRelation !== 'unRelated');
335
- // 解耦时直接用 base 当 checked,无半选;联动时用 conduct 归一
336
- const checkState = $derived.by(() => {
337
- if (!checkLinked) {
338
- return { checked: new Set(currentCheckedBase), half: new Set<TreeKey>() };
339
- }
340
- return conduct(mergedData, currentCheckedBase);
341
- });
342
-
343
- // --- expand: 受控 expandedKeys 不回写 (红线 #1) ---
344
- function initExpanded(): Set<TreeKey> {
345
- // 需用标准化后的 key(fieldNames 自定义时 collectExpandable* 才能识别 children)。
346
- const base = fieldNamesDefault ? treeData : normalizeNodes(treeData);
347
- if (defaultExpandAll) {
348
- return new Set(collectExpandable(base));
349
- }
350
- // expandedDepth:展开 ≤N 层的有子节点(与 defaultExpandedKeys 取并集)。优先级低于 defaultExpandAll。
351
- const init = new Set<TreeKey>(defaultExpandedKeys);
352
- if (typeof expandedDepth === 'number' && expandedDepth > 0) {
353
- for (const k of collectExpandableToDepth(base, expandedDepth)) init.add(k);
354
- }
355
- return init;
356
- }
357
- const isExpandControlled = $derived(expandedKeys !== undefined);
358
- let innerExpanded = $state<Set<TreeKey>>(initExpanded());
359
- const baseExpandedSet = $derived(
360
- isExpandControlled ? new Set(expandedKeys ?? []) : innerExpanded,
361
- );
362
- // autoExpandParent:展开节点的所有祖先也纳入展开集(派生,不写回,红线 #1)。
363
- // 实现:对 baseExpandedSet 中每个 key,递归向上收集祖先 key(深度优先搜索)。
364
- function collectAncestors(data: TreeNodeData[], targetKey: TreeKey, acc: Set<TreeKey>): boolean {
365
- for (const node of data) {
366
- if (node.key === targetKey) return true;
367
- if (node.children && collectAncestors(node.children, targetKey, acc)) {
368
- acc.add(node.key);
369
- return true;
370
- }
371
- }
372
- return false;
373
- }
374
- const currentExpandedSet = $derived.by(() => {
375
- if (!autoExpandParent || baseExpandedSet.size === 0) return baseExpandedSet;
376
- const withAncestors = new Set(baseExpandedSet);
377
- for (const key of baseExpandedSet) {
378
- collectAncestors(mergedData, key, withAncestors);
379
- }
380
- return withAncestors;
381
- });
382
-
383
- // --- 搜索:支持受控(searchValueProp)和非受控(内部 state)两种模式 ---
384
- // 受控:searchValueProp 传入时直接用,input 事件仅触发 onSearch 回调,不更新内部 state(红线 #1)。
385
- // 非受控:用内部 state,input 事件更新 innerSearchValue 并触发 onSearch。
386
- const isSearchControlled = $derived(searchValueProp !== undefined);
387
- let innerSearchValue = $state('');
388
- const searchValue = $derived(isSearchControlled ? (searchValueProp ?? '') : innerSearchValue);
389
- const trimmedSearch = $derived(searchValue.trim());
390
- // 搜索框是否渲染/启用:filterable 或 filterTreeNode(true 或自定义谓词函数)任一开启。
391
- const searchEnabled = $derived(filterable || filterTreeNode === true || typeof filterTreeNode === 'function');
392
- const searchActive = $derived(searchEnabled && trimmedSearch.length > 0);
393
- // 过滤谓词:传函数则用自定义 (input, node);否则内置 label 包含(不区分大小写)。
394
- const matchPredicate = $derived.by(() => {
395
- if (typeof filterTreeNode === 'function') {
396
- const fn = filterTreeNode;
397
- // 回传原始节点(fieldNames 自定义时),与其它回调一致。
398
- return (node: TreeNodeData) => fn(trimmedSearch, toOrig(node));
399
- }
400
- const lower = trimmedSearch.toLowerCase();
401
- return (node: TreeNodeData) => node.label.toLowerCase().includes(lower);
402
- });
403
- const filterResult = $derived.by(() => {
404
- if (!searchActive) return { matched: new Set<TreeKey>(), expand: new Set<TreeKey>() };
405
- return computeFilteredKeys(mergedData, matchPredicate);
406
- });
407
-
408
- // 搜索输入处理:受控时只触发 onSearch,非受控时同时更新 innerSearchValue。
409
- function handleSearchInput(e: Event) {
410
- const val = (e.target as HTMLInputElement).value;
411
- if (!isSearchControlled) innerSearchValue = val;
412
- // 计算 filteredKeys 并回调(基于当前 filterResult,但此时 val 可能还未更新到 derived)。
413
- // 为使 filteredKeys 与新 val 同步,临时基于新 val 计算一次。
414
- if (onSearch) {
415
- const trimmed = val.trim();
416
- let fKeys: string[] = [];
417
- if (trimmed.length > 0 && searchEnabled) {
418
- let pred: (node: TreeNodeData) => boolean;
419
- if (typeof filterTreeNode === 'function') {
420
- const fn = filterTreeNode;
421
- pred = (node: TreeNodeData) => fn(trimmed, toOrig(node));
422
- } else {
423
- const lower = trimmed.toLowerCase();
424
- pred = (node: TreeNodeData) => node.label.toLowerCase().includes(lower);
425
- }
426
- const result = computeFilteredKeys(mergedData, pred);
427
- fKeys = [...result.matched].map(String);
428
- }
429
- onSearch(val, fKeys);
430
- }
431
- }
432
-
433
- // 搜索激活时把过滤展开集并入可见展开集(派生,不写回)
434
- const effectiveExpanded = $derived.by(() => {
435
- if (!searchActive) return currentExpandedSet;
436
- const merged = new Set(currentExpandedSet);
437
- for (const k of filterResult.expand) merged.add(k);
438
- return merged;
439
- });
440
-
441
- // --- 可见扁平节点 ---
442
- const flat = $derived(flattenVisible(mergedData, effectiveExpanded));
443
- // 搜索时仅保留命中或其祖先链上的节点(expand 集即祖先链 + 自身有命中后代者)
444
- const visibleFlat = $derived.by(() => {
445
- if (!searchActive) return flat;
446
- return flat.filter(
447
- (f) => filterResult.matched.has(f.node.key) || filterResult.expand.has(f.node.key),
448
- );
449
- });
450
-
451
- const isEmpty = $derived(visibleFlat.length === 0);
452
- const emptyText = $derived(emptyContent ?? loc().t('Tree.emptyText'));
453
-
454
- // --- roving 焦点:activeKey + 派生高亮,render 不读挂载 registry (红线 #2) ---
455
- let activeKey = $state<TreeKey | null>(null);
456
- const activeDescId = $derived.by(() => {
457
- if (activeKey === null) return undefined;
458
- const exists = visibleFlat.some((f) => f.node.key === activeKey);
459
- return exists ? itemId(activeKey) : undefined;
460
- });
461
-
462
- // --- 虚拟滚动:复用 core 纯函数 fixedRange 自建轻量 fixed 定高虚拟化 ---
463
- // 选型说明:库内 VirtualList 组件会注入 role=list / role=listitem 包裹层,
464
- // 破坏 role=tree → role=treeitem 的 ARIA 结构(treeitem 不能是 listitem 的子),
465
- // 故直接用 core 的 fixedRange 纯函数在 Tree 内自建:滚动监听命令式 + cleanup(红线 #3),
466
- // 可见区间用 $derived 纯派生(红线 #2),保持 role=tree 容器 + 行 role=treeitem 语义不变。
467
- const VIRTUAL_OVERSCAN = 4;
468
- // viewport 元素普通引用(bind:this),不参与响应式几何读取。
469
- let viewportEl = $state<HTMLDivElement | null>(null);
470
- // 仅由命令式 scroll 回调写入的本地 scrollTop,render 期只读。
471
- let scrollTop = $state(0);
472
- // rAF 节流句柄(非响应式)。
473
- let rafId = 0;
474
-
475
- const rowHeight = $derived(itemHeight > 0 ? itemHeight : 32);
476
- const totalHeight = $derived(visibleFlat.length * rowHeight);
477
- // 可视区间:纯 $derived,仅依赖本地 $state,render-safe(不读 DOM)(红线 #2)。
478
- const vRange = $derived(
479
- virtualized
480
- ? fixedRange(scrollTop, height, rowHeight, visibleFlat.length, VIRTUAL_OVERSCAN)
481
- : { startIndex: 0, endIndex: visibleFlat.length },
482
- );
483
- // 实际喂给 #each 的行集合:virtualized 时只取视口内切片,否则全量。
484
- const renderFlat = $derived(
485
- virtualized ? visibleFlat.slice(vRange.startIndex, vRange.endIndex) : visibleFlat,
486
- );
487
-
488
- // 滚动监听(命令式 + rAF 节流 + cleanup)(红线 #3)。
489
- $effect(() => {
490
- const el = viewportEl;
491
- if (!el || !virtualized) return;
492
- function onScroll() {
493
- if (rafId) return;
494
- rafId = requestAnimationFrame(() => {
495
- rafId = 0;
496
- if (el) scrollTop = el.scrollTop;
497
- });
498
- }
499
- el.addEventListener('scroll', onScroll, { passive: true });
500
- return () => {
501
- el.removeEventListener('scroll', onScroll);
502
- if (rafId) {
503
- cancelAnimationFrame(rafId);
504
- rafId = 0;
505
- }
506
- };
507
- });
508
-
509
- // 命令式滚到指定行索引使其落入视口(键盘移动 activeKey 时调用)。
510
- function scrollIndexIntoView(index: number) {
511
- const el = viewportEl;
512
- if (!el || !virtualized || index < 0) return;
513
- const itemStart = index * rowHeight;
514
- const top = el.scrollTop;
515
- const bottom = top + el.clientHeight;
516
- // 已完整可见则不滚动,避免抖动。
517
- if (itemStart >= top && itemStart + rowHeight <= bottom) return;
518
- // 目标在视口上方对齐顶,下方对齐底。
519
- const align = itemStart < top ? 'start' : 'end';
520
- const target = scrollOffsetForIndex(itemStart, rowHeight, el.clientHeight, totalHeight, align);
521
- el.scrollTop = target;
522
- scrollTop = target;
523
- }
524
-
525
- function scrollActiveIntoView() {
526
- if (!virtualized || activeKey === null) return;
527
- const i = visibleFlat.findIndex((f) => f.node.key === activeKey);
528
- scrollIndexIntoView(i);
529
- }
530
-
531
- function isNodeDisabled(node: TreeNodeData): boolean {
532
- return disabled || !!node.disabled;
533
- }
534
-
535
- function isSelectable(node: TreeNodeData): boolean {
536
- return selectable && node.selectable !== false && !isNodeDisabled(node);
537
- }
538
-
539
- function isCheckableNode(node: TreeNodeData): boolean {
540
- return checkable && node.checkable !== false && !isNodeDisabled(node);
541
- }
542
-
543
- function isExpanded(key: TreeKey): boolean {
544
- return effectiveExpanded.has(key);
545
- }
546
-
547
- // --- 状态写入:仅非受控写 inner,受控只回调 (红线 #1) ---
548
- function emitSelect(node: TreeNodeData) {
549
- if (!isSelectable(node)) return;
550
- let next: TreeKey | TreeKey[];
551
- let selected: boolean;
552
- if (multiple) {
553
- const arr = Array.isArray(currentValue) ? [...currentValue] : [];
554
- const idx = arr.indexOf(node.key);
555
- if (idx >= 0) {
556
- arr.splice(idx, 1);
557
- selected = false;
558
- } else {
559
- arr.push(node.key);
560
- selected = true;
561
- }
562
- next = arr;
563
- } else {
564
- // 单选:点击直接选中该节点(不取消),selected 恒为 true
565
- next = node.key;
566
- selected = true;
567
- }
568
- if (!isValueControlled) innerValue = next;
569
- onChange?.({ value: next, node: toOrig(node), selected });
570
- }
571
-
572
- function emitCheck(node: TreeNodeData) {
573
- if (!isCheckableNode(node)) return;
574
- let nextBase: Set<TreeKey>;
575
- if (!checkLinked) {
576
- // 解耦(checkStrictly 或 unRelated):仅翻转该节点自身,不触达父子。
577
- nextBase = new Set(currentCheckedBase);
578
- if (nextBase.has(node.key)) nextBase.delete(node.key);
579
- else nextBase.add(node.key);
580
- } else {
581
- nextBase = toggleCheck(mergedData, currentCheckedBase, node.key);
582
- }
583
- if (!isCheckControlled) innerCheckedBase = nextBase;
584
- const resolved = !checkLinked
585
- ? { checked: new Set(nextBase), half: new Set<TreeKey>() }
586
- : conduct(mergedData, nextBase);
587
- onCheck?.({
588
- checked: [...resolved.checked],
589
- node: toOrig(node),
590
- halfChecked: [...resolved.half],
591
- });
592
- }
593
-
594
- function emitExpand(node: TreeNodeData, expand: boolean) {
595
- // accordion:展开时同层级只保留一个,自动收起同父级其它已展开节点(纯函数 core,红线 #2)。
596
- // 不同层级互不影响;收起仅移除自身。受控时也只回调收起 siblings 后的新集,不回写(红线 #1)。
597
- let next: Set<TreeKey>;
598
- if (expand) {
599
- next = accordion
600
- ? accordionExpand(mergedData, currentExpandedSet, node.key)
601
- : new Set(currentExpandedSet).add(node.key);
602
- } else {
603
- next = new Set(currentExpandedSet);
604
- next.delete(node.key);
605
- }
606
- if (!isExpandControlled) innerExpanded = next;
607
- onExpandedChange?.({ expanded: [...next], node: toOrig(node), expand });
608
- }
609
-
610
- function toggleExpand(node: TreeNodeData) {
611
- const hasOwnKids = (node.children?.length ?? 0) > 0;
612
- if (!isExpandable(node, hasOwnKids)) return;
613
- const willExpand = !isExpanded(node.key);
614
- // 展开未加载的异步节点:先取数据再展开(数据到位后合并树派生即显示子节点)
615
- if (willExpand && !hasOwnKids && loadData && !loadedKeys.has(node.key)) {
616
- void loadChildren(node);
617
- }
618
- emitExpand(node, willExpand);
619
- }
620
-
621
- function onRowClick(node: TreeNodeData) {
622
- if (isNodeDisabled(node)) return;
623
- activeKey = node.key;
624
- if (isSelectable(node)) emitSelect(node);
625
- else if (isExpandable(node, (node.children?.length ?? 0) > 0)) toggleExpand(node);
626
- }
627
-
628
- // --- 键盘导航 (红线 #2: 全部基于派生 visibleFlat 与 activeKey) ---
629
- function activeIndex(): number {
630
- if (activeKey === null) return -1;
631
- return visibleFlat.findIndex((f) => f.node.key === activeKey);
632
- }
633
-
634
- function moveNext() {
635
- const cur = activeIndex();
636
- let i = cur < 0 ? 0 : cur + 1;
637
- while (i < visibleFlat.length && isNodeDisabled((visibleFlat[i] as FlatNode).node)) i++;
638
- if (i < visibleFlat.length) activeKey = (visibleFlat[i] as FlatNode).node.key;
639
- }
640
-
641
- function movePrev() {
642
- const cur = activeIndex();
643
- let i = cur < 0 ? visibleFlat.length - 1 : cur - 1;
644
- while (i >= 0 && isNodeDisabled((visibleFlat[i] as FlatNode).node)) i--;
645
- if (i >= 0) activeKey = (visibleFlat[i] as FlatNode).node.key;
646
- }
647
-
648
- function moveFirst() {
649
- let i = 0;
650
- while (i < visibleFlat.length && isNodeDisabled((visibleFlat[i] as FlatNode).node)) i++;
651
- if (i < visibleFlat.length) activeKey = (visibleFlat[i] as FlatNode).node.key;
652
- }
653
-
654
- function moveLast() {
655
- let i = visibleFlat.length - 1;
656
- while (i >= 0 && isNodeDisabled((visibleFlat[i] as FlatNode).node)) i--;
657
- if (i >= 0) activeKey = (visibleFlat[i] as FlatNode).node.key;
658
- }
659
-
660
- function currentFlat(): FlatNode | undefined {
661
- const i = activeIndex();
662
- return i >= 0 ? visibleFlat[i] : undefined;
663
- }
664
-
665
- function moveToParent() {
666
- const f = currentFlat();
667
- if (!f || f.parentKey === null) return;
668
- activeKey = f.parentKey;
669
- }
670
-
671
- // `*`:展开当前层级(与活动节点同 parentKey)的全部可展开同级节点(APG 推荐,spec §6)。
672
- // 基于可见扁平节点定位同级,逐个展开未展开者(不收起已展开),合并为一次状态写入。
673
- function expandSiblings() {
674
- const f = currentFlat();
675
- if (!f) return;
676
- const targetParent = f.parentKey;
677
- const siblings = visibleFlat.filter(
678
- (x) => x.parentKey === targetParent && isExpandable(x.node, x.hasChildren),
679
- );
680
- let changed = false;
681
- let next = new Set(currentExpandedSet);
682
- let lastNode: TreeNodeData | null = null;
683
- for (const sib of siblings) {
684
- if (next.has(sib.node.key)) continue;
685
- // 触发未加载异步节点的子节点拉取(数据到位后合并树派生显示)。
686
- const hasOwnKids = (sib.node.children?.length ?? 0) > 0;
687
- if (!hasOwnKids && loadData && !loadedKeys.has(sib.node.key)) {
688
- void loadChildren(sib.node);
689
- }
690
- next.add(sib.node.key);
691
- lastNode = sib.node;
692
- changed = true;
693
- }
694
- if (!changed || lastNode === null) return;
695
- if (!isExpandControlled) innerExpanded = next;
696
- // 一次性回调(node 取最后展开者,expand=true);受控时不回写(红线 #1)。
697
- onExpandedChange?.({ expanded: [...next], node: toOrig(lastNode), expand: true });
698
- }
699
-
700
- // typeahead:连续输入字符在可见节点间按 label 前缀跳转(APG,spec §6)。
701
- // 缓冲命令式(非响应式),超时清空;同字符重复则在匹配项间循环。
702
- let typeaheadBuffer = '';
703
- let typeaheadTimer: ReturnType<typeof setTimeout> | undefined;
704
- const TYPEAHEAD_TIMEOUT = 600;
705
-
706
- function clearTypeahead() {
707
- typeaheadBuffer = '';
708
- typeaheadTimer = undefined;
709
- }
710
-
711
- // 卸载兜底清理 typeahead 计时器(红线 #3)。
712
- $effect(() => () => {
713
- if (typeaheadTimer !== undefined) clearTimeout(typeaheadTimer);
714
- });
715
-
716
- function typeahead(char: string) {
717
- if (typeaheadTimer !== undefined) clearTimeout(typeaheadTimer);
718
- typeaheadTimer = setTimeout(clearTypeahead, TYPEAHEAD_TIMEOUT);
719
- // 同一字符重复输入:从当前项之后开始找下一个该字母开头者(在匹配项间循环)。
720
- const repeat = typeaheadBuffer.length === 1 && typeaheadBuffer === char.toLowerCase();
721
- typeaheadBuffer = repeat ? typeaheadBuffer : typeaheadBuffer + char.toLowerCase();
722
- const prefix = typeaheadBuffer;
723
- const len = visibleFlat.length;
724
- if (len === 0) return;
725
- const cur = activeIndex();
726
- const start = cur < 0 ? 0 : (repeat ? cur + 1 : cur);
727
- for (let n = 0; n < len; n += 1) {
728
- const i = (start + n) % len;
729
- const fn = visibleFlat[i] as FlatNode;
730
- if (isNodeDisabled(fn.node)) continue;
731
- if (fn.node.label.toLowerCase().startsWith(prefix)) {
732
- activeKey = fn.node.key;
733
- return;
734
- }
735
- }
736
- }
737
-
738
- function onKeydown(e: KeyboardEvent) {
739
- if (disabled || visibleFlat.length === 0) return;
740
- if (activeKey === null) {
741
- if (
742
- e.key === 'ArrowDown' ||
743
- e.key === 'ArrowUp' ||
744
- e.key === 'Home' ||
745
- e.key === 'End'
746
- ) {
747
- e.preventDefault();
748
- moveFirst();
749
- scrollActiveIntoView();
750
- return;
751
- }
752
- // 无活动项时也支持 typeahead:从首项起按前缀跳转(activeIndex() 返回 -1 时从 0 开始)。
753
- if (
754
- e.key.length === 1 &&
755
- e.key !== ' ' &&
756
- e.key !== '*' &&
757
- !e.ctrlKey &&
758
- !e.metaKey &&
759
- !e.altKey
760
- ) {
761
- e.preventDefault();
762
- typeahead(e.key);
763
- scrollActiveIntoView();
764
- }
765
- // 其它键(含 `*`:无活动项无明确层级)不处理。
766
- return;
767
- }
768
- const f = currentFlat();
769
- switch (e.key) {
770
- case 'ArrowDown':
771
- e.preventDefault();
772
- moveNext();
773
- break;
774
- case 'ArrowUp':
775
- e.preventDefault();
776
- movePrev();
777
- break;
778
- case 'ArrowRight':
779
- e.preventDefault();
780
- if (f && isExpandable(f.node, f.hasChildren)) {
781
- if (!isExpanded(f.node.key)) toggleExpand(f.node);
782
- else moveNext();
783
- }
784
- break;
785
- case 'ArrowLeft':
786
- e.preventDefault();
787
- if (f && isExpandable(f.node, f.hasChildren) && isExpanded(f.node.key))
788
- emitExpand(f.node, false);
789
- else moveToParent();
790
- break;
791
- case 'Home':
792
- e.preventDefault();
793
- moveFirst();
794
- break;
795
- case 'End':
796
- e.preventDefault();
797
- moveLast();
798
- break;
799
- case 'Enter':
800
- e.preventDefault();
801
- if (f) emitSelect(f.node);
802
- break;
803
- case ' ':
804
- e.preventDefault();
805
- if (f) {
806
- if (isCheckableNode(f.node)) emitCheck(f.node);
807
- else emitSelect(f.node);
808
- }
809
- break;
810
- case '*':
811
- e.preventDefault();
812
- expandSiblings();
813
- break;
814
- default:
815
- // typeahead:单个可打印字符(非修饰键)→ 按 label 前缀跳转。
816
- if (
817
- e.key.length === 1 &&
818
- e.key !== ' ' &&
819
- !e.ctrlKey &&
820
- !e.metaKey &&
821
- !e.altKey
822
- ) {
823
- e.preventDefault();
824
- typeahead(e.key);
825
- }
826
- break;
827
- }
828
- // 移动 activeKey 后若目标行不在视口(虚拟化)则滚到可见。
829
- scrollActiveIntoView();
830
- }
831
-
832
- // --- 拖拽排序:HTML5 DnD(draggable + drag 事件),状态用 $state,命令式事件处理 ---
833
- // 受控:组件不改 treeData,仅 onDrop 通知父组件重排(红线 #1)。
834
- // 插入指示由 drag 事件更新 $state,render 读它显示指示线(红线 #2/#3)。
835
- let dragKey = $state<TreeKey | null>(null); // 当前被拖拽节点 key
836
- let dropKey = $state<TreeKey | null>(null); // 当前悬停目标 key
837
- let dropPos = $state<DropPosition | null>(null); // 放置位置 before/inside/after
838
- // 拖到 inside 时延时自动展开的计时器(命令式,dragleave/drop/dragend 清理)。
839
- let expandTimer: ReturnType<typeof setTimeout> | undefined;
840
-
841
- function clearExpandTimer() {
842
- if (expandTimer !== undefined) {
843
- clearTimeout(expandTimer);
844
- expandTimer = undefined;
845
- }
846
- }
847
-
848
- function resetDrag() {
849
- clearExpandTimer();
850
- dragKey = null;
851
- dropKey = null;
852
- dropPos = null;
853
- }
854
-
855
- function isDraggableNode(node: TreeNodeData): boolean {
856
- return draggable && !isNodeDisabled(node);
857
- }
858
-
859
- function onNodeDragStart(e: DragEvent, node: TreeNodeData) {
860
- if (!isDraggableNode(node)) {
861
- e.preventDefault();
862
- return;
863
- }
864
- dragKey = node.key;
865
- if (e.dataTransfer) {
866
- e.dataTransfer.effectAllowed = 'move';
867
- // 必须 setData 否则部分浏览器不触发 drop。
868
- e.dataTransfer.setData('text/plain', String(node.key));
869
- }
870
- onDragStart?.(toOrig(node));
871
- }
872
-
873
- function onNodeDragOver(e: DragEvent, f: FlatNode) {
874
- const node = f.node;
875
- if (dragKey === null || isNodeDisabled(node)) return;
876
- // 不能放到自身或自身子树内(受控数据无意义且会丢节点)。
877
- if (isAncestorOrSelf(mergedData, dragKey, node.key)) return;
878
- // dragover 必须 preventDefault 才能触发 drop(红线 #3)。
879
- e.preventDefault();
880
- if (e.dataTransfer) e.dataTransfer.dropEffect = 'move';
881
- const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();
882
- const offsetY = e.clientY - rect.top;
883
- // 叶子且无 loadData → 不允许 inside(不会有子节点容器)。
884
- const allowInside = f.hasChildren || (!!loadData && node.isLeaf !== true);
885
- const pos = computeDropPosition(offsetY, rect.height || rowHeight, allowInside);
886
- // 切换目标行时重置 inside 自动展开计时器,并触发 onDragEnter。
887
- if (dropKey !== node.key) {
888
- clearExpandTimer();
889
- // 通知拖拽进入新目标节点
890
- if (dragKey !== null) {
891
- const dragNode = findFlatNode(dragKey);
892
- if (dragNode) onDragEnter?.({ dragNode: toOrig(dragNode), dropNode: toOrig(node) });
893
- }
894
- }
895
- dropKey = node.key;
896
- dropPos = pos;
897
- // 拖到内部时自动展开目标(便于放入),延时避免误触。
898
- if (pos === 'inside' && isExpandable(node, f.hasChildren) && !isExpanded(node.key)) {
899
- if (expandTimer === undefined) {
900
- expandTimer = setTimeout(() => {
901
- expandTimer = undefined;
902
- if (dropKey === node.key && dropPos === 'inside') toggleExpand(node);
903
- }, 500);
904
- }
905
- } else {
906
- clearExpandTimer();
907
- }
908
- }
909
-
910
- function onNodeDragLeave(e: DragEvent, node: TreeNodeData) {
911
- // 仅当真正离开该行(而非进入子元素)时清理目标,避免指示线闪烁。
912
- const related = e.relatedTarget as Node | null;
913
- const cur = e.currentTarget as HTMLElement;
914
- if (related && cur.contains(related)) return;
915
- if (dropKey === node.key) {
916
- clearExpandTimer();
917
- dropKey = null;
918
- dropPos = null;
919
- }
920
- }
921
-
922
- function onNodeDrop(e: DragEvent, node: TreeNodeData) {
923
- if (dragKey === null || dropPos === null) {
924
- resetDrag();
925
- return;
926
- }
927
- if (isNodeDisabled(node) || isAncestorOrSelf(mergedData, dragKey, node.key)) {
928
- resetDrag();
929
- return;
930
- }
931
- e.preventDefault();
932
- const dragNode = findFlatNode(dragKey);
933
- const dropNode = node;
934
- const position = dropPos;
935
- resetDrag();
936
- if (dragNode)
937
- onDrop?.({ dragNode: toOrig(dragNode), dropNode: toOrig(dropNode), dropPosition: position });
938
- }
939
-
940
- function onNodeDragEnd() {
941
- resetDrag();
942
- }
943
-
944
- function findFlatNode(key: TreeKey): TreeNodeData | undefined {
945
- const f = flat.find((x) => x.node.key === key);
946
- return f?.node;
947
- }
948
-
949
- // --- 搜索高亮:把命中子串包 <mark>,返回片段数组供模板渲染 ---
950
- type Part = { text: string; mark: boolean };
951
- function highlightParts(text: string): Part[] {
952
- if (!searchActive) return [{ text, mark: false }];
953
- const lower = text.toLowerCase();
954
- const term = trimmedSearch.toLowerCase();
955
- const parts: Part[] = [];
956
- let from = 0;
957
- let idx = lower.indexOf(term, from);
958
- while (idx !== -1) {
959
- if (idx > from) parts.push({ text: text.slice(from, idx), mark: false });
960
- parts.push({ text: text.slice(idx, idx + term.length), mark: true });
961
- from = idx + term.length;
962
- idx = lower.indexOf(term, from);
963
- }
964
- if (from < text.length) parts.push({ text: text.slice(from), mark: false });
965
- return parts;
966
- }
967
-
968
- function rowChecked(node: TreeNodeData): boolean {
969
- return checkState.checked.has(node.key);
970
- }
971
- function rowHalf(node: TreeNodeData): boolean {
972
- return checkState.half.has(node.key);
973
- }
974
- function ariaCheckedValue(node: TreeNodeData): boolean | 'mixed' {
975
- if (rowChecked(node)) return true;
976
- if (rowHalf(node)) return 'mixed';
977
- return false;
978
- }
979
-
980
- const cls = $derived(
981
- [
982
- 'cd-tree',
983
- `cd-tree--${size}`,
984
- `cd-tree--${status}`,
985
- disabled && 'cd-tree--disabled',
986
- showLine && 'cd-tree--line',
987
- ]
988
- .filter(Boolean)
989
- .join(' '),
990
- );
991
- </script>
992
-
993
- <div class={cls}>
994
- {#if searchEnabled}
995
- <div class="cd-tree__search">
996
- <input
997
- class="cd-tree__search-input"
998
- type="text"
999
- placeholder={loc().t('Tree.searchPlaceholder')}
1000
- aria-label={loc().t('Tree.searchPlaceholder')}
1001
- value={searchValue}
1002
- oninput={handleSearchInput}
1003
- {disabled}
1004
- />
1005
- </div>
1006
- {/if}
1007
-
1008
- {#if isEmpty}
1009
- <div class="cd-tree__empty">{emptyText}</div>
1010
- {:else if virtualized}
1011
- <!-- 虚拟滚动:role=tree 容器自身滚动,spacer 撑总高,行绝对定位按索引偏移。
1012
- 只渲染视口内切片 renderFlat,保持 treeitem 语义不变(a11y 取舍见下)。-->
1013
- <div
1014
- class="cd-tree__list cd-tree__list--virtual"
1015
- role="tree"
1016
- aria-label={ariaLabel}
1017
- aria-multiselectable={multiple || checkable}
1018
- aria-activedescendant={activeDescId}
1019
- aria-disabled={disabled || undefined}
1020
- tabindex={disabled ? -1 : 0}
1021
- bind:this={viewportEl}
1022
- style={`block-size:${height}px; overflow:auto`}
1023
- onkeydown={onKeydown}
1024
- >
1025
- <div class="cd-tree__spacer" style={`block-size:${totalHeight}px`}>
1026
- {#each renderFlat as f, i (f.node.key)}
1027
- {@render row(f, `position:absolute; inset-inline:0; transform:translateY(${(vRange.startIndex + i) * rowHeight}px); block-size:${rowHeight}px`)}
1028
- {/each}
1029
- </div>
1030
- </div>
1031
- {:else}
1032
- <div
1033
- class="cd-tree__list"
1034
- role="tree"
1035
- aria-label={ariaLabel}
1036
- aria-multiselectable={multiple || checkable}
1037
- aria-activedescendant={activeDescId}
1038
- aria-disabled={disabled || undefined}
1039
- tabindex={disabled ? -1 : 0}
1040
- onkeydown={onKeydown}
1041
- >
1042
- {#each visibleFlat as f (f.node.key)}
1043
- {@render row(f, undefined)}
1044
- {/each}
1045
- </div>
1046
- {/if}
1047
- </div>
1048
-
1049
- {#snippet row(f: FlatNode, posStyle: string | undefined)}
1050
- {@const node = f.node}
1051
- {@const expandable = isExpandable(node, f.hasChildren)}
1052
- {@const loading = loadingKeys.has(node.key)}
1053
- {@const expanded = expandable && isExpanded(node.key)}
1054
- {@const nodeDisabled = isNodeDisabled(node)}
1055
- {@const selected = selectedSet.has(node.key)}
1056
- {@const checked = rowChecked(node)}
1057
- {@const active = activeKey === node.key}
1058
- {@const dragging = dragKey === node.key}
1059
- {@const isDropTarget = dropKey === node.key}
1060
- {@const indentStyle = showLine ? '' : `padding-inline-start: calc(${f.level} * var(--cd-tree-indent))`}
1061
- <!-- treeitem 焦点经容器 aria-activedescendant 漫游管理,行本身 tabindex=-1,键盘统一在 role=tree 容器处理 -->
1062
- <!-- svelte-ignore a11y_click_events_have_key_events -->
1063
- <div
1064
- id={itemId(node.key)}
1065
- class="cd-tree__node"
1066
- class:cd-tree__node--selected={selected}
1067
- class:cd-tree__node--disabled={nodeDisabled}
1068
- class:cd-tree__node--active={active}
1069
- class:cd-tree__node--block={blockNode}
1070
- class:cd-tree__node--dragging={dragging}
1071
- class:cd-tree__node--drop-before={isDropTarget && dropPos === 'before'}
1072
- class:cd-tree__node--drop-inside={isDropTarget && dropPos === 'inside'}
1073
- class:cd-tree__node--drop-after={isDropTarget && dropPos === 'after'}
1074
- role="treeitem"
1075
- draggable={draggable && !nodeDisabled ? true : undefined}
1076
- tabindex={-1}
1077
- aria-level={f.level + 1}
1078
- aria-setsize={f.setSize}
1079
- aria-posinset={f.posInSet}
1080
- aria-expanded={expandable ? expanded : undefined}
1081
- aria-selected={selectable ? selected : undefined}
1082
- aria-checked={checkable ? ariaCheckedValue(node) : undefined}
1083
- aria-disabled={nodeDisabled || undefined}
1084
- style={[posStyle, indentStyle].filter(Boolean).join('; ') || undefined}
1085
- onclick={() => onRowClick(node)}
1086
- oncontextmenu={onRightClick ? (e) => { e.preventDefault(); onRightClick(e, toOrig(node)); } : undefined}
1087
- ondragstart={draggable ? (e) => onNodeDragStart(e, node) : undefined}
1088
- ondragover={draggable ? (e) => onNodeDragOver(e, f) : undefined}
1089
- ondragleave={draggable ? (e) => onNodeDragLeave(e, node) : undefined}
1090
- ondrop={draggable ? (e) => onNodeDrop(e, node) : undefined}
1091
- ondragend={draggable ? onNodeDragEnd : undefined}
1092
- >
1093
- {#if showLine && f.level > 0}
1094
- <!-- 引导线列:每层祖先一格,祖先非末→贯穿竖线;自身连接列画拐角 -->
1095
- {#each Array(f.level) as _, depth (depth)}
1096
- {@const isSelfColumn = depth === f.level - 1}
1097
- <span
1098
- class="cd-tree__line"
1099
- class:cd-tree__line--through={!isSelfColumn && !f.ancestorIsLast[depth]}
1100
- class:cd-tree__line--elbow={isSelfColumn && f.isLast}
1101
- class:cd-tree__line--tee={isSelfColumn && !f.isLast}
1102
- aria-hidden="true"
1103
- ></span>
1104
- {/each}
1105
- {/if}
1106
- {#if loading}
1107
- {#if switcher}
1108
- {@render switcher({ node, expanded: false, loading: true })}
1109
- {:else}
1110
- <span class="cd-tree__switcher cd-tree__switcher--loading" aria-hidden="true">
1111
- <span class="cd-tree__spinner"></span>
1112
- </span>
1113
- {/if}
1114
- {:else if expandable}
1115
- {#if switcher}
1116
- <!-- svelte-ignore a11y_click_events_have_key_events -->
1117
- <span
1118
- role="button"
1119
- tabindex="-1"
1120
- aria-label={expanded ? loc().t('Tree.collapse') : loc().t('Tree.expand')}
1121
- onclick={(e) => {
1122
- e.stopPropagation();
1123
- if (!nodeDisabled) toggleExpand(node);
1124
- }}
1125
- >
1126
- {@render switcher({ node, expanded, loading: false })}
1127
- </span>
1128
- {:else}
1129
- <!-- svelte-ignore a11y_click_events_have_key_events -->
1130
- <span
1131
- class="cd-tree__switcher"
1132
- class:cd-tree__switcher--open={expanded}
1133
- role="button"
1134
- tabindex="-1"
1135
- aria-label={expanded ? loc().t('Tree.collapse') : loc().t('Tree.expand')}
1136
- onclick={(e) => {
1137
- e.stopPropagation();
1138
- if (!nodeDisabled) toggleExpand(node);
1139
- }}
1140
- >
1141
- <svg viewBox="0 0 16 16" width="10" height="10" aria-hidden="true" focusable="false">
1142
- <path fill="currentColor" d="M6 4l4 4-4 4V4Z" />
1143
- </svg>
1144
- </span>
1145
- {/if}
1146
- {:else}
1147
- {#if switcher}
1148
- {@render switcher({ node, expanded: false, loading: false })}
1149
- {:else}
1150
- <span class="cd-tree__switcher cd-tree__switcher--leaf" aria-hidden="true"></span>
1151
- {/if}
1152
- {/if}
1153
-
1154
- {#if checkable}
1155
- <span
1156
- class="cd-tree__checkbox"
1157
- class:cd-tree__checkbox--checked={checked}
1158
- class:cd-tree__checkbox--half={!checked && rowHalf(node)}
1159
- class:cd-tree__checkbox--disabled={!isCheckableNode(node)}
1160
- role="button"
1161
- tabindex="-1"
1162
- aria-hidden="true"
1163
- onclick={(e) => {
1164
- e.stopPropagation();
1165
- emitCheck(node);
1166
- }}
1167
- >
1168
- {#if checked}
1169
- <svg viewBox="0 0 16 16" width="12" height="12" aria-hidden="true" focusable="false">
1170
- <path
1171
- fill="none"
1172
- stroke="currentColor"
1173
- stroke-width="2"
1174
- stroke-linecap="round"
1175
- stroke-linejoin="round"
1176
- d="M3.5 8.5l3 3 6-6.5"
1177
- />
1178
- </svg>
1179
- {:else if rowHalf(node)}
1180
- <svg viewBox="0 0 16 16" width="12" height="12" aria-hidden="true" focusable="false">
1181
- <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M4 8h8" />
1182
- </svg>
1183
- {/if}
1184
- </span>
1185
- {/if}
1186
-
1187
- {#if showIcon}
1188
- {@const isLeaf = !expandable}
1189
- <span class="cd-tree__icon" aria-hidden="true">
1190
- {#if icon}{@render icon({ node, expanded, isLeaf })}{/if}
1191
- </span>
1192
- {/if}
1193
-
1194
- <span class="cd-tree__label">
1195
- {#if label}
1196
- {@render label({ node, level: f.level, searchValue: trimmedSearch, selected, checked })}
1197
- {:else}
1198
- {#each highlightParts(node.label) as part, i (i)}
1199
- {#if part.mark}
1200
- <mark class="cd-tree__highlight">{part.text}</mark>
1201
- {:else}{part.text}{/if}
1202
- {/each}
1203
- {/if}
1204
- </span>
1205
-
1206
- {#if suffix}
1207
- <span class="cd-tree__suffix">
1208
- {@render suffix({ node })}
1209
- </span>
1210
- {/if}
1211
-
1212
- {#if dragGhost && dragging}
1213
- <span class="cd-tree__drag-ghost" aria-hidden="true">
1214
- {@render dragGhost({ node })}
1215
- </span>
1216
- {/if}
1217
- </div>
1218
- {/snippet}
1219
-
1220
- <style>
1221
- .cd-tree {
1222
- --cd-tree-row-height: var(--cd-tree-node-height);
1223
- display: flex;
1224
- flex-direction: column;
1225
- gap: var(--cd-spacing-1);
1226
- color: var(--cd-tree-node-color);
1227
- font-size: var(--cd-font-size-body);
1228
- }
1229
- .cd-tree--small {
1230
- --cd-tree-row-height: var(--cd-tree-node-height-small);
1231
- }
1232
- .cd-tree--large {
1233
- --cd-tree-row-height: var(--cd-tree-node-height-large);
1234
- }
1235
- .cd-tree--disabled {
1236
- color: var(--cd-tree-node-color-disabled);
1237
- }
1238
-
1239
- .cd-tree__search-input {
1240
- inline-size: 100%;
1241
- block-size: var(--cd-tree-row-height);
1242
- padding-inline: var(--cd-spacing-2);
1243
- color: inherit;
1244
- background: var(--cd-color-bg-1, transparent);
1245
- border: 1px solid var(--cd-tree-border-color);
1246
- border-radius: var(--cd-radius-small, 4px);
1247
- font: inherit;
1248
- }
1249
- .cd-tree--warning .cd-tree__search-input {
1250
- border-color: var(--cd-tree-border-color-warning);
1251
- }
1252
- .cd-tree--error .cd-tree__search-input {
1253
- border-color: var(--cd-tree-border-color-error);
1254
- }
1255
- .cd-tree__search-input:focus-visible {
1256
- outline: none;
1257
- border-color: var(--cd-tree-focus-ring);
1258
- box-shadow: 0 0 0 2px var(--cd-tree-focus-ring);
1259
- }
1260
-
1261
- .cd-tree__list {
1262
- display: flex;
1263
- flex-direction: column;
1264
- outline: none;
1265
- }
1266
- .cd-tree__list:focus-visible {
1267
- box-shadow: 0 0 0 2px var(--cd-tree-focus-ring);
1268
- border-radius: var(--cd-radius-small, 4px);
1269
- }
1270
- /* 虚拟滚动:容器自身滚动,display block 以便 spacer 绝对定位行布局生效 */
1271
- .cd-tree__list--virtual {
1272
- display: block;
1273
- position: relative;
1274
- }
1275
- .cd-tree__spacer {
1276
- position: relative;
1277
- inline-size: 100%;
1278
- }
1279
-
1280
- .cd-tree__node {
1281
- display: flex;
1282
- align-items: center;
1283
- gap: var(--cd-spacing-1);
1284
- block-size: var(--cd-tree-row-height);
1285
- padding-inline-end: var(--cd-spacing-2);
1286
- border-radius: var(--cd-radius-small, 4px);
1287
- cursor: pointer;
1288
- transition: background-color var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
1289
- }
1290
- .cd-tree__node:hover {
1291
- background: var(--cd-tree-node-bg-hover);
1292
- }
1293
- .cd-tree__node--selected {
1294
- color: var(--cd-tree-node-color-selected);
1295
- background: var(--cd-tree-node-bg-selected);
1296
- }
1297
- .cd-tree__node--active {
1298
- box-shadow: inset 0 0 0 1px var(--cd-tree-focus-ring);
1299
- }
1300
- .cd-tree__node--disabled {
1301
- color: var(--cd-tree-node-color-disabled);
1302
- cursor: not-allowed;
1303
- }
1304
- .cd-tree__node--disabled:hover {
1305
- background: transparent;
1306
- }
1307
-
1308
- /* --- 拖拽排序:被拖节点半透明 + 插入指示线 / 内部高亮 --- */
1309
- .cd-tree__node--dragging {
1310
- opacity: 0.5;
1311
- }
1312
- /* before/after 用 ::after 画一条插入指示线(不影响布局,子元素不接收 drag 事件) */
1313
- .cd-tree__node--drop-before::after,
1314
- .cd-tree__node--drop-after::after {
1315
- content: '';
1316
- position: absolute;
1317
- inset-inline: 0;
1318
- block-size: 2px;
1319
- background: var(--cd-tree-focus-ring, var(--cd-color-primary));
1320
- border-radius: 1px;
1321
- pointer-events: none;
1322
- }
1323
- .cd-tree__node--drop-before::after {
1324
- inset-block-start: -1px;
1325
- }
1326
- .cd-tree__node--drop-after::after {
1327
- inset-block-end: -1px;
1328
- }
1329
- /* inside:成为子节点 → 整行高亮框 */
1330
- .cd-tree__node--drop-inside {
1331
- background: var(--cd-tree-node-bg-hover);
1332
- box-shadow: inset 0 0 0 1px var(--cd-tree-focus-ring, var(--cd-color-primary));
1333
- }
1334
- /* 节点需相对定位以承载绝对定位的指示线;虚拟化行已 position:absolute,非虚拟行设 relative */
1335
- .cd-tree__node {
1336
- position: relative;
1337
- }
1338
-
1339
- /* --- showLine 层级引导线:每层一格,用 ::before 画竖线、::after 画横线 --- */
1340
- .cd-tree__line {
1341
- position: relative;
1342
- flex: 0 0 auto;
1343
- inline-size: var(--cd-tree-indent);
1344
- align-self: stretch;
1345
- }
1346
- /* 贯穿竖线(祖先非末层) */
1347
- .cd-tree__line--through::before {
1348
- content: '';
1349
- position: absolute;
1350
- inset-block: 0;
1351
- inset-inline-start: 50%;
1352
- inline-size: 1px;
1353
- background: var(--cd-tree-line-color, var(--cd-color-border));
1354
- }
1355
- /* ├ 形:竖线贯穿 + 横线到右 */
1356
- .cd-tree__line--tee::before {
1357
- content: '';
1358
- position: absolute;
1359
- inset-block: 0;
1360
- inset-inline-start: 50%;
1361
- inline-size: 1px;
1362
- background: var(--cd-tree-line-color, var(--cd-color-border));
1363
- }
1364
- /* └ 形:竖线 top→中 + 横线到右 */
1365
- .cd-tree__line--elbow::before {
1366
- content: '';
1367
- position: absolute;
1368
- inset-block-start: 0;
1369
- block-size: 50%;
1370
- inset-inline-start: 50%;
1371
- inline-size: 1px;
1372
- background: var(--cd-tree-line-color, var(--cd-color-border));
1373
- }
1374
- .cd-tree__line--tee::after,
1375
- .cd-tree__line--elbow::after {
1376
- content: '';
1377
- position: absolute;
1378
- inset-block-start: 50%;
1379
- inset-inline-start: 50%;
1380
- inset-inline-end: 0;
1381
- block-size: 1px;
1382
- background: var(--cd-tree-line-color, var(--cd-color-border));
1383
- }
1384
-
1385
- .cd-tree__switcher {
1386
- display: inline-flex;
1387
- align-items: center;
1388
- justify-content: center;
1389
- flex: 0 0 auto;
1390
- inline-size: 1rem;
1391
- block-size: 1rem;
1392
- color: var(--cd-tree-expand-icon-color);
1393
- cursor: pointer;
1394
- transition: transform var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
1395
- }
1396
- .cd-tree__switcher--open {
1397
- transform: rotate(90deg);
1398
- }
1399
- .cd-tree__switcher--leaf {
1400
- cursor: default;
1401
- }
1402
- .cd-tree__switcher--loading {
1403
- cursor: default;
1404
- }
1405
- .cd-tree__spinner {
1406
- inline-size: 0.75rem;
1407
- block-size: 0.75rem;
1408
- border: 2px solid var(--cd-color-border, currentColor);
1409
- border-block-start-color: var(--cd-color-primary);
1410
- border-radius: 50%;
1411
- animation: cd-tree-spin 0.7s linear infinite;
1412
- }
1413
- @keyframes cd-tree-spin {
1414
- to {
1415
- transform: rotate(360deg);
1416
- }
1417
- }
1418
-
1419
- .cd-tree__checkbox {
1420
- display: inline-flex;
1421
- align-items: center;
1422
- justify-content: center;
1423
- flex: 0 0 auto;
1424
- inline-size: 1rem;
1425
- block-size: 1rem;
1426
- color: #fff;
1427
- background: var(--cd-color-bg-1, #fff);
1428
- border: 1px solid var(--cd-color-border);
1429
- border-radius: var(--cd-radius-small, 3px);
1430
- cursor: pointer;
1431
- }
1432
- .cd-tree__checkbox--checked,
1433
- .cd-tree__checkbox--half {
1434
- background: var(--cd-color-primary);
1435
- border-color: var(--cd-color-primary);
1436
- }
1437
- .cd-tree__checkbox--disabled {
1438
- cursor: not-allowed;
1439
- opacity: 0.5;
1440
- }
1441
-
1442
- .cd-tree__icon {
1443
- display: inline-flex;
1444
- align-items: center;
1445
- justify-content: center;
1446
- flex: 0 0 auto;
1447
- inline-size: 0;
1448
- block-size: 1rem;
1449
- color: var(--cd-tree-node-color);
1450
- }
1451
- /* 有自定义图标内容时撑开尺寸 */
1452
- .cd-tree__icon:not(:empty) {
1453
- inline-size: 1rem;
1454
- }
1455
-
1456
- .cd-tree__label {
1457
- overflow: hidden;
1458
- white-space: nowrap;
1459
- text-overflow: ellipsis;
1460
- flex: 1 1 auto;
1461
- min-inline-size: 0;
1462
- }
1463
-
1464
- .cd-tree__suffix {
1465
- display: inline-flex;
1466
- align-items: center;
1467
- flex: 0 0 auto;
1468
- margin-inline-start: var(--cd-spacing-1);
1469
- }
1470
-
1471
- /* 拖拽幽灵节点:绝对定位在节点外屏幕外,由浏览器 setDragImage 拾取(或 CSS 隐藏) */
1472
- .cd-tree__drag-ghost {
1473
- position: absolute;
1474
- inset-inline-start: -9999px;
1475
- inset-block-start: 0;
1476
- pointer-events: none;
1477
- }
1478
-
1479
- .cd-tree__highlight {
1480
- padding: 0;
1481
- color: var(--cd-tree-search-highlight-color);
1482
- background: var(--cd-tree-search-highlight-bg);
1483
- }
1484
-
1485
- .cd-tree__empty {
1486
- padding: var(--cd-spacing-3);
1487
- color: var(--cd-tree-node-color-disabled);
1488
- text-align: center;
1489
- }
1490
-
1491
- @media (prefers-reduced-motion: reduce) {
1492
- .cd-tree__node,
1493
- .cd-tree__switcher {
1494
- transition: none;
1495
- }
1496
- .cd-tree__spinner {
1497
- animation: none;
1498
- }
1499
- }
1500
- </style>