@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.
- package/dist/components.json +1 -1
- package/package.json +7 -8
- package/src/_floating/use-floating.ts +0 -208
- package/src/anchor/Anchor.a11y.test.ts +0 -49
- package/src/anchor/Anchor.kbd.test.ts +0 -70
- package/src/anchor/Anchor.svelte +0 -359
- package/src/anchor/AnchorKbdFixture.svelte +0 -24
- package/src/anchor/index.ts +0 -3
- package/src/anchor/meta.ts +0 -70
- package/src/anchor/types.ts +0 -8
- package/src/autocomplete/AutoComplete.a11y.test.ts +0 -49
- package/src/autocomplete/AutoComplete.kbd.test.ts +0 -69
- package/src/autocomplete/AutoComplete.svelte +0 -706
- package/src/autocomplete/AutoCompleteKbdFixture.svelte +0 -24
- package/src/autocomplete/index.ts +0 -2
- package/src/autocomplete/meta.ts +0 -41
- package/src/avatar/Avatar.a11y.test.ts +0 -37
- package/src/avatar/Avatar.svelte +0 -315
- package/src/avatar/AvatarGroup.svelte +0 -142
- package/src/avatar/context.ts +0 -21
- package/src/avatar/index.ts +0 -10
- package/src/avatar/meta.ts +0 -73
- package/src/back-top/BackTop.a11y.test.ts +0 -40
- package/src/back-top/BackTop.svelte +0 -314
- package/src/back-top/index.ts +0 -2
- package/src/back-top/meta.ts +0 -108
- package/src/badge/Badge.a11y.test.ts +0 -35
- package/src/badge/Badge.svelte +0 -328
- package/src/badge/BadgeA11yFixture.svelte +0 -18
- package/src/badge/index.ts +0 -2
- package/src/badge/meta.ts +0 -62
- package/src/banner/Banner.a11y.test.ts +0 -48
- package/src/banner/Banner.svelte +0 -368
- package/src/banner/index.ts +0 -3
- package/src/banner/meta.ts +0 -121
- package/src/breadcrumb/Breadcrumb.a11y.test.ts +0 -35
- package/src/breadcrumb/Breadcrumb.kbd.test.ts +0 -45
- package/src/breadcrumb/Breadcrumb.svelte +0 -414
- package/src/breadcrumb/BreadcrumbKbdFixture.svelte +0 -23
- package/src/breadcrumb/Item.svelte +0 -77
- package/src/breadcrumb/context.ts +0 -27
- package/src/breadcrumb/index.ts +0 -21
- package/src/breadcrumb/meta.ts +0 -128
- package/src/breadcrumb/types.ts +0 -4
- package/src/button/Button.a11y.test.ts +0 -54
- package/src/button/Button.svelte +0 -176
- package/src/button/index.ts +0 -2
- package/src/button/meta.ts +0 -28
- package/src/calendar/Calendar.a11y.test.ts +0 -51
- package/src/calendar/Calendar.kbd.test.ts +0 -59
- package/src/calendar/Calendar.svelte +0 -1344
- package/src/calendar/CalendarKbdFixture.svelte +0 -23
- package/src/calendar/index.ts +0 -3
- package/src/calendar/meta.ts +0 -117
- package/src/card/Card.a11y.test.ts +0 -38
- package/src/card/Card.svelte +0 -341
- package/src/card/CardMeta.svelte +0 -60
- package/src/card/index.ts +0 -8
- package/src/card/meta.ts +0 -83
- package/src/carousel/Carousel.a11y.test.ts +0 -53
- package/src/carousel/Carousel.kbd.test.ts +0 -67
- package/src/carousel/Carousel.svelte +0 -806
- package/src/carousel/CarouselA11yFixture.svelte +0 -25
- package/src/carousel/CarouselKbdFixture.svelte +0 -24
- package/src/carousel/index.ts +0 -2
- package/src/carousel/meta.ts +0 -74
- package/src/cascader/Cascader.a11y.test.ts +0 -59
- package/src/cascader/Cascader.kbd.test.ts +0 -56
- package/src/cascader/Cascader.svelte +0 -1570
- package/src/cascader/CascaderKbdFixture.svelte +0 -31
- package/src/cascader/index.ts +0 -3
- package/src/cascader/meta.ts +0 -57
- package/src/cascader/types.ts +0 -9
- package/src/checkbox/Checkbox.svelte +0 -281
- package/src/checkbox/CheckboxGroup.a11y.test.ts +0 -43
- package/src/checkbox/CheckboxGroup.kbd.test.ts +0 -40
- package/src/checkbox/CheckboxGroup.svelte +0 -122
- package/src/checkbox/CheckboxGroupKbdFixture.svelte +0 -20
- package/src/checkbox/context.ts +0 -31
- package/src/checkbox/index.ts +0 -4
- package/src/checkbox/meta.ts +0 -67
- package/src/collapse/Collapse.a11y.test.ts +0 -53
- package/src/collapse/Collapse.kbd.test.ts +0 -89
- package/src/collapse/Collapse.svelte +0 -406
- package/src/collapse/CollapseA11yFixture.svelte +0 -27
- package/src/collapse/CollapseKbdFixture.svelte +0 -25
- package/src/collapse/CollapsePanel.svelte +0 -102
- package/src/collapse/context.ts +0 -54
- package/src/collapse/index.ts +0 -17
- package/src/collapse/meta.ts +0 -79
- package/src/collapse/types.ts +0 -5
- package/src/color-picker/ColorPicker.a11y.test.ts +0 -60
- package/src/color-picker/ColorPicker.kbd.test.ts +0 -73
- package/src/color-picker/ColorPicker.svelte +0 -985
- package/src/color-picker/ColorPickerKbdFixture.svelte +0 -25
- package/src/color-picker/index.ts +0 -2
- package/src/color-picker/meta.ts +0 -47
- package/src/config-provider/ConfigProvider.svelte +0 -227
- package/src/config-provider/context.ts +0 -29
- package/src/config-provider/index.ts +0 -48
- package/src/config-provider/meta.ts +0 -128
- package/src/date-picker/DatePicker.a11y.test.ts +0 -45
- package/src/date-picker/DatePicker.kbd.test.ts +0 -71
- package/src/date-picker/DatePicker.svelte +0 -1798
- package/src/date-picker/DatePickerKbdFixture.svelte +0 -26
- package/src/date-picker/RangePicker.kbd.test.ts +0 -69
- package/src/date-picker/RangePicker.svelte +0 -775
- package/src/date-picker/RangePickerKbdFixture.svelte +0 -30
- package/src/date-picker/index.ts +0 -4
- package/src/date-picker/meta.ts +0 -67
- package/src/date-picker/range-meta.ts +0 -44
- package/src/descriptions/Descriptions.a11y.test.ts +0 -33
- package/src/descriptions/Descriptions.svelte +0 -287
- package/src/descriptions/DescriptionsItem.svelte +0 -43
- package/src/descriptions/context.ts +0 -21
- package/src/descriptions/index.ts +0 -16
- package/src/descriptions/meta.ts +0 -45
- package/src/descriptions/types.ts +0 -6
- package/src/divider/Divider.a11y.test.ts +0 -23
- package/src/divider/Divider.svelte +0 -154
- package/src/divider/index.ts +0 -2
- package/src/divider/meta.ts +0 -23
- package/src/drawer/Drawer.a11y.test.ts +0 -41
- package/src/drawer/Drawer.kbd.test.ts +0 -67
- package/src/drawer/Drawer.svelte +0 -554
- package/src/drawer/DrawerKbdFixture.svelte +0 -28
- package/src/drawer/index.ts +0 -2
- package/src/drawer/meta.ts +0 -127
- package/src/dropdown/Dropdown.a11y.test.ts +0 -46
- package/src/dropdown/Dropdown.kbd.test.ts +0 -56
- package/src/dropdown/Dropdown.svelte +0 -573
- package/src/dropdown/DropdownA11yFixture.svelte +0 -24
- package/src/dropdown/DropdownDivider.svelte +0 -17
- package/src/dropdown/DropdownItem.svelte +0 -127
- package/src/dropdown/DropdownItemNode.svelte +0 -355
- package/src/dropdown/DropdownKbdFixture.svelte +0 -26
- package/src/dropdown/DropdownMenu.svelte +0 -24
- package/src/dropdown/DropdownSubMenu.svelte +0 -212
- package/src/dropdown/DropdownTitle.svelte +0 -34
- package/src/dropdown/context.ts +0 -13
- package/src/dropdown/index.ts +0 -36
- package/src/dropdown/meta.ts +0 -97
- package/src/dropdown/types.test.ts +0 -50
- package/src/dropdown/types.ts +0 -67
- package/src/empty/Empty.a11y.test.ts +0 -24
- package/src/empty/Empty.svelte +0 -304
- package/src/empty/index.ts +0 -2
- package/src/empty/meta.ts +0 -41
- package/src/form/Field.svelte +0 -492
- package/src/form/FieldArray.svelte +0 -75
- package/src/form/Form.a11y.test.ts +0 -39
- package/src/form/Form.svelte +0 -243
- package/src/form/FormA11yFixture.svelte +0 -31
- package/src/form/FormCascader.svelte +0 -82
- package/src/form/FormCheckbox.svelte +0 -83
- package/src/form/FormDatePicker.svelte +0 -80
- package/src/form/FormErrorMessage.svelte +0 -44
- package/src/form/FormInput.svelte +0 -95
- package/src/form/FormLabel.svelte +0 -46
- package/src/form/FormRadio.svelte +0 -83
- package/src/form/FormRating.svelte +0 -85
- package/src/form/FormSection.svelte +0 -45
- package/src/form/FormSelect.svelte +0 -96
- package/src/form/FormSlider.svelte +0 -95
- package/src/form/FormSlot.svelte +0 -51
- package/src/form/FormSwitch.svelte +0 -82
- package/src/form/FormTagInput.svelte +0 -79
- package/src/form/FormTreeSelect.svelte +0 -85
- package/src/form/FormUpload.svelte +0 -92
- package/src/form/context.ts +0 -47
- package/src/form/index.ts +0 -22
- package/src/form/meta.ts +0 -85
- package/src/grid/Col.svelte +0 -142
- package/src/grid/Grid.a11y.test.ts +0 -14
- package/src/grid/GridA11yFixture.svelte +0 -12
- package/src/grid/Row.svelte +0 -116
- package/src/grid/index.ts +0 -3
- package/src/grid/meta.ts +0 -72
- package/src/grid/use-breakpoint.svelte.ts +0 -48
- package/src/highlight/Highlight.a11y.test.ts +0 -25
- package/src/highlight/Highlight.svelte +0 -99
- package/src/highlight/index.ts +0 -2
- package/src/highlight/meta.ts +0 -80
- package/src/icon/Icon.svelte +0 -156
- package/src/icon/index.ts +0 -2
- package/src/icon/meta.ts +0 -41
- package/src/image/Image.a11y.test.ts +0 -30
- package/src/image/Image.svelte +0 -387
- package/src/image/ImagePreview.kbd.test.ts +0 -52
- package/src/image/ImagePreview.svelte +0 -309
- package/src/image/ImagePreviewGroup.svelte +0 -93
- package/src/image/ImagePreviewKbdFixture.svelte +0 -32
- package/src/image/context.ts +0 -26
- package/src/image/index.ts +0 -15
- package/src/image/meta.ts +0 -131
- package/src/index.ts +0 -208
- package/src/input/Input.a11y.test.ts +0 -58
- package/src/input/Input.svelte +0 -505
- package/src/input/index.ts +0 -2
- package/src/input/meta.ts +0 -40
- package/src/input-number/InputNumber.a11y.test.ts +0 -43
- package/src/input-number/InputNumber.kbd.test.ts +0 -41
- package/src/input-number/InputNumber.svelte +0 -674
- package/src/input-number/InputNumberKbdFixture.svelte +0 -15
- package/src/input-number/index.ts +0 -2
- package/src/input-number/meta.ts +0 -65
- package/src/layout/Content.svelte +0 -37
- package/src/layout/Footer.svelte +0 -49
- package/src/layout/Header.svelte +0 -46
- package/src/layout/Layout.a11y.test.ts +0 -34
- package/src/layout/Layout.svelte +0 -60
- package/src/layout/LayoutA11yFixture.svelte +0 -21
- package/src/layout/Sider.svelte +0 -207
- package/src/layout/index.ts +0 -26
- package/src/layout/meta.ts +0 -116
- package/src/list/List.a11y.test.ts +0 -69
- package/src/list/List.bench.ts +0 -26
- package/src/list/List.kbd.test.ts +0 -71
- package/src/list/List.svelte +0 -920
- package/src/list/ListA11yFixture.svelte +0 -38
- package/src/list/ListBenchFixture.svelte +0 -22
- package/src/list/ListItem.svelte +0 -175
- package/src/list/ListKbdFixture.svelte +0 -31
- package/src/list/ListMeta.svelte +0 -73
- package/src/list/context.ts +0 -39
- package/src/list/index.ts +0 -21
- package/src/list/meta.ts +0 -99
- package/src/locale-provider/LocaleProvider.svelte +0 -110
- package/src/locale-provider/context.ts +0 -22
- package/src/locale-provider/index.ts +0 -21
- package/src/locale-provider/meta.ts +0 -93
- package/src/locale-provider/use-locale.ts +0 -25
- package/src/lottie-icon/LottieIcon.svelte +0 -330
- package/src/lottie-icon/index.ts +0 -9
- package/src/lottie-icon/meta.ts +0 -162
- package/src/menu/Menu.a11y.test.ts +0 -54
- package/src/menu/Menu.kbd.test.ts +0 -69
- package/src/menu/Menu.svelte +0 -762
- package/src/menu/MenuKbdFixture.svelte +0 -22
- package/src/menu/MenuPopupNode.svelte +0 -525
- package/src/menu/index.ts +0 -4
- package/src/menu/meta.ts +0 -137
- package/src/menu/types.ts +0 -120
- package/src/meta.test.ts +0 -173
- package/src/modal/ConfirmModal.svelte +0 -173
- package/src/modal/Modal.a11y.test.ts +0 -46
- package/src/modal/Modal.kbd.test.ts +0 -65
- package/src/modal/Modal.svelte +0 -511
- package/src/modal/ModalKbdFixture.svelte +0 -24
- package/src/modal/command.svelte.ts +0 -103
- package/src/modal/index.ts +0 -30
- package/src/modal/meta.ts +0 -165
- package/src/modal/z-stack.ts +0 -26
- package/src/notification/NotificationContainer.svelte +0 -192
- package/src/notification/NotificationItem.a11y.test.ts +0 -73
- package/src/notification/NotificationItem.svelte +0 -368
- package/src/notification/index.ts +0 -9
- package/src/notification/meta.ts +0 -120
- package/src/notification/store.ts +0 -191
- package/src/overflow-list/OverflowList.a11y.test.ts +0 -46
- package/src/overflow-list/OverflowList.kbd.test.ts +0 -34
- package/src/overflow-list/OverflowList.svelte +0 -539
- package/src/overflow-list/OverflowListA11yFixture.svelte +0 -22
- package/src/overflow-list/OverflowListKbdFixture.svelte +0 -21
- package/src/overflow-list/index.ts +0 -2
- package/src/overflow-list/meta.ts +0 -138
- package/src/pagination/Pagination.a11y.test.ts +0 -62
- package/src/pagination/Pagination.kbd.test.ts +0 -66
- package/src/pagination/Pagination.svelte +0 -428
- package/src/pagination/PaginationKbdFixture.svelte +0 -15
- package/src/pagination/index.ts +0 -2
- package/src/pagination/meta.ts +0 -73
- package/src/popconfirm/Popconfirm.a11y.test.ts +0 -46
- package/src/popconfirm/Popconfirm.kbd.test.ts +0 -42
- package/src/popconfirm/Popconfirm.svelte +0 -724
- package/src/popconfirm/PopconfirmA11yFixture.svelte +0 -34
- package/src/popconfirm/PopconfirmKbdFixture.svelte +0 -17
- package/src/popconfirm/index.ts +0 -2
- package/src/popconfirm/meta.ts +0 -200
- package/src/popover/Popover.a11y.test.ts +0 -58
- package/src/popover/Popover.kbd.test.ts +0 -42
- package/src/popover/Popover.svelte +0 -643
- package/src/popover/PopoverA11yFixture.svelte +0 -35
- package/src/popover/PopoverKbdFixture.svelte +0 -18
- package/src/popover/index.ts +0 -2
- package/src/popover/meta.ts +0 -103
- package/src/progress/Progress.a11y.test.ts +0 -37
- package/src/progress/Progress.svelte +0 -423
- package/src/progress/index.ts +0 -3
- package/src/progress/meta.ts +0 -132
- package/src/radio/Radio.svelte +0 -330
- package/src/radio/RadioGroup.a11y.test.ts +0 -43
- package/src/radio/RadioGroup.kbd.test.ts +0 -75
- package/src/radio/RadioGroup.svelte +0 -199
- package/src/radio/RadioGroupKbdFixture.svelte +0 -21
- package/src/radio/context.ts +0 -42
- package/src/radio/index.ts +0 -4
- package/src/radio/meta.ts +0 -68
- package/src/rating/Rating.a11y.test.ts +0 -41
- package/src/rating/Rating.kbd.test.ts +0 -48
- package/src/rating/Rating.svelte +0 -407
- package/src/rating/RatingKbdFixture.svelte +0 -15
- package/src/rating/index.ts +0 -2
- package/src/rating/meta.ts +0 -40
- package/src/resize-observer/ResizeObserver.svelte +0 -169
- package/src/resize-observer/action.ts +0 -80
- package/src/resize-observer/index.ts +0 -9
- package/src/resize-observer/meta.ts +0 -102
- package/src/scroll-list/ScrollColumn.svelte +0 -592
- package/src/scroll-list/ScrollList.svelte +0 -257
- package/src/scroll-list/index.ts +0 -4
- package/src/scroll-list/meta.ts +0 -93
- package/src/scroll-list/types.ts +0 -18
- package/src/select/Select.a11y.test.ts +0 -59
- package/src/select/Select.kbd.test.ts +0 -59
- package/src/select/Select.svelte +0 -1155
- package/src/select/SelectKbdFixture.svelte +0 -29
- package/src/select/index.ts +0 -3
- package/src/select/meta.ts +0 -78
- package/src/select/types.ts +0 -2
- package/src/side-sheet/SideSheet.a11y.test.ts +0 -53
- package/src/side-sheet/SideSheet.kbd.test.ts +0 -63
- package/src/side-sheet/SideSheet.svelte +0 -659
- package/src/side-sheet/SideSheetKbdFixture.svelte +0 -30
- package/src/side-sheet/index.ts +0 -2
- package/src/side-sheet/meta.ts +0 -116
- package/src/skeleton/Skeleton.a11y.test.ts +0 -35
- package/src/skeleton/Skeleton.svelte +0 -131
- package/src/skeleton/SkeletonAvatar.svelte +0 -82
- package/src/skeleton/SkeletonButton.svelte +0 -90
- package/src/skeleton/SkeletonImage.svelte +0 -100
- package/src/skeleton/SkeletonParagraph.svelte +0 -103
- package/src/skeleton/SkeletonTitle.svelte +0 -74
- package/src/skeleton/context.ts +0 -11
- package/src/skeleton/index.ts +0 -8
- package/src/skeleton/meta.ts +0 -65
- package/src/slider/Slider.a11y.test.ts +0 -44
- package/src/slider/Slider.kbd.test.ts +0 -74
- package/src/slider/Slider.svelte +0 -716
- package/src/slider/SliderKbdFixture.svelte +0 -21
- package/src/slider/index.ts +0 -2
- package/src/slider/meta.ts +0 -55
- package/src/space/Space.a11y.test.ts +0 -22
- package/src/space/Space.svelte +0 -109
- package/src/space/SpaceA11yFixture.svelte +0 -17
- package/src/space/index.ts +0 -2
- package/src/space/meta.ts +0 -27
- package/src/spin/Spin.a11y.test.ts +0 -29
- package/src/spin/Spin.svelte +0 -293
- package/src/spin/SpinA11yFixture.svelte +0 -18
- package/src/spin/index.ts +0 -2
- package/src/spin/meta.ts +0 -72
- package/src/steps/Steps.a11y.test.ts +0 -39
- package/src/steps/Steps.kbd.test.ts +0 -73
- package/src/steps/Steps.svelte +0 -392
- package/src/steps/StepsKbdFixture.svelte +0 -21
- package/src/steps/index.ts +0 -3
- package/src/steps/meta.ts +0 -59
- package/src/steps/types.ts +0 -8
- package/src/switch/Switch.a11y.test.ts +0 -46
- package/src/switch/Switch.kbd.test.ts +0 -40
- package/src/switch/Switch.svelte +0 -310
- package/src/switch/SwitchKbdFixture.svelte +0 -22
- package/src/switch/index.ts +0 -2
- package/src/switch/meta.ts +0 -44
- package/src/table/Table.a11y.test.ts +0 -70
- package/src/table/Table.bench.ts +0 -51
- package/src/table/Table.kbd.test.ts +0 -94
- package/src/table/Table.svelte +0 -2327
- package/src/table/TableKbdFixture.svelte +0 -35
- package/src/table/grid-nav.test.ts +0 -173
- package/src/table/grid-nav.ts +0 -146
- package/src/table/index.ts +0 -13
- package/src/table/meta.ts +0 -121
- package/src/table/types.ts +0 -133
- package/src/tabs/TabPane.svelte +0 -92
- package/src/tabs/Tabs.a11y.test.ts +0 -47
- package/src/tabs/Tabs.kbd.test.ts +0 -74
- package/src/tabs/Tabs.svelte +0 -1128
- package/src/tabs/TabsA11yFixture.svelte +0 -20
- package/src/tabs/TabsKbdFixture.svelte +0 -25
- package/src/tabs/context.ts +0 -43
- package/src/tabs/index.ts +0 -14
- package/src/tabs/meta.ts +0 -152
- package/src/tabs/types.ts +0 -6
- package/src/tag/Tag.a11y.test.ts +0 -33
- package/src/tag/Tag.svelte +0 -366
- package/src/tag/TagA11yFixture.svelte +0 -18
- package/src/tag/index.ts +0 -2
- package/src/tag/meta.ts +0 -92
- package/src/tag-input/TagInput.a11y.test.ts +0 -41
- package/src/tag-input/TagInput.svelte +0 -544
- package/src/tag-input/index.ts +0 -2
- package/src/tag-input/meta.ts +0 -43
- package/src/tag-input/reorder.test.ts +0 -59
- package/src/tag-input/reorder.ts +0 -41
- package/src/test-utils/LocaleHarness.svelte +0 -29
- package/src/test-utils/a11y.ts +0 -108
- package/src/test-utils/kbd.ts +0 -52
- package/src/textarea/TextArea.a11y.test.ts +0 -44
- package/src/textarea/TextArea.svelte +0 -420
- package/src/textarea/index.ts +0 -2
- package/src/textarea/meta.ts +0 -104
- package/src/time-picker/TimePicker.a11y.test.ts +0 -45
- package/src/time-picker/TimePicker.kbd.test.ts +0 -70
- package/src/time-picker/TimePicker.svelte +0 -1023
- package/src/time-picker/TimePickerKbdFixture.svelte +0 -23
- package/src/time-picker/index.ts +0 -2
- package/src/time-picker/meta.ts +0 -64
- package/src/timeline/Timeline.a11y.test.ts +0 -54
- package/src/timeline/Timeline.svelte +0 -599
- package/src/timeline/TimelineItem.svelte +0 -164
- package/src/timeline/context.ts +0 -28
- package/src/timeline/index.ts +0 -16
- package/src/timeline/meta.ts +0 -129
- package/src/timeline/types.ts +0 -9
- package/src/toast/Toast.a11y.test.ts +0 -67
- package/src/toast/ToastContainer.svelte +0 -184
- package/src/toast/ToastItem.svelte +0 -247
- package/src/toast/index.ts +0 -9
- package/src/toast/live-region.ts +0 -78
- package/src/toast/meta.ts +0 -95
- package/src/toast/store.ts +0 -187
- package/src/tooltip/Tooltip.a11y.test.ts +0 -41
- package/src/tooltip/Tooltip.kbd.test.ts +0 -37
- package/src/tooltip/Tooltip.svelte +0 -416
- package/src/tooltip/TooltipA11yFixture.svelte +0 -31
- package/src/tooltip/TooltipKbdFixture.svelte +0 -16
- package/src/tooltip/index.ts +0 -2
- package/src/tooltip/meta.ts +0 -59
- package/src/tooltip/placement.ts +0 -6
- package/src/transfer/Transfer.a11y.test.ts +0 -63
- package/src/transfer/Transfer.kbd.test.ts +0 -75
- package/src/transfer/Transfer.svelte +0 -1451
- package/src/transfer/TransferKbdFixture.svelte +0 -23
- package/src/transfer/group.test.ts +0 -55
- package/src/transfer/group.ts +0 -61
- package/src/transfer/index.ts +0 -3
- package/src/transfer/meta.ts +0 -55
- package/src/transfer/reorder.test.ts +0 -52
- package/src/transfer/reorder.ts +0 -42
- package/src/transfer/tree.test.ts +0 -44
- package/src/transfer/tree.ts +0 -52
- package/src/transfer/types.ts +0 -32
- package/src/tree/Tree.a11y.test.ts +0 -63
- package/src/tree/Tree.kbd.test.ts +0 -91
- package/src/tree/Tree.svelte +0 -1500
- package/src/tree/TreeKbdFixture.svelte +0 -30
- package/src/tree/index.ts +0 -3
- package/src/tree/meta.ts +0 -152
- package/src/tree-select/TreeSelect.a11y.test.ts +0 -52
- package/src/tree-select/TreeSelect.kbd.test.ts +0 -53
- package/src/tree-select/TreeSelect.svelte +0 -1611
- package/src/tree-select/TreeSelectKbdFixture.svelte +0 -20
- package/src/tree-select/index.ts +0 -3
- package/src/tree-select/meta.ts +0 -73
- package/src/tree-select/types.ts +0 -11
- package/src/tree-select/virtual.test.ts +0 -104
- package/src/typography/Link.svelte +0 -120
- package/src/typography/Paragraph.svelte +0 -92
- package/src/typography/Text.svelte +0 -93
- package/src/typography/Title.svelte +0 -91
- package/src/typography/Typography.a11y.test.ts +0 -34
- package/src/typography/TypographyA11yFixture.svelte +0 -27
- package/src/typography/TypographyBase.svelte +0 -807
- package/src/typography/index.ts +0 -16
- package/src/typography/meta.ts +0 -158
- package/src/upload/Upload.a11y.test.ts +0 -58
- package/src/upload/Upload.svelte +0 -1094
- package/src/upload/UploadA11yFixture.svelte +0 -23
- package/src/upload/index.ts +0 -3
- package/src/upload/meta.ts +0 -64
- package/src/upload/types.ts +0 -16
- package/src/virtual-list/VirtualList.svelte +0 -401
- package/src/virtual-list/index.ts +0 -2
- 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>
|