@chenzy-design/svelte 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (476) hide show
  1. package/dist/components.json +1 -1
  2. package/package.json +7 -8
  3. package/src/_floating/use-floating.ts +0 -208
  4. package/src/anchor/Anchor.a11y.test.ts +0 -49
  5. package/src/anchor/Anchor.kbd.test.ts +0 -70
  6. package/src/anchor/Anchor.svelte +0 -359
  7. package/src/anchor/AnchorKbdFixture.svelte +0 -24
  8. package/src/anchor/index.ts +0 -3
  9. package/src/anchor/meta.ts +0 -70
  10. package/src/anchor/types.ts +0 -8
  11. package/src/autocomplete/AutoComplete.a11y.test.ts +0 -49
  12. package/src/autocomplete/AutoComplete.kbd.test.ts +0 -69
  13. package/src/autocomplete/AutoComplete.svelte +0 -706
  14. package/src/autocomplete/AutoCompleteKbdFixture.svelte +0 -24
  15. package/src/autocomplete/index.ts +0 -2
  16. package/src/autocomplete/meta.ts +0 -41
  17. package/src/avatar/Avatar.a11y.test.ts +0 -37
  18. package/src/avatar/Avatar.svelte +0 -315
  19. package/src/avatar/AvatarGroup.svelte +0 -142
  20. package/src/avatar/context.ts +0 -21
  21. package/src/avatar/index.ts +0 -10
  22. package/src/avatar/meta.ts +0 -73
  23. package/src/back-top/BackTop.a11y.test.ts +0 -40
  24. package/src/back-top/BackTop.svelte +0 -314
  25. package/src/back-top/index.ts +0 -2
  26. package/src/back-top/meta.ts +0 -108
  27. package/src/badge/Badge.a11y.test.ts +0 -35
  28. package/src/badge/Badge.svelte +0 -328
  29. package/src/badge/BadgeA11yFixture.svelte +0 -18
  30. package/src/badge/index.ts +0 -2
  31. package/src/badge/meta.ts +0 -62
  32. package/src/banner/Banner.a11y.test.ts +0 -48
  33. package/src/banner/Banner.svelte +0 -368
  34. package/src/banner/index.ts +0 -3
  35. package/src/banner/meta.ts +0 -121
  36. package/src/breadcrumb/Breadcrumb.a11y.test.ts +0 -35
  37. package/src/breadcrumb/Breadcrumb.kbd.test.ts +0 -45
  38. package/src/breadcrumb/Breadcrumb.svelte +0 -414
  39. package/src/breadcrumb/BreadcrumbKbdFixture.svelte +0 -23
  40. package/src/breadcrumb/Item.svelte +0 -77
  41. package/src/breadcrumb/context.ts +0 -27
  42. package/src/breadcrumb/index.ts +0 -21
  43. package/src/breadcrumb/meta.ts +0 -128
  44. package/src/breadcrumb/types.ts +0 -4
  45. package/src/button/Button.a11y.test.ts +0 -54
  46. package/src/button/Button.svelte +0 -176
  47. package/src/button/index.ts +0 -2
  48. package/src/button/meta.ts +0 -28
  49. package/src/calendar/Calendar.a11y.test.ts +0 -51
  50. package/src/calendar/Calendar.kbd.test.ts +0 -59
  51. package/src/calendar/Calendar.svelte +0 -1344
  52. package/src/calendar/CalendarKbdFixture.svelte +0 -23
  53. package/src/calendar/index.ts +0 -3
  54. package/src/calendar/meta.ts +0 -117
  55. package/src/card/Card.a11y.test.ts +0 -38
  56. package/src/card/Card.svelte +0 -341
  57. package/src/card/CardMeta.svelte +0 -60
  58. package/src/card/index.ts +0 -8
  59. package/src/card/meta.ts +0 -83
  60. package/src/carousel/Carousel.a11y.test.ts +0 -53
  61. package/src/carousel/Carousel.kbd.test.ts +0 -67
  62. package/src/carousel/Carousel.svelte +0 -806
  63. package/src/carousel/CarouselA11yFixture.svelte +0 -25
  64. package/src/carousel/CarouselKbdFixture.svelte +0 -24
  65. package/src/carousel/index.ts +0 -2
  66. package/src/carousel/meta.ts +0 -74
  67. package/src/cascader/Cascader.a11y.test.ts +0 -59
  68. package/src/cascader/Cascader.kbd.test.ts +0 -56
  69. package/src/cascader/Cascader.svelte +0 -1570
  70. package/src/cascader/CascaderKbdFixture.svelte +0 -31
  71. package/src/cascader/index.ts +0 -3
  72. package/src/cascader/meta.ts +0 -57
  73. package/src/cascader/types.ts +0 -9
  74. package/src/checkbox/Checkbox.svelte +0 -281
  75. package/src/checkbox/CheckboxGroup.a11y.test.ts +0 -43
  76. package/src/checkbox/CheckboxGroup.kbd.test.ts +0 -40
  77. package/src/checkbox/CheckboxGroup.svelte +0 -122
  78. package/src/checkbox/CheckboxGroupKbdFixture.svelte +0 -20
  79. package/src/checkbox/context.ts +0 -31
  80. package/src/checkbox/index.ts +0 -4
  81. package/src/checkbox/meta.ts +0 -67
  82. package/src/collapse/Collapse.a11y.test.ts +0 -53
  83. package/src/collapse/Collapse.kbd.test.ts +0 -89
  84. package/src/collapse/Collapse.svelte +0 -406
  85. package/src/collapse/CollapseA11yFixture.svelte +0 -27
  86. package/src/collapse/CollapseKbdFixture.svelte +0 -25
  87. package/src/collapse/CollapsePanel.svelte +0 -102
  88. package/src/collapse/context.ts +0 -54
  89. package/src/collapse/index.ts +0 -17
  90. package/src/collapse/meta.ts +0 -79
  91. package/src/collapse/types.ts +0 -5
  92. package/src/color-picker/ColorPicker.a11y.test.ts +0 -60
  93. package/src/color-picker/ColorPicker.kbd.test.ts +0 -73
  94. package/src/color-picker/ColorPicker.svelte +0 -985
  95. package/src/color-picker/ColorPickerKbdFixture.svelte +0 -25
  96. package/src/color-picker/index.ts +0 -2
  97. package/src/color-picker/meta.ts +0 -47
  98. package/src/config-provider/ConfigProvider.svelte +0 -227
  99. package/src/config-provider/context.ts +0 -29
  100. package/src/config-provider/index.ts +0 -48
  101. package/src/config-provider/meta.ts +0 -128
  102. package/src/date-picker/DatePicker.a11y.test.ts +0 -45
  103. package/src/date-picker/DatePicker.kbd.test.ts +0 -71
  104. package/src/date-picker/DatePicker.svelte +0 -1798
  105. package/src/date-picker/DatePickerKbdFixture.svelte +0 -26
  106. package/src/date-picker/RangePicker.kbd.test.ts +0 -69
  107. package/src/date-picker/RangePicker.svelte +0 -775
  108. package/src/date-picker/RangePickerKbdFixture.svelte +0 -30
  109. package/src/date-picker/index.ts +0 -4
  110. package/src/date-picker/meta.ts +0 -67
  111. package/src/date-picker/range-meta.ts +0 -44
  112. package/src/descriptions/Descriptions.a11y.test.ts +0 -33
  113. package/src/descriptions/Descriptions.svelte +0 -287
  114. package/src/descriptions/DescriptionsItem.svelte +0 -43
  115. package/src/descriptions/context.ts +0 -21
  116. package/src/descriptions/index.ts +0 -16
  117. package/src/descriptions/meta.ts +0 -45
  118. package/src/descriptions/types.ts +0 -6
  119. package/src/divider/Divider.a11y.test.ts +0 -23
  120. package/src/divider/Divider.svelte +0 -154
  121. package/src/divider/index.ts +0 -2
  122. package/src/divider/meta.ts +0 -23
  123. package/src/drawer/Drawer.a11y.test.ts +0 -41
  124. package/src/drawer/Drawer.kbd.test.ts +0 -67
  125. package/src/drawer/Drawer.svelte +0 -554
  126. package/src/drawer/DrawerKbdFixture.svelte +0 -28
  127. package/src/drawer/index.ts +0 -2
  128. package/src/drawer/meta.ts +0 -127
  129. package/src/dropdown/Dropdown.a11y.test.ts +0 -46
  130. package/src/dropdown/Dropdown.kbd.test.ts +0 -56
  131. package/src/dropdown/Dropdown.svelte +0 -573
  132. package/src/dropdown/DropdownA11yFixture.svelte +0 -24
  133. package/src/dropdown/DropdownDivider.svelte +0 -17
  134. package/src/dropdown/DropdownItem.svelte +0 -127
  135. package/src/dropdown/DropdownItemNode.svelte +0 -355
  136. package/src/dropdown/DropdownKbdFixture.svelte +0 -26
  137. package/src/dropdown/DropdownMenu.svelte +0 -24
  138. package/src/dropdown/DropdownSubMenu.svelte +0 -212
  139. package/src/dropdown/DropdownTitle.svelte +0 -34
  140. package/src/dropdown/context.ts +0 -13
  141. package/src/dropdown/index.ts +0 -36
  142. package/src/dropdown/meta.ts +0 -97
  143. package/src/dropdown/types.test.ts +0 -50
  144. package/src/dropdown/types.ts +0 -67
  145. package/src/empty/Empty.a11y.test.ts +0 -24
  146. package/src/empty/Empty.svelte +0 -304
  147. package/src/empty/index.ts +0 -2
  148. package/src/empty/meta.ts +0 -41
  149. package/src/form/Field.svelte +0 -492
  150. package/src/form/FieldArray.svelte +0 -75
  151. package/src/form/Form.a11y.test.ts +0 -39
  152. package/src/form/Form.svelte +0 -243
  153. package/src/form/FormA11yFixture.svelte +0 -31
  154. package/src/form/FormCascader.svelte +0 -82
  155. package/src/form/FormCheckbox.svelte +0 -83
  156. package/src/form/FormDatePicker.svelte +0 -80
  157. package/src/form/FormErrorMessage.svelte +0 -44
  158. package/src/form/FormInput.svelte +0 -95
  159. package/src/form/FormLabel.svelte +0 -46
  160. package/src/form/FormRadio.svelte +0 -83
  161. package/src/form/FormRating.svelte +0 -85
  162. package/src/form/FormSection.svelte +0 -45
  163. package/src/form/FormSelect.svelte +0 -96
  164. package/src/form/FormSlider.svelte +0 -95
  165. package/src/form/FormSlot.svelte +0 -51
  166. package/src/form/FormSwitch.svelte +0 -82
  167. package/src/form/FormTagInput.svelte +0 -79
  168. package/src/form/FormTreeSelect.svelte +0 -85
  169. package/src/form/FormUpload.svelte +0 -92
  170. package/src/form/context.ts +0 -47
  171. package/src/form/index.ts +0 -22
  172. package/src/form/meta.ts +0 -85
  173. package/src/grid/Col.svelte +0 -142
  174. package/src/grid/Grid.a11y.test.ts +0 -14
  175. package/src/grid/GridA11yFixture.svelte +0 -12
  176. package/src/grid/Row.svelte +0 -116
  177. package/src/grid/index.ts +0 -3
  178. package/src/grid/meta.ts +0 -72
  179. package/src/grid/use-breakpoint.svelte.ts +0 -48
  180. package/src/highlight/Highlight.a11y.test.ts +0 -25
  181. package/src/highlight/Highlight.svelte +0 -99
  182. package/src/highlight/index.ts +0 -2
  183. package/src/highlight/meta.ts +0 -80
  184. package/src/icon/Icon.svelte +0 -156
  185. package/src/icon/index.ts +0 -2
  186. package/src/icon/meta.ts +0 -41
  187. package/src/image/Image.a11y.test.ts +0 -30
  188. package/src/image/Image.svelte +0 -387
  189. package/src/image/ImagePreview.kbd.test.ts +0 -52
  190. package/src/image/ImagePreview.svelte +0 -309
  191. package/src/image/ImagePreviewGroup.svelte +0 -93
  192. package/src/image/ImagePreviewKbdFixture.svelte +0 -32
  193. package/src/image/context.ts +0 -26
  194. package/src/image/index.ts +0 -15
  195. package/src/image/meta.ts +0 -131
  196. package/src/index.ts +0 -208
  197. package/src/input/Input.a11y.test.ts +0 -58
  198. package/src/input/Input.svelte +0 -505
  199. package/src/input/index.ts +0 -2
  200. package/src/input/meta.ts +0 -40
  201. package/src/input-number/InputNumber.a11y.test.ts +0 -43
  202. package/src/input-number/InputNumber.kbd.test.ts +0 -41
  203. package/src/input-number/InputNumber.svelte +0 -674
  204. package/src/input-number/InputNumberKbdFixture.svelte +0 -15
  205. package/src/input-number/index.ts +0 -2
  206. package/src/input-number/meta.ts +0 -65
  207. package/src/layout/Content.svelte +0 -37
  208. package/src/layout/Footer.svelte +0 -49
  209. package/src/layout/Header.svelte +0 -46
  210. package/src/layout/Layout.a11y.test.ts +0 -34
  211. package/src/layout/Layout.svelte +0 -60
  212. package/src/layout/LayoutA11yFixture.svelte +0 -21
  213. package/src/layout/Sider.svelte +0 -207
  214. package/src/layout/index.ts +0 -26
  215. package/src/layout/meta.ts +0 -116
  216. package/src/list/List.a11y.test.ts +0 -69
  217. package/src/list/List.bench.ts +0 -26
  218. package/src/list/List.kbd.test.ts +0 -71
  219. package/src/list/List.svelte +0 -920
  220. package/src/list/ListA11yFixture.svelte +0 -38
  221. package/src/list/ListBenchFixture.svelte +0 -22
  222. package/src/list/ListItem.svelte +0 -175
  223. package/src/list/ListKbdFixture.svelte +0 -31
  224. package/src/list/ListMeta.svelte +0 -73
  225. package/src/list/context.ts +0 -39
  226. package/src/list/index.ts +0 -21
  227. package/src/list/meta.ts +0 -99
  228. package/src/locale-provider/LocaleProvider.svelte +0 -110
  229. package/src/locale-provider/context.ts +0 -22
  230. package/src/locale-provider/index.ts +0 -21
  231. package/src/locale-provider/meta.ts +0 -93
  232. package/src/locale-provider/use-locale.ts +0 -25
  233. package/src/lottie-icon/LottieIcon.svelte +0 -330
  234. package/src/lottie-icon/index.ts +0 -9
  235. package/src/lottie-icon/meta.ts +0 -162
  236. package/src/menu/Menu.a11y.test.ts +0 -54
  237. package/src/menu/Menu.kbd.test.ts +0 -69
  238. package/src/menu/Menu.svelte +0 -762
  239. package/src/menu/MenuKbdFixture.svelte +0 -22
  240. package/src/menu/MenuPopupNode.svelte +0 -525
  241. package/src/menu/index.ts +0 -4
  242. package/src/menu/meta.ts +0 -137
  243. package/src/menu/types.ts +0 -120
  244. package/src/meta.test.ts +0 -173
  245. package/src/modal/ConfirmModal.svelte +0 -173
  246. package/src/modal/Modal.a11y.test.ts +0 -46
  247. package/src/modal/Modal.kbd.test.ts +0 -65
  248. package/src/modal/Modal.svelte +0 -511
  249. package/src/modal/ModalKbdFixture.svelte +0 -24
  250. package/src/modal/command.svelte.ts +0 -103
  251. package/src/modal/index.ts +0 -30
  252. package/src/modal/meta.ts +0 -165
  253. package/src/modal/z-stack.ts +0 -26
  254. package/src/notification/NotificationContainer.svelte +0 -192
  255. package/src/notification/NotificationItem.a11y.test.ts +0 -73
  256. package/src/notification/NotificationItem.svelte +0 -368
  257. package/src/notification/index.ts +0 -9
  258. package/src/notification/meta.ts +0 -120
  259. package/src/notification/store.ts +0 -191
  260. package/src/overflow-list/OverflowList.a11y.test.ts +0 -46
  261. package/src/overflow-list/OverflowList.kbd.test.ts +0 -34
  262. package/src/overflow-list/OverflowList.svelte +0 -539
  263. package/src/overflow-list/OverflowListA11yFixture.svelte +0 -22
  264. package/src/overflow-list/OverflowListKbdFixture.svelte +0 -21
  265. package/src/overflow-list/index.ts +0 -2
  266. package/src/overflow-list/meta.ts +0 -138
  267. package/src/pagination/Pagination.a11y.test.ts +0 -62
  268. package/src/pagination/Pagination.kbd.test.ts +0 -66
  269. package/src/pagination/Pagination.svelte +0 -428
  270. package/src/pagination/PaginationKbdFixture.svelte +0 -15
  271. package/src/pagination/index.ts +0 -2
  272. package/src/pagination/meta.ts +0 -73
  273. package/src/popconfirm/Popconfirm.a11y.test.ts +0 -46
  274. package/src/popconfirm/Popconfirm.kbd.test.ts +0 -42
  275. package/src/popconfirm/Popconfirm.svelte +0 -724
  276. package/src/popconfirm/PopconfirmA11yFixture.svelte +0 -34
  277. package/src/popconfirm/PopconfirmKbdFixture.svelte +0 -17
  278. package/src/popconfirm/index.ts +0 -2
  279. package/src/popconfirm/meta.ts +0 -200
  280. package/src/popover/Popover.a11y.test.ts +0 -58
  281. package/src/popover/Popover.kbd.test.ts +0 -42
  282. package/src/popover/Popover.svelte +0 -643
  283. package/src/popover/PopoverA11yFixture.svelte +0 -35
  284. package/src/popover/PopoverKbdFixture.svelte +0 -18
  285. package/src/popover/index.ts +0 -2
  286. package/src/popover/meta.ts +0 -103
  287. package/src/progress/Progress.a11y.test.ts +0 -37
  288. package/src/progress/Progress.svelte +0 -423
  289. package/src/progress/index.ts +0 -3
  290. package/src/progress/meta.ts +0 -132
  291. package/src/radio/Radio.svelte +0 -330
  292. package/src/radio/RadioGroup.a11y.test.ts +0 -43
  293. package/src/radio/RadioGroup.kbd.test.ts +0 -75
  294. package/src/radio/RadioGroup.svelte +0 -199
  295. package/src/radio/RadioGroupKbdFixture.svelte +0 -21
  296. package/src/radio/context.ts +0 -42
  297. package/src/radio/index.ts +0 -4
  298. package/src/radio/meta.ts +0 -68
  299. package/src/rating/Rating.a11y.test.ts +0 -41
  300. package/src/rating/Rating.kbd.test.ts +0 -48
  301. package/src/rating/Rating.svelte +0 -407
  302. package/src/rating/RatingKbdFixture.svelte +0 -15
  303. package/src/rating/index.ts +0 -2
  304. package/src/rating/meta.ts +0 -40
  305. package/src/resize-observer/ResizeObserver.svelte +0 -169
  306. package/src/resize-observer/action.ts +0 -80
  307. package/src/resize-observer/index.ts +0 -9
  308. package/src/resize-observer/meta.ts +0 -102
  309. package/src/scroll-list/ScrollColumn.svelte +0 -592
  310. package/src/scroll-list/ScrollList.svelte +0 -257
  311. package/src/scroll-list/index.ts +0 -4
  312. package/src/scroll-list/meta.ts +0 -93
  313. package/src/scroll-list/types.ts +0 -18
  314. package/src/select/Select.a11y.test.ts +0 -59
  315. package/src/select/Select.kbd.test.ts +0 -59
  316. package/src/select/Select.svelte +0 -1155
  317. package/src/select/SelectKbdFixture.svelte +0 -29
  318. package/src/select/index.ts +0 -3
  319. package/src/select/meta.ts +0 -78
  320. package/src/select/types.ts +0 -2
  321. package/src/side-sheet/SideSheet.a11y.test.ts +0 -53
  322. package/src/side-sheet/SideSheet.kbd.test.ts +0 -63
  323. package/src/side-sheet/SideSheet.svelte +0 -659
  324. package/src/side-sheet/SideSheetKbdFixture.svelte +0 -30
  325. package/src/side-sheet/index.ts +0 -2
  326. package/src/side-sheet/meta.ts +0 -116
  327. package/src/skeleton/Skeleton.a11y.test.ts +0 -35
  328. package/src/skeleton/Skeleton.svelte +0 -131
  329. package/src/skeleton/SkeletonAvatar.svelte +0 -82
  330. package/src/skeleton/SkeletonButton.svelte +0 -90
  331. package/src/skeleton/SkeletonImage.svelte +0 -100
  332. package/src/skeleton/SkeletonParagraph.svelte +0 -103
  333. package/src/skeleton/SkeletonTitle.svelte +0 -74
  334. package/src/skeleton/context.ts +0 -11
  335. package/src/skeleton/index.ts +0 -8
  336. package/src/skeleton/meta.ts +0 -65
  337. package/src/slider/Slider.a11y.test.ts +0 -44
  338. package/src/slider/Slider.kbd.test.ts +0 -74
  339. package/src/slider/Slider.svelte +0 -716
  340. package/src/slider/SliderKbdFixture.svelte +0 -21
  341. package/src/slider/index.ts +0 -2
  342. package/src/slider/meta.ts +0 -55
  343. package/src/space/Space.a11y.test.ts +0 -22
  344. package/src/space/Space.svelte +0 -109
  345. package/src/space/SpaceA11yFixture.svelte +0 -17
  346. package/src/space/index.ts +0 -2
  347. package/src/space/meta.ts +0 -27
  348. package/src/spin/Spin.a11y.test.ts +0 -29
  349. package/src/spin/Spin.svelte +0 -293
  350. package/src/spin/SpinA11yFixture.svelte +0 -18
  351. package/src/spin/index.ts +0 -2
  352. package/src/spin/meta.ts +0 -72
  353. package/src/steps/Steps.a11y.test.ts +0 -39
  354. package/src/steps/Steps.kbd.test.ts +0 -73
  355. package/src/steps/Steps.svelte +0 -392
  356. package/src/steps/StepsKbdFixture.svelte +0 -21
  357. package/src/steps/index.ts +0 -3
  358. package/src/steps/meta.ts +0 -59
  359. package/src/steps/types.ts +0 -8
  360. package/src/switch/Switch.a11y.test.ts +0 -46
  361. package/src/switch/Switch.kbd.test.ts +0 -40
  362. package/src/switch/Switch.svelte +0 -310
  363. package/src/switch/SwitchKbdFixture.svelte +0 -22
  364. package/src/switch/index.ts +0 -2
  365. package/src/switch/meta.ts +0 -44
  366. package/src/table/Table.a11y.test.ts +0 -70
  367. package/src/table/Table.bench.ts +0 -51
  368. package/src/table/Table.kbd.test.ts +0 -94
  369. package/src/table/Table.svelte +0 -2327
  370. package/src/table/TableKbdFixture.svelte +0 -35
  371. package/src/table/grid-nav.test.ts +0 -173
  372. package/src/table/grid-nav.ts +0 -146
  373. package/src/table/index.ts +0 -13
  374. package/src/table/meta.ts +0 -121
  375. package/src/table/types.ts +0 -133
  376. package/src/tabs/TabPane.svelte +0 -92
  377. package/src/tabs/Tabs.a11y.test.ts +0 -47
  378. package/src/tabs/Tabs.kbd.test.ts +0 -74
  379. package/src/tabs/Tabs.svelte +0 -1128
  380. package/src/tabs/TabsA11yFixture.svelte +0 -20
  381. package/src/tabs/TabsKbdFixture.svelte +0 -25
  382. package/src/tabs/context.ts +0 -43
  383. package/src/tabs/index.ts +0 -14
  384. package/src/tabs/meta.ts +0 -152
  385. package/src/tabs/types.ts +0 -6
  386. package/src/tag/Tag.a11y.test.ts +0 -33
  387. package/src/tag/Tag.svelte +0 -366
  388. package/src/tag/TagA11yFixture.svelte +0 -18
  389. package/src/tag/index.ts +0 -2
  390. package/src/tag/meta.ts +0 -92
  391. package/src/tag-input/TagInput.a11y.test.ts +0 -41
  392. package/src/tag-input/TagInput.svelte +0 -544
  393. package/src/tag-input/index.ts +0 -2
  394. package/src/tag-input/meta.ts +0 -43
  395. package/src/tag-input/reorder.test.ts +0 -59
  396. package/src/tag-input/reorder.ts +0 -41
  397. package/src/test-utils/LocaleHarness.svelte +0 -29
  398. package/src/test-utils/a11y.ts +0 -108
  399. package/src/test-utils/kbd.ts +0 -52
  400. package/src/textarea/TextArea.a11y.test.ts +0 -44
  401. package/src/textarea/TextArea.svelte +0 -420
  402. package/src/textarea/index.ts +0 -2
  403. package/src/textarea/meta.ts +0 -104
  404. package/src/time-picker/TimePicker.a11y.test.ts +0 -45
  405. package/src/time-picker/TimePicker.kbd.test.ts +0 -70
  406. package/src/time-picker/TimePicker.svelte +0 -1023
  407. package/src/time-picker/TimePickerKbdFixture.svelte +0 -23
  408. package/src/time-picker/index.ts +0 -2
  409. package/src/time-picker/meta.ts +0 -64
  410. package/src/timeline/Timeline.a11y.test.ts +0 -54
  411. package/src/timeline/Timeline.svelte +0 -599
  412. package/src/timeline/TimelineItem.svelte +0 -164
  413. package/src/timeline/context.ts +0 -28
  414. package/src/timeline/index.ts +0 -16
  415. package/src/timeline/meta.ts +0 -129
  416. package/src/timeline/types.ts +0 -9
  417. package/src/toast/Toast.a11y.test.ts +0 -67
  418. package/src/toast/ToastContainer.svelte +0 -184
  419. package/src/toast/ToastItem.svelte +0 -247
  420. package/src/toast/index.ts +0 -9
  421. package/src/toast/live-region.ts +0 -78
  422. package/src/toast/meta.ts +0 -95
  423. package/src/toast/store.ts +0 -187
  424. package/src/tooltip/Tooltip.a11y.test.ts +0 -41
  425. package/src/tooltip/Tooltip.kbd.test.ts +0 -37
  426. package/src/tooltip/Tooltip.svelte +0 -416
  427. package/src/tooltip/TooltipA11yFixture.svelte +0 -31
  428. package/src/tooltip/TooltipKbdFixture.svelte +0 -16
  429. package/src/tooltip/index.ts +0 -2
  430. package/src/tooltip/meta.ts +0 -59
  431. package/src/tooltip/placement.ts +0 -6
  432. package/src/transfer/Transfer.a11y.test.ts +0 -63
  433. package/src/transfer/Transfer.kbd.test.ts +0 -75
  434. package/src/transfer/Transfer.svelte +0 -1451
  435. package/src/transfer/TransferKbdFixture.svelte +0 -23
  436. package/src/transfer/group.test.ts +0 -55
  437. package/src/transfer/group.ts +0 -61
  438. package/src/transfer/index.ts +0 -3
  439. package/src/transfer/meta.ts +0 -55
  440. package/src/transfer/reorder.test.ts +0 -52
  441. package/src/transfer/reorder.ts +0 -42
  442. package/src/transfer/tree.test.ts +0 -44
  443. package/src/transfer/tree.ts +0 -52
  444. package/src/transfer/types.ts +0 -32
  445. package/src/tree/Tree.a11y.test.ts +0 -63
  446. package/src/tree/Tree.kbd.test.ts +0 -91
  447. package/src/tree/Tree.svelte +0 -1500
  448. package/src/tree/TreeKbdFixture.svelte +0 -30
  449. package/src/tree/index.ts +0 -3
  450. package/src/tree/meta.ts +0 -152
  451. package/src/tree-select/TreeSelect.a11y.test.ts +0 -52
  452. package/src/tree-select/TreeSelect.kbd.test.ts +0 -53
  453. package/src/tree-select/TreeSelect.svelte +0 -1611
  454. package/src/tree-select/TreeSelectKbdFixture.svelte +0 -20
  455. package/src/tree-select/index.ts +0 -3
  456. package/src/tree-select/meta.ts +0 -73
  457. package/src/tree-select/types.ts +0 -11
  458. package/src/tree-select/virtual.test.ts +0 -104
  459. package/src/typography/Link.svelte +0 -120
  460. package/src/typography/Paragraph.svelte +0 -92
  461. package/src/typography/Text.svelte +0 -93
  462. package/src/typography/Title.svelte +0 -91
  463. package/src/typography/Typography.a11y.test.ts +0 -34
  464. package/src/typography/TypographyA11yFixture.svelte +0 -27
  465. package/src/typography/TypographyBase.svelte +0 -807
  466. package/src/typography/index.ts +0 -16
  467. package/src/typography/meta.ts +0 -158
  468. package/src/upload/Upload.a11y.test.ts +0 -58
  469. package/src/upload/Upload.svelte +0 -1094
  470. package/src/upload/UploadA11yFixture.svelte +0 -23
  471. package/src/upload/index.ts +0 -3
  472. package/src/upload/meta.ts +0 -64
  473. package/src/upload/types.ts +0 -16
  474. package/src/virtual-list/VirtualList.svelte +0 -401
  475. package/src/virtual-list/index.ts +0 -2
  476. package/src/virtual-list/meta.ts +0 -106
@@ -1,132 +0,0 @@
1
- /**
2
- * Machine-readable component metadata for AI/docs consumption.
3
- * Progress — see specs/components/feedback/Progress.spec.md
4
- */
5
- export const meta = {
6
- name: 'Progress',
7
- category: 'feedback',
8
- description:
9
- '进度条:line/circle/dashboard 三形态,normal/success/error/warning 四态;percent 钳制到 0..100,showInfo/format 控制信息区,success 环形显示对勾(非颜色冗余信号),indeterminate 不确定进度循环动画;role=progressbar,受控 percent 不回写,仅 onComplete/onChange 通知。',
10
- exports: ['Progress'],
11
- props: [
12
- { name: 'percent', type: 'number', default: '0', desc: '受控进度,钳制到 0..100' },
13
- {
14
- name: 'type',
15
- type: "'line'|'circle'|'dashboard'",
16
- default: "'line'",
17
- desc: '形态',
18
- },
19
- {
20
- name: 'status',
21
- type: "'normal'|'success'|'error'|'warning'",
22
- default: "'normal'",
23
- desc: '语义状态',
24
- },
25
- { name: 'size', type: "'small'|'default'|'large'", default: "'default'" },
26
- {
27
- name: 'width',
28
- type: 'number',
29
- default: 'undefined',
30
- desc: 'circle/dashboard 直径 px,覆写 size',
31
- },
32
- { name: 'strokeWidth', type: 'number', default: 'undefined', desc: '笔触/条高 px 覆写' },
33
- {
34
- name: 'strokeLinecap',
35
- type: "'round'|'butt'|'square'",
36
- default: "'round'",
37
- desc: 'circle 端点形状',
38
- },
39
- { name: 'showInfo', type: 'boolean', default: 'true', desc: '是否显示信息区' },
40
- {
41
- name: 'format',
42
- type: '(percent: number, status: ProgressStatus) => string | null',
43
- default: 'undefined',
44
- desc: '自定义信息文本;返回 null 隐藏',
45
- },
46
- {
47
- name: 'indeterminate',
48
- type: 'boolean',
49
- default: 'false',
50
- desc: '不确定进度循环动画(纯 CSS)',
51
- },
52
- {
53
- name: 'gapDegree',
54
- type: 'number',
55
- default: 'dashboard 时 75,否则 0',
56
- desc: 'dashboard 开口角度',
57
- },
58
- {
59
- name: 'gapPosition',
60
- type: "'top'|'bottom'|'left'|'right'",
61
- default: "'bottom'",
62
- desc: '开口位置',
63
- },
64
- {
65
- name: 'successWhenFull',
66
- type: 'boolean',
67
- default: 'false',
68
- desc: '满 100 且 status=normal 时转 success',
69
- },
70
- {
71
- name: 'motion',
72
- type: 'boolean',
73
- default: 'true',
74
- desc: '过渡/循环动画,被 reduced-motion 覆盖',
75
- },
76
- { name: 'ariaLabel', type: 'string', default: 'undefined', desc: '无障碍标签' },
77
- {
78
- name: 'formatSnippet',
79
- type: 'Snippet<[{ percent: number; status: ProgressStatus }]>',
80
- default: 'undefined',
81
- desc: '信息区 snippet,优先于 format prop',
82
- },
83
- {
84
- name: 'onComplete',
85
- type: '(info: { percent: number }) => void',
86
- default: 'undefined',
87
- desc: 'percent 首达 100 触发一次',
88
- },
89
- {
90
- name: 'onChange',
91
- type: '(info: { percent: number }) => void',
92
- default: 'undefined',
93
- desc: 'percent 变更回调',
94
- },
95
- ],
96
- events: [
97
- { name: 'onComplete', desc: 'percent 首次到达 100' },
98
- { name: 'onChange', desc: 'percent 变化' },
99
- ],
100
- slots: [{ name: 'formatSnippet', desc: '自定义信息区内容(优先于 format prop)' }],
101
- a11y: {
102
- hasRole: true,
103
- focusable: false,
104
- note: 'role=progressbar + aria-valuemin/max=0/100 与 aria-valuenow/aria-valuetext;indeterminate 时省略 aria-valuenow 并设 aria-busy;circle success 显示对勾图标作为非颜色冗余信号(aria-hidden);不可聚焦不设 tabindex;reduced-motion 禁用过渡与循环动画。',
105
- },
106
- tokens: [
107
- '--cd-progress-track-color',
108
- '--cd-progress-stroke-normal',
109
- '--cd-progress-stroke-success',
110
- '--cd-progress-stroke-error',
111
- '--cd-progress-stroke-warning',
112
- '--cd-progress-info-color',
113
- '--cd-progress-info-success-color',
114
- '--cd-progress-height-small',
115
- '--cd-progress-height-default',
116
- '--cd-progress-height-large',
117
- '--cd-progress-circle-size-small',
118
- '--cd-progress-circle-size-default',
119
- '--cd-progress-circle-size-large',
120
- '--cd-progress-transition',
121
- ],
122
- responsive: false,
123
- examples: [
124
- { title: 'line 受控', code: '<Progress percent={percent} />' },
125
- { title: 'circle 带百分比', code: '<Progress type="circle" percent={75} />' },
126
- {
127
- title: 'dashboard',
128
- code: '<Progress type="dashboard" percent={60} status="warning" />',
129
- },
130
- { title: 'indeterminate', code: '<Progress indeterminate ariaLabel="加载中" />' },
131
- ],
132
- } as const;
@@ -1,330 +0,0 @@
1
- <!--
2
- Radio — see specs/components/input/Radio.spec.md
3
- Inside RadioGroup: role=radio via native input, roving tabindex.
4
- Standalone: self controlled / uncontrolled.
5
- -->
6
- <script lang="ts">
7
- import type { Snippet } from 'svelte';
8
- import { useId } from '@chenzy-design/core';
9
- import {
10
- getRadioGroupContext,
11
- type RadioValue,
12
- type RadioSize,
13
- type RadioStatus,
14
- type RadioType,
15
- } from './context.js';
16
-
17
- interface Props {
18
- value: RadioValue;
19
- checked?: boolean;
20
- defaultChecked?: boolean;
21
- disabled?: boolean;
22
- size?: RadioSize;
23
- status?: RadioStatus;
24
- type?: RadioType;
25
- name?: string;
26
- extra?: string | undefined;
27
- children?: Snippet;
28
- onChange?: (checked: boolean) => void;
29
- }
30
-
31
- let {
32
- value,
33
- checked = $bindable(),
34
- defaultChecked = false,
35
- disabled = false,
36
- size = 'default',
37
- status = 'default',
38
- type,
39
- name,
40
- extra,
41
- children,
42
- onChange,
43
- }: Props = $props();
44
-
45
- const group = getRadioGroupContext();
46
-
47
- const fieldId = useId('cd-radio-item');
48
- const extraId = $derived(extra ? `${fieldId}-extra` : undefined);
49
-
50
- const isControlled = $derived(checked !== undefined);
51
- let inner = $state(getInitialChecked());
52
-
53
- function getInitialChecked(): boolean {
54
- return defaultChecked;
55
- }
56
-
57
- const resolvedDisabled = $derived(disabled || (group ? group.getDisabled() : false));
58
- const resolvedSize = $derived(group ? group.getSize() : size);
59
- // Group transparently provides `status`; a per-item non-default `status` overrides it.
60
- const resolvedStatus = $derived(status !== 'default' ? status : (group?.getStatus() ?? 'default'));
61
- const resolvedName = $derived(group ? group.name : name);
62
- // type 优先取本项显式值,否则继承 Group,再退 default。
63
- const resolvedType = $derived<RadioType>(type ?? group?.getType() ?? 'default');
64
- // button/card/pureCard 用 role=radio 容器(非原生 input),其余用隐藏 input。
65
- const isFancy = $derived(resolvedType !== 'default');
66
-
67
- const isChecked = $derived(
68
- group ? group.getSelected() === value : isControlled ? !!checked : inner,
69
- );
70
-
71
- // roving tabindex: in a group only the tab stop is 0, else -1; standalone always 0
72
- const tabindex = $derived(group ? (group.isTabStop(value, resolvedDisabled) ? 0 : -1) : 0);
73
-
74
- function handleChange(e: Event & { currentTarget: HTMLInputElement }) {
75
- const next = e.currentTarget.checked;
76
- if (group) {
77
- group.select(value);
78
- onChange?.(true);
79
- return;
80
- }
81
- // Controlled (`checked=` / `bind:checked`): parent owns `checked`; propagate
82
- // only via `onChange`. Writing the prop AND firing `onChange` loops.
83
- // Uncontrolled: keep our own state in sync.
84
- if (!isControlled) inner = next;
85
- onChange?.(next);
86
- }
87
-
88
- function handleKeydown(e: KeyboardEvent) {
89
- group?.onKeydown(e, value);
90
- }
91
-
92
- // role=radio 容器(button/card 型):方向键交给 group,Space/Enter 选中本项。
93
- function handleFancyKeydown(e: KeyboardEvent) {
94
- if (resolvedDisabled) return;
95
- if (e.key === ' ' || e.key === 'Enter') {
96
- e.preventDefault();
97
- activate();
98
- return;
99
- }
100
- group?.onKeydown(e, value);
101
- }
102
-
103
- function handleFancyClick() {
104
- if (resolvedDisabled) return;
105
- activate();
106
- }
107
-
108
- // 选中本项(用于 role=radio 容器的点击/键盘),同 handleChange 的提交逻辑。
109
- function activate() {
110
- if (group) {
111
- group.select(value);
112
- onChange?.(true);
113
- return;
114
- }
115
- if (!isControlled) inner = true;
116
- onChange?.(true);
117
- }
118
-
119
- /** Register this radio's focusable element with the group for roving focus management. */
120
- function registerAttach(node: HTMLElement) {
121
- if (!group) return;
122
- // read deps so registration metadata stays current
123
- return group.register({ value, disabled: resolvedDisabled, el: node });
124
- }
125
-
126
- const cls = $derived(
127
- [
128
- 'cd-radio',
129
- `cd-radio--${resolvedSize}`,
130
- `cd-radio--${resolvedType}`,
131
- resolvedStatus !== 'default' && `cd-radio--${resolvedStatus}`,
132
- isChecked && 'cd-radio--checked',
133
- resolvedDisabled && 'cd-radio--disabled',
134
- ]
135
- .filter(Boolean)
136
- .join(' '),
137
- );
138
- </script>
139
-
140
- {#if isFancy}
141
- <!-- button/card/pureCard 型:role=radio 容器承载 aria-checked,参与 roving。 -->
142
- <div
143
- {@attach registerAttach}
144
- class={cls}
145
- role="radio"
146
- aria-checked={isChecked}
147
- aria-disabled={resolvedDisabled ? 'true' : undefined}
148
- aria-describedby={extraId}
149
- {tabindex}
150
- onclick={handleFancyClick}
151
- onkeydown={handleFancyKeydown}
152
- >
153
- {#if resolvedType !== 'pureCard'}
154
- <span class="cd-radio__circle" aria-hidden="true"></span>
155
- {/if}
156
- {#if children || extra}
157
- <span class="cd-radio__content">
158
- {#if children}<span class="cd-radio__label">{@render children()}</span>{/if}
159
- {#if extra}<span class="cd-radio__extra" id={extraId}>{extra}</span>{/if}
160
- </span>
161
- {/if}
162
- </div>
163
- {:else}
164
- <label class={cls} for={fieldId}>
165
- <input
166
- {@attach registerAttach}
167
- id={fieldId}
168
- class="cd-radio__input"
169
- type="radio"
170
- name={resolvedName}
171
- value={String(value)}
172
- checked={isChecked}
173
- disabled={resolvedDisabled}
174
- {tabindex}
175
- aria-describedby={extraId}
176
- onchange={handleChange}
177
- onkeydown={handleKeydown}
178
- />
179
- <span class="cd-radio__circle" aria-hidden="true"></span>
180
- {#if children || extra}
181
- <span class="cd-radio__content">
182
- {#if children}<span class="cd-radio__label">{@render children()}</span>{/if}
183
- {#if extra}<span class="cd-radio__extra" id={extraId}>{extra}</span>{/if}
184
- </span>
185
- {/if}
186
- </label>
187
- {/if}
188
-
189
- <style>
190
- .cd-radio {
191
- display: inline-flex;
192
- align-items: flex-start;
193
- gap: var(--cd-radio-label-gap);
194
- color: var(--cd-color-text-0);
195
- cursor: pointer;
196
- line-height: 1.4;
197
- }
198
- .cd-radio--disabled {
199
- cursor: not-allowed;
200
- opacity: 0.5;
201
- }
202
- .cd-radio__input {
203
- position: absolute;
204
- inline-size: 1px;
205
- block-size: 1px;
206
- padding: 0;
207
- margin: 0;
208
- overflow: hidden;
209
- clip-path: inset(50%);
210
- white-space: nowrap;
211
- border: 0;
212
- }
213
- .cd-radio__circle {
214
- position: relative;
215
- flex: 0 0 auto;
216
- inline-size: var(--cd-radio-size-default);
217
- block-size: var(--cd-radio-size-default);
218
- background: var(--cd-radio-bg);
219
- border: 1px solid var(--cd-radio-border);
220
- border-radius: var(--cd-radius-full);
221
- transition:
222
- border-color var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
223
- }
224
- .cd-radio--small .cd-radio__circle {
225
- inline-size: var(--cd-radio-size-small);
226
- block-size: var(--cd-radio-size-small);
227
- }
228
- .cd-radio--large .cd-radio__circle {
229
- inline-size: var(--cd-radio-size-large);
230
- block-size: var(--cd-radio-size-large);
231
- }
232
- .cd-radio--checked .cd-radio__circle {
233
- border-color: var(--cd-radio-color-checked);
234
- }
235
- .cd-radio--checked .cd-radio__circle::after {
236
- content: '';
237
- position: absolute;
238
- inset: 50%;
239
- inline-size: 50%;
240
- block-size: 50%;
241
- transform: translate(-50%, -50%);
242
- background: var(--cd-radio-dot-color);
243
- border-radius: var(--cd-radius-full);
244
- }
245
- /* 校验态:边框改用 warning/error,覆盖默认与 checked 描边(token 驱动) */
246
- .cd-radio--warning .cd-radio__circle {
247
- border-color: var(--cd-radio-color-warning);
248
- }
249
- .cd-radio--error .cd-radio__circle {
250
- border-color: var(--cd-radio-color-error);
251
- }
252
- .cd-radio__input:focus-visible + .cd-radio__circle {
253
- outline: none;
254
- box-shadow: var(--cd-focus-ring);
255
- }
256
- .cd-radio__content {
257
- display: inline-flex;
258
- flex-direction: column;
259
- gap: var(--cd-spacing-1);
260
- }
261
- .cd-radio__extra {
262
- color: var(--cd-color-text-2);
263
- font-size: var(--cd-font-size-1);
264
- }
265
- /* ---- button / card / pureCard 型:role=radio 容器 ---- */
266
- .cd-radio--button,
267
- .cd-radio--card,
268
- .cd-radio--pureCard {
269
- box-sizing: border-box;
270
- outline: none;
271
- }
272
- .cd-radio--button:focus-visible,
273
- .cd-radio--card:focus-visible,
274
- .cd-radio--pureCard:focus-visible {
275
- box-shadow: var(--cd-focus-ring);
276
- }
277
- /* button 型:矩形分段按钮,隐藏圆点 indicator */
278
- .cd-radio--button {
279
- gap: 0;
280
- block-size: var(--cd-radio-button-height);
281
- padding-inline: var(--cd-spacing-3);
282
- align-items: center;
283
- justify-content: center;
284
- color: var(--cd-color-text-0);
285
- background: var(--cd-radio-bg);
286
- border: 1px solid var(--cd-radio-border);
287
- border-radius: var(--cd-radius-2);
288
- }
289
- .cd-radio--button.cd-radio--small {
290
- block-size: var(--cd-radio-button-height-small);
291
- }
292
- .cd-radio--button.cd-radio--large {
293
- block-size: var(--cd-radio-button-height-large);
294
- }
295
- .cd-radio--button .cd-radio__circle {
296
- display: none;
297
- }
298
- .cd-radio--button.cd-radio--checked {
299
- color: var(--cd-radio-color-checked);
300
- border-color: var(--cd-radio-color-checked);
301
- }
302
- /* card / pureCard 型:带边框卡片,选中高亮边框 */
303
- .cd-radio--card,
304
- .cd-radio--pureCard {
305
- padding: var(--cd-spacing-3);
306
- background: var(--cd-radio-bg);
307
- border: 1px solid var(--cd-radio-border);
308
- border-radius: var(--cd-radio-card-radius);
309
- }
310
- .cd-radio--card.cd-radio--checked,
311
- .cd-radio--pureCard.cd-radio--checked {
312
- border-color: var(--cd-radio-card-border-checked);
313
- }
314
- .cd-radio--card.cd-radio--warning,
315
- .cd-radio--pureCard.cd-radio--warning,
316
- .cd-radio--button.cd-radio--warning {
317
- border-color: var(--cd-radio-color-warning);
318
- }
319
- .cd-radio--card.cd-radio--error,
320
- .cd-radio--pureCard.cd-radio--error,
321
- .cd-radio--button.cd-radio--error {
322
- border-color: var(--cd-radio-color-error);
323
- }
324
-
325
- @media (prefers-reduced-motion: reduce) {
326
- .cd-radio__circle {
327
- transition: none;
328
- }
329
- }
330
- </style>
@@ -1,43 +0,0 @@
1
- // RadioGroup a11y:role="radiogroup" 容器 + 多个 radio 选项(原生 input)。
2
- // 只断言静态 ARIA + axe 0 violations,不测方向键 roving(jsdom 限制)。
3
- import { describe, it, expect } from 'vitest';
4
- import { renderWithLocale, expectNoAxeViolations } from '../test-utils/a11y.js';
5
- import RadioGroup from './RadioGroup.svelte';
6
-
7
- const OPTIONS = [
8
- { label: 'Apple', value: 'apple' },
9
- { label: 'Banana', value: 'banana' },
10
- { label: 'Cherry', value: 'cherry', disabled: true },
11
- ];
12
-
13
- describe('RadioGroup a11y', () => {
14
- it('默认:role=radiogroup + ariaLabel + 多选项渲染,无 axe violations', async () => {
15
- const { container } = renderWithLocale(RadioGroup, {
16
- props: { ariaLabel: 'Fruit', options: OPTIONS },
17
- });
18
- const group = container.querySelector('[role="radiogroup"]');
19
- expect(group?.getAttribute('aria-label')).toBe('Fruit');
20
-
21
- const radios = container.querySelectorAll('input[type="radio"]');
22
- expect(radios.length).toBe(3);
23
- await expectNoAxeViolations(container);
24
- });
25
-
26
- it('选中态:value 命中的 radio 为 checked', async () => {
27
- const { container } = renderWithLocale(RadioGroup, {
28
- props: { ariaLabel: 'Fruit', options: OPTIONS, value: 'banana' },
29
- });
30
- const checked = container.querySelector('input[type="radio"]:checked') as HTMLInputElement | null;
31
- expect(checked?.value).toBe('banana');
32
- await expectNoAxeViolations(container);
33
- });
34
-
35
- it('禁用项:对应 radio 为 disabled', async () => {
36
- const { container } = renderWithLocale(RadioGroup, {
37
- props: { ariaLabel: 'Fruit', options: OPTIONS },
38
- });
39
- const disabled = container.querySelectorAll('input[type="radio"]:disabled');
40
- expect(disabled.length).toBe(1);
41
- await expectNoAxeViolations(container);
42
- });
43
- });
@@ -1,75 +0,0 @@
1
- // RadioGroup 键盘 e2e(browser project / 真实 chromium)。
2
- // WAI-ARIA radiogroup:roving tabindex + 方向键导航即选中(真实焦点)。
3
- // 测真实焦点移动 + 焦点即选中——jsdom 测不了(命令式 focus() 不可靠):
4
- // 1. roving 单停靠点:选中项 tabindex=0,其余 -1(默认 defaultValue=apple)。
5
- // 2. ↓→ 真实移动焦点到下一项,同时选中(checked + 停靠点同步)。
6
- // 3. wrap:末项再 → 回到首项(源码 moveTo 用模运算 wrap)。
7
- // 4. Home/End 跳首/末并选中。
8
- //
9
- // 真实焦点断言用 page locator 的 .toHaveFocus()。
10
- import { describe, it, expect } from 'vitest';
11
- import { page } from 'vitest/browser';
12
- import { renderKbdFixture, userEvent } from '../test-utils/kbd.js';
13
- import RadioGroupKbdFixture from './RadioGroupKbdFixture.svelte';
14
-
15
- function loc(el: Element) {
16
- return page.elementLocator(el);
17
- }
18
-
19
- describe('RadioGroup 键盘 e2e(radiogroup roving,焦点即选中)', () => {
20
- it('roving 单停靠点 + 方向键移动焦点即选中(wrap)+ Home/End', async () => {
21
- const { baseElement } = renderKbdFixture(RadioGroupKbdFixture);
22
-
23
- const radios = Array.from(
24
- baseElement.querySelectorAll<HTMLInputElement>('input[type="radio"]'),
25
- );
26
- expect(radios.length).toBe(3);
27
- const [apple, banana, cherry] = radios as [
28
- HTMLInputElement,
29
- HTMLInputElement,
30
- HTMLInputElement,
31
- ];
32
-
33
- // 1. roving 单停靠点:选中项(apple)tabindex=0,其余 -1。
34
- expect(radios.filter((el) => el.tabIndex === 0).length).toBe(1);
35
- expect(apple.tabIndex).toBe(0);
36
- expect(apple.checked).toBe(true);
37
-
38
- const before = baseElement.querySelector('[data-testid="before"]') as HTMLElement;
39
- before.focus();
40
- await expect.element(loc(before)).toHaveFocus();
41
- await userEvent.tab();
42
- await expect.element(loc(apple)).toHaveFocus();
43
-
44
- // 2. → 移动焦点到下一项,焦点即选中(checked + 停靠点同步)。
45
- await userEvent.keyboard('{ArrowRight}');
46
- await expect.element(loc(banana)).toHaveFocus();
47
- expect(banana.checked).toBe(true);
48
- expect(banana.tabIndex).toBe(0);
49
- expect(apple.tabIndex).toBe(-1);
50
- expect(apple.checked).toBe(false);
51
-
52
- // ↓ 同义于 →(垂直/水平统一)。
53
- await userEvent.keyboard('{ArrowDown}');
54
- await expect.element(loc(cherry)).toHaveFocus();
55
- expect(cherry.checked).toBe(true);
56
-
57
- // 3. wrap:末项再 → 回到首项并选中。
58
- await userEvent.keyboard('{ArrowRight}');
59
- await expect.element(loc(apple)).toHaveFocus();
60
- expect(apple.checked).toBe(true);
61
-
62
- // ← wrap 到末项。
63
- await userEvent.keyboard('{ArrowLeft}');
64
- await expect.element(loc(cherry)).toHaveFocus();
65
- expect(cherry.checked).toBe(true);
66
-
67
- // 4. Home/End 跳首/末并选中。
68
- await userEvent.keyboard('{Home}');
69
- await expect.element(loc(apple)).toHaveFocus();
70
- expect(apple.checked).toBe(true);
71
- await userEvent.keyboard('{End}');
72
- await expect.element(loc(cherry)).toHaveFocus();
73
- expect(cherry.checked).toBe(true);
74
- });
75
- });