@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,420 +0,0 @@
1
- <!--
2
- TextArea — see specs/components/input/Textarea.spec.md
3
- 原生 <textarea>,受控/非受控,size/status,showCount/maxCount/maxLength,IME 安全。
4
- autosize:随内容自适应高度(minRows/maxRows),$effect 内命令式测量 scrollHeight
5
- 调 core computeAutosizeHeight 设高度 + cleanup(红线 #3)。
6
- 计数走 core countCharacters(length / Intl.Segmenter 字素),纯函数派生(红线 #2)。
7
- -->
8
- <script lang="ts">
9
- import type { Snippet } from 'svelte';
10
- import { computeAutosizeHeight, countCharacters } from '@chenzy-design/core';
11
- import { useLocale } from '../locale-provider/index.js';
12
-
13
- type Size = 'small' | 'default' | 'large';
14
- type Status = 'default' | 'warning' | 'error';
15
- type Resize = 'none' | 'vertical' | 'both';
16
- type Autosize = boolean | { minRows?: number; maxRows?: number };
17
-
18
- interface Props {
19
- value?: string;
20
- defaultValue?: string;
21
- size?: Size;
22
- disabled?: boolean;
23
- readonly?: boolean;
24
- placeholder?: string;
25
- showCount?: boolean;
26
- maxLength?: number;
27
- /** 计数上限:用于计数展示与超限提示(不硬截断,截断用 maxLength) */
28
- maxCount?: number;
29
- /** 按视觉字符(Intl.Segmenter 字素)计数而非 UTF-16/code point */
30
- countGraphemes?: boolean;
31
- /** 显示清除按钮(非空且非禁用/只读时) */
32
- showClear?: boolean;
33
- /** 挂载后自动聚焦(命令式 + cleanup) */
34
- autoFocus?: boolean;
35
- status?: Status;
36
- /** Form 注入别名:等价 status,仅当未显式传 status 时生效(兼容) */
37
- validateStatus?: Status;
38
- rows?: number;
39
- /** 自适应高度:true 或 { minRows, maxRows } */
40
- autosize?: Autosize;
41
- /** 原生手动调整把手(autosize 时建议 none) */
42
- resize?: Resize;
43
- name?: string;
44
- id?: string;
45
- class?: string;
46
- ariaLabel?: string;
47
- ariaDescribedby?: string;
48
- /** 自定义计数器渲染(覆盖内建) */
49
- count?: Snippet<[{ count: number; maxCount: number | undefined; overLimit: boolean }]>;
50
- /** 自定义清除图标 */
51
- clearIcon?: Snippet;
52
- onChange?: (v: string) => void;
53
- onInput?: (v: string) => void;
54
- onClear?: () => void;
55
- onFocus?: (e: FocusEvent) => void;
56
- onBlur?: (e: FocusEvent) => void;
57
- /** 按下 Enter(含修饰键信息,供「Ctrl+Enter 提交」场景)。composition 中不触发。 */
58
- onEnterPress?: (payload: { value: string; event: KeyboardEvent }) => void;
59
- /** autosize 高度变化(命令式重测后触发,高度无变化不触发)。 */
60
- onResize?: (payload: { height: number }) => void;
61
- onCompositionStart?: (e: CompositionEvent) => void;
62
- onCompositionEnd?: (e: CompositionEvent) => void;
63
- /** 无边框模式 */
64
- borderless?: boolean;
65
- }
66
-
67
- let {
68
- value = $bindable(),
69
- defaultValue = '',
70
- size = 'default',
71
- disabled = false,
72
- readonly = false,
73
- placeholder,
74
- showCount = false,
75
- maxLength,
76
- maxCount,
77
- countGraphemes = false,
78
- showClear = false,
79
- autoFocus = false,
80
- status,
81
- validateStatus,
82
- rows = 3,
83
- autosize = false,
84
- resize = 'none',
85
- name,
86
- id,
87
- class: className = '',
88
- ariaLabel,
89
- ariaDescribedby,
90
- count: countSnippet,
91
- clearIcon,
92
- onChange,
93
- onInput,
94
- onClear,
95
- onFocus,
96
- onBlur,
97
- onEnterPress,
98
- onResize,
99
- onCompositionStart,
100
- onCompositionEnd,
101
- borderless = false,
102
- }: Props = $props();
103
-
104
- const loc = useLocale();
105
-
106
- // status 优先;未显式传 status 时用 validateStatus(Form 注入别名);都无则 default。
107
- const effectiveStatus = $derived<Status>(status ?? validateStatus ?? 'default');
108
-
109
- const isControlled = $derived(value !== undefined);
110
- let inner = $state(getInitialValue());
111
- const current = $derived(isControlled ? (value ?? '') : inner);
112
-
113
- function getInitialValue(): string {
114
- return defaultValue;
115
- }
116
-
117
- let composing = $state(false);
118
-
119
- // 计数:纯函数派生(红线 #2)。composition 中也照常显示,不裁剪。
120
- const count = $derived(
121
- countCharacters(current, countGraphemes ? { graphemes: true } : undefined),
122
- );
123
- const overLimit = $derived(maxCount !== undefined && count > maxCount);
124
- const over = $derived(overLimit ? count - (maxCount as number) : 0);
125
-
126
- function setValue(next: string) {
127
- // 受控时不回写 prop,仅经 onChange 上报(避免 value→onChange→value 死循环,红线 #1)。
128
- if (!isControlled) inner = next;
129
- }
130
-
131
- function handleInput(e: Event & { currentTarget: HTMLTextAreaElement }) {
132
- const next = e.currentTarget.value;
133
- setValue(next);
134
- onInput?.(next);
135
- if (!composing) onChange?.(next);
136
- }
137
-
138
- function handleCompositionStart(e: CompositionEvent) {
139
- composing = true;
140
- onCompositionStart?.(e);
141
- }
142
- function handleCompositionEnd(
143
- e: CompositionEvent & { currentTarget: HTMLTextAreaElement },
144
- ) {
145
- composing = false;
146
- const next = e.currentTarget.value;
147
- setValue(next);
148
- onChange?.(next);
149
- onCompositionEnd?.(e);
150
- }
151
-
152
- function handleKeydown(e: KeyboardEvent) {
153
- // Textarea 的 Enter 默认换行;onEnterPress 透传事件,由调用方判断修饰键
154
- // (Ctrl/Cmd+Enter 提交等)。composition 中(IME 选词回车)不触发。
155
- if (e.key === 'Enter' && !composing) onEnterPress?.({ value: current, event: e });
156
- }
157
-
158
- function clear() {
159
- setValue('');
160
- onClear?.();
161
- onChange?.('');
162
- taEl?.focus();
163
- }
164
-
165
- const canClear = $derived(showClear && !disabled && !readonly && current.length > 0);
166
-
167
- const autosizeOn = $derived(autosize !== false);
168
- const minRows = $derived(
169
- typeof autosize === 'object' ? (autosize.minRows ?? rows) : rows,
170
- );
171
- const maxRows = $derived(
172
- typeof autosize === 'object' ? autosize.maxRows : undefined,
173
- );
174
-
175
- // autosize 时强制 resize none(把手与自适应冲突)。
176
- const effectiveResize = $derived<Resize>(autosizeOn ? 'none' : resize);
177
-
178
- // --- autosize 命令式测量 (红线 #3):current 变化时测 scrollHeight 设高度 ---
179
- let taEl = $state<HTMLTextAreaElement | null>(null);
180
- // 上一次上报的 autosize 高度;仅在高度真正变化时触发 onResize(避免重复)。
181
- let lastReportedHeight = -1;
182
-
183
- $effect(() => {
184
- if (!autosizeOn || !taEl) return;
185
- const el = taEl;
186
- // 读 current 建立依赖:内容变化触发重测。
187
- void current;
188
-
189
- const cs = getComputedStyle(el);
190
- const lineHeight = parseFloat(cs.lineHeight) || parseFloat(cs.fontSize) * 1.5;
191
- const verticalPadding = parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom);
192
- const verticalBorder = parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth);
193
-
194
- // 先重置 height 再读 scrollHeight,得到内容自然高度。
195
- const prevHeight = el.style.height;
196
- el.style.height = 'auto';
197
- const scrollHeight = el.scrollHeight + verticalBorder; // scrollHeight 不含 border
198
- const result = computeAutosizeHeight({
199
- scrollHeight,
200
- lineHeight,
201
- verticalPadding,
202
- verticalBorder,
203
- minRows,
204
- ...(maxRows !== undefined ? { maxRows } : {}),
205
- });
206
- el.style.height = `${result.height}px`;
207
- el.style.overflowY = result.overflow ? 'auto' : 'hidden';
208
-
209
- // 高度变化时上报({height}),首次测量也上报一次。
210
- if (result.height !== lastReportedHeight) {
211
- lastReportedHeight = result.height;
212
- onResize?.({ height: result.height });
213
- }
214
-
215
- return () => {
216
- el.style.height = prevHeight;
217
- };
218
- });
219
-
220
- // --- autoFocus 命令式 + cleanup (红线 #3) ---
221
- $effect(() => {
222
- if (!autoFocus || !taEl) return;
223
- const el = taEl;
224
- const raf = requestAnimationFrame(() => el.focus());
225
- return () => cancelAnimationFrame(raf);
226
- });
227
-
228
- const cls = $derived(
229
- [
230
- 'cd-textarea',
231
- `cd-textarea--${size}`,
232
- `cd-textarea--${effectiveStatus}`,
233
- disabled && 'cd-textarea--disabled',
234
- readonly && 'cd-textarea--readonly',
235
- autosizeOn && 'cd-textarea--autosize',
236
- overLimit && 'cd-textarea--over-limit',
237
- borderless && 'cd-textarea--borderless',
238
- className,
239
- ]
240
- .filter(Boolean)
241
- .join(' '),
242
- );
243
- </script>
244
-
245
- <div class={cls} aria-invalid={effectiveStatus === 'error' || undefined}>
246
- <textarea
247
- class="cd-textarea__native"
248
- class:cd-textarea__native--autosize={autosizeOn}
249
- bind:this={taEl}
250
- {name}
251
- {id}
252
- {disabled}
253
- {readonly}
254
- {placeholder}
255
- {rows}
256
- style:resize={effectiveResize}
257
- maxlength={maxLength}
258
- value={current}
259
- aria-label={ariaLabel}
260
- aria-describedby={ariaDescribedby}
261
- aria-invalid={effectiveStatus === 'error' || undefined}
262
- oninput={handleInput}
263
- onkeydown={handleKeydown}
264
- oncompositionstart={handleCompositionStart}
265
- oncompositionend={handleCompositionEnd}
266
- onfocus={onFocus}
267
- onblur={onBlur}
268
- ></textarea>
269
-
270
- {#if canClear}
271
- <button
272
- type="button"
273
- class="cd-textarea__clear"
274
- aria-label={loc().t('Textarea.clear')}
275
- onclick={clear}
276
- >
277
- {#if clearIcon}
278
- {@render clearIcon()}
279
- {:else}
280
- <svg viewBox="0 0 16 16" width="14" height="14" aria-hidden="true" focusable="false">
281
- <path
282
- fill="currentColor"
283
- d="M8 1a7 7 0 1 0 0 14A7 7 0 0 0 8 1Zm2.5 9.1-1.4 1.4L8 9.4 6.5 11l-1.4-1.4L6.6 8 5.1 6.5 6.5 5.1 8 6.6 9.5 5.1l1.4 1.4L9.4 8l1.1 1.1Z"
284
- />
285
- </svg>
286
- {/if}
287
- </button>
288
- {/if}
289
-
290
- {#if showCount}
291
- {#if countSnippet}
292
- {@render countSnippet({ count, maxCount, overLimit })}
293
- {:else}
294
- <span class="cd-textarea__count" class:cd-textarea__count--over={overLimit}>
295
- {#if maxCount !== undefined}
296
- {loc().t('Textarea.countFormat', {
297
- count: loc().formatNumber(count),
298
- maxCount: loc().formatNumber(maxCount),
299
- })}
300
- {:else if maxLength !== undefined}
301
- {loc().formatNumber(count)}/{loc().formatNumber(maxLength)}
302
- {:else}
303
- {loc().t('Textarea.countOnly', { count: loc().formatNumber(count) })}
304
- {/if}
305
- </span>
306
- {/if}
307
- {/if}
308
-
309
- {#if overLimit}
310
- <span class="cd-sr-only" aria-live="polite">
311
- {loc().t('Textarea.overLimitAnnounce', { over: loc().formatNumber(over) })}
312
- </span>
313
- {/if}
314
- </div>
315
-
316
- <style>
317
- .cd-textarea {
318
- position: relative;
319
- display: inline-flex;
320
- inline-size: 100%;
321
- padding: var(--cd-input-padding-x);
322
- background: var(--cd-input-color-bg);
323
- color: var(--cd-input-color-text);
324
- border: 1px solid var(--cd-input-border);
325
- border-radius: var(--cd-input-radius);
326
- font-size: var(--cd-input-font-size);
327
- transition: border-color var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
328
- }
329
- .cd-textarea--small {
330
- font-size: var(--cd-font-size-1);
331
- }
332
- .cd-textarea--large {
333
- font-size: var(--cd-font-size-3);
334
- }
335
- .cd-textarea:focus-within {
336
- border-color: var(--cd-input-border-active);
337
- box-shadow: var(--cd-focus-ring);
338
- }
339
- .cd-textarea--warning {
340
- border-color: var(--cd-input-border-warning);
341
- }
342
- .cd-textarea--error {
343
- border-color: var(--cd-input-border-error);
344
- }
345
- .cd-textarea--disabled {
346
- background: var(--cd-color-fill-0);
347
- color: var(--cd-color-text-3);
348
- cursor: not-allowed;
349
- }
350
- .cd-textarea--borderless {
351
- border-color: transparent;
352
- background: transparent;
353
- box-shadow: none;
354
- }
355
- .cd-textarea--borderless:focus-within {
356
- border-color: transparent;
357
- box-shadow: none;
358
- }
359
- .cd-textarea__native {
360
- inline-size: 100%;
361
- min-inline-size: 0;
362
- margin: 0;
363
- padding: 0;
364
- border: none;
365
- background: transparent;
366
- color: inherit;
367
- font: inherit;
368
- line-height: 1.5;
369
- resize: vertical;
370
- outline: none;
371
- }
372
- .cd-textarea__native--autosize {
373
- resize: none;
374
- overflow-y: hidden;
375
- }
376
- .cd-textarea__native::placeholder {
377
- color: var(--cd-input-color-placeholder);
378
- }
379
- .cd-textarea__native:disabled {
380
- cursor: not-allowed;
381
- }
382
- .cd-textarea__clear {
383
- position: absolute;
384
- inset-block-start: var(--cd-spacing-1);
385
- inset-inline-end: var(--cd-spacing-1);
386
- display: inline-flex;
387
- align-items: center;
388
- justify-content: center;
389
- padding: 0;
390
- border: none;
391
- background: transparent;
392
- color: var(--cd-color-text-2);
393
- cursor: pointer;
394
- border-radius: var(--cd-radius-1);
395
- }
396
- .cd-textarea__clear:hover {
397
- color: var(--cd-color-text-0);
398
- }
399
- .cd-textarea__clear:focus-visible {
400
- outline: none;
401
- box-shadow: var(--cd-focus-ring);
402
- }
403
- .cd-textarea__count {
404
- position: absolute;
405
- inset-block-end: var(--cd-spacing-1);
406
- inset-inline-end: var(--cd-spacing-2);
407
- color: var(--cd-color-text-3);
408
- font-size: var(--cd-font-size-1);
409
- white-space: nowrap;
410
- pointer-events: none;
411
- }
412
- .cd-textarea__count--over {
413
- color: var(--cd-input-border-error);
414
- }
415
- @media (prefers-reduced-motion: reduce) {
416
- .cd-textarea {
417
- transition: none;
418
- }
419
- }
420
- </style>
@@ -1,2 +0,0 @@
1
- export { default as TextArea } from './TextArea.svelte';
2
- export { meta as textareaMeta } from './meta.js';
@@ -1,104 +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: 'TextArea',
7
- category: 'input',
8
- description: '多行文本录入框,支持计数(maxCount/字素)、清除、校验态、IME 与 autosize 自适应高度(minRows/maxRows)。',
9
- capabilities: ['multiline', 'autosize', 'char-count', 'clearable', 'validation-status'],
10
- props: [
11
- { name: 'value', type: 'string', default: 'undefined', desc: '受控值;提供则为受控' },
12
- { name: 'defaultValue', type: 'string', default: "''", desc: '非受控初始值' },
13
- { name: 'size', type: "'small'|'default'|'large'", default: 'default' },
14
- { name: 'disabled', type: 'boolean', default: 'false' },
15
- { name: 'readonly', type: 'boolean', default: 'false' },
16
- { name: 'placeholder', type: 'string', default: 'undefined' },
17
- { name: 'showCount', type: 'boolean', default: 'false', desc: '显示字符计数' },
18
- { name: 'maxLength', type: 'number', default: 'undefined', desc: '原生硬性长度限制(截断输入)' },
19
- { name: 'maxCount', type: 'number', default: 'undefined', desc: '计数上限(计数展示与超限提示,不截断)' },
20
- {
21
- name: 'countGraphemes',
22
- type: 'boolean',
23
- default: 'false',
24
- desc: '按视觉字符(Intl.Segmenter 字素)计数而非 code point,正确处理 emoji/组合字符',
25
- },
26
- { name: 'showClear', type: 'boolean', default: 'false', desc: '显示清除按钮(非空且非禁用/只读)' },
27
- { name: 'autoFocus', type: 'boolean', default: 'false', desc: '挂载后自动聚焦' },
28
- { name: 'status', type: "'default'|'warning'|'error'", default: 'default', desc: '校验态' },
29
- {
30
- name: 'validateStatus',
31
- type: "'default'|'warning'|'error'",
32
- default: 'undefined',
33
- desc: 'Form 注入别名,等价 status(仅当未显式传 status 时生效)',
34
- },
35
- { name: 'rows', type: 'number', default: '3' },
36
- {
37
- name: 'autosize',
38
- type: 'boolean | { minRows?: number; maxRows?: number }',
39
- default: 'false',
40
- desc: '随内容自适应高度',
41
- },
42
- {
43
- name: 'resize',
44
- type: "'none'|'vertical'|'both'",
45
- default: "'none'",
46
- desc: '原生手动调整把手(autosize 时强制 none)',
47
- },
48
- { name: 'name', type: 'string', default: 'undefined' },
49
- { name: 'id', type: 'string', default: 'undefined' },
50
- { name: 'class', type: 'string', default: "''", desc: '透传根类名' },
51
- { name: 'ariaLabel', type: 'string', default: 'undefined' },
52
- { name: 'ariaDescribedby', type: 'string', default: 'undefined' },
53
- { name: 'onChange', type: '(v: string) => void', default: 'undefined' },
54
- { name: 'onInput', type: '(v: string) => void', default: 'undefined' },
55
- { name: 'onClear', type: '() => void', default: 'undefined', desc: '点击清除按钮' },
56
- { name: 'onFocus', type: '(e: FocusEvent) => void', default: 'undefined', desc: '获得焦点' },
57
- { name: 'onBlur', type: '(e: FocusEvent) => void', default: 'undefined', desc: '失去焦点' },
58
- {
59
- name: 'onEnterPress',
60
- type: '(p: { value: string; event: KeyboardEvent }) => void',
61
- default: 'undefined',
62
- desc: '按下 Enter(含修饰键信息,供 Ctrl+Enter 提交)',
63
- },
64
- {
65
- name: 'onResize',
66
- type: '(p: { height: number }) => void',
67
- default: 'undefined',
68
- desc: 'autosize 高度变化',
69
- },
70
- {
71
- name: 'onCompositionStart',
72
- type: '(e: CompositionEvent) => void',
73
- default: 'undefined',
74
- desc: 'IME 开始',
75
- },
76
- {
77
- name: 'onCompositionEnd',
78
- type: '(e: CompositionEvent) => void',
79
- default: 'undefined',
80
- desc: 'IME 结束',
81
- },
82
- ],
83
- slots: [
84
- { name: 'count', scope: '{ count, maxCount, overLimit }', desc: '自定义计数器渲染(覆盖内建)' },
85
- { name: 'clearIcon', desc: '自定义清除图标' },
86
- ],
87
- a11y: {
88
- role: 'textbox',
89
- notes: [
90
- '原生 textarea',
91
- 'error 时 aria-invalid',
92
- 'IME composition 安全',
93
- '超限经 aria-live=polite 播报',
94
- '清除按钮可 Tab 到达,aria-label 来自 i18n',
95
- ],
96
- },
97
- i18nKeys: [
98
- 'Textarea.clear',
99
- 'Textarea.countFormat',
100
- 'Textarea.countOnly',
101
- 'Textarea.overLimitAnnounce',
102
- ],
103
- tokens: ['--cd-input-*', '--cd-focus-ring', '--cd-motion-*'],
104
- } as const;
@@ -1,45 +0,0 @@
1
- // TimePicker a11y:触发器(button)+ role=dialog 面板 + 时/分 role=listbox/option 列。
2
- // 只断言静态 ARIA + axe 0 violations,不测真实键盘/焦点(jsdom 限制)。
3
- // 打开态面板 portal 到 document.body,故扫描 document.body。
4
- import { describe, it, expect } from 'vitest';
5
- import { renderWithLocale, expectNoAxeViolations } from '../test-utils/a11y.js';
6
- import TimePicker from './TimePicker.svelte';
7
-
8
- describe('TimePicker a11y', () => {
9
- it('关闭态:触发器 aria-haspopup=dialog / aria-expanded=false,无 axe violations', async () => {
10
- const { container } = renderWithLocale(TimePicker, {
11
- props: { ariaLabel: 'Meeting time' },
12
- });
13
- const trigger = container.querySelector('.cd-time-picker__trigger');
14
- expect(trigger).not.toBeNull();
15
- expect(trigger?.getAttribute('aria-haspopup')).toBe('dialog');
16
- expect(trigger?.getAttribute('aria-expanded')).toBe('false');
17
- expect(trigger?.getAttribute('aria-label')).toBe('Meeting time');
18
- await expectNoAxeViolations(container);
19
- });
20
-
21
- it('打开态:role=dialog 面板 + listbox/option 列(portal 到 body),无 axe violations', async () => {
22
- renderWithLocale(TimePicker, {
23
- props: { defaultOpen: true, ariaLabel: 'Meeting time' },
24
- });
25
- const dialog = document.querySelector('[role="dialog"]');
26
- expect(dialog).not.toBeNull();
27
- expect(dialog?.getAttribute('aria-label')).toBeTruthy();
28
- const listboxes = document.querySelectorAll('[role="listbox"]');
29
- expect(listboxes.length).toBeGreaterThan(0);
30
- const options = document.querySelectorAll('[role="option"]');
31
- expect(options.length).toBeGreaterThan(0);
32
- await expectNoAxeViolations(document.body);
33
- });
34
-
35
- it('已选值:选中 option aria-selected=true + 触发器 aria-expanded=true', async () => {
36
- renderWithLocale(TimePicker, {
37
- props: { defaultOpen: true, defaultValue: '09:30:00', ariaLabel: 'Meeting time' },
38
- });
39
- const trigger = document.querySelector('.cd-time-picker__trigger');
40
- expect(trigger?.getAttribute('aria-expanded')).toBe('true');
41
- const selected = document.querySelector('[role="option"][aria-selected="true"]');
42
- expect(selected).not.toBeNull();
43
- await expectNoAxeViolations(document.body);
44
- });
45
- });
@@ -1,70 +0,0 @@
1
- // TimePicker 键盘 e2e(browser project / 真实 chromium)。
2
- // 时间列用真实焦点 roving(APG listbox):每列单一 Tab 停靠点(选中项 tabindex=0,
3
- // 其余 -1),列内 ↑↓ 命令式移动 DOM 焦点(循环)、Home/End 跳首末,列间用 Tab。
4
- // 故断言真实 .toHaveFocus()(先读源码 onColKeydown 确认是命令式 focus,非 activedescendant)。
5
- // 1. 打开后焦点落进小时列选中项(value=08:30:45 → 小时 08)。
6
- // 2. 列内 ↓↑ 移动焦点(相邻项),Home/End 跳首末项。
7
- // 3. Tab 进入下一列(分钟列)的停靠点(选中项 30)。
8
- // 4. Esc 关闭面板。
9
- import { describe, it, expect } from 'vitest';
10
- import { page } from 'vitest/browser';
11
- import { renderKbdFixture, userEvent } from '../test-utils/kbd.js';
12
- import TimePickerKbdFixture from './TimePickerKbdFixture.svelte';
13
-
14
- function loc(el: Element) {
15
- return page.elementLocator(el);
16
- }
17
-
18
- describe('TimePicker 键盘 e2e(列内 roving 真实焦点)', () => {
19
- it('小时列 ↓↑ + Home/End 移动焦点;Tab 进分钟列;Esc 关闭', async () => {
20
- const { baseElement } = renderKbdFixture(TimePickerKbdFixture);
21
-
22
- const trigger = baseElement.querySelector('[data-testid="before"]') as HTMLButtonElement;
23
- expect(trigger).not.toBeNull();
24
- await userEvent.click(trigger);
25
-
26
- const dialog = document.querySelector('[role="dialog"]') as HTMLElement;
27
- expect(dialog).not.toBeNull();
28
- const cols = Array.from(dialog.querySelectorAll<HTMLElement>('[role="listbox"]'));
29
- expect(cols.length).toBe(3); // 时/分/秒
30
- const [hourCol, minuteCol] = cols as [HTMLElement, HTMLElement, HTMLElement];
31
-
32
- const hourOptions = Array.from(hourCol.querySelectorAll<HTMLElement>('[role="option"]'));
33
- // value=08:30:45 → 小时列选中项 08(文本 '08')。
34
- const hour08 = hourOptions.find((el) => el.textContent?.trim() === '08')!;
35
- const hour09 = hourOptions.find((el) => el.textContent?.trim() === '09')!;
36
- const hour07 = hourOptions.find((el) => el.textContent?.trim() === '07')!;
37
-
38
- // 1. 打开后焦点落进小时列选中项(08)。
39
- await expect.element(loc(hour08)).toHaveFocus();
40
- expect(hour08.tabIndex).toBe(0);
41
-
42
- // 2a. ↓ → 下一项(09),真实焦点跟随、停靠点收敛。
43
- await userEvent.keyboard('{ArrowDown}');
44
- await expect.element(loc(hour09)).toHaveFocus();
45
- expect(hour09.tabIndex).toBe(0);
46
- expect(hour08.tabIndex).toBe(-1);
47
-
48
- // 2b. ↑↑ → 回到 08 再到 07。
49
- await userEvent.keyboard('{ArrowUp}');
50
- await expect.element(loc(hour08)).toHaveFocus();
51
- await userEvent.keyboard('{ArrowUp}');
52
- await expect.element(loc(hour07)).toHaveFocus();
53
-
54
- // 2c. Home/End → 列首(00)/列末(23)。
55
- await userEvent.keyboard('{Home}');
56
- await expect.element(loc(hourOptions[0]!)).toHaveFocus();
57
- await userEvent.keyboard('{End}');
58
- await expect.element(loc(hourOptions[hourOptions.length - 1]!)).toHaveFocus();
59
-
60
- // 3. Tab → 进入分钟列的停靠点(选中项 30)。
61
- const minuteOptions = Array.from(minuteCol.querySelectorAll<HTMLElement>('[role="option"]'));
62
- const minute30 = minuteOptions.find((el) => el.textContent?.trim() === '30')!;
63
- await userEvent.tab();
64
- await expect.element(loc(minute30)).toHaveFocus();
65
-
66
- // 4. Esc 关闭面板(useDismiss escape)。
67
- await userEvent.keyboard('{Escape}');
68
- await expect.poll(() => document.querySelector('[role="dialog"]')).toBeNull();
69
- });
70
- });