@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
package/src/menu/types.ts DELETED
@@ -1,120 +0,0 @@
1
- import type { Snippet } from 'svelte';
2
-
3
- /** Menu 项键类型。 */
4
- export type MenuKey = string | number;
5
-
6
- /** 普通菜单项;含 children 即为可展开的 SubMenu。 */
7
- export interface MenuItemNode {
8
- /** 非分隔符/分组时无需 type,默认即普通项;显式可写 'item' */
9
- type?: 'item';
10
- key: MenuKey;
11
- label: string;
12
- disabled?: boolean;
13
- /** 项前自定义图标 */
14
- icon?: Snippet;
15
- children?: MenuItemDef[];
16
- /**
17
- * 链接地址。仅 navigation 用途生效:叶子项渲染为原生 `<a href>` 走站点导航语义;
18
- * menu 用途(默认命令式菜单)忽略此字段,叶子仍为 button + onClick。
19
- */
20
- href?: string;
21
- /** 链接 target(如 '_blank');仅 navigation + href 渲染 `<a>` 时透传。 */
22
- target?: string;
23
- /** 链接 rel(如 'noopener noreferrer');仅 navigation + href 渲染 `<a>` 时透传。 */
24
- rel?: string;
25
- }
26
-
27
- /**
28
- * 分隔符项:渲染为一条水平分隔线,不可选不可聚焦(role=separator)。
29
- * 无需 key/label;为避免 #each 缺 key 警告,渲染时按索引生成兜底 key。
30
- */
31
- export interface MenuDividerNode {
32
- type: 'divider';
33
- key?: MenuKey;
34
- }
35
-
36
- /**
37
- * 分组项:渲染为不可点击的组标题 + 其下始终展开的菜单项。
38
- * 区别于 SubMenu(可展开/收起)——group 是始终展开的分区标题。
39
- */
40
- export interface MenuGroupNode {
41
- type: 'group';
42
- key?: MenuKey;
43
- /** 分组标题文案 */
44
- label: string;
45
- children: MenuItemDef[];
46
- }
47
-
48
- /**
49
- * Menu 数据项。向后兼容:普通项可省略 type;
50
- * 通过 type='divider' / type='group' 扩展分隔符与分组标题。
51
- */
52
- export type MenuItemDef = MenuItemNode | MenuDividerNode | MenuGroupNode;
53
-
54
- /** 类型守卫:分隔符项。 */
55
- export function isDivider(item: MenuItemDef): item is MenuDividerNode {
56
- return (item as MenuDividerNode).type === 'divider';
57
- }
58
-
59
- /** 类型守卫:分组项。 */
60
- export function isGroup(item: MenuItemDef): item is MenuGroupNode {
61
- return (item as MenuGroupNode).type === 'group';
62
- }
63
-
64
- /**
65
- * Menu 用途(语义区分):
66
- * - 'menu'(默认):命令式菜单,执行操作。容器 role=menu/menubar,
67
- * 叶子 role=menuitem(多选 menuitemcheckbox),button + onClick,roving 键盘。
68
- * - 'navigation':站点导航。容器为 nav landmark(无 menu role),
69
- * 含 href 的叶子渲染原生 `<a href>`,沿用浏览器原生链接 + Tab 键序,不用 menuitem role。
70
- */
71
- export type MenuPurpose = 'menu' | 'navigation';
72
-
73
- /** 容器 ARIA 角色集合,由 purpose + mode 纯函数派生(红线 #2)。 */
74
- export interface MenuSemantics {
75
- /** 是否为 navigation 用途(原生链接语义)。 */
76
- navigation: boolean;
77
- /** 最外层 ul 的 role;navigation 下为 undefined(用原生 list 语义 + nav landmark 包裹)。 */
78
- listRole: 'menu' | 'menubar' | undefined;
79
- /** 叶子项控件 role;navigation 下为 undefined(原生 a/button 语义)。 */
80
- leafRole: 'menuitem' | 'menuitemcheckbox' | undefined;
81
- /** SubMenu 标题控件 role;navigation 下为 undefined。 */
82
- submenuTitleRole: 'menuitem' | undefined;
83
- /** 内嵌/浮层子列表 role;navigation 下为 undefined。 */
84
- subListRole: 'menu' | undefined;
85
- /** 分组/分隔等结构 li 的 role(none);navigation 下为 undefined(原生 li)。 */
86
- structuralRole: 'none' | undefined;
87
- /** group 子列表 role;navigation 下为 undefined。 */
88
- groupListRole: 'group' | undefined;
89
- }
90
-
91
- /**
92
- * 纯函数:据 purpose + mode + multiple 派生容器/项的 ARIA 角色。
93
- * 无副作用、不读 DOM/registry(红线 #2)。
94
- */
95
- export function deriveMenuSemantics(
96
- purpose: MenuPurpose,
97
- mode: 'vertical' | 'inline' | 'horizontal',
98
- multiple: boolean,
99
- ): MenuSemantics {
100
- if (purpose === 'navigation') {
101
- return {
102
- navigation: true,
103
- listRole: undefined,
104
- leafRole: undefined,
105
- submenuTitleRole: undefined,
106
- subListRole: undefined,
107
- structuralRole: undefined,
108
- groupListRole: undefined,
109
- };
110
- }
111
- return {
112
- navigation: false,
113
- listRole: mode === 'horizontal' ? 'menubar' : 'menu',
114
- leafRole: multiple ? 'menuitemcheckbox' : 'menuitem',
115
- submenuTitleRole: 'menuitem',
116
- subListRole: 'menu',
117
- structuralRole: 'none',
118
- groupListRole: 'group',
119
- };
120
- }
package/src/meta.test.ts DELETED
@@ -1,173 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { meta as buttonMeta } from './button/meta.js';
3
- import { meta as iconMeta } from './icon/meta.js';
4
- import { meta as dividerMeta } from './divider/meta.js';
5
- import { meta as spaceMeta } from './space/meta.js';
6
- import { meta as typographyMeta } from './typography/meta.js';
7
- import { meta as gridMeta } from './grid/meta.js';
8
- import { meta as layoutMeta } from './layout/meta.js';
9
- import { meta as inputMeta } from './input/meta.js';
10
- import { meta as textareaMeta } from './textarea/meta.js';
11
- import { meta as switchMeta } from './switch/meta.js';
12
- import { meta as checkboxMeta } from './checkbox/meta.js';
13
- import { meta as radioMeta } from './radio/meta.js';
14
- import { meta as inputNumberMeta } from './input-number/meta.js';
15
- import { meta as ratingMeta } from './rating/meta.js';
16
- import { meta as sliderMeta } from './slider/meta.js';
17
- import { meta as formMeta } from './form/meta.js';
18
- import { meta as selectMeta } from './select/meta.js';
19
- import { meta as autocompleteMeta } from './autocomplete/meta.js';
20
- import { meta as tagInputMeta } from './tag-input/meta.js';
21
- import { meta as colorPickerMeta } from './color-picker/meta.js';
22
- import { meta as datePickerMeta } from './date-picker/meta.js';
23
- import { meta as timePickerMeta } from './time-picker/meta.js';
24
- import { meta as cascaderMeta } from './cascader/meta.js';
25
- import { meta as treeSelectMeta } from './tree-select/meta.js';
26
- import { meta as transferMeta } from './transfer/meta.js';
27
- import { meta as uploadMeta } from './upload/meta.js';
28
- import { meta as breadcrumbMeta } from './breadcrumb/meta.js';
29
- import { meta as paginationMeta } from './pagination/meta.js';
30
- import { meta as stepsMeta } from './steps/meta.js';
31
- import { meta as tabsMeta } from './tabs/meta.js';
32
- import { meta as dropdownMeta } from './dropdown/meta.js';
33
- import { meta as menuMeta } from './menu/meta.js';
34
- import { meta as anchorMeta } from './anchor/meta.js';
35
- import { meta as tagMeta } from './tag/meta.js';
36
- import { meta as avatarMeta } from './avatar/meta.js';
37
- import { meta as badgeMeta } from './badge/meta.js';
38
- import { meta as cardMeta } from './card/meta.js';
39
- import { meta as tooltipMeta } from './tooltip/meta.js';
40
- import { meta as popoverMeta } from './popover/meta.js';
41
- import { meta as emptyMeta } from './empty/meta.js';
42
- import { meta as descriptionsMeta } from './descriptions/meta.js';
43
- import { meta as collapseMeta } from './collapse/meta.js';
44
- import { meta as timelineMeta } from './timeline/meta.js';
45
- import { meta as listMeta } from './list/meta.js';
46
- import { meta as imageMeta } from './image/meta.js';
47
- import { meta as highlightMeta } from './highlight/meta.js';
48
- import { meta as virtualListMeta } from './virtual-list/meta.js';
49
- import { meta as carouselMeta } from './carousel/meta.js';
50
- import { meta as treeMeta } from './tree/meta.js';
51
- import { meta as tableMeta } from './table/meta.js';
52
- import { meta as calendarMeta } from './calendar/meta.js';
53
- import { meta as scrollListMeta } from './scroll-list/meta.js';
54
- import { meta as overflowListMeta } from './overflow-list/meta.js';
55
- import { meta as spinMeta } from './spin/meta.js';
56
- import { meta as progressMeta } from './progress/meta.js';
57
- import { meta as skeletonMeta } from './skeleton/meta.js';
58
- import { meta as bannerMeta } from './banner/meta.js';
59
- import { meta as modalMeta } from './modal/meta.js';
60
- import { meta as popconfirmMeta } from './popconfirm/meta.js';
61
- import { meta as drawerMeta } from './drawer/meta.js';
62
- import { meta as sideSheetMeta } from './side-sheet/meta.js';
63
- import { meta as toastMeta } from './toast/meta.js';
64
- import { meta as notificationMeta } from './notification/meta.js';
65
- import { meta as backTopMeta } from './back-top/meta.js';
66
- import { meta as localeProviderMeta } from './locale-provider/meta.js';
67
- import { meta as configProviderMeta } from './config-provider/meta.js';
68
- import { meta as resizeObserverMeta } from './resize-observer/meta.js';
69
- import { meta as lottieIconMeta } from './lottie-icon/meta.js';
70
-
71
- const metas = {
72
- buttonMeta,
73
- iconMeta,
74
- dividerMeta,
75
- spaceMeta,
76
- typographyMeta,
77
- gridMeta,
78
- layoutMeta,
79
- inputMeta,
80
- textareaMeta,
81
- switchMeta,
82
- checkboxMeta,
83
- radioMeta,
84
- inputNumberMeta,
85
- ratingMeta,
86
- sliderMeta,
87
- formMeta,
88
- selectMeta,
89
- autocompleteMeta,
90
- tagInputMeta,
91
- colorPickerMeta,
92
- datePickerMeta,
93
- timePickerMeta,
94
- cascaderMeta,
95
- treeSelectMeta,
96
- transferMeta,
97
- uploadMeta,
98
- breadcrumbMeta,
99
- paginationMeta,
100
- stepsMeta,
101
- tabsMeta,
102
- dropdownMeta,
103
- menuMeta,
104
- anchorMeta,
105
- tagMeta,
106
- avatarMeta,
107
- badgeMeta,
108
- cardMeta,
109
- tooltipMeta,
110
- popoverMeta,
111
- emptyMeta,
112
- descriptionsMeta,
113
- collapseMeta,
114
- timelineMeta,
115
- listMeta,
116
- imageMeta,
117
- highlightMeta,
118
- virtualListMeta,
119
- carouselMeta,
120
- treeMeta,
121
- tableMeta,
122
- calendarMeta,
123
- scrollListMeta,
124
- overflowListMeta,
125
- spinMeta,
126
- progressMeta,
127
- skeletonMeta,
128
- bannerMeta,
129
- modalMeta,
130
- popconfirmMeta,
131
- drawerMeta,
132
- sideSheetMeta,
133
- toastMeta,
134
- notificationMeta,
135
- backTopMeta,
136
- localeProviderMeta,
137
- configProviderMeta,
138
- resizeObserverMeta,
139
- lottieIconMeta,
140
- };
141
-
142
- type PropEntry = { name?: string; type?: string };
143
-
144
- /** collect prop entries from either a flat `props` or aggregated `subComponents[].props` */
145
- function allProps(m: Record<string, unknown>): PropEntry[] {
146
- if (Array.isArray(m.props)) return m.props as PropEntry[];
147
- if (Array.isArray(m.subComponents)) {
148
- return (m.subComponents as Array<{ props?: PropEntry[] }>).flatMap(
149
- (sc) => sc.props ?? [],
150
- );
151
- }
152
- return [];
153
- }
154
-
155
- describe('component metadata', () => {
156
- it.each(Object.entries(metas))('%s is well-formed', (_name, m) => {
157
- expect(m.name).toBeTruthy();
158
- expect(['basic', 'input', 'navigation', 'show', 'feedback', 'other']).toContain(
159
- m.category,
160
- );
161
- expect(m.description).toBeTruthy();
162
- expect(allProps(m).length).toBeGreaterThan(0);
163
- });
164
-
165
- it('every prop entry has name and type', () => {
166
- for (const m of Object.values(metas)) {
167
- for (const p of allProps(m)) {
168
- expect(p.name, `${m.name} prop`).toBeTruthy();
169
- expect(p.type, `${m.name}.${p.name} type`).toBeTruthy();
170
- }
171
- }
172
- });
173
- });
@@ -1,173 +0,0 @@
1
- <!--
2
- ConfirmModal — 命令式 modal.confirm/info/... 的渲染外壳。
3
- 包装基础 Modal,加类型图标 + 标题/内容;onOk 返回 Promise 时自动 confirmLoading,
4
- resolve 后关闭、reject 复位保持打开。仅供 command.ts mount 使用,不在 barrel 暴露为组件。
5
- -->
6
- <script lang="ts">
7
- import type { Snippet } from 'svelte';
8
- import { Modal } from './index.js';
9
- import { Button } from '../button/index.js';
10
- import { useLocale } from '../locale-provider/index.js';
11
-
12
- type ConfirmType = 'confirm' | 'info' | 'success' | 'warning' | 'error';
13
-
14
- interface Props {
15
- type?: ConfirmType;
16
- title?: string;
17
- content?: string;
18
- okText?: string;
19
- cancelText?: string;
20
- /** confirm 显示取消按钮;info/success/warning/error 默认单按钮 */
21
- showCancel?: boolean;
22
- width?: number | string;
23
- centered?: boolean;
24
- zIndex?: number;
25
- /** 返回 Promise 时自动 loading,resolve 关闭 / reject 复位 */
26
- onOk?: () => void | Promise<unknown>;
27
- onCancel?: () => void;
28
- /** 关闭动画结束后由宿主卸载用 */
29
- onClose?: () => void;
30
- /** 自定义图标(Snippet),覆盖内置类型图标 */
31
- icon?: Snippet;
32
- }
33
-
34
- let {
35
- type = 'confirm',
36
- title,
37
- content,
38
- okText,
39
- cancelText,
40
- showCancel = type === 'confirm',
41
- width = 416,
42
- centered = true,
43
- zIndex,
44
- onOk,
45
- onCancel,
46
- onClose,
47
- icon,
48
- }: Props = $props();
49
-
50
- const loc = useLocale();
51
-
52
- let open = $state(true);
53
- let loading = $state(false);
54
-
55
- const okType = $derived<'primary' | 'danger'>(
56
- type === 'error' || type === 'warning' ? 'danger' : 'primary',
57
- );
58
-
59
- function close() {
60
- open = false;
61
- // 静态显示无动画,关闭后下一微任务通知宿主卸载
62
- queueMicrotask(() => onClose?.());
63
- }
64
-
65
- async function handleOk() {
66
- if (loading) return;
67
- const result = onOk?.();
68
- if (result instanceof Promise) {
69
- loading = true;
70
- try {
71
- await result;
72
- close();
73
- } catch {
74
- loading = false; // reject:复位,保持打开
75
- }
76
- } else {
77
- close();
78
- }
79
- }
80
-
81
- function handleCancel() {
82
- onCancel?.();
83
- close();
84
- }
85
- </script>
86
-
87
- <div class="cd-confirm-modal" style={zIndex !== undefined ? `--cd-modal-z:${zIndex}` : undefined}>
88
- <Modal
89
- {open}
90
- title={title ?? ''}
91
- {width}
92
- {centered}
93
- closable={false}
94
- maskClosable={false}
95
- confirmLoading={loading}
96
- onOk={handleOk}
97
- onCancel={handleCancel}
98
- >
99
- {#snippet footer()}
100
- {#if showCancel}
101
- <Button onclick={handleCancel} disabled={loading}>
102
- {cancelText ?? loc().t('Modal.cancelText')}
103
- </Button>
104
- {/if}
105
- <Button type={okType} loading={loading} onclick={handleOk}>
106
- {okText ?? loc().t('Modal.okText')}
107
- </Button>
108
- {/snippet}
109
- <div class="cd-confirm-modal__body">
110
- <span class="cd-confirm-modal__icon cd-confirm-modal__icon--{type}" aria-hidden="true">
111
- {#if icon}
112
- {@render icon()}
113
- {:else if type === 'success'}
114
- <svg width="22" height="22" viewBox="0 0 16 16" fill="none">
115
- <circle cx="8" cy="8" r="7" stroke="currentColor" stroke-width="1.5" />
116
- <path d="M5 8.2 7 10.2 11 5.8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
117
- </svg>
118
- {:else if type === 'error'}
119
- <svg width="22" height="22" viewBox="0 0 16 16" fill="none">
120
- <circle cx="8" cy="8" r="7" stroke="currentColor" stroke-width="1.5" />
121
- <path d="M5.5 5.5 10.5 10.5M10.5 5.5 5.5 10.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
122
- </svg>
123
- {:else if type === 'warning' || type === 'confirm'}
124
- <svg width="22" height="22" viewBox="0 0 16 16" fill="none">
125
- <path d="M8 2 1.5 13.5h13L8 2Z" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round" />
126
- <path d="M8 6.3v3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
127
- <circle cx="8" cy="11.4" r="0.85" fill="currentColor" />
128
- </svg>
129
- {:else}
130
- <svg width="22" height="22" viewBox="0 0 16 16" fill="none">
131
- <circle cx="8" cy="8" r="7" stroke="currentColor" stroke-width="1.5" />
132
- <path d="M8 7.2v4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
133
- <circle cx="8" cy="4.7" r="0.9" fill="currentColor" />
134
- </svg>
135
- {/if}
136
- </span>
137
- {#if content}
138
- <p class="cd-confirm-modal__content">{content}</p>
139
- {/if}
140
- </div>
141
- </Modal>
142
- </div>
143
-
144
- <style>
145
- .cd-confirm-modal__body {
146
- display: flex;
147
- gap: var(--cd-spacing-3);
148
- align-items: flex-start;
149
- }
150
- .cd-confirm-modal__icon {
151
- display: inline-flex;
152
- flex-shrink: 0;
153
- line-height: 1;
154
- }
155
- .cd-confirm-modal__icon--success {
156
- color: var(--cd-color-success);
157
- }
158
- .cd-confirm-modal__icon--error {
159
- color: var(--cd-color-danger);
160
- }
161
- .cd-confirm-modal__icon--warning,
162
- .cd-confirm-modal__icon--confirm {
163
- color: var(--cd-color-warning);
164
- }
165
- .cd-confirm-modal__icon--info {
166
- color: var(--cd-color-primary);
167
- }
168
- .cd-confirm-modal__content {
169
- margin: 0;
170
- color: var(--cd-color-text-1);
171
- line-height: 1.6;
172
- }
173
- </style>
@@ -1,46 +0,0 @@
1
- // Modal a11y 试点:复杂浮层组件(portal 到 body、focus-trap、scroll-lock)。
2
- // 验证复杂组件能在 jsdom 渲染 + axe 扫描通过。
3
- //
4
- // 注意:本套件不测真实焦点移动/focus-trap 行为(jsdom 焦点模型不完整),
5
- // 只断言静态 ARIA(role=dialog / aria-modal / aria-labelledby)+ axe 0 violations。
6
- // Modal 用 use:portal 把面板 appendChild 到 document.body,故扫描 document.body。
7
- import { describe, it, expect } from 'vitest';
8
- import { renderWithLocale, expectNoAxeViolations } from '../test-utils/a11y.js';
9
- import Modal from './Modal.svelte';
10
-
11
- describe('Modal a11y', () => {
12
- it('open + title:role=dialog / aria-modal / aria-labelledby,无 axe violations', async () => {
13
- renderWithLocale(Modal, {
14
- props: { open: true, title: 'Delete item' },
15
- });
16
-
17
- // portal 到 body —— 在 document 全局查询而非 container。
18
- const dialog = document.querySelector('[role="dialog"]') as HTMLElement | null;
19
- expect(dialog).not.toBeNull();
20
- expect(dialog?.getAttribute('aria-modal')).toBe('true');
21
-
22
- // 有 title 时用 aria-labelledby 指向标题 h2,且该 id 存在。
23
- const labelledby = dialog?.getAttribute('aria-labelledby');
24
- expect(labelledby).toBeTruthy();
25
- const titleEl = labelledby ? document.getElementById(labelledby) : null;
26
- expect(titleEl?.textContent).toContain('Delete item');
27
-
28
- // 默认 footer 的 ok/cancel 文案来自 en_US locale(验证 LocaleProvider 管线)。
29
- const closeBtn = document.querySelector('.cd-modal__close') as HTMLElement | null;
30
- expect(closeBtn?.getAttribute('aria-label')).toBeTruthy();
31
-
32
- await expectNoAxeViolations(document.body);
33
- });
34
-
35
- it('无 title + ariaLabel:role=dialog 用 aria-label 提供可访问名', async () => {
36
- renderWithLocale(Modal, {
37
- props: { open: true, ariaLabel: 'Settings dialog', closable: false, footer: null },
38
- });
39
-
40
- const dialog = document.querySelector('[role="dialog"]') as HTMLElement | null;
41
- expect(dialog?.getAttribute('aria-label')).toBe('Settings dialog');
42
- expect(dialog?.getAttribute('aria-labelledby')).toBeNull();
43
-
44
- await expectNoAxeViolations(document.body);
45
- });
46
- });
@@ -1,65 +0,0 @@
1
- // Modal 键盘 e2e(browser project / 真实 chromium)。
2
- // 测 focus-trap 的真实焦点行为——jsdom 完全测不了(焦点模型不完整):
3
- // 1. 打开 Modal 后焦点进入对话框内(首个可聚焦元素)。
4
- // 2. Tab 循环被困在 Modal 内:Tab 到最后一个可聚焦元素后再 Tab 回到第一个;
5
- // Shift+Tab 从第一个回到最后一个。
6
- // 3. 关闭后焦点归还触发元素(trigger 按钮)。
7
- //
8
- // 真实焦点断言用 page locator 的 .toHaveFocus()(对真实 document.activeElement 重试断言)。
9
- import { describe, it, expect } from 'vitest';
10
- import { page } from 'vitest/browser';
11
- import { renderKbdFixture, userEvent } from '../test-utils/kbd.js';
12
- import ModalKbdFixture from './ModalKbdFixture.svelte';
13
-
14
- // 把任意 DOM 元素包成可断言焦点的 locator。
15
- function loc(el: Element) {
16
- return page.elementLocator(el);
17
- }
18
-
19
- describe('Modal 键盘 e2e(focus trap)', () => {
20
- it('打开后焦点进入对话框;Tab 循环困在 Modal 内;关闭后焦点归还 trigger', async () => {
21
- const { baseElement } = renderKbdFixture(ModalKbdFixture);
22
-
23
- // 先聚焦 trigger,再点击打开(点击会先聚焦该按钮,作为归还焦点的锚点)。
24
- const trigger = baseElement.querySelector('[data-testid="trigger"]') as HTMLButtonElement;
25
- expect(trigger).not.toBeNull();
26
- await userEvent.click(trigger);
27
-
28
- // Modal portal 到 body —— 在 document 范围查询对话框。
29
- const dialog = document.querySelector('[role="dialog"]') as HTMLElement;
30
- expect(dialog).not.toBeNull();
31
-
32
- // 1. 焦点进入对话框内(首个可聚焦元素,焦点陷阱 activate 时聚焦它)。
33
- await expect.element(loc(dialog)).toBeInTheDocument();
34
- // activeElement 落在对话框内部(而非 trigger 或 body)。
35
- expect(dialog.contains(document.activeElement)).toBe(true);
36
-
37
- // 收集对话框内所有可聚焦元素,按 DOM 顺序(焦点陷阱用同一选择器循环)。
38
- const focusables = Array.from(
39
- dialog.querySelectorAll<HTMLElement>(
40
- 'a[href],button:not([disabled]),textarea:not([disabled]),input:not([disabled]),select:not([disabled]),[tabindex]:not([tabindex="-1"])',
41
- ),
42
- ).filter((el) => el.offsetParent !== null);
43
- expect(focusables.length).toBeGreaterThan(1);
44
- const first = focusables[0]!;
45
- const last = focusables[focusables.length - 1]!;
46
-
47
- // 2a. 把焦点移到最后一个可聚焦元素,再 Tab → 焦点循环回第一个(被困住,不逃出 Modal)。
48
- last.focus();
49
- await expect.element(loc(last)).toHaveFocus();
50
- await userEvent.tab();
51
- await expect.element(loc(first)).toHaveFocus();
52
- // 焦点没逃到 trigger(仍在对话框内)。
53
- expect(dialog.contains(document.activeElement)).toBe(true);
54
-
55
- // 2b. Shift+Tab 从第一个 → 循环回最后一个。
56
- await userEvent.tab({ shift: true });
57
- await expect.element(loc(last)).toHaveFocus();
58
- expect(dialog.contains(document.activeElement)).toBe(true);
59
-
60
- // 3. Esc 关闭(keyboard=true 默认)—— focus-trap deactivate 把焦点归还 trigger。
61
- await userEvent.keyboard('{Escape}');
62
- const triggerLoc = baseElement.querySelector('[data-testid="trigger"]') as HTMLElement;
63
- await expect.element(loc(triggerLoc)).toHaveFocus();
64
- });
65
- });