@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,492 +0,0 @@
1
- <!--
2
- Field — see specs/components/input/Form.spec.md
3
- Single-field wrapper: label + required mark + error/extra text + a11y wiring.
4
- Pulls field slices from the shared form context (read-only during render).
5
- -->
6
- <script lang="ts">
7
- import type { Snippet } from 'svelte';
8
- import { useId, type Rule, type ValidateTrigger } from '@chenzy-design/core';
9
- import { getFormContext } from './context.js';
10
- import { useLocale } from '../locale-provider/index.js';
11
-
12
- type FieldStatus = 'default' | 'error' | 'warning';
13
-
14
- interface ChildArgs {
15
- /** Generic field value — always present, regardless of `valuePropName`. */
16
- value: unknown;
17
- onChange: (v: unknown) => void;
18
- onBlur: () => void;
19
- status: FieldStatus;
20
- id: string;
21
- /** id(s) of the field's error/warning/extra text, for the control's aria-describedby */
22
- describedBy: string | undefined;
23
- disabled: boolean;
24
- /**
25
- * whether this field is required (spec §138). Controls should expose it as
26
- * `aria-required="true"` so the required semantic reaches screen readers —
27
- * the visible star is `aria-hidden` and thus inaudible on its own.
28
- */
29
- required: boolean;
30
- /**
31
- * Convenience alias keyed by `valuePropName` (default 'value'), carrying the
32
- * same value as `value`. Lets non-`value` controls (e.g. Checkbox/Switch use
33
- * `checked`) destructure `{ checked, onChange }` directly from the snippet.
34
- */
35
- [key: string]: unknown;
36
- }
37
-
38
- interface Props {
39
- field: string;
40
- label?: string;
41
- rules?: Rule[];
42
- /** field-level initial value; overrides the container's initValues (spec §4.2 L79). */
43
- initValue?: unknown;
44
- required?: boolean;
45
- /**
46
- * externally forced validate status (spec §4.2 L81). A controlled DISPLAY
47
- * state only — it never feeds the internal validation engine and is never
48
- * written back (red line #1). When set it takes precedence over the
49
- * internally computed status for visuals/aria.
50
- */
51
- validateStatus?: 'default' | 'warning' | 'error';
52
- extraText?: string;
53
- /**
54
- * register & collect only, render no layout DOM (spec §4.2 L85 / §190). The
55
- * control snippet is still rendered (so it can bind), but the label / status
56
- * text / field wrapper chrome are skipped.
57
- */
58
- noStyle?: boolean;
59
- /** number of columns this field spans inside a grid parent / Form.Section (spec §4.2 L86). */
60
- span?: number;
61
- /** pure value transform applied at collect/submit time (spec §4.2 L88). */
62
- transform?: (value: unknown, values: Record<string, unknown>) => unknown;
63
- /**
64
- * Name of the control's value prop. Default 'value'. For boolean controls
65
- * such as Checkbox/Switch pass 'checked'; the snippet then exposes a
66
- * `checked` alias mirroring the field value.
67
- */
68
- valuePropName?: string;
69
- /** names of fields this field's validation depends on (e.g. confirm → ['password']) */
70
- dependencies?: string[];
71
- /** field-level override of the form's validateTrigger (spec §4 L84). */
72
- trigger?: ValidateTrigger | ValidateTrigger[];
73
- /**
74
- * 是否允许空字符串作为有效值(默认 false:空串当 undefined 处理,不触发 required 通过)。
75
- * 设为 true 后空串参与 required 校验和值收集。
76
- */
77
- allowEmptyString?: boolean;
78
- /**
79
- * 字段值在存入 formState 前的转换函数(在 Field 层执行,不同于 transform 的提交时转换)。
80
- * convert 的结果回写 formState,transform 的结果仅用于提交/收集,不回写。
81
- */
82
- convert?: (value: unknown) => unknown;
83
- /**
84
- * 组件卸载时保留字段状态(默认 false:卸载时清空字段值/错误/touched)。
85
- * 设为 true 后卸载不清 formState,下次挂载时继承上次状态。
86
- */
87
- keepState?: boolean;
88
- children?: Snippet<[ChildArgs]>;
89
- }
90
-
91
- let {
92
- field,
93
- label,
94
- rules = [],
95
- initValue,
96
- required = false,
97
- validateStatus,
98
- extraText,
99
- noStyle = false,
100
- span,
101
- transform,
102
- valuePropName = 'value',
103
- dependencies,
104
- trigger,
105
- allowEmptyString = false,
106
- convert,
107
- keepState = false,
108
- children,
109
- }: Props = $props();
110
-
111
- const ctx = getFormContext();
112
- if (!ctx) throw new Error('<Form.Field> must be used inside <Form>');
113
- const { form, getFormState } = ctx;
114
-
115
- const loc = useLocale();
116
-
117
- const id = useId('cd-field');
118
- const errorId = `${id}-error`;
119
- const warningId = `${id}-warning`;
120
- const extraId = `${id}-extra`;
121
-
122
- // Register the field in the core registry (a plain Map, not Svelte-reactive),
123
- // so this never feeds back into a render-read. Cleanup unregisters.
124
- $effect(() => {
125
- const effectiveRules = required ? [{ required: true } as Rule, ...rules] : rules;
126
- const config: {
127
- rules: Rule[];
128
- label?: string;
129
- initialValue?: unknown;
130
- dependencies?: string[];
131
- trigger?: ValidateTrigger | ValidateTrigger[];
132
- transform?: (value: unknown, values: Record<string, unknown>) => unknown;
133
- } = {
134
- rules: effectiveRules,
135
- };
136
- if (label !== undefined) config.label = label;
137
- if (initValue !== undefined) config.initialValue = initValue;
138
- if (dependencies !== undefined) config.dependencies = dependencies;
139
- if (trigger !== undefined) config.trigger = trigger;
140
- if (transform !== undefined) config.transform = transform;
141
- const unregister = form.registerField(field, config);
142
- // spec §2 L26: a `mount` trigger validates once right after registration.
143
- // Imperative one-shot (not a render read) so it cannot loop.
144
- if (form.getFieldTrigger(field).includes('mount')) void form.validateField(field);
145
- // keepState: when false (default), unregister clears field state on destroy.
146
- // When true, we skip the cleanup so state persists for future mounts.
147
- return keepState ? () => { /* preserve state — do not unregister */ } : unregister;
148
- });
149
-
150
- // Read-only slices derived from the bridged form state (render-safe getters).
151
- const value = $derived(getFormState().values[field]);
152
- const error = $derived(getFormState().errors[field]);
153
- const warning = $derived(getFormState().warnings[field]);
154
- const validating = $derived(getFormState().validating[field] === true);
155
- const touched = $derived(getFormState().touched[field]);
156
-
157
- // `validateStatus` is a controlled display override (spec §4.2 L81): it forces
158
- // the visual status without touching the internal validation engine (red line
159
- // #1 — never written back). When set, it wins over the computed status.
160
- const forcedError = $derived(validateStatus === 'error');
161
- const forcedWarning = $derived(validateStatus === 'warning');
162
- const showError = $derived(forcedError || (error !== undefined && error !== ''));
163
- // a warning only surfaces when there is no blocking error to show
164
- const showWarning = $derived(
165
- !showError && (forcedWarning || (warning !== undefined && warning !== '')),
166
- );
167
- const status = $derived<FieldStatus>(showError ? 'error' : showWarning ? 'warning' : 'default');
168
-
169
- const showRequiredMark = $derived(ctx.getRequiredMark() && required);
170
- const showExtra = $derived(
171
- !showError && !showWarning && extraText !== undefined && extraText !== '',
172
- );
173
- const validatingText = $derived(loc().t('Form.validating'));
174
-
175
- // resolved validation triggers for this field (own override → form default).
176
- // Plain getters off the core registry (a non-reactive Map), read inside event
177
- // handlers only — never during render, so no effect loop.
178
- function triggers(): ValidateTrigger[] {
179
- return form.getFieldTrigger(field);
180
- }
181
-
182
- function handleChange(v: unknown) {
183
- // allowEmptyString: treat empty string as undefined unless explicitly allowed.
184
- // This normalizes '' to undefined for required validation / collection.
185
- const coerced = !allowEmptyString && v === '' ? undefined : v;
186
- // convert: field-level value transform (applied before storing into formState).
187
- const stored = convert !== undefined ? convert(coerced) : coerced;
188
- const tr = triggers();
189
- // Validate on change when 'change' is an active trigger AND the field is
190
- // already "active": after a blur (touched) OR while an error is showing (so
191
- // typing clears a submit error). Controls like Input have no blur hook to
192
- // set `touched`, so the "showing error" path keeps submit errors clearable.
193
- const active = touched === true || (error !== undefined && error !== '');
194
- const validate = tr.includes('change') && active;
195
- form.setFieldValue(field, stored, { validate });
196
- }
197
-
198
- function handleBlur() {
199
- form.setFieldTouched(field);
200
- // only validate on blur when 'blur' is an active trigger for this field.
201
- if (triggers().includes('blur')) void form.validateField(field);
202
- }
203
-
204
- const describedBy = $derived(
205
- // noStyle renders no status/extra elements, so there is nothing to point at
206
- noStyle
207
- ? undefined
208
- : showError
209
- ? errorId
210
- : showWarning
211
- ? warningId
212
- : showExtra
213
- ? extraId
214
- : undefined,
215
- );
216
-
217
- const labelWidth = $derived(ctx.getLabelWidth());
218
- const labelPosition = $derived(ctx.getLabelPosition());
219
- const labelAlign = $derived(ctx.getLabelAlign());
220
- const showValidateIcon = $derived(ctx.getShowValidateIcon());
221
- const extraTextPosition = $derived(ctx.getExtraTextPosition?.() ?? 'bottom');
222
- // label style: fixed width in `left` mode + text-align from labelAlign (§4 L60)
223
- const labelStyle = $derived(
224
- [
225
- labelPosition === 'left' && labelWidth !== undefined
226
- ? `inline-size:${typeof labelWidth === 'number' ? `${labelWidth}px` : labelWidth}`
227
- : undefined,
228
- `text-align:${labelAlign}`,
229
- ]
230
- .filter(Boolean)
231
- .join(';'),
232
- );
233
-
234
- // inset:label 浮入控件,聚焦或有值时上浮变小(floating label)
235
- const isInset = $derived(labelPosition === 'inset');
236
- let focused = $state(false);
237
- const hasValue = $derived(value !== undefined && value !== null && value !== '');
238
- const labelFloated = $derived(focused || hasValue);
239
-
240
- const cls = $derived(
241
- [
242
- 'cd-form-field',
243
- `cd-form-field--label-${labelPosition}`,
244
- `cd-form-field--${status}`,
245
- isInset && labelFloated && 'cd-form-field--floated',
246
- ]
247
- .filter(Boolean)
248
- .join(' '),
249
- );
250
-
251
- // `span` (spec §4.2 L86): occupy N columns of a grid parent (e.g. Form.Section).
252
- // Pure inline `grid-column` — inert when the parent isn't a grid.
253
- const wrapStyle = $derived(span !== undefined ? `grid-column:span ${span}` : undefined);
254
- </script>
255
-
256
- {#if noStyle}
257
- <!--
258
- noStyle (spec §4.2 L85 / §190): register & collect only, render no layout
259
- chrome. The control snippet is still rendered so it can bind to the field;
260
- label / status text / wrapper DOM are skipped. `validateStatus`/error still
261
- flow into `status` so a custom control can style itself.
262
- -->
263
- {@render children?.({
264
- value,
265
- [valuePropName]: value,
266
- onChange: handleChange,
267
- onBlur: handleBlur,
268
- status,
269
- id,
270
- describedBy,
271
- disabled: ctx.getDisabled(),
272
- required,
273
- })}
274
- {:else}
275
- <div class={cls} data-field={field} style={wrapStyle}>
276
- {#if label !== undefined && !isInset}
277
- <label
278
- class="cd-form-field__label cd-form-field__label--align-{labelAlign}"
279
- for={id}
280
- style={labelStyle}
281
- >
282
- {#if showRequiredMark}<span aria-hidden="true" class="cd-form-field__required">*</span>{/if}
283
- <span class="cd-form-field__label-text">{label}{ctx.getColon() ? ':' : ''}</span>
284
- </label>
285
- {/if}
286
-
287
- <!-- inset 时 label 浮入控件容器内;focusin/focusout 驱动上浮 (红线 #3 命令式 DOM 事件) -->
288
- <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
289
- <div
290
- class="cd-form-field__control"
291
- aria-describedby={describedBy}
292
- onfocusin={isInset ? () => (focused = true) : undefined}
293
- onfocusout={isInset ? () => (focused = false) : undefined}
294
- >
295
- {#if label !== undefined && isInset}
296
- <label class="cd-form-field__inset-label" for={id}>
297
- {#if showRequiredMark}<span aria-hidden="true" class="cd-form-field__required">*</span>{/if}
298
- <span class="cd-form-field__label-text">{label}</span>
299
- </label>
300
- {/if}
301
-
302
- {@render children?.({
303
- value,
304
- // alias keyed by valuePropName (e.g. `checked`); for the default 'value'
305
- // this is the same key and a no-op spread. Pure object construction —
306
- // no write-back, satisfies red line #1/#2.
307
- [valuePropName]: value,
308
- onChange: handleChange,
309
- onBlur: handleBlur,
310
- status,
311
- id,
312
- describedBy,
313
- disabled: ctx.getDisabled(),
314
- required,
315
- })}
316
-
317
- {#if validating}
318
- <div class="cd-form-field__validating" aria-live="polite">
319
- <span class="cd-form-field__spinner" aria-hidden="true"></span>
320
- <span>{validatingText}</span>
321
- </div>
322
- {/if}
323
-
324
- {#if showError}
325
- <div id={errorId} role="alert" class="cd-form-field__error">
326
- {#if showValidateIcon}
327
- <svg
328
- class="cd-form-field__status-icon"
329
- viewBox="0 0 16 16"
330
- width="14"
331
- height="14"
332
- aria-hidden="true"
333
- focusable="false"
334
- >
335
- <path
336
- fill="currentColor"
337
- d="M8 1a7 7 0 1 0 0 14A7 7 0 0 0 8 1Zm-.75 3.5h1.5v5h-1.5v-5ZM8 12.25a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"
338
- />
339
- </svg>
340
- {/if}
341
- <span>{error}</span>
342
- </div>
343
- {:else if showWarning}
344
- <div id={warningId} class="cd-form-field__warning">
345
- {#if showValidateIcon}
346
- <svg
347
- class="cd-form-field__status-icon"
348
- viewBox="0 0 16 16"
349
- width="14"
350
- height="14"
351
- aria-hidden="true"
352
- focusable="false"
353
- >
354
- <path
355
- fill="currentColor"
356
- d="M7.13 1.7a1 1 0 0 1 1.74 0l6.1 10.8A1 1 0 0 1 14.1 14H1.9a1 1 0 0 1-.87-1.5l6.1-10.8ZM7.25 6h1.5v4h-1.5V6ZM8 12.4a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"
357
- />
358
- </svg>
359
- {/if}
360
- <span>{warning}</span>
361
- </div>
362
- {:else if showExtra}
363
- <div id={extraId} class="cd-form-field__extra" class:cd-form-field__extra--middle={extraTextPosition === 'middle'} class:cd-form-field__extra--bottom={extraTextPosition === 'bottom'}>{extraText}</div>
364
- {/if}
365
- </div>
366
- </div>
367
- {/if}
368
-
369
- <style>
370
- .cd-form-field {
371
- display: flex;
372
- gap: var(--cd-form-label-gap, var(--cd-spacing-2));
373
- }
374
- .cd-form-field--label-top {
375
- flex-direction: column;
376
- }
377
- .cd-form-field--label-left {
378
- flex-direction: row;
379
- align-items: flex-start;
380
- }
381
- .cd-form-field__label {
382
- display: inline-flex;
383
- align-items: center;
384
- gap: var(--cd-spacing-1);
385
- color: var(--cd-form-label-color, var(--cd-color-text-1));
386
- }
387
- /* labelAlign (§4 L60): justify the label's inline content within its box */
388
- .cd-form-field__label--align-left {
389
- justify-content: flex-start;
390
- }
391
- .cd-form-field__label--align-right {
392
- justify-content: flex-end;
393
- }
394
- .cd-form-field--label-left .cd-form-field__label {
395
- padding-block-start: var(--cd-spacing-1);
396
- }
397
- .cd-form-field__required {
398
- color: var(--cd-form-required-color, var(--cd-color-danger, #e54848));
399
- }
400
- .cd-form-field__control {
401
- display: flex;
402
- flex: 1;
403
- flex-direction: column;
404
- gap: var(--cd-spacing-1);
405
- min-inline-size: 0;
406
- }
407
- /* inset floating label */
408
- .cd-form-field--label-inset {
409
- flex-direction: column;
410
- }
411
- .cd-form-field--label-inset .cd-form-field__control {
412
- position: relative;
413
- padding-block-start: var(--cd-spacing-3);
414
- }
415
- .cd-form-field__inset-label {
416
- position: absolute;
417
- inset-block-start: 50%;
418
- inset-inline-start: var(--cd-input-padding-x, var(--cd-spacing-3));
419
- transform: translateY(-50%);
420
- display: inline-flex;
421
- align-items: center;
422
- gap: var(--cd-spacing-1);
423
- color: var(--cd-input-color-placeholder, var(--cd-color-text-3));
424
- pointer-events: none;
425
- transition:
426
- transform var(--cd-motion-duration-fast) var(--cd-motion-ease-standard),
427
- font-size var(--cd-motion-duration-fast) var(--cd-motion-ease-standard),
428
- color var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
429
- }
430
- .cd-form-field--floated .cd-form-field__inset-label {
431
- transform: translateY(calc(-50% - 0.85rem)) scale(0.85);
432
- color: var(--cd-form-label-color, var(--cd-color-text-1));
433
- }
434
- @media (prefers-reduced-motion: reduce) {
435
- .cd-form-field__inset-label {
436
- transition: none;
437
- }
438
- }
439
- .cd-form-field__error {
440
- display: inline-flex;
441
- align-items: center;
442
- gap: var(--cd-spacing-1);
443
- color: var(--cd-form-error-color, var(--cd-color-danger, #e54848));
444
- font-size: var(--cd-form-error-font-size, var(--cd-font-size-1, 0.75rem));
445
- }
446
- .cd-form-field__warning {
447
- display: inline-flex;
448
- align-items: center;
449
- gap: var(--cd-spacing-1);
450
- color: var(--cd-form-warning-color, var(--cd-color-warning, #fa8c16));
451
- font-size: var(--cd-form-error-font-size, var(--cd-font-size-1, 0.75rem));
452
- }
453
- .cd-form-field__status-icon {
454
- flex: 0 0 auto;
455
- }
456
- .cd-form-field__extra {
457
- color: var(--cd-form-extra-color, var(--cd-color-text-3));
458
- font-size: var(--cd-form-error-font-size, var(--cd-font-size-1, 0.75rem));
459
- }
460
- .cd-form-field__extra--middle {
461
- order: -1;
462
- }
463
- .cd-form-field__extra--bottom {
464
- order: 0;
465
- }
466
- /* async-validation indicator (red line #3: pure-CSS spin, no JS geometry) */
467
- .cd-form-field__validating {
468
- display: inline-flex;
469
- align-items: center;
470
- gap: var(--cd-spacing-1);
471
- color: var(--cd-form-extra-color, var(--cd-color-text-3));
472
- font-size: var(--cd-form-error-font-size, var(--cd-font-size-1, 0.75rem));
473
- }
474
- .cd-form-field__spinner {
475
- inline-size: 0.85em;
476
- block-size: 0.85em;
477
- border: 2px solid var(--cd-color-fill-2, rgba(0, 0, 0, 0.1));
478
- border-block-start-color: var(--cd-color-primary, #3370ff);
479
- border-radius: 50%;
480
- animation: cd-form-field-spin 0.7s linear infinite;
481
- }
482
- @keyframes cd-form-field-spin {
483
- to {
484
- transform: rotate(360deg);
485
- }
486
- }
487
- @media (prefers-reduced-motion: reduce) {
488
- .cd-form-field__spinner {
489
- animation-duration: 1.8s;
490
- }
491
- }
492
- </style>
@@ -1,75 +0,0 @@
1
- <!--
2
- FieldArray (Form.List) — 动态字段数组:增/删/重排子表单项。
3
- 本地维护行标识 items({ key }[]),children snippet 渲染每行;
4
- 子字段用拼接键 `${name}.${item.key}.${sub}` 走普通 Field(core 扁平键天然支持校验)。
5
- remove 时清理该行所有子字段值(setFieldValue undefined),避免提交残留。
6
- 不依赖 core 的嵌套路径支持,自包含(红线 #1:不写回 props,状态本地 $state)。
7
- -->
8
- <script lang="ts">
9
- import { untrack, type Snippet } from 'svelte';
10
- import { useId } from '@chenzy-design/core';
11
- import { getFormContext } from './context.js';
12
-
13
- interface ArrayItem {
14
- /** 稳定行标识,用于拼接子字段名与 each key */
15
- key: string;
16
- }
17
- interface ChildArgs {
18
- items: ArrayItem[];
19
- /** 拼接某行某子字段的完整 field 名 */
20
- name: (item: ArrayItem, sub: string) => string;
21
- add: () => void;
22
- remove: (item: ArrayItem) => void;
23
- move: (from: number, to: number) => void;
24
- }
25
-
26
- interface Props {
27
- /** 数组字段名(子字段前缀) */
28
- name: string;
29
- /** 初始行数 */
30
- initialCount?: number;
31
- children?: Snippet<[ChildArgs]>;
32
- }
33
-
34
- let { name, initialCount = 0, children }: Props = $props();
35
-
36
- const ctx = getFormContext();
37
- if (!ctx) throw new Error('<Form.List> must be used inside <Form>');
38
- const { form } = ctx;
39
-
40
- function newKey(): string {
41
- return useId(`${name}-row`);
42
- }
43
- function getInitial(): ArrayItem[] {
44
- return Array.from({ length: Math.max(0, initialCount) }, () => ({ key: newKey() }));
45
- }
46
- let items = $state<ArrayItem[]>(untrack(getInitial));
47
-
48
- function add() {
49
- items = [...items, { key: newKey() }];
50
- }
51
- function remove(item: ArrayItem) {
52
- // 清理该行所有子字段值(前缀匹配),避免提交残留
53
- const prefix = `${name}.${item.key}.`;
54
- const values = form.getState().values;
55
- for (const k of Object.keys(values)) {
56
- if (k.startsWith(prefix)) form.setFieldValue(k, undefined);
57
- }
58
- items = items.filter((it) => it.key !== item.key);
59
- }
60
- function move(from: number, to: number) {
61
- if (from === to || from < 0 || to < 0 || from >= items.length || to >= items.length) return;
62
- const next = [...items];
63
- const [moved] = next.splice(from, 1);
64
- next.splice(to, 0, moved as ArrayItem);
65
- items = next;
66
- }
67
-
68
- function fieldName(item: ArrayItem, sub: string): string {
69
- return `${name}.${item.key}.${sub}`;
70
- }
71
- </script>
72
-
73
- <div class="cd-field-array">
74
- {@render children?.({ items, name: fieldName, add, remove, move })}
75
- </div>
@@ -1,39 +0,0 @@
1
- // Form a11y:经 FormA11yFixture 组合 Form.Input + Form.Field 自定义控件。
2
- // 验证 label 关联(<label for> ↔ 控件 id)、required → aria-required、
3
- // validateStatus=error → 控件 aria-invalid、extraText/error → aria-describedby。
4
- // 仅静态 ARIA + axe(不测校验交互)。
5
- import { describe, it, expect } from 'vitest';
6
- import { renderWithLocale, expectNoAxeViolations } from '../test-utils/a11y.js';
7
- import FormA11yFixture from './FormA11yFixture.svelte';
8
-
9
- describe('Form a11y', () => {
10
- it('Form.Input:label 经 for/id 关联到 input,required → aria-required', async () => {
11
- const { container } = renderWithLocale(FormA11yFixture, {});
12
- const nameField = container.querySelector('[data-field="name"]');
13
- expect(nameField).not.toBeNull();
14
- const label = nameField?.querySelector('label');
15
- const input = nameField?.querySelector('input');
16
- expect(label).not.toBeNull();
17
- expect(input).not.toBeNull();
18
- // label[for] 精确指向控件 id(WAI-ARIA 首选关联)。
19
- expect(label?.getAttribute('for')).toBe(input?.getAttribute('id'));
20
- expect(input?.getAttribute('aria-required')).toBe('true');
21
- });
22
-
23
- it('Form.Field 自定义控件:validateStatus=error → aria-invalid,describedBy 关联存在的元素', async () => {
24
- const { container } = renderWithLocale(FormA11yFixture, {});
25
- const bioField = container.querySelector('[data-field="bio"]');
26
- expect(bioField).not.toBeNull();
27
- const textarea = bioField?.querySelector('textarea');
28
- expect(textarea?.getAttribute('aria-invalid')).toBe('true');
29
- // aria-describedby 指向实际存在的状态文本元素。
30
- const describedBy = textarea?.getAttribute('aria-describedby');
31
- expect(describedBy).toBeTruthy();
32
- expect(container.querySelector(`#${describedBy}`)).not.toBeNull();
33
- });
34
-
35
- it('整个表单:无 axe violations', async () => {
36
- const { container } = renderWithLocale(FormA11yFixture, {});
37
- await expectNoAxeViolations(container);
38
- });
39
- });