@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,138 +0,0 @@
1
- /**
2
- * Machine-readable component metadata for AI/docs consumption.
3
- * OverflowList — see specs/components/show/OverflowList.spec.md
4
- */
5
- export const meta = {
6
- name: 'OverflowList',
7
- category: 'show',
8
- description:
9
- '溢出列表:collapse 折叠模式把溢出项收纳进 +N 折叠节点(collapseFrom 决定从尾 end / 头 start 折叠),或 scroll 滚动模式不折叠改为可滚动容器;direction 支持 horizontal 横向 / vertical 纵向。ResizeObserver 命令式测量 + requestAnimationFrame 合批 + hysteresis 滞后防抖动,复用 @chenzy-design/core 收纳算法(computeOverflowPartition)。命令式方法(bind:this 暴露):forceMeasure() 强制立即重测重算(容器尺寸变化未被 RO 捕获时手动触发);scrollTo(index, opts?) scroll 模式滚动到指定项(opts.align start/center/end)。',
10
- exports: ['OverflowList'],
11
- props: [
12
- { name: 'items', type: 'T[]', default: '[]', desc: '数据驱动的列表项' },
13
- {
14
- name: 'size',
15
- type: "'small'|'default'|'large'",
16
- default: "'default'",
17
- desc: '影响 gap(small 4 / default 8 / large 12 px)',
18
- },
19
- {
20
- name: 'mode',
21
- type: "'collapse'|'scroll'",
22
- default: "'collapse'",
23
- desc: 'collapse 折叠溢出项为 +N(默认);scroll 不折叠,可见层沿主轴可滚动',
24
- },
25
- {
26
- name: 'direction',
27
- type: "'horizontal'|'vertical'",
28
- default: "'horizontal'",
29
- desc: '主轴方向:横向(测项宽 + clientWidth)/ 纵向(测项高 + clientHeight,根容器需有高度约束)',
30
- },
31
- {
32
- name: 'collapseFrom',
33
- type: "'end'|'start'",
34
- default: "'end'",
35
- desc: 'collapse 模式下从尾部(end)还是头部(start)折叠;start 时折叠节点渲染在头部,尾部项保持可见',
36
- },
37
- { name: 'gap', type: 'number', default: 'undefined', desc: '显式覆盖项间距(px)' },
38
- {
39
- name: 'minVisibleItems',
40
- type: 'number',
41
- default: '0',
42
- desc: '永不折叠到少于该数量的可见项',
43
- },
44
- {
45
- name: 'alwaysVisibleIndexes',
46
- type: 'number[]',
47
- default: '[]',
48
- desc: '永不被折叠的项索引',
49
- },
50
- {
51
- name: 'threshold',
52
- type: 'number',
53
- default: '8',
54
- desc: 'hysteresis 滞后阈值(px),抑制边界宽度抖动',
55
- },
56
- {
57
- name: 'item',
58
- type: 'Snippet<[{ item: T; index: number }]>',
59
- default: 'undefined',
60
- desc: '渲染单个可见项',
61
- },
62
- {
63
- name: 'overflow',
64
- type: 'Snippet<[{ overflowItems: T[]; overflowCount: number }]>',
65
- default: 'undefined',
66
- desc: '自定义折叠节点;缺省渲染 +N 按钮',
67
- },
68
- {
69
- name: 'onOverflowChange',
70
- type: '(info: { overflowCount: number; visibleCount: number; overflowItems: T[] }) => void',
71
- default: 'undefined',
72
- desc: '收纳结果变化时通知(去重,仅真实变化触发)',
73
- },
74
- { name: 'ariaLabel', type: 'string', default: 'undefined', desc: '容器无障碍标签' },
75
- { name: 'class', type: 'string', default: "''", desc: '附加根类名' },
76
- ],
77
- events: [
78
- {
79
- name: 'onOverflowChange',
80
- desc: '可见数 / 溢出数变化时回调,携带 overflowItems',
81
- },
82
- ],
83
- methods: [
84
- {
85
- name: 'forceMeasure',
86
- type: '() => void',
87
- desc: '命令式强制立即重新测量 + 重算可见/溢出划分(bind:this 后调用)。用于容器尺寸变化未被 ResizeObserver 捕获的场景:父级 display 切回、字体加载、缩放等。同步执行,去重 onOverflowChange 同样生效。',
88
- },
89
- {
90
- name: 'scrollTo',
91
- type: "(index: number, opts?: { align?: 'start' | 'center' | 'end' }) => void",
92
- desc: 'scroll 模式下命令式滚动到指定项(bind:this 后调用)。align 默认 start;vertical 写 scrollTop,horizontal 写 scrollLeft;index 自动 clamp。collapse 模式为 no-op。',
93
- },
94
- ],
95
- slots: [
96
- { name: 'item', desc: '单个可见项渲染模板' },
97
- { name: 'overflow', desc: '自定义 +N 折叠节点' },
98
- ],
99
- a11y: {
100
- hasRole: false,
101
- focusable: false,
102
- note: '根容器 role=group 透明保留子项语义;折叠节点为 button + aria-label「显示其余 N 项」;离屏测量层 aria-hidden 且不进 Tab 序(tabindex=-1);被折叠项随之移出 Tab 序。',
103
- },
104
- tokens: [
105
- '--cd-overflow-list-gap',
106
- '--cd-overflow-list-gap-small',
107
- '--cd-overflow-list-gap-large',
108
- '--cd-overflow-list-overflow-color',
109
- '--cd-overflow-list-overflow-color-hover',
110
- '--cd-overflow-list-overflow-bg',
111
- '--cd-overflow-list-overflow-bg-hover',
112
- '--cd-overflow-list-overflow-radius',
113
- '--cd-overflow-list-focus-ring',
114
- ],
115
- responsive: true,
116
- examples: [
117
- {
118
- title: '基础工具栏收纳',
119
- code: '<OverflowList items={tags}>{#snippet item({ item })}<Tag>{item}</Tag>{/snippet}</OverflowList>',
120
- },
121
- {
122
- title: '自定义折叠节点',
123
- code: '<OverflowList {items}>\n {#snippet item({ item })}<Tag>{item}</Tag>{/snippet}\n {#snippet overflow({ overflowCount })}<Dropdown>更多 {overflowCount}</Dropdown>{/snippet}\n</OverflowList>',
124
- },
125
- {
126
- title: 'start 头部折叠(保留尾部最新项)',
127
- code: '<OverflowList {items} collapseFrom="start">{#snippet item({ item })}<Tag>{item}</Tag>{/snippet}</OverflowList>',
128
- },
129
- {
130
- title: 'scroll 滚动模式(不折叠)',
131
- code: '<OverflowList {items} mode="scroll">{#snippet item({ item })}<Tag>{item}</Tag>{/snippet}</OverflowList>',
132
- },
133
- {
134
- title: 'vertical 纵向(容器需有高度)',
135
- code: '<div style="height:200px"><OverflowList {items} direction="vertical">{#snippet item({ item })}<Tag>{item}</Tag>{/snippet}</OverflowList></div>',
136
- },
137
- ],
138
- } as const;
@@ -1,62 +0,0 @@
1
- // Pagination a11y:分页器。
2
- // nav[aria-label] 包裹,页码为原生 button,当前页 aria-current=page。
3
- //
4
- // 修复记录:
5
- // 1. showSizeChanger 内置 Select 现经 ariaLabel=Pagination.itemsPerPage 获可访问名。
6
- // 2. showQuickJumper 跳页 Input 现经 ariaLabel=Pagination.jumpTo 获可访问名。
7
- // 两处 axe aria-input-field-name / label 均消除。
8
- import { describe, it, expect } from 'vitest';
9
- import { renderWithLocale, expectNoAxeViolations } from '../test-utils/a11y.js';
10
- import Pagination from './Pagination.svelte';
11
-
12
- describe('Pagination a11y', () => {
13
- it('默认渲染:nav landmark + 可访问名,无 axe violations', async () => {
14
- const { container } = renderWithLocale(Pagination, {
15
- props: { total: 100, defaultPageSize: 10 },
16
- });
17
- const nav = container.querySelector('nav');
18
- expect(nav).not.toBeNull();
19
- // ariaLabel 缺省时来自 locale,应非空
20
- expect(nav?.getAttribute('aria-label')).toBeTruthy();
21
- await expectNoAxeViolations(container);
22
- });
23
-
24
- it('当前页 aria-current=page,无 axe violations', async () => {
25
- const { container } = renderWithLocale(Pagination, {
26
- props: { total: 100, defaultPageSize: 10, defaultCurrentPage: 3 },
27
- });
28
- const current = container.querySelector('[aria-current="page"]');
29
- expect(current).not.toBeNull();
30
- expect(current?.textContent?.trim()).toContain('3');
31
- await expectNoAxeViolations(container);
32
- });
33
-
34
- it('自定义 ariaLabel + showTotal,无 axe violations', async () => {
35
- const { container } = renderWithLocale(Pagination, {
36
- props: {
37
- total: 200,
38
- defaultPageSize: 20,
39
- ariaLabel: 'Results pagination',
40
- showTotal: true,
41
- },
42
- });
43
- expect(container.querySelector('nav')?.getAttribute('aria-label')).toBe('Results pagination');
44
- await expectNoAxeViolations(container);
45
- });
46
-
47
- // 内置 Select 经 ariaLabel=Pagination.itemsPerPage 获可访问名。
48
- it('showSizeChanger axe 0 violations(内置 Select 有 aria-label)', async () => {
49
- const { container } = renderWithLocale(Pagination, {
50
- props: { total: 200, defaultPageSize: 20, showSizeChanger: true },
51
- });
52
- await expectNoAxeViolations(container);
53
- });
54
-
55
- // 跳页 input 经 ariaLabel=Pagination.jumpTo 获可访问名。
56
- it('showQuickJumper axe 0 violations(跳页 input 有 aria-label)', async () => {
57
- const { container } = renderWithLocale(Pagination, {
58
- props: { total: 200, defaultPageSize: 20, showQuickJumper: true },
59
- });
60
- await expectNoAxeViolations(container);
61
- });
62
- });
@@ -1,66 +0,0 @@
1
- // Pagination 键盘 e2e(browser project / 真实 chromium)。
2
- // 页码按钮组 roving(真实焦点):方向键移动焦点但不切页(切页交给 Enter/Space → click)。
3
- // 测真实焦点移动——jsdom 测不了(命令式 focus() 不可靠):
4
- // 1. roving 单停靠点:页码组只有当前页 tabindex=0(默认 current=1),其余 -1。
5
- // 2. ←→/↑↓ 真实移动焦点到相邻页码,但 current/aria-current 不变(仅移动焦点)。
6
- // 3. 无 wrap:末页再 → clamp 在末页;首页再 ← clamp 在首页。
7
- //
8
- // 真实焦点断言用 page locator 的 .toHaveFocus()。
9
- import { describe, it, expect } from 'vitest';
10
- import { page } from 'vitest/browser';
11
- import { renderKbdFixture, userEvent } from '../test-utils/kbd.js';
12
- import PaginationKbdFixture from './PaginationKbdFixture.svelte';
13
-
14
- function loc(el: Element) {
15
- return page.elementLocator(el);
16
- }
17
-
18
- describe('Pagination 键盘 e2e(页码 roving,真实焦点,移动≠切页)', () => {
19
- it('roving 单停靠点 + 方向键移动焦点不切页(clamp)', async () => {
20
- const { baseElement } = renderKbdFixture(PaginationKbdFixture);
21
-
22
- const pages = Array.from(
23
- baseElement.querySelectorAll<HTMLElement>('.cd-pagination__page[data-page]'),
24
- );
25
- expect(pages.length).toBe(3);
26
- const [p1, p2, p3] = pages as [HTMLElement, HTMLElement, HTMLElement];
27
-
28
- // 1. roving 单停靠点:当前页(1)tabindex=0,其余 -1。
29
- expect(pages.filter((el) => el.tabIndex === 0).length).toBe(1);
30
- expect(p1.tabIndex).toBe(0);
31
- expect(p1.getAttribute('aria-current')).toBe('page');
32
-
33
- p1.focus();
34
- await expect.element(loc(p1)).toHaveFocus();
35
-
36
- // 2. → 移动焦点到下一页码,但不切页(aria-current 仍在第 1 页)。
37
- await userEvent.keyboard('{ArrowRight}');
38
- await expect.element(loc(p2)).toHaveFocus();
39
- expect(p2.tabIndex).toBe(0);
40
- expect(p1.tabIndex).toBe(-1);
41
- // 移动焦点 ≠ 切页:current 仍为 1。
42
- expect(p1.getAttribute('aria-current')).toBe('page');
43
- expect(p2.getAttribute('aria-current')).toBe(null);
44
-
45
- await userEvent.keyboard('{ArrowRight}');
46
- await expect.element(loc(p3)).toHaveFocus();
47
-
48
- // 无 wrap:末页再 → 停在末页(clamp)。
49
- await userEvent.keyboard('{ArrowRight}');
50
- await expect.element(loc(p3)).toHaveFocus();
51
-
52
- // ← 回退;首页再 ← 停在首页(clamp)。
53
- await userEvent.keyboard('{ArrowLeft}');
54
- await expect.element(loc(p2)).toHaveFocus();
55
- await userEvent.keyboard('{ArrowLeft}');
56
- await expect.element(loc(p1)).toHaveFocus();
57
- await userEvent.keyboard('{ArrowLeft}');
58
- await expect.element(loc(p1)).toHaveFocus();
59
-
60
- // Home/End 跳首/末页码。
61
- await userEvent.keyboard('{End}');
62
- await expect.element(loc(p3)).toHaveFocus();
63
- await userEvent.keyboard('{Home}');
64
- await expect.element(loc(p1)).toHaveFocus();
65
- });
66
- });
@@ -1,428 +0,0 @@
1
- <!--
2
- Pagination — see specs/components/navigation/Pagination.spec.md
3
- Base subset: default + simple modes, prev/next, page buttons with ellipsis,
4
- showTotal text, showSizeChanger (reuses Select), showQuickJumper (reuses Input).
5
- Numbers localized via Intl.NumberFormat; text via locale package.
6
- Boundary validation/clamping via @chenzy-design/core (pure functions):
7
- out-of-range current/pageSize and quick-jumper input are clamped to a valid
8
- page. Controlled props are never written back (red line #1): the clamped page
9
- is only surfaced through onChange.
10
- -->
11
- <script lang="ts">
12
- import type { Snippet } from 'svelte';
13
- import {
14
- paginationPageCount as computePageCount,
15
- clampPage,
16
- clampPageSize,
17
- parseJumpInput,
18
- pageRange,
19
- useLiveAnnouncer,
20
- nextRovingIndex,
21
- rovingKeyFromEvent,
22
- type PageCell as CorePageCell,
23
- } from '@chenzy-design/core';
24
- import { useLocale } from '../locale-provider/index.js';
25
- import { Select } from '../select/index.js';
26
- import { Input } from '../input/index.js';
27
-
28
- type PaginationSize = 'small' | 'default' | 'large';
29
- type PaginationMode = 'default' | 'simple';
30
- type PaginationStatus = 'default' | 'warning' | 'error';
31
- type PopoverPosition = 'top' | 'bottom';
32
-
33
- interface Props {
34
- total?: number;
35
- currentPage?: number;
36
- defaultCurrentPage?: number;
37
- /** controlled page size; omit for uncontrolled (defaultPageSize) */
38
- pageSize?: number;
39
- defaultPageSize?: number;
40
- /** options for the size changer */
41
- pageSizeOptions?: number[];
42
- size?: PaginationSize;
43
- mode?: PaginationMode;
44
- /** quick-jumper validation state (透传 Input) */
45
- status?: PaginationStatus;
46
- showTotal?: boolean | ((total: number, range: [number, number]) => string);
47
- /** show the page-size selector (reuses Select) */
48
- showSizeChanger?: boolean;
49
- /** show the quick-jump input (reuses Input) */
50
- showQuickJumper?: boolean;
51
- /** hide the whole pager when there is only one page */
52
- hideOnSinglePage?: boolean;
53
- /** pages kept on each side of the current page */
54
- siblingCount?: number;
55
- /** pages kept fixed at each boundary (head/tail) */
56
- boundaryCount?: number;
57
- /** size-changer dropdown placement (透传 Select) */
58
- popoverPosition?: PopoverPosition;
59
- disabled?: boolean;
60
- locale?: string;
61
- /** fires on page OR page-size change; receives the resolved (page, pageSize) */
62
- onChange?: (page: number, pageSize: number) => void;
63
- onPageSizeChange?: (pageSize: number) => void;
64
- ariaLabel?: string;
65
- /** 自定义页码按钮内容,接收 { page, isCurrent } */
66
- renderPage?: Snippet<[{ page: number; isCurrent: boolean }]>;
67
- /** size-changer 浮层层叠顺序(透传 CSS 变量 --cd-select-dropdown-z) */
68
- popoverZIndex?: number;
69
- /** 上一页按钮内容,可为字符串或 Snippet */
70
- prevText?: string | Snippet;
71
- /** 下一页按钮内容,可为字符串或 Snippet */
72
- nextText?: string | Snippet;
73
- }
74
-
75
- let {
76
- total = 0,
77
- currentPage,
78
- defaultCurrentPage = 1,
79
- pageSize,
80
- defaultPageSize = 10,
81
- pageSizeOptions = [10, 20, 50, 100],
82
- size = 'default',
83
- mode = 'default',
84
- status = 'default',
85
- showTotal = false,
86
- showSizeChanger = false,
87
- showQuickJumper = false,
88
- hideOnSinglePage = false,
89
- siblingCount = 1,
90
- boundaryCount = 1,
91
- popoverPosition = 'bottom',
92
- disabled = false,
93
- locale = 'zh-CN',
94
- onChange,
95
- onPageSizeChange,
96
- ariaLabel,
97
- renderPage,
98
- popoverZIndex,
99
- prevText,
100
- nextText,
101
- }: Props = $props();
102
-
103
- const loc = useLocale();
104
- // 单例 live region(polite):翻页 / pageSize 变更播报给屏幕阅读器。
105
- // 命令式写入在事件回调里(非 render 期),符合红线 #3。
106
- const announcer = useLiveAnnouncer();
107
-
108
- // --- pageSize 受控/非受控 (红线 #1):不回写 prop ---
109
- const isSizeControlled = $derived(pageSize !== undefined);
110
- let innerSize = $state(getInitialSize());
111
- // 钳制:非法/不在选项内的 pageSize 回退默认值(不回写受控 prop)。
112
- const currentSize = $derived(
113
- clampPageSize(isSizeControlled ? (pageSize as number) : innerSize, pageSizeOptions, defaultPageSize),
114
- );
115
-
116
- function getInitialSize(): number {
117
- return clampPageSize(defaultPageSize, pageSizeOptions, 10);
118
- }
119
-
120
- const pageCount = $derived(computePageCount(total, currentSize));
121
-
122
- // Controlled / uncontrolled (red line #1): never write back the prop.
123
- const isControlled = $derived(currentPage !== undefined);
124
- let inner = $state(getInitialPage());
125
- // 钳制:显示的 current 始终落在 [1, pageCount],越界时显示钳后值(不回写受控 prop)。
126
- const current = $derived(
127
- clampPage(isControlled ? (currentPage as number) : inner, total, currentSize),
128
- );
129
-
130
- function getInitialPage(): number {
131
- return defaultCurrentPage;
132
- }
133
-
134
- // size-changer options for Select
135
- const sizeOptions = $derived(
136
- pageSizeOptions.map((n) => ({
137
- label: loc().t('Pagination.pageSize', { size: n }),
138
- value: n,
139
- })),
140
- );
141
-
142
- // 改变每页条数:保持当前页,超出新总页数则钳到末页(onChange 上报 page+size)。
143
- function changePageSize(nextSize: number) {
144
- if (disabled || nextSize === currentSize) return;
145
- if (!isSizeControlled) innerSize = nextSize;
146
- const nextPage = clampPage(current, total, nextSize);
147
- if (!isControlled && nextPage !== inner) inner = nextPage;
148
- onPageSizeChange?.(nextSize);
149
- onChange?.(nextPage, nextSize);
150
- announcer.announce(
151
- loc().t('Pagination.pageSizeChangeAnnounce', { size: nextSize, page: nextPage }),
152
- );
153
- }
154
-
155
- // 快速跳页:解析输入,越界静默钳入 [1, pageCount];非数字/空输入忽略。
156
- let jumpValue = $state('');
157
- function jump() {
158
- const next = parseJumpInput(jumpValue, total, currentSize);
159
- jumpValue = '';
160
- if (next === null) return;
161
- goto(next);
162
- }
163
-
164
- const nf = $derived(new Intl.NumberFormat(locale));
165
-
166
- // Page list with ellipsis folding via core pure function (red line #2):
167
- // boundaryCount pages kept at each end, siblingCount around current, gaps
168
- // collapse into '…'. Cell count is bounded → million pages stay O(1) DOM.
169
- const pages = $derived<CorePageCell[]>(
170
- pageRange(current, pageCount, siblingCount, boundaryCount),
171
- );
172
-
173
- // hideOnSinglePage: collapse the whole pager when there is only one page.
174
- const hidden = $derived(hideOnSinglePage && pageCount <= 1);
175
-
176
- // map popoverPosition → Select placement
177
- const sizeChangerPlacement = $derived(
178
- popoverPosition === 'top' ? ('topStart' as const) : ('bottomStart' as const),
179
- );
180
-
181
- const isFirst = $derived(current <= 1);
182
- const isLast = $derived(current >= pageCount);
183
-
184
- const cls = $derived(`cd-pagination cd-pagination--${size} cd-pagination--${mode}`);
185
-
186
- function goto(page: number) {
187
- if (disabled) return;
188
- const next = clampPage(page, total, currentSize);
189
- if (next === current) return;
190
- if (!isControlled) inner = next;
191
- onChange?.(next, currentSize);
192
- // 用「即将生效」的 next/pageCount 播报($derived 在同步回调内尚未重算;受控时本就不回写)。
193
- announcer.announce(
194
- loc().t('Pagination.pageChangeAnnounce', { page: next, count: pageCount }),
195
- );
196
- }
197
-
198
- const totalText = $derived(loc().t('Pagination.total', { total: nf.format(total) }));
199
-
200
- // --- roving tabindex(页码按钮,红线 #2/#3)---
201
- // 仅 `type === 'page'` 的单元格参与漫游;省略号/prev/next 不在序列内。
202
- const pageValues = $derived(pages.filter((c) => c.type === 'page').map((c) => c.value));
203
- let listEl = $state<HTMLElement | null>(null);
204
- // focusedPage 为 null 时,tab 落点回退到当前激活页(current)。
205
- let focusedPage = $state<number | null>(null);
206
-
207
- // 纯函数 tabindex:焦点项 0,其余 -1(无焦点项时 current 接收 Tab)。
208
- function pageTabindex(value: number): 0 | -1 {
209
- const stop = focusedPage ?? current;
210
- return value === stop ? 0 : -1;
211
- }
212
-
213
- // 方向键漫游:移动焦点,不切页;Enter/Space 交给原生 button click → goto。
214
- function onPageKeydown(e: KeyboardEvent, value: number) {
215
- const intent = rovingKeyFromEvent(e.key);
216
- if (!intent) return;
217
- e.preventDefault();
218
- const vals = pageValues;
219
- const idx = vals.indexOf(value);
220
- const nextIdx = nextRovingIndex(idx, vals.length, intent, false);
221
- const nextVal = vals[nextIdx];
222
- if (nextVal !== undefined) {
223
- focusedPage = nextVal;
224
- listEl?.querySelector<HTMLElement>(`[data-page="${nextVal}"]`)?.focus();
225
- }
226
- }
227
- </script>
228
-
229
- {#if !hidden}
230
- <nav class={cls} aria-label={ariaLabel ?? loc().t('Pagination.ariaLabel')}>
231
- {#if showTotal}
232
- <span class="cd-pagination__total">
233
- {#if typeof showTotal === 'function'}
234
- {showTotal(total, [(current - 1) * currentSize + 1, Math.min(current * currentSize, total)])}
235
- {:else}
236
- {totalText}
237
- {/if}
238
- </span>
239
- {/if}
240
-
241
- <button
242
- type="button"
243
- class="cd-pagination__prev"
244
- disabled={disabled || isFirst}
245
- aria-label={loc().t('Pagination.prevPage')}
246
- onclick={() => goto(current - 1)}
247
- >{#if prevText}{#if typeof prevText === 'function'}{@render prevText()}{:else}{prevText}{/if}{:else}‹{/if}</button
248
- >
249
-
250
- {#if mode === 'simple'}
251
- <span class="cd-pagination__simple">
252
- <span class="cd-pagination__simple-current">{nf.format(current)}</span>
253
- <span class="cd-pagination__simple-sep" aria-hidden="true">/</span>
254
- <span class="cd-pagination__simple-total">{nf.format(pageCount)}</span>
255
- </span>
256
- {:else}
257
- <ul class="cd-pagination__list" bind:this={listEl}>
258
- {#each pages as cell (cell.type === 'page' ? `p-${cell.value}` : `e-${cell.position}`)}
259
- <li class="cd-pagination__item">
260
- {#if cell.type === 'ellipsis'}
261
- <span class="cd-pagination__ellipsis" aria-hidden="true">…</span>
262
- {:else}
263
- <button
264
- type="button"
265
- class="cd-pagination__page"
266
- class:cd-pagination__page--active={cell.value === current}
267
- aria-current={cell.value === current ? 'page' : undefined}
268
- aria-label={loc().t('Pagination.pageLabel', { page: cell.value })}
269
- data-page={cell.value}
270
- tabindex={pageTabindex(cell.value)}
271
- {disabled}
272
- onclick={() => goto(cell.value)}
273
- onfocus={() => (focusedPage = cell.value)}
274
- onkeydown={(e) => onPageKeydown(e, cell.value)}
275
- >{#if renderPage}{@render renderPage({ page: cell.value, isCurrent: cell.value === current })}{:else}{nf.format(cell.value)}{/if}</button
276
- >
277
- {/if}
278
- </li>
279
- {/each}
280
- </ul>
281
- {/if}
282
-
283
- <button
284
- type="button"
285
- class="cd-pagination__next"
286
- disabled={disabled || isLast}
287
- aria-label={loc().t('Pagination.nextPage')}
288
- onclick={() => goto(current + 1)}
289
- >{#if nextText}{#if typeof nextText === 'function'}{@render nextText()}{:else}{nextText}{/if}{:else}›{/if}</button
290
- >
291
-
292
- {#if showSizeChanger}
293
- <span class="cd-pagination__size-changer" style={popoverZIndex != null ? `--cd-select-dropdown-z:${popoverZIndex}` : undefined}>
294
- <Select
295
- {size}
296
- {disabled}
297
- ariaLabel={loc().t('Pagination.itemsPerPage')}
298
- placement={sizeChangerPlacement}
299
- options={sizeOptions}
300
- value={currentSize}
301
- onChange={(v) => changePageSize(Number(v))}
302
- />
303
- </span>
304
- {/if}
305
-
306
- {#if showQuickJumper}
307
- <span class="cd-pagination__jumper">
308
- <span class="cd-pagination__jumper-label">{loc().t('Pagination.jumpTo')}</span>
309
- <span class="cd-pagination__jumper-input">
310
- <Input
311
- {size}
312
- {status}
313
- {disabled}
314
- ariaLabel={loc().t('Pagination.jumpTo')}
315
- value={jumpValue}
316
- onInput={(v) => (jumpValue = v)}
317
- onEnter={jump}
318
- />
319
- </span>
320
- {#if loc().t('Pagination.jumpToSuffix')}
321
- <span class="cd-pagination__jumper-suffix">{loc().t('Pagination.jumpToSuffix')}</span>
322
- {/if}
323
- </span>
324
- {/if}
325
- </nav>
326
- {/if}
327
-
328
- <style>
329
- .cd-pagination {
330
- display: inline-flex;
331
- align-items: center;
332
- gap: var(--cd-pagination-gap);
333
- color: var(--cd-color-text-0);
334
- }
335
- .cd-pagination__list {
336
- display: inline-flex;
337
- align-items: center;
338
- gap: var(--cd-pagination-gap);
339
- margin: 0;
340
- padding: 0;
341
- list-style: none;
342
- }
343
- .cd-pagination__item {
344
- display: inline-flex;
345
- }
346
- .cd-pagination__page,
347
- .cd-pagination__prev,
348
- .cd-pagination__next {
349
- display: inline-flex;
350
- align-items: center;
351
- justify-content: center;
352
- min-inline-size: var(--cd-pagination-item-size);
353
- block-size: var(--cd-pagination-item-size);
354
- padding-inline: var(--cd-spacing-2);
355
- border: var(--cd-pagination-item-border);
356
- border-radius: var(--cd-pagination-item-radius);
357
- background: transparent;
358
- color: inherit;
359
- font: inherit;
360
- cursor: pointer;
361
- transition: background-color var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
362
- }
363
- .cd-pagination__page:hover:not(:disabled):not(.cd-pagination__page--active),
364
- .cd-pagination__prev:hover:not(:disabled),
365
- .cd-pagination__next:hover:not(:disabled) {
366
- background: var(--cd-pagination-item-bg-hover);
367
- }
368
- .cd-pagination__page--active {
369
- background: var(--cd-pagination-item-bg-active);
370
- color: var(--cd-pagination-item-color-active);
371
- }
372
- .cd-pagination__page:focus-visible,
373
- .cd-pagination__prev:focus-visible,
374
- .cd-pagination__next:focus-visible {
375
- outline: none;
376
- box-shadow: var(--cd-focus-ring);
377
- }
378
- .cd-pagination__page:disabled,
379
- .cd-pagination__prev:disabled,
380
- .cd-pagination__next:disabled {
381
- cursor: not-allowed;
382
- opacity: 0.4;
383
- }
384
- .cd-pagination__ellipsis {
385
- display: inline-flex;
386
- align-items: center;
387
- justify-content: center;
388
- min-inline-size: var(--cd-pagination-item-size);
389
- block-size: var(--cd-pagination-item-size);
390
- user-select: none;
391
- }
392
- .cd-pagination__simple {
393
- display: inline-flex;
394
- align-items: center;
395
- gap: var(--cd-spacing-1);
396
- }
397
- .cd-pagination__size-changer {
398
- display: inline-flex;
399
- inline-size: var(--cd-pagination-size-changer-width, 7.5rem);
400
- }
401
- .cd-pagination__jumper {
402
- display: inline-flex;
403
- align-items: center;
404
- gap: var(--cd-spacing-1);
405
- }
406
- .cd-pagination__jumper-input {
407
- inline-size: var(--cd-pagination-jumper-width, 3.5rem);
408
- }
409
- .cd-pagination--small .cd-pagination__page,
410
- .cd-pagination--small .cd-pagination__prev,
411
- .cd-pagination--small .cd-pagination__next,
412
- .cd-pagination--small .cd-pagination__ellipsis {
413
- font-size: var(--cd-font-size-1);
414
- }
415
- .cd-pagination--large .cd-pagination__page,
416
- .cd-pagination--large .cd-pagination__prev,
417
- .cd-pagination--large .cd-pagination__next,
418
- .cd-pagination--large .cd-pagination__ellipsis {
419
- font-size: var(--cd-font-size-3);
420
- }
421
- @media (prefers-reduced-motion: reduce) {
422
- .cd-pagination__page,
423
- .cd-pagination__prev,
424
- .cd-pagination__next {
425
- transition: none;
426
- }
427
- }
428
- </style>