@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,359 +0,0 @@
1
- <!--
2
- Anchor — see specs/components/navigation/Anchor.spec.md
3
- 基础子集: vertical 链接列表、scroll-spy 激活高亮、点击平滑滚动、ink 滑块。
4
- 受控/非受控 (红线 #1: 不回写 value, 仅 onChange)。
5
- scroll-spy (红线 #3): $effect 内命令式 addEventListener('scroll'),rAF 节流,
6
- 在事件回调里读 getBoundingClientRect (非 render 期),cleanup 移除监听 + 取消 rAF。
7
- ink 用激活链接的 CSS 左边框 (border-inline-start),不 JS 测 DOM 定位。
8
- affix: position:sticky 吸顶(inset-block-start = offsetTop)。
9
- updateHash: 激活变更时写 location.hash(replaceState,不触发额外滚动/历史堆栈)。
10
- targetOffset: 点击滚动的独立偏移,缺省继承 offsetTop。
11
- getContainer: 自定义滚动容器(缺省 window)。提供时监听该容器 scroll,
12
- 几何按容器视口换算(target.top - container.top),点击滚动该容器(红线 #3)。
13
- horizontal: 水平模式,链接横排,ink 走底部下划线(border-block-end)。
14
- 多级嵌套: link.children 形成树形。渲染用递归 snippet(renderList),每深一层
15
- 的子列表向内缩进一级(--cd-anchor-indent,逐层累加),rail 只在顶层一条。
16
- scroll-spy 命令式遍历扁平化树(flatten 纯函数派生 flatLinks),父子链接皆可
17
- 点击跳转 + 滚动高亮。无 children 时行为与平铺链接完全一致(向后兼容)。
18
- -->
19
- <script lang="ts">
20
- import type { AnchorLink } from './types.js';
21
- import { nextRovingIndex, rovingKeyFromEvent } from '@chenzy-design/core';
22
- import { useLocale } from '../locale-provider/index.js';
23
-
24
- interface Props {
25
- links?: AnchorLink[];
26
- value?: string;
27
- defaultValue?: string;
28
- offsetTop?: number;
29
- bounds?: number;
30
- showInk?: boolean;
31
- scrollMotion?: boolean;
32
- /** position:sticky 吸顶 */
33
- affix?: boolean;
34
- /** 激活变更时写 location.hash */
35
- updateHash?: boolean;
36
- /** 点击滚动的独立偏移(缺省继承 offsetTop) */
37
- targetOffset?: number;
38
- /** 自定义滚动容器;缺省监听/滚动 window */
39
- getContainer?: () => HTMLElement | null;
40
- /** 水平模式:链接横排,ink 走底部下划线 */
41
- horizontal?: boolean;
42
- onChange?: (key: string) => void;
43
- ariaLabel?: string;
44
- }
45
-
46
- let {
47
- links = [],
48
- value,
49
- defaultValue,
50
- offsetTop = 0,
51
- bounds = 5,
52
- showInk = true,
53
- scrollMotion = true,
54
- affix = false,
55
- updateHash = false,
56
- targetOffset,
57
- getContainer,
58
- horizontal = false,
59
- onChange,
60
- ariaLabel,
61
- }: Props = $props();
62
-
63
- const loc = useLocale();
64
-
65
- // 深度优先扁平化嵌套链接树(纯函数,红线 #2)。scroll-spy 与初始激活
66
- // 计算只关心全部叶/枝链接的线性集合,与渲染的树形结构解耦。
67
- function flatten(items: AnchorLink[]): AnchorLink[] {
68
- const out: AnchorLink[] = [];
69
- for (const item of items) {
70
- out.push(item);
71
- if (item.children?.length) out.push(...flatten(item.children));
72
- }
73
- return out;
74
- }
75
- const flatLinks = $derived<AnchorLink[]>(flatten(links));
76
-
77
- function getInitialActive(): string {
78
- return defaultValue ?? flatten(links)[0]?.key ?? '';
79
- }
80
-
81
- // --- 受控 value (红线 #1): 不回写 value, 仅 onChange ---
82
- const isControlled = $derived(value !== undefined);
83
- let innerActive = $state<string>(getInitialActive());
84
- const activeKey = $derived<string>(isControlled ? (value ?? '') : innerActive);
85
-
86
- function setActive(key: string) {
87
- if (key === activeKey) return;
88
- if (!isControlled) innerActive = key;
89
- onChange?.(key);
90
- }
91
-
92
- // updateHash:把激活链接的 href(#id)写入 location.hash。
93
- // 用 replaceState 避免污染历史堆栈与触发浏览器原生跳转滚动。
94
- function writeHash(href: string) {
95
- if (!updateHash || typeof window === 'undefined') return;
96
- if (!href.startsWith('#')) return;
97
- history.replaceState(null, '', href);
98
- }
99
-
100
- // getContainer 提供时几何以容器视口为参照系(target.top - container.top),
101
- // 缺省时参照系为浏览器视口顶部(0),即原 window 行为。命令式读取,非 render 期。
102
- function getReferenceTop(): number {
103
- const container = getContainer?.();
104
- return container ? container.getBoundingClientRect().top : 0;
105
- }
106
-
107
- // 命令式读取目标元素并算出当前激活 key(在事件回调里调用,非 render 期)。
108
- function computeActiveKey(): string {
109
- const refTop = getReferenceTop();
110
- let best = '';
111
- let bestTop = -Infinity;
112
- // 遍历扁平化后的全部链接(含嵌套子链接),父子皆参与 scroll-spy。
113
- for (const link of flatLinks) {
114
- const el = document.querySelector(link.href);
115
- if (!el) continue;
116
- // 相对滚动容器视口顶部的偏移。
117
- const top = el.getBoundingClientRect().top - refTop;
118
- // 已滚过顶部阈值的 section 里取最接近阈值的那个。
119
- if (top <= offsetTop + bounds && top > bestTop) {
120
- bestTop = top;
121
- best = link.key;
122
- }
123
- }
124
- // 没有任何 section 越过阈值时,回退到第一个链接。
125
- if (best === '') best = flatLinks[0]?.key ?? '';
126
- return best;
127
- }
128
-
129
- function prefersReducedMotion(): boolean {
130
- return (
131
- typeof window !== 'undefined' &&
132
- window.matchMedia('(prefers-reduced-motion: reduce)').matches
133
- );
134
- }
135
-
136
- // --- scroll-spy (红线 #3): $effect 内命令式监听 + rAF 节流 ---
137
- // 监听目标:getContainer() 返回的元素(缺省 window)。读取 getContainer 使其
138
- // 变更时 effect 重订阅。
139
- $effect(() => {
140
- if (typeof window === 'undefined') return;
141
- const target: HTMLElement | Window = getContainer?.() ?? window;
142
- let frame = 0;
143
-
144
- function onScroll() {
145
- if (frame) return;
146
- frame = requestAnimationFrame(() => {
147
- frame = 0;
148
- setActive(computeActiveKey());
149
- });
150
- }
151
-
152
- target.addEventListener('scroll', onScroll, { passive: true });
153
- // 初始算一次。
154
- onScroll();
155
-
156
- return () => {
157
- target.removeEventListener('scroll', onScroll);
158
- if (frame) cancelAnimationFrame(frame);
159
- };
160
- });
161
-
162
- function handleClick(e: MouseEvent, link: AnchorLink) {
163
- e.preventDefault();
164
- activateLink(link);
165
- }
166
-
167
- // 滚动 + setActive + writeHash 主体(与 handleClick 解耦,供 Space 键复用,无 event)。
168
- function activateLink(link: AnchorLink) {
169
- const el = document.querySelector(link.href);
170
- if (el) {
171
- const smooth = scrollMotion && !prefersReducedMotion();
172
- const offset = targetOffset ?? offsetTop;
173
- const container = getContainer?.();
174
- if (container) {
175
- // 滚动量 = 目标相对容器视口顶部的偏移 - offset,叠加容器当前滚动位置。
176
- const delta =
177
- el.getBoundingClientRect().top -
178
- container.getBoundingClientRect().top -
179
- offset;
180
- container.scrollTo({
181
- top: container.scrollTop + delta,
182
- behavior: smooth ? 'smooth' : 'auto',
183
- });
184
- } else {
185
- const top = el.getBoundingClientRect().top + window.scrollY - offset;
186
- window.scrollTo({ top, behavior: smooth ? 'smooth' : 'auto' });
187
- }
188
- }
189
- setActive(link.key);
190
- writeHash(link.href);
191
- }
192
-
193
- // --- roving tabindex(a11y §6):链接列表为单一 Tab 停靠点。 ---
194
- // rootEl 普通引用,命令式 focus() 用(非 render 期)。
195
- let rootEl = $state<HTMLElement | null>(null);
196
- // 当前焦点链接 key;null = 尚无焦点 -> 首链接作为 Tab 停靠点。
197
- let focusedKey = $state<string | null>(null);
198
-
199
- // 纯派生 tabindex:焦点链接(或无焦点时的首链接)为 0,其余 -1。
200
- // 不在 render 期写 $state(红线 #2)。
201
- function linkTabindex(key: string): 0 | -1 {
202
- return (focusedKey ?? flatLinks[0]?.key) === key ? 0 : -1;
203
- }
204
-
205
- // 链接 keydown:方向键 roving(纯函数 nextRovingIndex 派生)、Home/End 跳首尾、
206
- // Space 显式激活(原生 <a> 不响应 Space)。Enter 交给原生 <a> 点击(向后兼容)。
207
- function onLinkKeydown(e: KeyboardEvent, link: AnchorLink) {
208
- const intent = rovingKeyFromEvent(e.key);
209
- if (intent) {
210
- e.preventDefault();
211
- const idx = flatLinks.findIndex((l) => l.key === link.key);
212
- const next = nextRovingIndex(idx, flatLinks.length, intent, false);
213
- const nextKey = flatLinks[next]?.key;
214
- if (nextKey != null) {
215
- focusedKey = nextKey;
216
- rootEl
217
- ?.querySelector<HTMLElement>(`[data-anchor-key="${CSS.escape(nextKey)}"]`)
218
- ?.focus();
219
- }
220
- return;
221
- }
222
- if (e.key === 'Home' || e.key === 'End') {
223
- e.preventDefault();
224
- const nextKey = (e.key === 'Home' ? flatLinks[0] : flatLinks[flatLinks.length - 1])
225
- ?.key;
226
- if (nextKey != null) {
227
- focusedKey = nextKey;
228
- rootEl
229
- ?.querySelector<HTMLElement>(`[data-anchor-key="${CSS.escape(nextKey)}"]`)
230
- ?.focus();
231
- }
232
- return;
233
- }
234
- if (e.key === ' ') {
235
- e.preventDefault();
236
- activateLink(link);
237
- }
238
- }
239
- </script>
240
-
241
- <nav
242
- bind:this={rootEl}
243
- class="cd-anchor"
244
- class:cd-anchor--no-ink={!showInk}
245
- class:cd-anchor--affix={affix}
246
- class:cd-anchor--horizontal={horizontal}
247
- style={affix ? `inset-block-start:${offsetTop}px` : undefined}
248
- aria-label={ariaLabel ?? loc().t('Anchor.ariaLabel')}
249
- >
250
- {@render renderList(links, 0)}
251
- </nav>
252
-
253
- {#snippet renderList(items: AnchorLink[], level: number)}
254
- <ul class="cd-anchor__list">
255
- {#each items as link (link.key)}
256
- {@const active = link.key === activeKey}
257
- <li class="cd-anchor__item">
258
- <a
259
- class="cd-anchor__link cd-anchor__link--level-{level}"
260
- class:cd-anchor__link--active={active}
261
- href={link.href}
262
- aria-current={active ? 'location' : undefined}
263
- tabindex={linkTabindex(link.key)}
264
- data-anchor-key={link.key}
265
- onclick={(e) => handleClick(e, link)}
266
- onkeydown={(e) => onLinkKeydown(e, link)}
267
- onfocus={() => {
268
- focusedKey = link.key;
269
- }}
270
- >
271
- {link.title}
272
- </a>
273
- {#if link.children?.length}
274
- {@render renderList(link.children, level + 1)}
275
- {/if}
276
- </li>
277
- {/each}
278
- </ul>
279
- {/snippet}
280
-
281
- <style>
282
- .cd-anchor {
283
- display: block;
284
- }
285
- .cd-anchor--affix {
286
- position: sticky;
287
- inset-block-start: 0;
288
- }
289
- .cd-anchor__list {
290
- margin: 0;
291
- padding: 0;
292
- list-style: none;
293
- border-inline-start: 1px solid var(--cd-anchor-rail-color);
294
- }
295
- /* 嵌套子列表:不重复绘制滑轨(rail 只在顶层一条),整体向内缩进一级,
296
- 使每深一层的链接累加缩进。level-0 顶层链接样式完全不受影响(向后兼容)。 */
297
- .cd-anchor__list .cd-anchor__list {
298
- border-inline-start: none;
299
- margin-inline-start: var(--cd-anchor-indent, 16px);
300
- }
301
- .cd-anchor__item {
302
- margin: 0;
303
- padding: 0;
304
- }
305
- .cd-anchor__link {
306
- display: block;
307
- padding: var(--cd-anchor-link-padding);
308
- border-inline-start: var(--cd-anchor-ink-width) solid transparent;
309
- margin-inline-start: calc(-1 * var(--cd-anchor-ink-width));
310
- color: var(--cd-anchor-link-color);
311
- text-decoration: none;
312
- overflow: hidden;
313
- white-space: nowrap;
314
- text-overflow: ellipsis;
315
- transition: color var(--cd-motion-duration-fast)
316
- var(--cd-motion-ease-standard);
317
- }
318
- .cd-anchor__link:hover {
319
- color: var(--cd-anchor-link-color-active);
320
- }
321
- .cd-anchor__link:focus-visible {
322
- outline: none;
323
- box-shadow: var(--cd-focus-ring);
324
- border-radius: var(--cd-radius-1);
325
- }
326
- .cd-anchor__link--active {
327
- color: var(--cd-anchor-link-color-active);
328
- border-inline-start-color: var(--cd-anchor-ink-color);
329
- }
330
- .cd-anchor--no-ink .cd-anchor__link--active {
331
- border-inline-start-color: transparent;
332
- }
333
-
334
- /* --- horizontal 水平模式:链接横排,ink 走底部下划线 --- */
335
- .cd-anchor--horizontal .cd-anchor__list {
336
- display: flex;
337
- flex-wrap: nowrap;
338
- border-inline-start: none;
339
- border-block-end: 1px solid var(--cd-anchor-rail-color);
340
- }
341
- .cd-anchor--horizontal .cd-anchor__link {
342
- border-inline-start: none;
343
- margin-inline-start: 0;
344
- border-block-end: var(--cd-anchor-ink-width) solid transparent;
345
- margin-block-end: calc(-1 * var(--cd-anchor-ink-width));
346
- }
347
- .cd-anchor--horizontal .cd-anchor__link--active {
348
- border-inline-start-color: transparent;
349
- border-block-end-color: var(--cd-anchor-ink-color);
350
- }
351
- .cd-anchor--horizontal.cd-anchor--no-ink .cd-anchor__link--active {
352
- border-block-end-color: transparent;
353
- }
354
- @media (prefers-reduced-motion: reduce) {
355
- .cd-anchor__link {
356
- transition: none;
357
- }
358
- }
359
- </style>
@@ -1,24 +0,0 @@
1
- <!--
2
- 仅供 Anchor.kbd.test.ts(browser project)使用的键盘 e2e 夹具。
3
- 链接列表为单一 Tab 停靠点(roving,真实焦点)。带对应 section 目标。
4
- 前后各放按钮验证 Tab 进入只停靠单个链接、Tab 出去落到 after。
5
- -->
6
- <script lang="ts">
7
- import { LocaleProvider } from '../locale-provider/index.js';
8
- import Anchor from './Anchor.svelte';
9
-
10
- const links = [
11
- { key: 'one', href: '#sec-one', title: 'Section One' },
12
- { key: 'two', href: '#sec-two', title: 'Section Two' },
13
- { key: 'three', href: '#sec-three', title: 'Section Three' },
14
- ];
15
- </script>
16
-
17
- <LocaleProvider locale="en_US">
18
- <button type="button" data-testid="before">before</button>
19
- <Anchor {links} ariaLabel="On this page" />
20
- <button type="button" data-testid="after">after</button>
21
- <section id="sec-one">one</section>
22
- <section id="sec-two">two</section>
23
- <section id="sec-three">three</section>
24
- </LocaleProvider>
@@ -1,3 +0,0 @@
1
- export { default as Anchor } from './Anchor.svelte';
2
- export { meta as anchorMeta } from './meta.js';
3
- export type { AnchorLink } from './types.js';
@@ -1,70 +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: 'Anchor',
7
- category: 'navigation',
8
- description:
9
- '锚点导航,垂直/水平链接列表。支持 scroll-spy 激活高亮、点击平滑滚动、ink 边框指示、自定义滚动容器、多级嵌套链接树,受控/非受控。',
10
- props: [
11
- {
12
- name: 'links',
13
- type: 'AnchorLink[]',
14
- default: '[]',
15
- desc: '锚点链接数据;link.children 形成多级嵌套树,渲染逐级缩进,父子皆参与滚动高亮(无 children 即平铺)',
16
- },
17
- {
18
- name: 'value',
19
- type: 'string',
20
- default: 'undefined',
21
- desc: '受控当前激活 key',
22
- },
23
- { name: 'defaultValue', type: 'string', default: 'undefined' },
24
- { name: 'offsetTop', type: 'number', default: '0', desc: '滚动判定/定位偏移' },
25
- { name: 'bounds', type: 'number', default: '5', desc: '激活判定边界容差' },
26
- { name: 'showInk', type: 'boolean', default: 'true', desc: '是否显示 ink 边框' },
27
- {
28
- name: 'scrollMotion',
29
- type: 'boolean',
30
- default: 'true',
31
- desc: '点击是否平滑滚动(reduced-motion 下强制即时)',
32
- },
33
- { name: 'affix', type: 'boolean', default: 'false', desc: 'position:sticky 吸顶' },
34
- { name: 'updateHash', type: 'boolean', default: 'false', desc: '激活变更时写 location.hash' },
35
- { name: 'targetOffset', type: 'number', default: 'offsetTop', desc: '点击滚动独立偏移' },
36
- {
37
- name: 'getContainer',
38
- type: '() => HTMLElement | null',
39
- default: 'undefined',
40
- desc: '自定义滚动容器(缺省 window)',
41
- },
42
- { name: 'horizontal', type: 'boolean', default: 'false', desc: '水平模式,ink 走底部下划线' },
43
- { name: 'onChange', type: '(key: string) => void', default: 'undefined' },
44
- { name: 'ariaLabel', type: 'string', default: 'undefined' },
45
- ],
46
- a11y: {
47
- role: 'navigation',
48
- keyboard: ['Tab', 'Enter'],
49
- notes: [
50
- 'nav[aria-label] 包裹原生 a 链接列表',
51
- '激活链接 aria-current=true',
52
- '键盘交互为原生锚链接行为',
53
- 'scroll-spy 命令式监听 scroll(getContainer 时监听容器),rAF 节流,reduced-motion 下点击即时定位',
54
- 'horizontal 水平模式仅改布局/ink 方向,激活态与键盘交互不变',
55
- '多级嵌套用嵌套 ul/li 表达层级树,子链接逐级缩进;扁平化树参与 scroll-spy,父子链接均可聚焦/跳转/高亮',
56
- ],
57
- },
58
- tokens: [
59
- '--cd-anchor-link-color',
60
- '--cd-anchor-link-color-active',
61
- '--cd-anchor-link-padding',
62
- '--cd-anchor-indent',
63
- '--cd-anchor-rail-color',
64
- '--cd-anchor-ink-color',
65
- '--cd-anchor-ink-width',
66
- '--cd-focus-ring',
67
- '--cd-radius-1',
68
- '--cd-motion-*',
69
- ],
70
- } as const;
@@ -1,8 +0,0 @@
1
- /** Anchor 链接项;href 形如 '#section-1',key 唯一标识。 */
2
- export interface AnchorLink {
3
- key: string;
4
- href: string;
5
- title: string;
6
- /** 子链接,形成多级嵌套树;缺省即平铺链接(向后兼容)。 */
7
- children?: AnchorLink[];
8
- }
@@ -1,49 +0,0 @@
1
- // AutoComplete a11y:combobox 文本输入 + 内联 listbox/option 下拉(非 portal)。
2
- // 只断言静态 ARIA + axe,不测真实键盘/焦点(jsdom 限制)。下拉内联在 root 子树,扫 container。
3
- //
4
- // 修复记录:input role="combobox" 现经 ariaLabel/ariaLabelledby prop 或
5
- // placeholder(非空) / locale AutoComplete.ariaLabel 回退获可访问名,
6
- // 打开态 axe aria-input-field-name 消除。
7
- import { describe, it, expect } from 'vitest';
8
- import { renderWithLocale, expectNoAxeViolations } from '../test-utils/a11y.js';
9
- import AutoComplete from './AutoComplete.svelte';
10
-
11
- const data = [
12
- { label: 'alpha', value: 'alpha' },
13
- { label: 'alphabet', value: 'alphabet' },
14
- { label: 'beta', value: 'beta' },
15
- ];
16
-
17
- describe('AutoComplete a11y', () => {
18
- it('关闭态:input role=combobox / aria-autocomplete=list,无 axe violations', async () => {
19
- const { container } = renderWithLocale(AutoComplete, {
20
- props: { data, placeholder: 'Type to search' },
21
- });
22
- const combobox = container.querySelector('[role="combobox"]');
23
- expect(combobox).not.toBeNull();
24
- expect(combobox?.getAttribute('aria-autocomplete')).toBe('list');
25
- expect(combobox?.getAttribute('aria-expanded')).toBe('false');
26
- await expectNoAxeViolations(container);
27
- });
28
-
29
- it('打开态:listbox + option 内联渲染 + aria-controls 指向 listbox(结构断言)', () => {
30
- const { container } = renderWithLocale(AutoComplete, {
31
- props: { data, defaultOpen: true, defaultValue: 'a' },
32
- });
33
- const combobox = container.querySelector('[role="combobox"]');
34
- const listbox = container.querySelector('[role="listbox"]');
35
- expect(listbox).not.toBeNull();
36
- expect(container.querySelectorAll('[role="option"]').length).toBeGreaterThan(0);
37
- expect(combobox?.getAttribute('aria-expanded')).toBe('true');
38
- expect(combobox?.getAttribute('aria-controls')).toBe(listbox?.getAttribute('id'));
39
- });
40
-
41
- // combobox input 可访问名缺省走 locale AutoComplete.ariaLabel(placeholder 此处为空)。
42
- it('打开态:axe 0 violations(combobox input 经 locale 获可访问名)', async () => {
43
- const { container } = renderWithLocale(AutoComplete, {
44
- props: { data, defaultOpen: true, defaultValue: 'a' },
45
- });
46
- expect(container.querySelector('[role="combobox"]')?.getAttribute('aria-label')).toBeTruthy();
47
- await expectNoAxeViolations(container);
48
- });
49
- });
@@ -1,69 +0,0 @@
1
- // AutoComplete 键盘 e2e(browser project / 真实 chromium)。
2
- // 输入框 role=combobox,焦点始终留在 input 上;高亮走 aria-activedescendant
3
- // 指向当前 option id(options tabindex=-1,从不真实聚焦)——故断言
4
- // activedescendant 变化,而非 toHaveFocus。
5
- // 1. 输入后浮层打开(aria-expanded=true),defaultActiveFirstOption 高亮首项。
6
- // 2. ↓ 移高亮到下一项,↑ 回上一项(activedescendant 变化)。
7
- // 3. Enter 选中当前高亮项(onSelect 写入夹具 output),浮层关闭。
8
- // 4. Esc 关闭浮层。
9
- import { describe, it, expect, vi } from 'vitest';
10
- import { renderKbdFixture, userEvent } from '../test-utils/kbd.js';
11
- import AutoCompleteKbdFixture from './AutoCompleteKbdFixture.svelte';
12
-
13
- describe('AutoComplete 键盘 e2e(combobox aria-activedescendant 浮层导航)', () => {
14
- it('输入打开 + ↑↓ 移高亮 + Enter 选中 + Esc 关闭', async () => {
15
- renderKbdFixture(AutoCompleteKbdFixture);
16
-
17
- const combobox = document.querySelector('[role="combobox"]') as HTMLInputElement;
18
- expect(combobox).not.toBeNull();
19
- expect(combobox.getAttribute('aria-expanded')).toBe('false');
20
-
21
- // 1. 聚焦后输入 "Ap",过滤到 Apple / Apricot,浮层打开并高亮首项。
22
- combobox.focus();
23
- await userEvent.keyboard('Ap');
24
-
25
- // 浮层经 Svelte 响应式渲染,poll 等其出现(aria-expanded → true)。
26
- await vi.waitFor(() => {
27
- expect(document.querySelector('[role="listbox"]')).not.toBeNull();
28
- });
29
- const listbox = document.querySelector('[role="listbox"]') as HTMLElement;
30
- const listId = listbox.id;
31
- expect(listId).toBeTruthy();
32
- expect(combobox.getAttribute('aria-expanded')).toBe('true');
33
-
34
- const options = Array.from(listbox.querySelectorAll<HTMLElement>('[role="option"]'));
35
- expect(options.length).toBe(2);
36
- // option 不可真实聚焦(tabindex=-1)。
37
- expect(options.every((o) => o.tabIndex === -1)).toBe(true);
38
-
39
- // defaultActiveFirstOption:高亮落在首项(opt-0)。
40
- expect(combobox.getAttribute('aria-activedescendant')).toBe(`${listId}-opt-0`);
41
-
42
- // 2. ↓ 移到 opt-1,↑ 回 opt-0。
43
- await userEvent.keyboard('{ArrowDown}');
44
- expect(combobox.getAttribute('aria-activedescendant')).toBe(`${listId}-opt-1`);
45
- await userEvent.keyboard('{ArrowUp}');
46
- expect(combobox.getAttribute('aria-activedescendant')).toBe(`${listId}-opt-0`);
47
-
48
- // 3. Enter 选中当前高亮(opt-0 = Apple),onSelect 写入夹具;浮层关闭。
49
- await userEvent.keyboard('{Enter}');
50
- const out = document.querySelector('[data-testid="selected"]') as HTMLElement;
51
- expect(out.textContent).toBe(JSON.stringify('Apple'));
52
- await vi.waitFor(() => {
53
- expect(document.querySelector('[role="listbox"]')).toBeNull();
54
- });
55
- expect(combobox.getAttribute('aria-expanded')).toBe('false');
56
-
57
- // 4. 清空后重新输入打开浮层,再 Esc 关闭。
58
- // 选中后 value="Apple"(5 字符),全选删除再输入 "Ba" 过滤到 Banana。
59
- await userEvent.keyboard('{Backspace}{Backspace}{Backspace}{Backspace}{Backspace}');
60
- await userEvent.keyboard('Ba');
61
- await vi.waitFor(() => {
62
- expect(document.querySelector('[role="listbox"]')).not.toBeNull();
63
- });
64
- await userEvent.keyboard('{Escape}');
65
- await vi.waitFor(() => {
66
- expect(document.querySelector('[role="listbox"]')).toBeNull();
67
- });
68
- });
69
- });