@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,46 +0,0 @@
|
|
|
1
|
-
// OverflowList a11y:溢出列表。
|
|
2
|
-
// 根容器 role=group 透明保留子项语义 + aria-label 提供可访问名;
|
|
3
|
-
// 离屏测量层 aria-hidden(不进可达性树)。
|
|
4
|
-
// jsdom 无布局,不会真实折叠出 +N 节点;本套件只断言静态 ARIA + axe(折叠行为留给 Playwright)。
|
|
5
|
-
import { describe, it, expect, beforeAll } from 'vitest';
|
|
6
|
-
import { renderWithLocale, expectNoAxeViolations } from '../test-utils/a11y.js';
|
|
7
|
-
import OverflowListFixture from './OverflowListA11yFixture.svelte';
|
|
8
|
-
|
|
9
|
-
// jsdom 无 ResizeObserver(OverflowList 用其测量溢出)。仅在本测试内补一个 no-op 桩,
|
|
10
|
-
// 不改基建/组件源码——溢出测量/折叠不在静态 a11y 测试范围(留给 Playwright)。
|
|
11
|
-
beforeAll(() => {
|
|
12
|
-
if (!('ResizeObserver' in globalThis)) {
|
|
13
|
-
(globalThis as { ResizeObserver?: unknown }).ResizeObserver = class {
|
|
14
|
-
observe(): void {}
|
|
15
|
-
unobserve(): void {}
|
|
16
|
-
disconnect(): void {}
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
describe('OverflowList a11y', () => {
|
|
22
|
-
it('collapse 模式:根 role=group + aria-label,离屏测量层 aria-hidden,无 axe violations', async () => {
|
|
23
|
-
const { container } = renderWithLocale(OverflowListFixture, {});
|
|
24
|
-
const group = container.querySelector('[role="group"]');
|
|
25
|
-
expect(group).not.toBeNull();
|
|
26
|
-
expect(group?.getAttribute('aria-label')).toBe('Toolbar');
|
|
27
|
-
|
|
28
|
-
// 离屏测量层移出可达性树。
|
|
29
|
-
const measure = container.querySelector('.cd-overflow-list__measure');
|
|
30
|
-
expect(measure?.getAttribute('aria-hidden')).toBe('true');
|
|
31
|
-
|
|
32
|
-
await expectNoAxeViolations(container);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
it('scroll 模式:可见层可聚焦 + role=group + 可访问名,无 axe violations', async () => {
|
|
36
|
-
const { container } = renderWithLocale(OverflowListFixture, {
|
|
37
|
-
props: { mode: 'scroll', ariaLabel: 'Scrollable tags' },
|
|
38
|
-
});
|
|
39
|
-
const visible = container.querySelector('.cd-overflow-list__visible');
|
|
40
|
-
// scroll 模式可见层为可聚焦滚动容器(tabindex=0)+ group + 可访问名。
|
|
41
|
-
expect(visible?.getAttribute('tabindex')).toBe('0');
|
|
42
|
-
expect(visible?.getAttribute('role')).toBe('group');
|
|
43
|
-
expect(visible?.getAttribute('aria-label')).toBe('Scrollable tags');
|
|
44
|
-
await expectNoAxeViolations(container);
|
|
45
|
-
});
|
|
46
|
-
});
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
// OverflowList 键盘 e2e(browser project / 真实 chromium),scroll 模式可聚焦滚动容器。
|
|
2
|
-
// scroll 模式下可见层(.cd-overflow-list__visible)成为滚动容器,tabindex=0 + role=group +
|
|
3
|
-
// aria-label,键盘用户可 Tab 聚焦后用方向键滚动(浏览器对聚焦滚动容器原生支持,WCAG 2.1.1)。
|
|
4
|
-
// Tab 从前置按钮进入 → 焦点落到可滚动可见层(真实焦点 + 可访问名存在)。
|
|
5
|
-
import { describe, it, expect } from 'vitest';
|
|
6
|
-
import { page } from 'vitest/browser';
|
|
7
|
-
import { renderKbdFixture, userEvent } from '../test-utils/kbd.js';
|
|
8
|
-
import OverflowListKbdFixture from './OverflowListKbdFixture.svelte';
|
|
9
|
-
|
|
10
|
-
function loc(el: Element) {
|
|
11
|
-
return page.elementLocator(el);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
describe('OverflowList 键盘 e2e(scroll 模式可聚焦滚动容器)', () => {
|
|
15
|
-
it('Tab 聚焦可滚动可见层(tabindex=0 + 可访问名)', async () => {
|
|
16
|
-
const { baseElement } = renderKbdFixture(OverflowListKbdFixture);
|
|
17
|
-
|
|
18
|
-
const scroller = baseElement.querySelector(
|
|
19
|
-
'.cd-overflow-list__visible',
|
|
20
|
-
) as HTMLElement;
|
|
21
|
-
expect(scroller).not.toBeNull();
|
|
22
|
-
// scroll 模式可见层可聚焦 + 有可访问名 + group 角色。
|
|
23
|
-
expect(scroller.tabIndex).toBe(0);
|
|
24
|
-
expect(scroller.getAttribute('role')).toBe('group');
|
|
25
|
-
expect(scroller.getAttribute('aria-label')).toBe('Tags');
|
|
26
|
-
|
|
27
|
-
// Tab 从前置按钮进入 → 焦点落到可滚动可见层(真实焦点)。
|
|
28
|
-
const before = baseElement.querySelector('[data-testid="before"]') as HTMLElement;
|
|
29
|
-
before.focus();
|
|
30
|
-
await expect.element(loc(before)).toHaveFocus();
|
|
31
|
-
await userEvent.tab();
|
|
32
|
-
await expect.element(loc(scroller)).toHaveFocus();
|
|
33
|
-
});
|
|
34
|
-
});
|
|
@@ -1,539 +0,0 @@
|
|
|
1
|
-
<!--
|
|
2
|
-
OverflowList — see specs/components/show/OverflowList.spec.md
|
|
3
|
-
collapse 折叠模式(尾部 end / 头部 start 方向)+ scroll 滚动模式,
|
|
4
|
-
horizontal 横向 / vertical 纵向两种排列。
|
|
5
|
-
复用 @chenzy-design/core 收纳算法(computeOverflowPartition / applyHysteresis)。
|
|
6
|
-
- mode='collapse':容器放不下时把溢出项收纳进 +N 折叠节点(collapseFrom 决定从尾/头折叠)。
|
|
7
|
-
- mode='scroll':不折叠,可见层变可滚动容器,溢出项靠滚动查看。
|
|
8
|
-
- direction='horizontal'|'vertical':主轴方向;几何测量读对应维度(宽/高)。
|
|
9
|
-
命令式方法(bind:this 暴露,红线 #3:方法内直接操作 DOM,非 render 期):
|
|
10
|
-
- forceMeasure():强制立即重新测量 + 重算可见/溢出划分(容器尺寸变化未被
|
|
11
|
-
ResizeObserver 捕获——如父级 display 切换、字体/缩放变化时手动触发)。
|
|
12
|
-
- scrollTo(index, opts?):scroll 模式下把指定项滚到可见层主轴位置(collapse 模式 no-op)。
|
|
13
|
-
|
|
14
|
-
⚠️ 三条死循环红线(本组件最易爆,严格遵守):
|
|
15
|
-
1. onOverflowChange 去重:只在 overflowCount/visibleCount 实际变化时调,
|
|
16
|
-
用普通变量 prevReported* 记录上次值比较,避免重复触发。
|
|
17
|
-
2. render 绝不读「effect/RO 写入的几何 $state」再触发循环:visibleCount 是
|
|
18
|
-
$state,由 RO 回调 + rAF 计算后写入,render 读它渲染可见层——这是安全的单向流。
|
|
19
|
-
绝对禁止:render 期读 measure layer 的 DOM 宽度、或用 $derived 读 getBoundingClientRect。
|
|
20
|
-
测量只在命令式 RO 回调/effect 里做。
|
|
21
|
-
3. ResizeObserver 必须命令式:$effect 内 new ResizeObserver、observe(rootEl)、
|
|
22
|
-
cleanup disconnect。测量项宽度也命令式:在 measure() 里遍历 measure layer 子元素
|
|
23
|
-
读 offsetWidth,算 itemSizes,调 computeVisibleCount,写 visibleCount $state。
|
|
24
|
-
用 rAF 合批(RO 回调里 cancelAnimationFrame 上一个 + requestAnimationFrame(measure)),
|
|
25
|
-
cleanup 里 cancelAnimationFrame + disconnect。
|
|
26
|
-
|
|
27
|
-
关键防循环点:measure() 只由 RO(容器尺寸变)和 items 变(内容变)触发,
|
|
28
|
-
绝不依赖 visibleCount。measure 读 DOM → 写 visibleCount $state → render 重渲可见层,
|
|
29
|
-
但 render 不会回触发 measure(measure 不是 $derived、不在依赖 visibleCount 的 $effect 里),
|
|
30
|
-
RO 只在容器真实尺寸变化时回调——故零循环。
|
|
31
|
-
-->
|
|
32
|
-
<script lang="ts" generics="T">
|
|
33
|
-
// 泛型组件 props 用内联匿名类型而非具名 interface Props:在 declaration:true 下,
|
|
34
|
-
// 引用泛型参数 T 的具名 interface 会被当作私有名泄漏进生成的 .d.ts 公共签名而报错。
|
|
35
|
-
import type { Snippet } from 'svelte';
|
|
36
|
-
import { untrack } from 'svelte';
|
|
37
|
-
import { computeOverflowPartition, applyHysteresis } from '@chenzy-design/core';
|
|
38
|
-
import { useLocale } from '../locale-provider/index.js';
|
|
39
|
-
|
|
40
|
-
let {
|
|
41
|
-
items = [],
|
|
42
|
-
size = 'default',
|
|
43
|
-
mode = 'collapse',
|
|
44
|
-
direction = 'horizontal',
|
|
45
|
-
collapseFrom = 'end',
|
|
46
|
-
gap,
|
|
47
|
-
minVisibleItems = 0,
|
|
48
|
-
alwaysVisibleIndexes = [],
|
|
49
|
-
threshold = 8,
|
|
50
|
-
item,
|
|
51
|
-
overflow,
|
|
52
|
-
onOverflowChange,
|
|
53
|
-
ariaLabel,
|
|
54
|
-
class: className = '',
|
|
55
|
-
}: {
|
|
56
|
-
items?: T[];
|
|
57
|
-
size?: 'small' | 'default' | 'large';
|
|
58
|
-
/** collapse 折叠溢出项为 +N(默认);scroll 不折叠,可见层可滚动查看 */
|
|
59
|
-
mode?: 'collapse' | 'scroll';
|
|
60
|
-
/** 主轴方向:horizontal 横向(默认)/ vertical 纵向 */
|
|
61
|
-
direction?: 'horizontal' | 'vertical';
|
|
62
|
-
/** collapse 模式下从尾部(end,默认)还是头部(start)折叠 */
|
|
63
|
-
collapseFrom?: 'end' | 'start';
|
|
64
|
-
gap?: number;
|
|
65
|
-
minVisibleItems?: number;
|
|
66
|
-
alwaysVisibleIndexes?: number[];
|
|
67
|
-
threshold?: number;
|
|
68
|
-
item?: Snippet<[{ item: T; index: number }]>;
|
|
69
|
-
overflow?: Snippet<[{ overflowItems: T[]; overflowCount: number }]>;
|
|
70
|
-
onOverflowChange?: (info: {
|
|
71
|
-
overflowCount: number;
|
|
72
|
-
visibleCount: number;
|
|
73
|
-
overflowItems: T[];
|
|
74
|
-
}) => void;
|
|
75
|
-
ariaLabel?: string;
|
|
76
|
-
class?: string;
|
|
77
|
-
} = $props();
|
|
78
|
-
|
|
79
|
-
// DOM 引用(bind:this),普通引用,不参与响应式几何读取。
|
|
80
|
-
// containerEl = 最外层根容器(block,宽度随父)。RO 观测它,clientWidth 当 containerSize。
|
|
81
|
-
// 内层可见层 .cd-overflow-list__visible 是 flex + overflow:hidden,其 border-box 不随父宽
|
|
82
|
-
// 变化上报 RO(bug 根因),故几何测量改用根容器。
|
|
83
|
-
const loc = useLocale();
|
|
84
|
-
|
|
85
|
-
let containerEl = $state<HTMLElement | null>(null); // 根容器,RO 观测对象 + containerSize 来源
|
|
86
|
-
let visibleEl = $state<HTMLElement | null>(null); // 可见层(scroll 模式即滚动容器,scrollTo 目标)
|
|
87
|
-
let measureEl = $state<HTMLElement | null>(null); // 离屏测量层容器
|
|
88
|
-
|
|
89
|
-
// 几何 $state:仅由命令式 measure()(RO 回调 / effect)写入,render 期只读。
|
|
90
|
-
// 初值全显(SSR / 首帧降级,避免闪烁)。用 untrack 读取初始快照长度——这里只需要
|
|
91
|
-
// 一次性初值,不需要响应式追踪(items 变化由专门的 $effect 触发重测),
|
|
92
|
-
// 故消除 state_referenced_locally。
|
|
93
|
-
let visibleCount = $state(untrack(() => items.length));
|
|
94
|
-
let overflowCount = $state(0);
|
|
95
|
-
|
|
96
|
-
// 普通(非响应式)变量:rAF 句柄、hysteresis 上次容器尺寸、回调去重记录。
|
|
97
|
-
let rafId = 0;
|
|
98
|
-
let prevContainerSize = 0;
|
|
99
|
-
let prevReportedVisible = -1;
|
|
100
|
-
let prevReportedOverflow = -1;
|
|
101
|
-
|
|
102
|
-
// size → 默认 gap(px);显式 gap prop 优先。CSS 实际像素与传给 core 的数值必须一致。
|
|
103
|
-
const gapPx = $derived(
|
|
104
|
-
gap ?? (size === 'small' ? 4 : size === 'large' ? 12 : 8),
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
// scroll 模式:永不折叠,全部可见、可见层可滚动。collapse 模式才按几何收纳。
|
|
108
|
-
const isScroll = $derived(mode === 'scroll');
|
|
109
|
-
|
|
110
|
-
// 可见层切片:纯 $derived,仅依赖 items + visibleCount + collapseFrom + mode(render-safe,不读 DOM)。
|
|
111
|
-
// collapseFrom='end':可见 = 前 visibleCount 项,溢出 = 其余尾部项。
|
|
112
|
-
// collapseFrom='start':可见 = 后 visibleCount 项,溢出 = 其余头部项(折叠节点渲染在头部)。
|
|
113
|
-
const vc = $derived(Math.max(0, visibleCount));
|
|
114
|
-
const visibleItems = $derived(
|
|
115
|
-
isScroll
|
|
116
|
-
? items
|
|
117
|
-
: collapseFrom === 'start'
|
|
118
|
-
? items.slice(items.length - vc)
|
|
119
|
-
: items.slice(0, vc),
|
|
120
|
-
);
|
|
121
|
-
const overflowItems = $derived(
|
|
122
|
-
isScroll
|
|
123
|
-
? []
|
|
124
|
-
: collapseFrom === 'start'
|
|
125
|
-
? items.slice(0, items.length - vc)
|
|
126
|
-
: items.slice(vc),
|
|
127
|
-
);
|
|
128
|
-
// 首个可见项在原 items 中的索引:start 折叠时可见窗口在尾部,从此偏移开始;
|
|
129
|
-
// 否则(end / scroll)从 0 开始。snippet 的 index 始终映射回原始下标。
|
|
130
|
-
const visibleBaseIndex = $derived(
|
|
131
|
-
!isScroll && collapseFrom === 'start' ? items.length - vc : 0,
|
|
132
|
-
);
|
|
133
|
-
|
|
134
|
-
const cls = $derived(
|
|
135
|
-
[
|
|
136
|
-
'cd-overflow-list',
|
|
137
|
-
`cd-overflow-list--${size}`,
|
|
138
|
-
`cd-overflow-list--${direction}`,
|
|
139
|
-
`cd-overflow-list--${mode}`,
|
|
140
|
-
className,
|
|
141
|
-
]
|
|
142
|
-
.filter(Boolean)
|
|
143
|
-
.join(' '),
|
|
144
|
-
);
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* 命令式测量(普通函数,绝不是 $derived,绝不在依赖 visibleCount 的 effect 里)。
|
|
148
|
-
* 只由 RO 回调(容器尺寸变)和 items effect(内容变)通过 rAF 调用。
|
|
149
|
-
*/
|
|
150
|
-
function measure(): void {
|
|
151
|
-
// scroll 模式不折叠:可见层渲染全部、靠滚动查看,无几何收纳计算。
|
|
152
|
-
if (isScroll) {
|
|
153
|
-
if (visibleCount !== items.length) visibleCount = items.length;
|
|
154
|
-
if (overflowCount !== 0) overflowCount = 0;
|
|
155
|
-
if (
|
|
156
|
-
onOverflowChange &&
|
|
157
|
-
(items.length !== prevReportedVisible || 0 !== prevReportedOverflow)
|
|
158
|
-
) {
|
|
159
|
-
prevReportedVisible = items.length;
|
|
160
|
-
prevReportedOverflow = 0;
|
|
161
|
-
onOverflowChange({
|
|
162
|
-
overflowCount: 0,
|
|
163
|
-
visibleCount: items.length,
|
|
164
|
-
overflowItems: [],
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
const container = containerEl;
|
|
171
|
-
const measureRoot = measureEl;
|
|
172
|
-
if (!container || !measureRoot) return;
|
|
173
|
-
|
|
174
|
-
const vertical = direction === 'vertical';
|
|
175
|
-
|
|
176
|
-
// 1. 容器主轴可用尺寸:横向读 clientWidth,纵向读 clientHeight(block,已扣 padding)。
|
|
177
|
-
const containerSize = vertical ? container.clientHeight : container.clientWidth;
|
|
178
|
-
|
|
179
|
-
// 2. 遍历测量层项子元素,读真实主轴尺寸 → itemSizes[]。
|
|
180
|
-
const itemNodes = measureRoot.querySelectorAll<HTMLElement>(
|
|
181
|
-
'[data-cd-measure-item]',
|
|
182
|
-
);
|
|
183
|
-
const itemSizes: number[] = [];
|
|
184
|
-
for (const node of itemNodes)
|
|
185
|
-
itemSizes.push(vertical ? node.offsetHeight : node.offsetWidth);
|
|
186
|
-
|
|
187
|
-
// 3. 折叠节点样本主轴尺寸 → overflowSize。
|
|
188
|
-
const overflowNode = measureRoot.querySelector<HTMLElement>(
|
|
189
|
-
'[data-cd-measure-overflow]',
|
|
190
|
-
);
|
|
191
|
-
const overflowSize = overflowNode
|
|
192
|
-
? vertical
|
|
193
|
-
? overflowNode.offsetHeight
|
|
194
|
-
: overflowNode.offsetWidth
|
|
195
|
-
: 0;
|
|
196
|
-
|
|
197
|
-
// 4. 复用 core 收纳算法(collapseFrom 决定从尾/头折叠;方向已折算进 itemSizes/containerSize)。
|
|
198
|
-
const r = computeOverflowPartition({
|
|
199
|
-
itemSizes,
|
|
200
|
-
containerSize,
|
|
201
|
-
overflowSize,
|
|
202
|
-
gap: gapPx,
|
|
203
|
-
alwaysVisible: alwaysVisibleIndexes,
|
|
204
|
-
minVisibleItems,
|
|
205
|
-
collapseFrom,
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
// 5. hysteresis 防边界抖动(prevContainerSize 普通变量)。
|
|
209
|
-
const next = applyHysteresis(
|
|
210
|
-
visibleCount,
|
|
211
|
-
r.visibleCount,
|
|
212
|
-
prevContainerSize,
|
|
213
|
-
containerSize,
|
|
214
|
-
threshold,
|
|
215
|
-
);
|
|
216
|
-
prevContainerSize = containerSize;
|
|
217
|
-
|
|
218
|
-
const nextOverflow = Math.max(0, items.length - next);
|
|
219
|
-
|
|
220
|
-
// 6. 仅在真实变化时写 $state(写 $state 触发 render 重渲,但不回触发 measure)。
|
|
221
|
-
if (next !== visibleCount) visibleCount = next;
|
|
222
|
-
if (nextOverflow !== overflowCount) overflowCount = nextOverflow;
|
|
223
|
-
|
|
224
|
-
// 7. 去重通知 onOverflowChange(与上次上报值比较)。
|
|
225
|
-
// start 折叠时溢出项在头部 [0, count-next),end 折叠时在尾部 [next, count)。
|
|
226
|
-
if (
|
|
227
|
-
onOverflowChange &&
|
|
228
|
-
(next !== prevReportedVisible || nextOverflow !== prevReportedOverflow)
|
|
229
|
-
) {
|
|
230
|
-
prevReportedVisible = next;
|
|
231
|
-
prevReportedOverflow = nextOverflow;
|
|
232
|
-
onOverflowChange({
|
|
233
|
-
overflowCount: nextOverflow,
|
|
234
|
-
visibleCount: next,
|
|
235
|
-
overflowItems:
|
|
236
|
-
collapseFrom === 'start'
|
|
237
|
-
? items.slice(0, items.length - next)
|
|
238
|
-
: items.slice(next),
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
function scheduleMeasure(): void {
|
|
244
|
-
if (rafId) cancelAnimationFrame(rafId);
|
|
245
|
-
rafId = requestAnimationFrame(() => {
|
|
246
|
-
rafId = 0;
|
|
247
|
-
measure();
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* 命令式方法:强制立即重新测量 + 重算可见/溢出划分(红线 #3:方法内直接调 measure 操作
|
|
253
|
-
* DOM,非 render 期,由父组件 bind:this 后主动调用)。
|
|
254
|
-
* 用于容器尺寸变化未被 ResizeObserver 捕获的场景:父级从 display:none 切回、字体加载完成、
|
|
255
|
-
* 浏览器缩放、内容动态改变间距等。同步执行(不经 rAF),调用后 visibleCount/overflowCount
|
|
256
|
-
* 立即反映最新几何,behavior 与 RO 自然触发完全一致(去重 onOverflowChange 同样生效)。
|
|
257
|
-
*/
|
|
258
|
-
export function forceMeasure(): void {
|
|
259
|
-
if (rafId) {
|
|
260
|
-
cancelAnimationFrame(rafId);
|
|
261
|
-
rafId = 0;
|
|
262
|
-
}
|
|
263
|
-
measure();
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* 命令式方法:scroll 模式下把指定项滚动到可见层主轴位置(红线 #3:直接写 DOM
|
|
268
|
-
* scrollLeft/scrollTop,非 render 期)。collapse 模式无滚动容器,为 no-op。
|
|
269
|
-
* @param index 目标索引(自动 clamp 到 [0, items.length - 1])
|
|
270
|
-
* @param opts.align 'start'(默认)| 'center' | 'end':目标项在视口主轴内的对齐方式
|
|
271
|
-
*/
|
|
272
|
-
export function scrollTo(
|
|
273
|
-
index: number,
|
|
274
|
-
opts?: { align?: 'start' | 'center' | 'end' },
|
|
275
|
-
): void {
|
|
276
|
-
const el = visibleEl;
|
|
277
|
-
if (!el || !isScroll || items.length === 0) return;
|
|
278
|
-
const i = Math.max(0, Math.min(items.length - 1, Math.floor(index)));
|
|
279
|
-
const vertical = direction === 'vertical';
|
|
280
|
-
|
|
281
|
-
// scroll 模式可见层渲染全部 items,直接读第 i 个 .cd-overflow-list__item 的几何。
|
|
282
|
-
const nodes = el.querySelectorAll<HTMLElement>('.cd-overflow-list__item');
|
|
283
|
-
const node = nodes[i];
|
|
284
|
-
if (!node) return;
|
|
285
|
-
|
|
286
|
-
// 目标项相对滚动内容起点的主轴偏移与尺寸:用 getBoundingClientRect 差值(不受
|
|
287
|
-
// offsetParent 影响),再叠加当前滚动量还原内容坐标。命令式读几何,非 render 期。
|
|
288
|
-
const elRect = el.getBoundingClientRect();
|
|
289
|
-
const nodeRect = node.getBoundingClientRect();
|
|
290
|
-
const itemStart = vertical
|
|
291
|
-
? nodeRect.top - elRect.top + el.scrollTop
|
|
292
|
-
: nodeRect.left - elRect.left + el.scrollLeft;
|
|
293
|
-
const itemSize = vertical ? nodeRect.height : nodeRect.width;
|
|
294
|
-
const viewport = vertical ? el.clientHeight : el.clientWidth;
|
|
295
|
-
const maxScroll =
|
|
296
|
-
(vertical ? el.scrollHeight : el.scrollWidth) - viewport;
|
|
297
|
-
|
|
298
|
-
const align = opts?.align ?? 'start';
|
|
299
|
-
let target =
|
|
300
|
-
align === 'center'
|
|
301
|
-
? itemStart - (viewport - itemSize) / 2
|
|
302
|
-
: align === 'end'
|
|
303
|
-
? itemStart - (viewport - itemSize)
|
|
304
|
-
: itemStart;
|
|
305
|
-
target = Math.max(0, Math.min(maxScroll, target));
|
|
306
|
-
|
|
307
|
-
if (vertical) el.scrollTop = target;
|
|
308
|
-
else el.scrollLeft = target;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
// ResizeObserver:命令式创建 + observe(containerEl),容器尺寸变 → rAF 合批 measure。
|
|
312
|
-
// 观测根容器(block,随父宽变化,RO 必 fire)而非内层 flex/overflow 可见层(bug 根因:
|
|
313
|
-
// 其 border-box 不随父变化上报 RO)。依赖 containerEl 就绪;cleanup disconnect + cancelAnimationFrame。
|
|
314
|
-
// 不依赖 visibleCount,故 render 写 visibleCount 不会重跑此 effect。
|
|
315
|
-
$effect(() => {
|
|
316
|
-
const container = containerEl;
|
|
317
|
-
if (!container) return;
|
|
318
|
-
|
|
319
|
-
// 立即测一次(命令式,非 render 期)。
|
|
320
|
-
measure();
|
|
321
|
-
|
|
322
|
-
const ro = new ResizeObserver(() => scheduleMeasure());
|
|
323
|
-
ro.observe(container);
|
|
324
|
-
|
|
325
|
-
return () => {
|
|
326
|
-
ro.disconnect();
|
|
327
|
-
if (rafId) {
|
|
328
|
-
cancelAnimationFrame(rafId);
|
|
329
|
-
rafId = 0;
|
|
330
|
-
}
|
|
331
|
-
};
|
|
332
|
-
});
|
|
333
|
-
|
|
334
|
-
// items 内容 / 模式参数变化时重测:effect 依赖 items.length + mode/direction/
|
|
335
|
-
// collapseFrom/gap 等配置(render 安全,均非几何 $state),绝不依赖 visibleCount,
|
|
336
|
-
// 故 measure 写 visibleCount 不会重跑此 effect → 零循环。
|
|
337
|
-
$effect(() => {
|
|
338
|
-
// 显式建立依赖:内容长度 + 影响收纳结果的配置项变化即重测。
|
|
339
|
-
void items.length;
|
|
340
|
-
void mode;
|
|
341
|
-
void direction;
|
|
342
|
-
void collapseFrom;
|
|
343
|
-
void gapPx;
|
|
344
|
-
void minVisibleItems;
|
|
345
|
-
void threshold;
|
|
346
|
-
scheduleMeasure();
|
|
347
|
-
});
|
|
348
|
-
</script>
|
|
349
|
-
|
|
350
|
-
<div class={cls} role="group" aria-label={ariaLabel} bind:this={containerEl}>
|
|
351
|
-
<!-- 可见层:实际渲染,用户所见。scroll 模式下可滚动;collapse 模式下溢出收纳为 +N。
|
|
352
|
-
scroll 模式下可见层即滚动容器:设 tabindex=0 让键盘用户可聚焦后用方向键滚动
|
|
353
|
-
(WCAG 2.1.1,浏览器对聚焦的滚动容器原生支持方向键滚动),并提供可访问名。
|
|
354
|
-
group 角色为非交互元素,故 tabindex 显式抑制 lint(同 Card/Carousel/DatePicker)。 -->
|
|
355
|
-
<!-- svelte-ignore a11y_no_noninteractive_tabindex -->
|
|
356
|
-
<div
|
|
357
|
-
class="cd-overflow-list__visible"
|
|
358
|
-
bind:this={visibleEl}
|
|
359
|
-
tabindex={isScroll ? 0 : undefined}
|
|
360
|
-
role={isScroll ? 'group' : undefined}
|
|
361
|
-
aria-label={isScroll ? (ariaLabel ?? loc().t('OverflowList.scrollAriaLabel')) : undefined}
|
|
362
|
-
>
|
|
363
|
-
<!-- start 折叠:折叠节点在头部(溢出项是前面的项)。scroll 模式 overflowCount 恒为 0。 -->
|
|
364
|
-
{#if overflowCount > 0 && collapseFrom === 'start'}
|
|
365
|
-
{#if overflow}
|
|
366
|
-
{@render overflow({ overflowItems, overflowCount })}
|
|
367
|
-
{:else}
|
|
368
|
-
<button
|
|
369
|
-
type="button"
|
|
370
|
-
class="cd-overflow-list__more"
|
|
371
|
-
aria-label={loc().t('OverflowList.moreAriaLabel', { count: overflowCount })}
|
|
372
|
-
>
|
|
373
|
-
+{overflowCount}
|
|
374
|
-
</button>
|
|
375
|
-
{/if}
|
|
376
|
-
{/if}
|
|
377
|
-
{#each visibleItems as it, i (visibleBaseIndex + i)}
|
|
378
|
-
<div class="cd-overflow-list__item">
|
|
379
|
-
{#if item}{@render item({ item: it, index: visibleBaseIndex + i })}{/if}
|
|
380
|
-
</div>
|
|
381
|
-
{/each}
|
|
382
|
-
<!-- end 折叠(默认):折叠节点在尾部。 -->
|
|
383
|
-
{#if overflowCount > 0 && collapseFrom === 'end'}
|
|
384
|
-
{#if overflow}
|
|
385
|
-
{@render overflow({ overflowItems, overflowCount })}
|
|
386
|
-
{:else}
|
|
387
|
-
<button
|
|
388
|
-
type="button"
|
|
389
|
-
class="cd-overflow-list__more"
|
|
390
|
-
aria-label={loc().t('OverflowList.moreAriaLabel', { count: overflowCount })}
|
|
391
|
-
>
|
|
392
|
-
+{overflowCount}
|
|
393
|
-
</button>
|
|
394
|
-
{/if}
|
|
395
|
-
{/if}
|
|
396
|
-
</div>
|
|
397
|
-
|
|
398
|
-
<!-- 离屏测量层:渲染全部 items + 折叠节点样本,仅用于测宽,永不进可视布局/Tab 序。 -->
|
|
399
|
-
<div class="cd-overflow-list__measure" bind:this={measureEl} aria-hidden="true">
|
|
400
|
-
{#each items as it, i (i)}
|
|
401
|
-
<div class="cd-overflow-list__item" data-cd-measure-item>
|
|
402
|
-
{#if item}{@render item({ item: it, index: i })}{/if}
|
|
403
|
-
</div>
|
|
404
|
-
{/each}
|
|
405
|
-
<button
|
|
406
|
-
type="button"
|
|
407
|
-
class="cd-overflow-list__more"
|
|
408
|
-
data-cd-measure-overflow
|
|
409
|
-
tabindex="-1"
|
|
410
|
-
>
|
|
411
|
-
+{items.length}
|
|
412
|
-
</button>
|
|
413
|
-
</div>
|
|
414
|
-
</div>
|
|
415
|
-
|
|
416
|
-
<style>
|
|
417
|
-
.cd-overflow-list {
|
|
418
|
-
--cd-overflow-list-gap: var(--cd-spacing-2, 8px);
|
|
419
|
-
--cd-overflow-list-gap-small: var(--cd-spacing-1, 4px);
|
|
420
|
-
--cd-overflow-list-gap-large: var(--cd-spacing-3, 12px);
|
|
421
|
-
--cd-overflow-list-overflow-color: var(--cd-color-text-1, #4e5969);
|
|
422
|
-
--cd-overflow-list-overflow-color-hover: var(--cd-color-text-0, #1d2129);
|
|
423
|
-
--cd-overflow-list-overflow-bg: var(--cd-color-fill-0, #f2f3f5);
|
|
424
|
-
--cd-overflow-list-overflow-bg-hover: var(--cd-color-fill-1, #e5e6eb);
|
|
425
|
-
--cd-overflow-list-overflow-radius: var(--cd-radius-default, 4px);
|
|
426
|
-
--cd-overflow-list-focus-ring: var(--cd-color-primary, #165dff);
|
|
427
|
-
|
|
428
|
-
position: relative;
|
|
429
|
-
display: block;
|
|
430
|
-
inline-size: 100%;
|
|
431
|
-
box-sizing: border-box;
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
/* 纵向根容器:撑满父高,几何测量读 clientHeight。 */
|
|
435
|
-
.cd-overflow-list--vertical {
|
|
436
|
-
block-size: 100%;
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
/* 可见层:单行 flex,超出裁剪;折叠节点不被裁。 */
|
|
440
|
-
.cd-overflow-list__visible {
|
|
441
|
-
display: flex;
|
|
442
|
-
flex-wrap: nowrap;
|
|
443
|
-
align-items: center;
|
|
444
|
-
gap: var(--cd-overflow-list-gap);
|
|
445
|
-
inline-size: 100%;
|
|
446
|
-
overflow: hidden;
|
|
447
|
-
box-sizing: border-box;
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
/* 纵向:主轴改为列方向,可见层撑满高。 */
|
|
451
|
-
.cd-overflow-list--vertical .cd-overflow-list__visible {
|
|
452
|
-
flex-direction: column;
|
|
453
|
-
align-items: stretch;
|
|
454
|
-
block-size: 100%;
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
/* scroll 模式:不折叠,可见层沿主轴可滚动。容器可聚焦,键盘焦点环可见。 */
|
|
458
|
-
.cd-overflow-list--scroll .cd-overflow-list__visible {
|
|
459
|
-
outline: none;
|
|
460
|
-
}
|
|
461
|
-
.cd-overflow-list--scroll .cd-overflow-list__visible:focus-visible {
|
|
462
|
-
outline: 2px solid var(--cd-overflow-list-focus-ring);
|
|
463
|
-
outline-offset: 1px;
|
|
464
|
-
}
|
|
465
|
-
.cd-overflow-list--scroll.cd-overflow-list--horizontal .cd-overflow-list__visible {
|
|
466
|
-
overflow-x: auto;
|
|
467
|
-
overflow-y: hidden;
|
|
468
|
-
}
|
|
469
|
-
.cd-overflow-list--scroll.cd-overflow-list--vertical .cd-overflow-list__visible {
|
|
470
|
-
overflow-x: hidden;
|
|
471
|
-
overflow-y: auto;
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
.cd-overflow-list--small .cd-overflow-list__visible {
|
|
475
|
-
gap: var(--cd-overflow-list-gap-small);
|
|
476
|
-
}
|
|
477
|
-
.cd-overflow-list--large .cd-overflow-list__visible {
|
|
478
|
-
gap: var(--cd-overflow-list-gap-large);
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
/* 单项不收缩,保持真实尺寸(测量与可见层一致)。 */
|
|
482
|
-
.cd-overflow-list__item {
|
|
483
|
-
flex: 0 0 auto;
|
|
484
|
-
min-inline-size: 0;
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
/* 折叠节点:永远显示在末尾、不被裁剪。 */
|
|
488
|
-
.cd-overflow-list__more {
|
|
489
|
-
flex: 0 0 auto;
|
|
490
|
-
display: inline-flex;
|
|
491
|
-
align-items: center;
|
|
492
|
-
justify-content: center;
|
|
493
|
-
padding-inline: 8px;
|
|
494
|
-
block-size: 24px;
|
|
495
|
-
border: none;
|
|
496
|
-
border-radius: var(--cd-overflow-list-overflow-radius);
|
|
497
|
-
background: var(--cd-overflow-list-overflow-bg);
|
|
498
|
-
color: var(--cd-overflow-list-overflow-color);
|
|
499
|
-
font-size: 12px;
|
|
500
|
-
line-height: 1;
|
|
501
|
-
white-space: nowrap;
|
|
502
|
-
cursor: pointer;
|
|
503
|
-
box-sizing: border-box;
|
|
504
|
-
}
|
|
505
|
-
.cd-overflow-list__more:hover {
|
|
506
|
-
background: var(--cd-overflow-list-overflow-bg-hover);
|
|
507
|
-
color: var(--cd-overflow-list-overflow-color-hover);
|
|
508
|
-
}
|
|
509
|
-
.cd-overflow-list__more:focus-visible {
|
|
510
|
-
outline: 2px solid var(--cd-overflow-list-focus-ring);
|
|
511
|
-
outline-offset: 1px;
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
/* 离屏测量层:渲染全部项,不可见、不可点、不进 Tab 序、不参与可视布局。 */
|
|
515
|
-
.cd-overflow-list__measure {
|
|
516
|
-
position: absolute;
|
|
517
|
-
inset-block-start: 0;
|
|
518
|
-
inset-inline-start: 0;
|
|
519
|
-
display: flex;
|
|
520
|
-
flex-wrap: nowrap;
|
|
521
|
-
align-items: center;
|
|
522
|
-
gap: var(--cd-overflow-list-gap);
|
|
523
|
-
visibility: hidden;
|
|
524
|
-
pointer-events: none;
|
|
525
|
-
z-index: -1;
|
|
526
|
-
box-sizing: border-box;
|
|
527
|
-
}
|
|
528
|
-
/* 纵向测量层:列方向布局,测项高度。 */
|
|
529
|
-
.cd-overflow-list--vertical .cd-overflow-list__measure {
|
|
530
|
-
flex-direction: column;
|
|
531
|
-
align-items: flex-start;
|
|
532
|
-
}
|
|
533
|
-
.cd-overflow-list--small .cd-overflow-list__measure {
|
|
534
|
-
gap: var(--cd-overflow-list-gap-small);
|
|
535
|
-
}
|
|
536
|
-
.cd-overflow-list--large .cd-overflow-list__measure {
|
|
537
|
-
gap: var(--cd-overflow-list-gap-large);
|
|
538
|
-
}
|
|
539
|
-
</style>
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
<!--
|
|
2
|
-
仅供 OverflowList.a11y.test.ts 使用的测试夹具:数据驱动 items + item Snippet。
|
|
3
|
-
jsdom 无布局,ResizeObserver 测量拿到 0 宽,不会真的折叠出 +N 节点——
|
|
4
|
-
本套件只断言容器 role=group 语义与可访问名 + axe 静态扫描,折叠行为留给 Playwright。
|
|
5
|
-
-->
|
|
6
|
-
<script lang="ts">
|
|
7
|
-
import { OverflowList } from './index.js';
|
|
8
|
-
|
|
9
|
-
interface Props {
|
|
10
|
-
mode?: 'collapse' | 'scroll';
|
|
11
|
-
ariaLabel?: string;
|
|
12
|
-
}
|
|
13
|
-
let { mode = 'collapse', ariaLabel = 'Toolbar' }: Props = $props();
|
|
14
|
-
|
|
15
|
-
const items = ['Cut', 'Copy', 'Paste', 'Delete', 'Rename'];
|
|
16
|
-
</script>
|
|
17
|
-
|
|
18
|
-
<OverflowList {items} {mode} {ariaLabel}>
|
|
19
|
-
{#snippet item({ item })}
|
|
20
|
-
<span class="cd-tag">{item}</span>
|
|
21
|
-
{/snippet}
|
|
22
|
-
</OverflowList>
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
<!--
|
|
2
|
-
仅供 OverflowList.kbd.test.ts(browser project)使用的键盘 e2e 夹具。
|
|
3
|
-
mode='scroll':不折叠,可见层(.cd-overflow-list__visible)成为可滚动容器,
|
|
4
|
-
设 tabindex=0 + role=group + aria-label,键盘用户可聚焦后用方向键滚动(WCAG 2.1.1)。
|
|
5
|
-
data-testid=before 用于 Tab 起跳。
|
|
6
|
-
-->
|
|
7
|
-
<script lang="ts">
|
|
8
|
-
import { LocaleProvider } from '../locale-provider/index.js';
|
|
9
|
-
import OverflowList from './OverflowList.svelte';
|
|
10
|
-
|
|
11
|
-
const items = ['One', 'Two', 'Three', 'Four', 'Five', 'Six'];
|
|
12
|
-
</script>
|
|
13
|
-
|
|
14
|
-
<LocaleProvider locale="en_US">
|
|
15
|
-
<button type="button" data-testid="before">before</button>
|
|
16
|
-
<OverflowList {items} mode="scroll" ariaLabel="Tags">
|
|
17
|
-
{#snippet item({ item }: { item: string; index: number })}
|
|
18
|
-
<span>{item}</span>
|
|
19
|
-
{/snippet}
|
|
20
|
-
</OverflowList>
|
|
21
|
-
</LocaleProvider>
|