@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,102 +0,0 @@
1
- <!--
2
- Collapse.Panel — 声明式单面板,与数据驱动 panels 渲染同一套 .cd-collapse__item 结构,
3
- 从而复用父 Collapse 的 grid 展开动画、箭头位置、边框等全部 CSS,无需在父级建挂载 registry。
4
- 父子状态经 context.ts 传递(参考 Timeline.Item / Form.Field):
5
- 展开态判断(isActive/shouldRender)为父级纯派生函数,本组件只读不写(红线 #2);
6
- 点击 header 调父 toggle,受控时仅 onChange 不回写(红线 #1,在父级落实)。
7
- -->
8
- <script lang="ts">
9
- import type { Snippet } from 'svelte';
10
- import { getCollapseContext } from './context.js';
11
-
12
- interface Props {
13
- /** 面板唯一标识,等价数据驱动 panel.key。 */
14
- itemKey: string;
15
- /** 头部文本。 */
16
- header?: string;
17
- /** 面板级 disabled:该面板不可展开/收起。 */
18
- disabled?: boolean;
19
- /** 头部富内容插槽,优先于 header 文本。 */
20
- head?: Snippet;
21
- /** 头部右侧额外内容(不触发展开/收起),可为字符串或 Snippet。 */
22
- extra?: Snippet | string;
23
- /** 是否显示箭头区域,默认 true。 */
24
- showArrow?: boolean;
25
- children?: Snippet;
26
- }
27
-
28
- let { itemKey, header, disabled = false, head, extra, showArrow = true, children }: Props = $props();
29
-
30
- const ctx = getCollapseContext();
31
-
32
- // 展开态由父派生(纯函数),跨 context 读 getter 保持响应性。
33
- const active = $derived(ctx?.isActive(itemKey) ?? false);
34
- // 面板不可用 = 父整体 disabled 或本面板 disabled。
35
- const itemDisabled = $derived((ctx?.getDisabled() ?? false) || disabled);
36
- const render = $derived(ctx?.shouldRender(itemKey) ?? true);
37
-
38
- const idBase = $derived(ctx?.getIdBase() ?? 'cd-collapse');
39
- const headerId = $derived(`${idBase}-h-${itemKey}`);
40
- const regionId = $derived(`${idBase}-r-${itemKey}`);
41
- const headingLevel = $derived(ctx?.getHeadingLevel() ?? 3);
42
- // roving tabindex 由父派生(红线 #2:本组件只读不写父级 $state)。
43
- const tabindex = $derived(ctx?.headerTabindex(itemKey, disabled) ?? 0);
44
- const expandIcon = $derived(ctx?.getExpandIcon());
45
- </script>
46
-
47
- <div class="cd-collapse__item" class:cd-collapse__item--active={active}>
48
- <!-- APG Accordion:Header 触发器外层 role=heading + aria-level。 -->
49
- <span role="heading" aria-level={headingLevel} class="cd-collapse__heading">
50
- <button
51
- type="button"
52
- id={headerId}
53
- class="cd-collapse__header"
54
- data-collapse-key={itemKey}
55
- aria-expanded={active}
56
- aria-controls={regionId}
57
- aria-disabled={itemDisabled || undefined}
58
- disabled={itemDisabled || undefined}
59
- {tabindex}
60
- onclick={(e) => ctx?.headerClick(e, itemKey, disabled)}
61
- onkeydown={(e) => ctx?.onHeaderKeydown(e, itemKey)}
62
- onfocus={() => ctx?.onHeaderFocus(itemKey)}
63
- >
64
- {#if showArrow}
65
- {#if expandIcon}
66
- <span class="cd-collapse__arrow" class:cd-collapse__arrow--open={active} aria-hidden="true">
67
- {@render expandIcon({ isExpanded: active })}
68
- </span>
69
- {:else}
70
- <span class="cd-collapse__arrow" class:cd-collapse__arrow--open={active} aria-hidden="true">
71
- <svg viewBox="0 0 16 16" width="12" height="12" focusable="false">
72
- <path fill="currentColor" d="M6 4l4 4-4 4V4Z" />
73
- </svg>
74
- </span>
75
- {/if}
76
- {/if}
77
- <span class="cd-collapse__title">
78
- {#if head}{@render head()}{:else}{header}{/if}
79
- </span>
80
- {#if extra !== undefined}
81
- <span class="cd-collapse__extra" onclick={(e) => e.stopPropagation()} role="none">
82
- {#if typeof extra === 'string'}{extra}{:else}{@render extra()}{/if}
83
- </span>
84
- {/if}
85
- </button>
86
- </span>
87
- <div
88
- id={regionId}
89
- class="cd-collapse__region"
90
- role="region"
91
- aria-labelledby={headerId}
92
- hidden={!active}
93
- >
94
- <div class="cd-collapse__region-inner">
95
- <div class="cd-collapse__content">
96
- {#if render}
97
- {@render children?.()}
98
- {/if}
99
- </div>
100
- </div>
101
- </div>
102
- </div>
@@ -1,54 +0,0 @@
1
- import { getContext, setContext } from 'svelte';
2
- import type { Snippet } from 'svelte';
3
-
4
- export type CollapseSize = 'small' | 'default' | 'large';
5
- export type CollapseIconPosition = 'left' | 'right';
6
-
7
- /**
8
- * 父 Collapse 向声明式 <Collapse.Panel> 暴露的上下文。
9
- * 全部用 getter 跨 context 边界保持对父 prop / 展开态变化的响应性
10
- * (直接读快照会冻结初始值)。
11
- * 红线 #2: isActive / shouldRender 为纯派生函数,render 期只读不写。
12
- */
13
- export interface CollapseContext {
14
- /** 该 key 当前是否展开(受控读 prop、非受控读本地 set,均由父派生)。 */
15
- isActive: (key: string) => boolean;
16
- /** 该 key 内容是否应渲染(lazyRender / keepDOM 策略)。 */
17
- shouldRender: (key: string) => boolean;
18
- /** 点击 header 切换展开态;panelDisabled 为该面板自身 disabled。 */
19
- toggle: (key: string, panelDisabled?: boolean) => void;
20
- /**
21
- * Header 点击入口:先发 on:headerClick(埋点,disabled 拦截前),再 toggle。
22
- * 声明式 <Collapse.Panel> 的 header onclick 应调此,保证 headerClick 事件统一从父发出。
23
- */
24
- headerClick: (event: MouseEvent, key: string, panelDisabled?: boolean) => void;
25
- /** 父级整体 disabled。 */
26
- getDisabled: () => boolean;
27
- getSize: () => CollapseSize;
28
- getIconPosition: () => CollapseIconPosition;
29
- /** header/region id 前缀,用于 aria 关联。 */
30
- getIdBase: () => string;
31
- /** Header role=heading 的 aria-level。 */
32
- getHeadingLevel: () => number;
33
- /**
34
- * roving tabindex(纯派生):焦点 Header / 首个未禁用 Header 为 0,其余 -1。
35
- * 红线 #2:render 期只读,不写父级 $state。
36
- */
37
- headerTabindex: (key: string, panelDisabled?: boolean) => 0 | -1;
38
- /** Header keydown:↑↓ roving + Home/End(命令式 focus(),非 render 期)。 */
39
- onHeaderKeydown: (event: KeyboardEvent, key: string) => void;
40
- /** Header 获得焦点时同步 focusedKey。 */
41
- onHeaderFocus: (key: string) => void;
42
- /** 自定义展开图标 Snippet,参数为 {isExpanded};undefined 时渲染默认箭头 SVG。 */
43
- getExpandIcon: () => Snippet<[{ isExpanded: boolean }]> | undefined;
44
- }
45
-
46
- const KEY = Symbol('cd-collapse');
47
-
48
- export function setCollapseContext(ctx: CollapseContext): void {
49
- setContext(KEY, ctx);
50
- }
51
-
52
- export function getCollapseContext(): CollapseContext | undefined {
53
- return getContext<CollapseContext | undefined>(KEY);
54
- }
@@ -1,17 +0,0 @@
1
- import Collapse_ from './Collapse.svelte';
2
- import CollapsePanelComponent from './CollapsePanel.svelte';
3
-
4
- export const Collapse: typeof Collapse_ & {
5
- Panel: typeof CollapsePanelComponent;
6
- } = Object.assign(Collapse_, { Panel: CollapsePanelComponent });
7
-
8
- export { CollapsePanelComponent };
9
- export { meta as collapseMeta } from './meta.js';
10
- export type { CollapsePanel } from './types.js';
11
- export {
12
- getCollapseContext,
13
- setCollapseContext,
14
- type CollapseContext,
15
- type CollapseSize,
16
- type CollapseIconPosition,
17
- } from './context.js';
@@ -1,79 +0,0 @@
1
- /**
2
- * Machine-readable component metadata for AI/docs consumption.
3
- * See specs/00-foundation/ai-friendly.spec.md.
4
- */
5
- export const meta = {
6
- name: 'Collapse',
7
- category: 'show',
8
- description:
9
- '折叠面板,分组承载内容、按需展开。支持数据驱动 panels 与声明式 <Collapse.Panel> 两种用法(择一)、受控 activeKey、accordion 手风琴、展开动画、箭头位置、边框与面板级 disabled。',
10
- props: [
11
- {
12
- name: 'panels',
13
- type: 'CollapsePanel[]',
14
- default: '[]',
15
- desc: '面板头部数据(数据驱动模式;为空且传 children 时切换为声明式 <Collapse.Panel>)',
16
- },
17
- {
18
- name: 'activeKey',
19
- type: 'string|string[]',
20
- default: 'undefined',
21
- desc: '受控展开键,仅 onChange 不回写',
22
- },
23
- { name: 'defaultActiveKey', type: 'string|string[]', default: 'undefined' },
24
- { name: 'accordion', type: 'boolean', default: 'false', desc: '手风琴模式,仅展开一个' },
25
- { name: 'size', type: "'small'|'default'|'large'", default: 'default' },
26
- { name: 'expandIconPosition', type: "'left'|'right'", default: 'right' },
27
- { name: 'bordered', type: 'boolean', default: 'true' },
28
- { name: 'disabled', type: 'boolean', default: 'false' },
29
- { name: 'motion', type: 'boolean', default: 'true', desc: '展开动画开关' },
30
- { name: 'lazyRender', type: 'boolean', default: 'false', desc: '首次展开后才渲染内容' },
31
- { name: 'keepDOM', type: 'boolean', default: 'true', desc: '展开过的内容保留 DOM' },
32
- { name: 'onChange', type: '(keys: string[]) => void', default: 'undefined' },
33
- { name: 'onExpand', type: '(detail: { key: string }) => void', default: 'undefined', desc: '某面板被展开后触发' },
34
- { name: 'onCollapse', type: '(detail: { key: string }) => void', default: 'undefined', desc: '某面板被收起后触发' },
35
- {
36
- name: 'onHeaderClick',
37
- type: '(detail: { key: string; event: MouseEvent }) => void',
38
- default: 'undefined',
39
- desc: 'Header 被点击触发(disabled 拦截前发出,可用于埋点)',
40
- },
41
- {
42
- name: 'children',
43
- type: 'Snippet<[{ key: string }]> | Snippet',
44
- default: 'undefined',
45
- desc: '数据驱动:按 key 渲染面板内容;声明式(不传 panels):内嵌 <Collapse.Panel> 列表',
46
- },
47
- ],
48
- subcomponents: [
49
- {
50
- name: 'Collapse.Panel',
51
- desc: '声明式单面板,经 Object.assign(Collapse, { Panel }) 导出,父子状态用 context 传递(同 Timeline.Item / Form.Field 复合模式)。等价于 panels 数据驱动的一项,可放富内容头部/内容。',
52
- props: [
53
- { name: 'itemKey', type: 'string', default: '(required)', desc: '面板唯一标识,等价 panel.key' },
54
- { name: 'header', type: 'string', default: 'undefined', desc: '头部文本' },
55
- { name: 'disabled', type: 'boolean', default: 'false', desc: '面板级 disabled,该面板不可展开/收起' },
56
- { name: 'head', type: 'Snippet', default: 'undefined', desc: '头部富内容插槽,优先于 header' },
57
- { name: 'children', type: 'Snippet', default: 'undefined', desc: '面板内容' },
58
- ],
59
- },
60
- ],
61
- a11y: {
62
- role: 'region',
63
- keyboard: ['Tab', 'Enter', 'Space'],
64
- notes: [
65
- '面板头为原生 button,aria-expanded 标记展开态',
66
- 'button aria-controls 指向内容 region,region aria-labelledby 指回头部',
67
- '折叠时内容区 hidden 移出可达性树',
68
- '箭头 aria-hidden=true',
69
- ],
70
- },
71
- tokens: [
72
- '--cd-collapse-*',
73
- '--cd-focus-ring',
74
- '--cd-radius-1',
75
- '--cd-spacing-2',
76
- '--cd-motion-ease-standard',
77
- '--cd-color-text-3',
78
- ],
79
- } as const;
@@ -1,5 +0,0 @@
1
- export interface CollapsePanel {
2
- key: string;
3
- header: string;
4
- disabled?: boolean;
5
- }
@@ -1,60 +0,0 @@
1
- // ColorPicker a11y:inline 面板 role=group;saturation/hue/alpha 滑块 role=slider;
2
- // presets role=listbox/option;trigger 模式按钮 aria-haspopup/aria-expanded,需 ariaLabel 提供可访问名。
3
- // 浮层不 portal,渲染在 root 容器内,故扫 container(参照 Modal 但无需扫 body)。
4
- import { describe, it, expect } from 'vitest';
5
- import { renderWithLocale, expectNoAxeViolations } from '../test-utils/a11y.js';
6
- import ColorPicker from './ColorPicker.svelte';
7
-
8
- describe('ColorPicker a11y', () => {
9
- it('inline:role=group 面板 + 滑块 role=slider + presets listbox/option,无 axe violations', async () => {
10
- const { container } = renderWithLocale(ColorPicker, {
11
- props: { inline: true, defaultValue: '#3370ff', alpha: true, presets: ['#ff0000', '#00ff00'] },
12
- });
13
- const panel = container.querySelector('[role="group"]');
14
- expect(panel).not.toBeNull();
15
- expect(panel?.getAttribute('aria-label')).toBeTruthy();
16
-
17
- // saturation / hue / alpha 三个 slider,均有 aria-label + aria-valuenow。
18
- const sliders = container.querySelectorAll('[role="slider"]');
19
- expect(sliders.length).toBeGreaterThanOrEqual(3);
20
- sliders.forEach((s) => {
21
- expect(s.getAttribute('aria-label')).toBeTruthy();
22
- expect(s.getAttribute('aria-valuenow')).not.toBeNull();
23
- });
24
-
25
- // presets:listbox + option,可访问名/选中态。
26
- const listbox = container.querySelector('[role="listbox"]');
27
- expect(listbox).not.toBeNull();
28
- expect(listbox?.getAttribute('aria-label')).toBeTruthy();
29
- const options = container.querySelectorAll('[role="option"]');
30
- expect(options.length).toBe(2);
31
- expect(options[0]?.getAttribute('aria-label')).toBeTruthy();
32
-
33
- await expectNoAxeViolations(container);
34
- });
35
-
36
- it('trigger 模式(关闭态):trigger 按钮 aria-haspopup=dialog / aria-expanded=false / ariaLabel 可访问名', async () => {
37
- const { container } = renderWithLocale(ColorPicker, {
38
- props: { ariaLabel: 'Pick brand color', defaultValue: '#3370ff' },
39
- });
40
- const trigger = container.querySelector('.cd-color-picker__trigger');
41
- expect(trigger?.getAttribute('aria-haspopup')).toBe('dialog');
42
- expect(trigger?.getAttribute('aria-expanded')).toBe('false');
43
- expect(trigger?.getAttribute('aria-label')).toBe('Pick brand color');
44
- await expectNoAxeViolations(container);
45
- });
46
-
47
- it('trigger 模式(打开态):role=dialog 面板渲染于容器内,aria-expanded=true,无 axe violations', async () => {
48
- const { container } = renderWithLocale(ColorPicker, {
49
- props: { ariaLabel: 'Background color', open: true, defaultValue: '#112233' },
50
- });
51
- const trigger = container.querySelector('.cd-color-picker__trigger');
52
- expect(trigger?.getAttribute('aria-expanded')).toBe('true');
53
- // 浮层非 portal:直接在 root 容器内查询。
54
- const dialog = container.querySelector('[role="dialog"]');
55
- expect(dialog).not.toBeNull();
56
- expect(dialog?.getAttribute('aria-label')).toBe('Background color');
57
- expect(container.querySelectorAll('[role="slider"]').length).toBeGreaterThanOrEqual(2);
58
- await expectNoAxeViolations(container);
59
- });
60
- });
@@ -1,73 +0,0 @@
1
- // ColorPicker 键盘 e2e(browser project / 真实 chromium)。
2
- // 测浮层 focus-trap 的真实焦点行为——jsdom 测不了(焦点模型不完整):
3
- // 1. 点 trigger 打开后焦点进入面板内首个可聚焦控件(饱和度 slider)。
4
- // 2. Tab 循环被困在面板内:Tab 到最后一个再 Tab 回第一个;Shift+Tab 反向。
5
- // 3. Esc 关闭后焦点归还触发元素(trigger)。
6
- //
7
- // ColorPicker 浮层「非 portal」:面板渲染在 .cd-color-picker 根容器内,
8
- // 故在 fixture container 范围内查 [role=dialog](不在 document 查)。
9
- import { describe, it, expect, vi } from 'vitest';
10
- import { page } from 'vitest/browser';
11
- import { renderKbdFixture, userEvent } from '../test-utils/kbd.js';
12
- import ColorPickerKbdFixture from './ColorPickerKbdFixture.svelte';
13
-
14
- function loc(el: Element) {
15
- return page.elementLocator(el);
16
- }
17
-
18
- function focusablesIn(panel: HTMLElement) {
19
- return Array.from(
20
- panel.querySelectorAll<HTMLElement>(
21
- 'a[href],button:not([disabled]),textarea:not([disabled]),input:not([disabled]),select:not([disabled]),[tabindex]:not([tabindex="-1"])',
22
- ),
23
- ).filter((el) => el.offsetParent !== null);
24
- }
25
-
26
- describe('ColorPicker 键盘 e2e(focus trap)', () => {
27
- it('打开后焦点进入面板首控件;Tab 循环困在面板内;Esc 关闭后焦点归还 trigger', async () => {
28
- const { container } = renderKbdFixture(ColorPickerKbdFixture);
29
-
30
- // trigger 是 ColorPicker 自带按钮(非 portal,在 container 内)。
31
- // 该按钮尺寸来自 CSS token(测试环境未加载组件 token 样式表,故渲染为 0×0,
32
- // userEvent.click 的可见性门槛过不去)。改用原生 focus()+click():先聚焦使其成为
33
- // 焦点归还锚点(focus-trap activate 时记录的 previouslyFocused),再触发打开。
34
- const trigger = container.querySelector('.cd-color-picker__trigger') as HTMLButtonElement;
35
- expect(trigger).not.toBeNull();
36
- trigger.focus();
37
- await expect.element(loc(trigger)).toHaveFocus();
38
- trigger.click();
39
-
40
- // 浮层非 portal —— 在 container 范围查面板(role=dialog)。
41
- // click 触发的 open 状态更新→重渲染是异步的,轮询等面板出现。
42
- await vi.waitFor(() => {
43
- const p = container.querySelector('[role="dialog"]');
44
- expect(p).not.toBeNull();
45
- });
46
- const panel = container.querySelector('[role="dialog"]') as HTMLElement;
47
- await expect.element(loc(panel)).toBeInTheDocument();
48
-
49
- // 1. 焦点进入面板内(focus-trap activate 聚焦首个可聚焦控件)。
50
- expect(panel.contains(document.activeElement)).toBe(true);
51
-
52
- const focusables = focusablesIn(panel);
53
- expect(focusables.length).toBeGreaterThan(1);
54
- const first = focusables[0]!;
55
- const last = focusables[focusables.length - 1]!;
56
-
57
- // 2a. 焦点移到最后一个,再 Tab → 循环回第一个(被困住,不逃出面板)。
58
- last.focus();
59
- await expect.element(loc(last)).toHaveFocus();
60
- await userEvent.tab();
61
- await expect.element(loc(first)).toHaveFocus();
62
- expect(panel.contains(document.activeElement)).toBe(true);
63
-
64
- // 2b. Shift+Tab 从第一个 → 循环回最后一个。
65
- await userEvent.tab({ shift: true });
66
- await expect.element(loc(last)).toHaveFocus();
67
- expect(panel.contains(document.activeElement)).toBe(true);
68
-
69
- // 3. Esc 关闭 —— focus-trap deactivate 把焦点归还 trigger。
70
- await userEvent.keyboard('{Escape}');
71
- await expect.element(loc(trigger)).toHaveFocus();
72
- });
73
- });