@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,806 +0,0 @@
1
- <!--
2
- Carousel — see specs/components/show/Carousel.spec.md
3
- 基础子集:单/多 slide 展示(slidesToShow/slidesToScroll)、slide/fade 动画、
4
- autoplay(含 hoverToPause)、loop、dot/line/columnar 指示器、prev/next 箭头、受控 value、
5
- vertical 纵向方向、pointer 拖拽/滑动手势切换。
6
-
7
- ⚠️ 死循环红线:
8
- - 受控 value 不回写 prop(红线 #1):isControlled = $derived(value !== undefined) +
9
- 内部 $state inner + current = $derived(...);变更只 onChange。
10
- - 当前页/transform 为派生纯函数(红线 #2):trackOffset/pageCount 由 $derived 计算。
11
- - autoplay timer 与 pointer 拖拽监听命令式(红线 #3):autoplay 用普通变量 setInterval
12
- + $effect cleanup;pointermove/up 绑 window 手动 add/remove;拖拽偏移存 $state dragPx。
13
- - 不使用响应式 attachment 读 DOM。
14
- -->
15
- <script lang="ts">
16
- import type { Snippet } from 'svelte';
17
- import { untrack } from 'svelte';
18
- import { useLiveAnnouncer } from '@chenzy-design/core';
19
- import { useLocale } from '../locale-provider/index.js';
20
-
21
- type Animation = 'slide' | 'fade';
22
- type IndicatorType = 'dot' | 'line' | 'columnar';
23
- type IndicatorPosition = 'left' | 'center' | 'right';
24
- type IndicatorSize = 'small' | 'medium';
25
- type Theme = 'primary' | 'light' | 'dark';
26
- type ArrowType = 'hover' | 'always';
27
- type SlideDirection = 'left' | 'right';
28
- type TriggerType = 'hover' | 'click';
29
-
30
- /** autoPlay 对象形式:{ interval?, hoverToPause? } */
31
- type AutoPlayConfig = { interval?: number; hoverToPause?: boolean };
32
-
33
- interface ArrowSlotProps {
34
- children?: Snippet;
35
- onClick?: () => void;
36
- }
37
-
38
- interface Props {
39
- slides?: Snippet[];
40
- /** 受控当前激活索引(Semi API: activeIndex) */
41
- activeIndex?: number;
42
- value?: number;
43
- defaultActiveIndex?: number;
44
- /** 自动播放;支持布尔或对象形式 { interval?, hoverToPause? } */
45
- autoPlay?: boolean | AutoPlayConfig;
46
- /** @deprecated 请用 autoPlay */
47
- autoplay?: boolean;
48
- interval?: number;
49
- loop?: boolean;
50
- animation?: Animation;
51
- speed?: number;
52
- slidesToShow?: number;
53
- slidesToScroll?: number;
54
- vertical?: boolean;
55
- draggable?: boolean;
56
- showIndicator?: boolean;
57
- indicatorType?: IndicatorType;
58
- /** 指示器位置(横向:left/center/right) */
59
- indicatorPosition?: IndicatorPosition;
60
- /** 指示器尺寸 */
61
- indicatorSize?: IndicatorSize;
62
- showArrow?: boolean;
63
- /** 箭头展示时机:hover=悬停时显示,always=始终显示 */
64
- arrowType?: ArrowType;
65
- /** 自定义箭头内容与点击回调 */
66
- arrowProps?: {
67
- leftArrow?: ArrowSlotProps;
68
- rightArrow?: ArrowSlotProps;
69
- };
70
- hoverToPause?: boolean;
71
- /** 主题 */
72
- theme?: Theme;
73
- /** 动画滑动方向 */
74
- slideDirection?: SlideDirection;
75
- /** 指示器触发切换的交互方式 */
76
- trigger?: TriggerType;
77
- height?: number | string;
78
- ariaLabel?: string;
79
- onChange?: (index: number) => void;
80
- onPlayStateChange?: (playing: boolean) => void;
81
- class?: string;
82
- }
83
-
84
- let {
85
- slides = [],
86
- activeIndex,
87
- value,
88
- defaultActiveIndex = 0,
89
- autoPlay,
90
- autoplay = false,
91
- interval = 3000,
92
- loop = true,
93
- animation = 'slide',
94
- speed = 300,
95
- slidesToShow = 1,
96
- slidesToScroll = 1,
97
- vertical = false,
98
- draggable = true,
99
- showIndicator = true,
100
- indicatorType = 'dot',
101
- indicatorPosition = 'center',
102
- indicatorSize = 'medium',
103
- showArrow = true,
104
- arrowType = 'always',
105
- arrowProps,
106
- hoverToPause = true,
107
- theme,
108
- slideDirection,
109
- trigger = 'click',
110
- height = 240,
111
- ariaLabel,
112
- onChange,
113
- onPlayStateChange,
114
- class: className = '',
115
- }: Props = $props();
116
-
117
- // 解析 autoPlay:对象形式覆盖 interval / hoverToPause
118
- const resolvedAutoPlay = $derived.by<boolean>(() => {
119
- if (autoPlay !== undefined) {
120
- return typeof autoPlay === 'boolean' ? autoPlay : true;
121
- }
122
- return autoplay;
123
- });
124
- const resolvedInterval = $derived.by<number>(() => {
125
- if (autoPlay && typeof autoPlay === 'object' && autoPlay.interval !== undefined) {
126
- return autoPlay.interval;
127
- }
128
- return interval;
129
- });
130
- const resolvedHoverToPause = $derived.by<boolean>(() => {
131
- if (autoPlay && typeof autoPlay === 'object' && autoPlay.hoverToPause !== undefined) {
132
- return autoPlay.hoverToPause;
133
- }
134
- return hoverToPause;
135
- });
136
-
137
- // 受控索引:activeIndex 优先于 value(Semi API activeIndex 是主 prop)
138
- const controlledIndex = $derived(activeIndex !== undefined ? activeIndex : value);
139
-
140
- const loc = useLocale();
141
- // 单例 live region(polite):手动切换 slide 时播报「第 N 张,共 M 张」(红线 #3:命令式)。
142
- const announcer = useLiveAnnouncer();
143
-
144
- // 受控 / 非受控(红线 #1):永不回写 prop。
145
- const isControlled = $derived(controlledIndex !== undefined);
146
- let inner = $state(getInitialIndex());
147
- const current = $derived(isControlled ? (controlledIndex as number) : inner);
148
-
149
- function getInitialIndex(): number {
150
- return defaultActiveIndex;
151
- }
152
-
153
- const count = $derived(slides.length);
154
-
155
- // 同屏展示数 / 步长归一(至少 1,且不超过 slide 数)。
156
- const perView = $derived(Math.max(1, Math.min(slidesToShow, Math.max(1, count))));
157
- const step = $derived(Math.max(1, slidesToScroll));
158
-
159
- // fade 动画与多图同屏互斥:多图时强制 slide 轨道平移。
160
- const mode = $derived<Animation>(perView > 1 ? 'slide' : animation);
161
-
162
- // 派生纯函数(红线 #2):可滚动的最大起始索引与页数。
163
- // loop 时每张都能作为起点;非 loop 时起点止于「末尾恰好填满一屏」。
164
- const maxIndex = $derived(loop ? Math.max(0, count - 1) : Math.max(0, count - perView));
165
- const pageCount = $derived(
166
- count === 0 ? 0 : loop ? Math.ceil(count / step) : Math.floor(maxIndex / step) + 1,
167
- );
168
- const activePage = $derived(step > 0 ? Math.round(current / step) : 0);
169
-
170
- // hover 暂停状态(本地)。
171
- let paused = $state(false);
172
- // 键盘焦点进入容器时暂停 autoplay(无障碍:WCAG 2.2.2,焦点态不应继续移动)。
173
- let focused = $state(false);
174
- // 用户经播放/暂停按钮显式切换的状态。默认按 autoplay prop 推断初值。
175
- // userPaused=true 即用户主动暂停;与 hover/focus 暂停叠加判定是否实际运行。
176
- let userPaused = $state(false);
177
-
178
- // reduced-motion:matchMedia 监听,开启时暂停 autoplay(无障碍)。
179
- let reducedMotion = $state(false);
180
-
181
- // 是否「想要」自动播放(用户意图):autoPlay/autoplay 开 且 未被用户显式暂停。
182
- const wantsPlaying = $derived(resolvedAutoPlay && !userPaused);
183
- // 实际是否在播放(叠加 hover/focus/reduced-motion 等运行时抑制)。
184
- const isPlaying = $derived(
185
- wantsPlaying && !paused && !focused && !reducedMotion && count > perView,
186
- );
187
-
188
- function togglePlay() {
189
- userPaused = !userPaused;
190
- onPlayStateChange?.(!userPaused);
191
- }
192
-
193
- $effect(() => {
194
- if (typeof window === 'undefined' || !window.matchMedia) return;
195
- const mql = window.matchMedia('(prefers-reduced-motion: reduce)');
196
- reducedMotion = mql.matches;
197
- const onChangeMq = (e: MediaQueryListEvent) => {
198
- reducedMotion = e.matches;
199
- };
200
- mql.addEventListener('change', onChangeMq);
201
- return () => mql.removeEventListener('change', onChangeMq);
202
- });
203
-
204
- const heightStyle = $derived(typeof height === 'number' ? `${height}px` : height);
205
-
206
- // 每张 slide 占视口的百分比(横/纵向均按 perView 切分)。
207
- const slidePct = $derived(100 / perView);
208
-
209
- function clampIndex(i: number): number {
210
- if (count === 0) return 0;
211
- if (loop) return ((i % count) + count) % count;
212
- return Math.min(maxIndex, Math.max(0, i));
213
- }
214
-
215
- function go(i: number) {
216
- if (count === 0) return;
217
- const next = clampIndex(i);
218
- if (next === current) return;
219
- if (!isControlled) inner = next;
220
- onChange?.(next);
221
- // 手动切换时 polite 播报「第 N 张,共 M 张」;autoplay 实际运行中不播,避免噪音(§6)。
222
- // 用即将生效的 next 计算页码($derived 在同步回调内尚未重算)。
223
- if (!isPlaying && pageCount > 0) {
224
- const nextPage = step > 0 ? Math.round(next / step) : 0;
225
- announcer.announce(
226
- loc().t('Carousel.slideAnnounce', { index: nextPage + 1, total: pageCount }),
227
- );
228
- }
229
- }
230
-
231
- function prev() {
232
- go(current - step);
233
- }
234
- function next() {
235
- go(current + step);
236
- }
237
- function goToPage(p: number) {
238
- go(p * step);
239
- }
240
- // Home/End:跳到第一/最后一张(非 loop 时止于 maxIndex)。
241
- function goFirst() {
242
- go(0);
243
- }
244
- function goLast() {
245
- go(loop ? count - 1 : maxIndex);
246
- }
247
-
248
- // 视口键盘导航(§6):←/→ 切换,Home/End 跳首末。
249
- // RTL 下 ←/→ 物理键语义镜像(←=next、→=prev)。
250
- function onViewportKeydown(e: KeyboardEvent) {
251
- if (count <= perView) return;
252
- const rtl = viewportEl?.matches(':dir(rtl)') ?? false;
253
- switch (e.key) {
254
- case 'ArrowLeft':
255
- e.preventDefault();
256
- rtl ? next() : prev();
257
- break;
258
- case 'ArrowRight':
259
- e.preventDefault();
260
- rtl ? prev() : next();
261
- break;
262
- case 'ArrowUp':
263
- if (!vertical) return;
264
- e.preventDefault();
265
- prev();
266
- break;
267
- case 'ArrowDown':
268
- if (!vertical) return;
269
- e.preventDefault();
270
- next();
271
- break;
272
- case 'Home':
273
- e.preventDefault();
274
- goFirst();
275
- break;
276
- case 'End':
277
- e.preventDefault();
278
- goLast();
279
- break;
280
- }
281
- }
282
-
283
- // autoplay:$effect 内 setInterval,普通变量句柄 + cleanup(红线 #3)。
284
- // 用 untrack 读 current,避免 effect 依赖 current 而每次切换都重建定时器(计时被重置);
285
- // effect 仅依赖 autoplay/paused/count/interval/reducedMotion/step,定时器在一次播放周期内稳定。
286
- $effect(() => {
287
- if (!isPlaying) return;
288
- const id = setInterval(() => {
289
- go(untrack(() => current) + step);
290
- }, resolvedInterval);
291
- return () => clearInterval(id);
292
- });
293
-
294
- function onMouseEnter() {
295
- if (resolvedHoverToPause) paused = true;
296
- }
297
- function onMouseLeave() {
298
- if (resolvedHoverToPause) paused = false;
299
- }
300
- // 键盘焦点进入/离开容器:暂停/恢复 autoplay(§6)。
301
- function onFocusIn() {
302
- focused = true;
303
- }
304
- function onFocusOut(e: FocusEvent) {
305
- // 仅当焦点真正移出容器时恢复(忽略容器内部移动)。
306
- const next = e.relatedTarget as Node | null;
307
- if (!next || !(e.currentTarget as HTMLElement).contains(next)) {
308
- focused = false;
309
- }
310
- }
311
-
312
- // ---- 命令式 pointer 拖拽(红线 #3)----
313
- // 视口尺寸在 pointerdown 时读一次存入普通变量;拖拽偏移(px)存 $state 以驱动轨道平移。
314
- let viewportEl: HTMLElement | null = null;
315
- let dragStart = 0; // 起点坐标(vertical 取 clientY,否则 clientX)
316
- let dragSize = 0; // 视口主轴尺寸(px),用于阈值与百分比换算
317
- let dragPx = $state(0); // 实时拖拽位移(px,负为向后)
318
- let dragging = $state(false);
319
-
320
- // 拖拽期间的额外平移百分比(占整条轨道),由派生纯函数换算(红线 #2)。
321
- const dragPct = $derived(dragSize > 0 ? (dragPx / dragSize) * slidePct : 0);
322
-
323
- function onPointerMove(e: PointerEvent) {
324
- const cur = vertical ? e.clientY : e.clientX;
325
- dragPx = cur - dragStart;
326
- }
327
-
328
- function onPointerUp() {
329
- window.removeEventListener('pointermove', onPointerMove);
330
- window.removeEventListener('pointerup', onPointerUp);
331
- window.removeEventListener('pointercancel', onPointerUp);
332
- const moved = dragPx;
333
- dragging = false;
334
- dragPx = 0;
335
- // 拖过半张(单张尺寸的一半)即进位,否则回弹。
336
- const slideSize = dragSize / perView;
337
- if (slideSize > 0 && Math.abs(moved) > slideSize / 2) {
338
- go(moved < 0 ? current + step : current - step);
339
- }
340
- }
341
-
342
- function onPointerDown(e: PointerEvent) {
343
- if (!draggable || mode !== 'slide' || count <= perView || !viewportEl) return;
344
- // 仅主键 / 触摸 / 笔;忽略右键。
345
- if (e.button !== 0 && e.pointerType === 'mouse') return;
346
- const rect = viewportEl.getBoundingClientRect();
347
- dragSize = vertical ? rect.height : rect.width;
348
- dragStart = vertical ? e.clientY : e.clientX;
349
- dragPx = 0;
350
- dragging = true;
351
- window.addEventListener('pointermove', onPointerMove);
352
- window.addEventListener('pointerup', onPointerUp);
353
- window.addEventListener('pointercancel', onPointerUp);
354
- }
355
-
356
- // 派生纯函数(红线 #2):轨道平移 = 当前索引偏移 + 拖拽偏移。
357
- const trackOffset = $derived(-(current * slidePct) + dragPct);
358
- const axis = $derived(vertical ? 'Y' : 'X');
359
- // 拖拽中关闭过渡(跟手),松手后恢复 speed 过渡。
360
- const trackDuration = $derived(dragging ? 0 : speed);
361
-
362
- const cls = $derived(
363
- [
364
- 'cd-carousel',
365
- `cd-carousel--${mode}`,
366
- vertical && 'cd-carousel--vertical',
367
- dragging && 'cd-carousel--dragging',
368
- draggable && mode === 'slide' && count > perView && 'cd-carousel--draggable',
369
- theme && `cd-carousel--${theme}`,
370
- arrowType && `cd-carousel--arrow-${arrowType}`,
371
- slideDirection && `cd-carousel--slide-${slideDirection}`,
372
- className,
373
- ]
374
- .filter(Boolean)
375
- .join(' '),
376
- );
377
- </script>
378
-
379
- <div
380
- class={cls}
381
- role="region"
382
- aria-roledescription="carousel"
383
- aria-label={ariaLabel ?? loc().t('Carousel.ariaLabel')}
384
- style="block-size:{heightStyle}"
385
- onmouseenter={onMouseEnter}
386
- onmouseleave={onMouseLeave}
387
- onfocusin={onFocusIn}
388
- onfocusout={onFocusOut}
389
- >
390
- <!--
391
- viewport 可聚焦(tabindex=0)以承接 ←/→/Home/End 键盘导航;
392
- autoplay 实际运行时 aria-live=off(避免每次自动切换都打断屏幕阅读器),
393
- 暂停/手动态切到 polite,配合计数文本播报「第 X 张」。
394
- APG carousel:role=group 的轮播视口承载方向键导航属预期模式,故抑制以下两条 a11y 警告。
395
- -->
396
- <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
397
- <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
398
- <div
399
- bind:this={viewportEl}
400
- class="cd-carousel__viewport"
401
- role="group"
402
- aria-roledescription="slides"
403
- tabindex={count > perView ? 0 : undefined}
404
- aria-live={isPlaying ? 'off' : 'polite'}
405
- onpointerdown={onPointerDown}
406
- onkeydown={onViewportKeydown}
407
- >
408
- {#if mode === 'slide'}
409
- <div
410
- class="cd-carousel__track"
411
- style="--cd-carousel-slide-size:{slidePct}%; transform:translate{axis}({trackOffset}%); transition-duration:{trackDuration}ms"
412
- >
413
- {#each slides as slide, i (i)}
414
- <div
415
- class="cd-carousel__slide"
416
- role="group"
417
- aria-roledescription="slide"
418
- aria-label={loc().t('Carousel.slideLabel', { index: i + 1 })}
419
- aria-hidden={(i < current || i >= current + perView) || undefined}
420
- inert={(i < current || i >= current + perView) || undefined}
421
- >
422
- {@render slide()}
423
- </div>
424
- {/each}
425
- </div>
426
- {:else}
427
- <div class="cd-carousel__fade">
428
- {#each slides as slide, i (i)}
429
- <div
430
- class="cd-carousel__slide cd-carousel__slide--fade"
431
- class:cd-carousel__slide--active={i === current}
432
- role="group"
433
- aria-roledescription="slide"
434
- aria-label={loc().t('Carousel.slideLabel', { index: i + 1 })}
435
- aria-hidden={i !== current || undefined}
436
- inert={i !== current || undefined}
437
- style="transition-duration:{speed}ms"
438
- >
439
- {@render slide()}
440
- </div>
441
- {/each}
442
- </div>
443
- {/if}
444
- </div>
445
-
446
- {#if showArrow && count > perView}
447
- <button
448
- type="button"
449
- class="cd-carousel__arrow cd-carousel__arrow--prev"
450
- aria-label={loc().t('Carousel.prev')}
451
- onclick={() => { arrowProps?.leftArrow?.onClick?.(); prev(); }}
452
- >
453
- {#if arrowProps?.leftArrow?.children}
454
- {@render arrowProps.leftArrow.children()}
455
- {:else}
456
- {vertical ? '∧' : '‹'}
457
- {/if}
458
- </button>
459
- <button
460
- type="button"
461
- class="cd-carousel__arrow cd-carousel__arrow--next"
462
- aria-label={loc().t('Carousel.next')}
463
- onclick={() => { arrowProps?.rightArrow?.onClick?.(); next(); }}
464
- >
465
- {#if arrowProps?.rightArrow?.children}
466
- {@render arrowProps.rightArrow.children()}
467
- {:else}
468
- {vertical ? '∨' : '›'}
469
- {/if}
470
- </button>
471
- {/if}
472
-
473
- <!--
474
- 播放/暂停按钮(WCAG 2.2.2):autoPlay/autoplay 开启时常驻,可见且可键盘操作。
475
- label 随 userPaused 切换(播放 ↔ 暂停)。
476
- -->
477
- {#if resolvedAutoPlay && count > perView}
478
- <button
479
- type="button"
480
- class="cd-carousel__play"
481
- aria-label={userPaused ? loc().t('Carousel.play') : loc().t('Carousel.pause')}
482
- aria-pressed={!userPaused}
483
- onclick={togglePlay}
484
- >{userPaused ? '▶' : '❚❚'}</button>
485
- {/if}
486
-
487
- {#if showIndicator && pageCount > 1}
488
- <div
489
- class="cd-carousel__indicators cd-carousel__indicators--{indicatorType} cd-carousel__indicators--{indicatorPosition} cd-carousel__indicators--{indicatorSize}"
490
- role="tablist"
491
- aria-label={loc().t('Carousel.indicators')}
492
- >
493
- {#each { length: pageCount } as _p, p (p)}
494
- <button
495
- type="button"
496
- class="cd-carousel__dot cd-carousel__indicator cd-carousel__indicator--{indicatorType}"
497
- class:cd-carousel__dot--active={p === activePage}
498
- role="tab"
499
- aria-selected={p === activePage}
500
- aria-label={loc().t('Carousel.slideLabel', { index: p + 1 })}
501
- onclick={trigger === 'click' ? () => goToPage(p) : undefined}
502
- onmouseenter={trigger === 'hover' ? () => goToPage(p) : undefined}
503
- ></button>
504
- {/each}
505
- </div>
506
- {/if}
507
- </div>
508
-
509
- <style>
510
- .cd-carousel {
511
- position: relative;
512
- inline-size: 100%;
513
- overflow: hidden;
514
- border-radius: var(--cd-carousel-radius);
515
- }
516
- .cd-carousel__viewport {
517
- position: relative;
518
- inline-size: 100%;
519
- block-size: 100%;
520
- overflow: hidden;
521
- }
522
- .cd-carousel__viewport:focus-visible {
523
- outline: none;
524
- box-shadow: inset 0 0 0 2px var(--cd-color-primary, currentColor);
525
- }
526
- /* 可拖拽时禁用文本/图片选中与浏览器原生平移手势,确保 pointer 跟手。 */
527
- .cd-carousel--draggable .cd-carousel__viewport {
528
- cursor: grab;
529
- user-select: none;
530
- touch-action: pan-y;
531
- }
532
- .cd-carousel--vertical.cd-carousel--draggable .cd-carousel__viewport {
533
- touch-action: pan-x;
534
- }
535
- .cd-carousel--dragging .cd-carousel__viewport {
536
- cursor: grabbing;
537
- }
538
-
539
- /* slide 模式:横向 flex 轨道平移 */
540
- .cd-carousel__track {
541
- display: flex;
542
- inline-size: 100%;
543
- block-size: 100%;
544
- transition-property: transform;
545
- transition-timing-function: var(--cd-motion-ease-standard);
546
- }
547
- .cd-carousel__slide {
548
- flex: 0 0 var(--cd-carousel-slide-size, 100%);
549
- inline-size: var(--cd-carousel-slide-size, 100%);
550
- block-size: 100%;
551
- }
552
-
553
- /* vertical:轨道纵向排列,slide 高度切分,平移走 Y 轴 */
554
- .cd-carousel--vertical .cd-carousel__track {
555
- flex-direction: column;
556
- }
557
- .cd-carousel--vertical .cd-carousel__slide {
558
- inline-size: 100%;
559
- block-size: var(--cd-carousel-slide-size, 100%);
560
- flex: 0 0 var(--cd-carousel-slide-size, 100%);
561
- }
562
-
563
- /* fade 模式:叠放,仅 active 项可见 */
564
- .cd-carousel__fade {
565
- position: relative;
566
- inline-size: 100%;
567
- block-size: 100%;
568
- }
569
- .cd-carousel__slide--fade {
570
- position: absolute;
571
- inset: 0;
572
- opacity: 0;
573
- pointer-events: none;
574
- transition-property: opacity;
575
- transition-timing-function: var(--cd-motion-ease-standard);
576
- }
577
- .cd-carousel__slide--fade.cd-carousel__slide--active {
578
- opacity: 1;
579
- pointer-events: auto;
580
- }
581
-
582
- .cd-carousel__arrow {
583
- position: absolute;
584
- inset-block-start: 50%;
585
- transform: translateY(-50%);
586
- display: inline-flex;
587
- align-items: center;
588
- justify-content: center;
589
- inline-size: var(--cd-carousel-arrow-size);
590
- block-size: var(--cd-carousel-arrow-size);
591
- padding: 0;
592
- border: none;
593
- border-radius: var(--cd-radius-full);
594
- background: var(--cd-carousel-arrow-bg);
595
- color: var(--cd-carousel-arrow-color);
596
- font-size: calc(var(--cd-carousel-arrow-size) * 0.6);
597
- line-height: 1;
598
- cursor: pointer;
599
- z-index: 2;
600
- }
601
- .cd-carousel__arrow--prev {
602
- inset-inline-start: var(--cd-spacing-2);
603
- }
604
- .cd-carousel__arrow--next {
605
- inset-inline-end: var(--cd-spacing-2);
606
- }
607
- .cd-carousel__arrow:focus-visible {
608
- outline: none;
609
- box-shadow: var(--cd-focus-ring);
610
- }
611
-
612
- /* vertical:箭头改为上/下居中 */
613
- .cd-carousel--vertical .cd-carousel__arrow {
614
- inset-block-start: auto;
615
- inset-inline: 0;
616
- margin-inline: auto;
617
- transform: none;
618
- }
619
- .cd-carousel--vertical .cd-carousel__arrow--prev {
620
- inset-block-start: var(--cd-spacing-2);
621
- }
622
- .cd-carousel--vertical .cd-carousel__arrow--next {
623
- inset-block-end: var(--cd-spacing-2);
624
- }
625
-
626
- /* 播放/暂停按钮:左下角常驻,命中区 ≥ 32px。 */
627
- .cd-carousel__play {
628
- position: absolute;
629
- inset-block-end: var(--cd-spacing-2);
630
- inset-inline-start: var(--cd-spacing-2);
631
- display: inline-flex;
632
- align-items: center;
633
- justify-content: center;
634
- inline-size: var(--cd-carousel-arrow-size);
635
- block-size: var(--cd-carousel-arrow-size);
636
- padding: 0;
637
- border: none;
638
- border-radius: var(--cd-radius-full);
639
- background: var(--cd-carousel-arrow-bg);
640
- color: var(--cd-carousel-arrow-color);
641
- font-size: calc(var(--cd-carousel-arrow-size) * 0.4);
642
- line-height: 1;
643
- cursor: pointer;
644
- z-index: 2;
645
- }
646
- .cd-carousel__play:focus-visible {
647
- outline: none;
648
- box-shadow: var(--cd-focus-ring);
649
- }
650
-
651
- .cd-carousel__indicators {
652
- position: absolute;
653
- inset-block-end: var(--cd-spacing-2);
654
- inset-inline: 0;
655
- display: flex;
656
- justify-content: center;
657
- gap: var(--cd-carousel-indicator-gap);
658
- z-index: 2;
659
- }
660
- /* vertical:指示器移至右侧纵向排列 */
661
- .cd-carousel--vertical .cd-carousel__indicators {
662
- inset-block: 0;
663
- inset-inline-end: var(--cd-spacing-2);
664
- inset-inline-start: auto;
665
- flex-direction: column;
666
- justify-content: center;
667
- }
668
- .cd-carousel__dot {
669
- inline-size: 8px;
670
- block-size: 8px;
671
- padding: 0;
672
- border: none;
673
- border-radius: var(--cd-radius-full);
674
- background: var(--cd-carousel-indicator-color);
675
- cursor: pointer;
676
- transition: background var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
677
- }
678
- .cd-carousel__dot--active {
679
- background: var(--cd-carousel-indicator-color-active);
680
- }
681
- .cd-carousel__dot:focus-visible {
682
- outline: none;
683
- box-shadow: var(--cd-focus-ring);
684
- }
685
-
686
- /* line 指示器:横向细长条;激活态加长 + 高亮(纯 CSS 派生,红线 #2)。 */
687
- .cd-carousel__indicator--line {
688
- inline-size: 16px;
689
- block-size: 4px;
690
- border-radius: var(--cd-radius-full);
691
- transition:
692
- background var(--cd-motion-duration-fast) var(--cd-motion-ease-standard),
693
- inline-size var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
694
- }
695
- .cd-carousel__indicator--line.cd-carousel__dot--active {
696
- inline-size: 24px;
697
- }
698
- /* vertical 方向:line 旋为纵向细条(主轴改为 block-size 伸缩)。 */
699
- .cd-carousel--vertical .cd-carousel__indicator--line {
700
- inline-size: 4px;
701
- block-size: 16px;
702
- transition:
703
- background var(--cd-motion-duration-fast) var(--cd-motion-ease-standard),
704
- block-size var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
705
- }
706
- .cd-carousel--vertical .cd-carousel__indicator--line.cd-carousel__dot--active {
707
- block-size: 24px;
708
- }
709
-
710
- /* columnar 指示器:竖栏;默认矮,激活态变高 + 高亮。 */
711
- .cd-carousel__indicator--columnar {
712
- inline-size: 4px;
713
- block-size: 8px;
714
- border-radius: var(--cd-radius-sm, 2px);
715
- transition:
716
- background var(--cd-motion-duration-fast) var(--cd-motion-ease-standard),
717
- block-size var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
718
- }
719
- .cd-carousel__indicator--columnar.cd-carousel__dot--active {
720
- block-size: 14px;
721
- }
722
- /* vertical 方向:columnar 转为横栏,主轴改为 inline-size 伸缩。 */
723
- .cd-carousel--vertical .cd-carousel__indicator--columnar {
724
- inline-size: 8px;
725
- block-size: 4px;
726
- transition:
727
- background var(--cd-motion-duration-fast) var(--cd-motion-ease-standard),
728
- inline-size var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
729
- }
730
- .cd-carousel--vertical .cd-carousel__indicator--columnar.cd-carousel__dot--active {
731
- inline-size: 14px;
732
- }
733
-
734
- /* columnar 横向时按底边对齐,竖栏自底部生长更自然。 */
735
- .cd-carousel__indicators--columnar {
736
- align-items: flex-end;
737
- }
738
- .cd-carousel--vertical .cd-carousel__indicators--columnar {
739
- align-items: flex-start;
740
- }
741
-
742
- /* arrowType=hover:默认隐藏箭头,鼠标悬停 carousel 时显示 */
743
- .cd-carousel--arrow-hover .cd-carousel__arrow {
744
- opacity: 0;
745
- transition: opacity var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
746
- }
747
- .cd-carousel--arrow-hover:hover .cd-carousel__arrow,
748
- .cd-carousel--arrow-hover:focus-within .cd-carousel__arrow {
749
- opacity: 1;
750
- }
751
-
752
- /* indicatorPosition */
753
- .cd-carousel__indicators--left {
754
- justify-content: flex-start;
755
- padding-inline-start: var(--cd-spacing-2);
756
- }
757
- .cd-carousel__indicators--right {
758
- justify-content: flex-end;
759
- padding-inline-end: var(--cd-spacing-2);
760
- }
761
-
762
- /* indicatorSize=small:缩小指示器尺寸 */
763
- .cd-carousel__indicators--small .cd-carousel__dot {
764
- inline-size: 6px;
765
- block-size: 6px;
766
- }
767
- .cd-carousel__indicators--small .cd-carousel__indicator--line {
768
- inline-size: 10px;
769
- block-size: 3px;
770
- }
771
- .cd-carousel__indicators--small .cd-carousel__indicator--line.cd-carousel__dot--active {
772
- inline-size: 16px;
773
- }
774
- .cd-carousel__indicators--small .cd-carousel__indicator--columnar {
775
- inline-size: 3px;
776
- block-size: 6px;
777
- }
778
- .cd-carousel__indicators--small .cd-carousel__indicator--columnar.cd-carousel__dot--active {
779
- block-size: 10px;
780
- }
781
-
782
- /* theme */
783
- .cd-carousel--primary {
784
- --cd-carousel-arrow-bg: var(--cd-color-primary);
785
- --cd-carousel-arrow-color: #fff;
786
- --cd-carousel-indicator-color-active: var(--cd-color-primary);
787
- }
788
- .cd-carousel--light {
789
- --cd-carousel-arrow-bg: rgba(255, 255, 255, 0.85);
790
- --cd-carousel-arrow-color: var(--cd-color-text-1);
791
- }
792
- .cd-carousel--dark {
793
- --cd-carousel-arrow-bg: rgba(0, 0, 0, 0.5);
794
- --cd-carousel-arrow-color: #fff;
795
- --cd-carousel-indicator-color: rgba(255, 255, 255, 0.5);
796
- --cd-carousel-indicator-color-active: #fff;
797
- }
798
-
799
- @media (prefers-reduced-motion: reduce) {
800
- .cd-carousel__track,
801
- .cd-carousel__slide--fade,
802
- .cd-carousel__dot {
803
- transition-duration: 0ms;
804
- }
805
- }
806
- </style>