@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
package/src/slider/Slider.svelte
DELETED
|
@@ -1,716 +0,0 @@
|
|
|
1
|
-
<!--
|
|
2
|
-
Slider — see specs/components/input/Slider.spec.md
|
|
3
|
-
Single / range slider. APG slider(-multithumb). Controlled / uncontrolled.
|
|
4
|
-
Dragging is IMPERATIVE: rail rect read once on pointerdown into a plain var,
|
|
5
|
-
document pointermove/up listeners added/removed by hand — no reactive
|
|
6
|
-
attachment reads DOM measurements (avoids re-subscribe loops). Variation only
|
|
7
|
-
via onChange; an optional local `dragValue` gives instant feedback while dragging.
|
|
8
|
-
|
|
9
|
-
Tooltip is a lightweight absolutely-positioned bubble above each handle, shown
|
|
10
|
-
on hover/focus/drag (or always via alwaysShowTip / forced via tooltipVisible).
|
|
11
|
-
No floating library is pulled in: percent layout already gives the position.
|
|
12
|
-
-->
|
|
13
|
-
<script lang="ts">
|
|
14
|
-
import { useLiveAnnouncer } from '@chenzy-design/core';
|
|
15
|
-
import { useLocale } from '../locale-provider/index.js';
|
|
16
|
-
|
|
17
|
-
type Size = 'small' | 'default' | 'large';
|
|
18
|
-
type Status = 'default' | 'warning' | 'error';
|
|
19
|
-
type Single = number;
|
|
20
|
-
type Pair = [number, number];
|
|
21
|
-
type SliderValue = Single | Pair;
|
|
22
|
-
|
|
23
|
-
interface Props {
|
|
24
|
-
value?: SliderValue;
|
|
25
|
-
defaultValue?: SliderValue;
|
|
26
|
-
min?: number;
|
|
27
|
-
max?: number;
|
|
28
|
-
step?: number | null;
|
|
29
|
-
range?: boolean;
|
|
30
|
-
marks?: Record<number, string>;
|
|
31
|
-
dots?: boolean;
|
|
32
|
-
included?: boolean;
|
|
33
|
-
vertical?: boolean;
|
|
34
|
-
verticalReverse?: boolean;
|
|
35
|
-
height?: number;
|
|
36
|
-
disabled?: boolean;
|
|
37
|
-
clickable?: boolean;
|
|
38
|
-
size?: Size;
|
|
39
|
-
status?: Status;
|
|
40
|
-
tooltipVisible?: boolean;
|
|
41
|
-
alwaysShowTip?: boolean;
|
|
42
|
-
tipFormatter?: (value: number) => string | null;
|
|
43
|
-
getAriaValueText?: (value: number, index: number) => string;
|
|
44
|
-
railStyle?: string;
|
|
45
|
-
handleStyle?: string;
|
|
46
|
-
id?: string;
|
|
47
|
-
ariaLabel?: string;
|
|
48
|
-
/** group 容器与各手柄的 aria-labelledby(指向外部 label 的 id)。 */
|
|
49
|
-
ariaLabelledby?: string;
|
|
50
|
-
onChange?: (v: SliderValue) => void;
|
|
51
|
-
/** 拖拽结束(pointerup)或键盘操作落定时触发,适合做请求节流。 */
|
|
52
|
-
onChangeComplete?: (v: SliderValue) => void;
|
|
53
|
-
/** 与 change 同步的低级输入信号(拖动中每次值变化实时触发,表单绑定用)。 */
|
|
54
|
-
onInput?: (v: SliderValue) => void;
|
|
55
|
-
/** 手柄获得焦点,附带手柄索引(0/1)。 */
|
|
56
|
-
onFocus?: (detail: { index: number }) => void;
|
|
57
|
-
/** 手柄失焦,附带手柄索引(0/1)。 */
|
|
58
|
-
onBlur?: (detail: { index: number }) => void;
|
|
59
|
-
/** 已选轨道段自定义样式(range 时为数组,各段对应一个样式对象) */
|
|
60
|
-
trackStyle?: Record<string, string> | Record<string, string>[];
|
|
61
|
-
/** range 模式下两手柄是否可相互推动(true=最小间距 0,number=最小间距值) */
|
|
62
|
-
pushable?: boolean | number;
|
|
63
|
-
/** range 模式下是否允许交叉(默认 true,false 时强制 left <= right) */
|
|
64
|
-
allowCross?: boolean;
|
|
65
|
-
/** 拖拽/点击结束时触发(onChangeComplete 的别名,语义更明确) */
|
|
66
|
-
onAfterChange?: (v: SliderValue) => void;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
let {
|
|
70
|
-
value = $bindable(),
|
|
71
|
-
defaultValue,
|
|
72
|
-
min = 0,
|
|
73
|
-
max = 100,
|
|
74
|
-
step = 1,
|
|
75
|
-
range = false,
|
|
76
|
-
marks,
|
|
77
|
-
dots = false,
|
|
78
|
-
included = true,
|
|
79
|
-
vertical = false,
|
|
80
|
-
verticalReverse = false,
|
|
81
|
-
height = 200,
|
|
82
|
-
disabled = false,
|
|
83
|
-
clickable = true,
|
|
84
|
-
size = 'default',
|
|
85
|
-
status = 'default',
|
|
86
|
-
tooltipVisible = undefined,
|
|
87
|
-
alwaysShowTip = false,
|
|
88
|
-
tipFormatter = String,
|
|
89
|
-
getAriaValueText,
|
|
90
|
-
railStyle,
|
|
91
|
-
handleStyle,
|
|
92
|
-
id,
|
|
93
|
-
ariaLabel,
|
|
94
|
-
ariaLabelledby,
|
|
95
|
-
onChange,
|
|
96
|
-
onChangeComplete,
|
|
97
|
-
onInput,
|
|
98
|
-
onFocus,
|
|
99
|
-
onBlur,
|
|
100
|
-
trackStyle,
|
|
101
|
-
pushable = false,
|
|
102
|
-
allowCross = true,
|
|
103
|
-
onAfterChange,
|
|
104
|
-
}: Props = $props();
|
|
105
|
-
|
|
106
|
-
const loc = useLocale();
|
|
107
|
-
// 单例 live region(polite):值到达 min/max 边界时播报一次(红线 #3:命令式、事件回调内)。
|
|
108
|
-
const announcer = useLiveAnnouncer();
|
|
109
|
-
// 节流:记住上次播报的边界,连续停在同一边界不重复播;离开后再回到才重播。
|
|
110
|
-
let lastBoundary: 'min' | 'max' | null = null;
|
|
111
|
-
|
|
112
|
-
// 任一手柄到达 min/max 时 polite 播报一次(拖拽落定 / 键盘步进后调用)。
|
|
113
|
-
function maybeAnnounceBoundary(v: SliderValue) {
|
|
114
|
-
const reachesMin = Array.isArray(v) ? v[0] <= min : v <= min;
|
|
115
|
-
const reachesMax = Array.isArray(v) ? v[1] >= max : v >= max;
|
|
116
|
-
const boundary: 'min' | 'max' | null = reachesMax ? 'max' : reachesMin ? 'min' : null;
|
|
117
|
-
if (boundary === null) {
|
|
118
|
-
lastBoundary = null;
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
if (boundary === lastBoundary) return;
|
|
122
|
-
lastBoundary = boundary;
|
|
123
|
-
announcer.announce(
|
|
124
|
-
loc().t(boundary === 'max' ? 'Slider.maxReachedAnnounce' : 'Slider.minReachedAnnounce'),
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const isControlled = $derived(value !== undefined);
|
|
129
|
-
let inner = $state<SliderValue>(getInitialValue());
|
|
130
|
-
// While dragging, a local override gives instant visual feedback without
|
|
131
|
-
// writing the controlled prop. null = not dragging.
|
|
132
|
-
let dragValue = $state<SliderValue | null>(null);
|
|
133
|
-
// Which handle (if any) the pointer is hovering / which has focus — drives the
|
|
134
|
-
// hover/focus tooltip without any imperative DOM measurement.
|
|
135
|
-
let hoverIndex = $state<number | null>(null);
|
|
136
|
-
let focusIndex = $state<number | null>(null);
|
|
137
|
-
|
|
138
|
-
const current = $derived<SliderValue>(
|
|
139
|
-
dragValue ?? (isControlled ? (value as SliderValue) : inner),
|
|
140
|
-
);
|
|
141
|
-
|
|
142
|
-
function getInitialValue(): SliderValue {
|
|
143
|
-
if (defaultValue !== undefined) return defaultValue;
|
|
144
|
-
return range ? [min, min] : min;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// Normalize to a pair for rendering; single mode uses index 1 (start = min).
|
|
148
|
-
const values = $derived<Pair>(
|
|
149
|
-
range ? (current as Pair) : ([min, current as number] as Pair),
|
|
150
|
-
);
|
|
151
|
-
|
|
152
|
-
const markKeys = $derived(
|
|
153
|
-
marks ? Object.keys(marks).map(Number).sort((a, b) => a - b) : [],
|
|
154
|
-
);
|
|
155
|
-
|
|
156
|
-
// Dot positions: every step between min and max (skip endpoints duplicates of marks not needed).
|
|
157
|
-
const dotValues = $derived.by<number[]>(() => {
|
|
158
|
-
if (!dots || step === null || step <= 0) return [];
|
|
159
|
-
const out: number[] = [];
|
|
160
|
-
for (let v = min; v <= max + 1e-9; v += step) {
|
|
161
|
-
out.push(Math.round(v * 1e6) / 1e6);
|
|
162
|
-
}
|
|
163
|
-
return out;
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
function clampToRange(n: number): number {
|
|
167
|
-
return Math.min(max, Math.max(min, n));
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
function snap(n: number): number {
|
|
171
|
-
const clamped = clampToRange(n);
|
|
172
|
-
if (step === null) {
|
|
173
|
-
if (markKeys.length === 0) return clamped;
|
|
174
|
-
return markKeys.reduce((best, k) =>
|
|
175
|
-
Math.abs(k - clamped) < Math.abs(best - clamped) ? k : best,
|
|
176
|
-
);
|
|
177
|
-
}
|
|
178
|
-
const stepped = Math.round((clamped - min) / step) * step + min;
|
|
179
|
-
// Avoid float drift.
|
|
180
|
-
const decimals = decimalsOf(step);
|
|
181
|
-
const factor = 10 ** decimals;
|
|
182
|
-
return clampToRange(Math.round(stepped * factor) / factor);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
function decimalsOf(n: number): number {
|
|
186
|
-
const s = String(n);
|
|
187
|
-
const dot = s.indexOf('.');
|
|
188
|
-
return dot === -1 ? 0 : s.length - dot - 1;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
function valueToPercent(n: number): number {
|
|
192
|
-
if (max === min) return 0;
|
|
193
|
-
return ((n - min) / (max - min)) * 100;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function commit(next: SliderValue, complete = false) {
|
|
197
|
-
// Controlled: never write the prop; propagate only via onChange.
|
|
198
|
-
if (!isControlled) inner = next;
|
|
199
|
-
onChange?.(next);
|
|
200
|
-
// onInput: low-level input signal, kept in sync with change.
|
|
201
|
-
onInput?.(next);
|
|
202
|
-
// onChangeComplete / onAfterChange: only when the interaction settles (pointerup / keyboard),
|
|
203
|
-
// for request throttling on the consumer side.
|
|
204
|
-
if (complete) {
|
|
205
|
-
onChangeComplete?.(next);
|
|
206
|
-
onAfterChange?.(next);
|
|
207
|
-
maybeAnnounceBoundary(next);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// Build the next value for a given handle index, honoring allowCross and pushable.
|
|
212
|
-
function withHandle(index: number, raw: number): SliderValue {
|
|
213
|
-
const snapped = snap(raw);
|
|
214
|
-
if (!range) return snapped;
|
|
215
|
-
const pair: Pair = [...(current as Pair)] as Pair;
|
|
216
|
-
pair[index] = snapped;
|
|
217
|
-
|
|
218
|
-
if (!allowCross) {
|
|
219
|
-
// Enforce left <= right; clamp instead of swap.
|
|
220
|
-
if (index === 0 && pair[0] > pair[1]) pair[0] = pair[1];
|
|
221
|
-
if (index === 1 && pair[1] < pair[0]) pair[1] = pair[0];
|
|
222
|
-
} else if (pushable !== false) {
|
|
223
|
-
// pushable: minimum gap between handles.
|
|
224
|
-
const minGap = typeof pushable === 'number' ? pushable : 0;
|
|
225
|
-
if (index === 0 && pair[0] > pair[1] - minGap) {
|
|
226
|
-
pair[1] = snap(pair[0] + minGap);
|
|
227
|
-
if (pair[1] > max) { pair[1] = max; pair[0] = snap(max - minGap); }
|
|
228
|
-
}
|
|
229
|
-
if (index === 1 && pair[1] < pair[0] + minGap) {
|
|
230
|
-
pair[0] = snap(pair[1] - minGap);
|
|
231
|
-
if (pair[0] < min) { pair[0] = min; pair[1] = snap(min + minGap); }
|
|
232
|
-
}
|
|
233
|
-
} else {
|
|
234
|
-
// Default: swap so handles never cross.
|
|
235
|
-
if (pair[0] > pair[1]) {
|
|
236
|
-
return [pair[1], pair[0]];
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
return pair;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// ---- Imperative pointer drag ----
|
|
243
|
-
// Plain (non-reactive) variables: rail rect is read once on pointerdown.
|
|
244
|
-
let railRect: DOMRect | null = null;
|
|
245
|
-
let activeIndex = 0;
|
|
246
|
-
let railElement: HTMLElement | null = null;
|
|
247
|
-
|
|
248
|
-
function ratioFromRect(rect: DOMRect, clientX: number, clientY: number): number {
|
|
249
|
-
let ratio: number;
|
|
250
|
-
if (vertical) {
|
|
251
|
-
// Default: bottom = min (value grows upward). verticalReverse flips it.
|
|
252
|
-
ratio = verticalReverse
|
|
253
|
-
? (clientY - rect.top) / rect.height
|
|
254
|
-
: (rect.bottom - clientY) / rect.height;
|
|
255
|
-
} else {
|
|
256
|
-
const rtl = getComputedStyle(document.documentElement).direction === 'rtl';
|
|
257
|
-
const fromStart = (clientX - rect.left) / rect.width;
|
|
258
|
-
ratio = rtl ? 1 - fromStart : fromStart;
|
|
259
|
-
}
|
|
260
|
-
return Math.min(1, Math.max(0, ratio));
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
function rawFromClient(clientX: number, clientY: number): number {
|
|
264
|
-
if (!railRect) return min;
|
|
265
|
-
return min + ratioFromRect(railRect, clientX, clientY) * (max - min);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
function nearestHandle(raw: number): number {
|
|
269
|
-
if (!range) return 0;
|
|
270
|
-
const [a, b] = current as Pair;
|
|
271
|
-
return Math.abs(raw - a) <= Math.abs(raw - b) ? 0 : 1;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
function onPointerMove(e: PointerEvent) {
|
|
275
|
-
const raw = rawFromClient(e.clientX, e.clientY);
|
|
276
|
-
const next = withHandle(activeIndex, raw);
|
|
277
|
-
// Fire onInput on every live value change during the drag; only emit when the
|
|
278
|
-
// value actually moved to avoid spamming identical values per pixel.
|
|
279
|
-
if (!sameValue(next, dragValue)) onInput?.(next);
|
|
280
|
-
dragValue = next;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
function onPointerUp() {
|
|
284
|
-
document.removeEventListener('pointermove', onPointerMove);
|
|
285
|
-
document.removeEventListener('pointerup', onPointerUp);
|
|
286
|
-
if (dragValue !== null) {
|
|
287
|
-
const finalValue = dragValue;
|
|
288
|
-
dragValue = null;
|
|
289
|
-
// Drag settled: emit change + changeComplete (onInput already fired live).
|
|
290
|
-
if (!isControlled) inner = finalValue;
|
|
291
|
-
onChange?.(finalValue);
|
|
292
|
-
onChangeComplete?.(finalValue);
|
|
293
|
-
onAfterChange?.(finalValue);
|
|
294
|
-
maybeAnnounceBoundary(finalValue);
|
|
295
|
-
}
|
|
296
|
-
railRect = null;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
function sameValue(a: SliderValue, b: SliderValue | null): boolean {
|
|
300
|
-
if (b === null) return false;
|
|
301
|
-
if (Array.isArray(a) && Array.isArray(b)) return a[0] === b[0] && a[1] === b[1];
|
|
302
|
-
return a === b;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
function beginDrag(index: number, e: PointerEvent) {
|
|
306
|
-
if (disabled || !railElement) return;
|
|
307
|
-
activeIndex = index;
|
|
308
|
-
railRect = railElement.getBoundingClientRect();
|
|
309
|
-
dragValue = withHandle(index, rawFromClient(e.clientX, e.clientY));
|
|
310
|
-
document.addEventListener('pointermove', onPointerMove);
|
|
311
|
-
document.addEventListener('pointerup', onPointerUp);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
function handleHandlePointerDown(index: number, e: PointerEvent) {
|
|
315
|
-
if (disabled || !railElement) return;
|
|
316
|
-
e.preventDefault();
|
|
317
|
-
(e.currentTarget as HTMLElement).focus();
|
|
318
|
-
beginDrag(index, e);
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
function handleRailPointerDown(e: PointerEvent) {
|
|
322
|
-
if (disabled || !railElement || !clickable) return;
|
|
323
|
-
const rect = railElement.getBoundingClientRect();
|
|
324
|
-
const raw = min + ratioFromRect(rect, e.clientX, e.clientY) * (max - min);
|
|
325
|
-
beginDrag(nearestHandle(raw), e);
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
// RTL detection for keyboard mapping (SSR-safe). Mirrors the pointer path which
|
|
329
|
-
// reads documentElement direction.
|
|
330
|
-
function isRtl(): boolean {
|
|
331
|
-
if (typeof document === 'undefined') return false;
|
|
332
|
-
return getComputedStyle(document.documentElement).direction === 'rtl';
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
// Map an arrow key to +1 / -1 / 0 (other) so the *visual* direction always
|
|
336
|
-
// matches increase/decrease, honoring vertical + verticalReverse + RTL.
|
|
337
|
-
// Horizontal: Right increases, Left decreases — flipped under RTL.
|
|
338
|
-
// Vertical: Up increases, Down decreases — flipped under verticalReverse.
|
|
339
|
-
// (The cross-axis arrows stay consistent with APG: Right/Up increase.)
|
|
340
|
-
function arrowDirection(key: string): -1 | 0 | 1 {
|
|
341
|
-
const rtl = isRtl();
|
|
342
|
-
switch (key) {
|
|
343
|
-
case 'ArrowUp':
|
|
344
|
-
return vertical && verticalReverse ? -1 : 1;
|
|
345
|
-
case 'ArrowDown':
|
|
346
|
-
return vertical && verticalReverse ? 1 : -1;
|
|
347
|
-
case 'ArrowRight':
|
|
348
|
-
return rtl ? -1 : 1;
|
|
349
|
-
case 'ArrowLeft':
|
|
350
|
-
return rtl ? 1 : -1;
|
|
351
|
-
default:
|
|
352
|
-
return 0;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
function handleKeydown(index: number, e: KeyboardEvent) {
|
|
357
|
-
if (disabled) return;
|
|
358
|
-
const cur = handleValue(index);
|
|
359
|
-
const stepSize = step ?? 1;
|
|
360
|
-
const bigStep = stepSize * 10;
|
|
361
|
-
let next = cur;
|
|
362
|
-
switch (e.key) {
|
|
363
|
-
case 'ArrowRight':
|
|
364
|
-
case 'ArrowUp':
|
|
365
|
-
case 'ArrowLeft':
|
|
366
|
-
case 'ArrowDown':
|
|
367
|
-
next = cur + arrowDirection(e.key) * stepSize;
|
|
368
|
-
break;
|
|
369
|
-
case 'PageUp':
|
|
370
|
-
next = cur + bigStep;
|
|
371
|
-
break;
|
|
372
|
-
case 'PageDown':
|
|
373
|
-
next = cur - bigStep;
|
|
374
|
-
break;
|
|
375
|
-
case 'Home':
|
|
376
|
-
next = min;
|
|
377
|
-
break;
|
|
378
|
-
case 'End':
|
|
379
|
-
next = max;
|
|
380
|
-
break;
|
|
381
|
-
default:
|
|
382
|
-
return;
|
|
383
|
-
}
|
|
384
|
-
e.preventDefault();
|
|
385
|
-
// Keyboard step settles immediately: change + input + changeComplete.
|
|
386
|
-
commit(withHandle(index, next), true);
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
// Track geometry (percent) for the filled segment.
|
|
390
|
-
const trackStart = $derived(range ? valueToPercent(values[0]) : 0);
|
|
391
|
-
const trackEnd = $derived(valueToPercent(range ? values[1] : (current as number)));
|
|
392
|
-
const handleList = $derived(range ? ([0, 1] as const) : ([1] as const));
|
|
393
|
-
|
|
394
|
-
function handleValue(index: number): number {
|
|
395
|
-
if (!range) return current as number;
|
|
396
|
-
return (current as Pair)[index] ?? min;
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
// Per-handle aria-valuemin/max. In range mode the two handles must not report
|
|
400
|
-
// ranges that allow crossing: the low handle (0) caps its max at the high
|
|
401
|
-
// handle's current value, and the high handle (1) floors its min at the low
|
|
402
|
-
// handle's current value (防越界的可达性表达 — spec §6).
|
|
403
|
-
function handleMin(index: number): number {
|
|
404
|
-
if (range && index === 1) return (current as Pair)[0] ?? min;
|
|
405
|
-
return min;
|
|
406
|
-
}
|
|
407
|
-
function handleMax(index: number): number {
|
|
408
|
-
if (range && index === 0) return (current as Pair)[1] ?? max;
|
|
409
|
-
return max;
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
// A dot sits inside the filled segment (active) when between trackStart/End.
|
|
413
|
-
function dotActive(v: number): boolean {
|
|
414
|
-
const pct = valueToPercent(v);
|
|
415
|
-
return included && pct >= trackStart - 1e-9 && pct <= trackEnd + 1e-9;
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
// Should the value bubble show for a given handle?
|
|
419
|
-
function tipText(index: number): string | null {
|
|
420
|
-
return tipFormatter ? tipFormatter(handleValue(index)) : String(handleValue(index));
|
|
421
|
-
}
|
|
422
|
-
function tipShown(index: number): boolean {
|
|
423
|
-
if (tipText(index) === null) return false;
|
|
424
|
-
if (tooltipVisible !== undefined) return tooltipVisible;
|
|
425
|
-
if (alwaysShowTip) return true;
|
|
426
|
-
if (dragValue !== null && activeIndex === index) return true;
|
|
427
|
-
return hoverIndex === index || focusIndex === index;
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
function ariaValueText(index: number): string | undefined {
|
|
431
|
-
const v = handleValue(index);
|
|
432
|
-
if (getAriaValueText) return getAriaValueText(v, index);
|
|
433
|
-
const t = tipFormatter ? tipFormatter(v) : null;
|
|
434
|
-
return t ?? undefined;
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
// Position style for an element at a value percent, honoring direction.
|
|
438
|
-
function posStyle(pct: number): string {
|
|
439
|
-
if (vertical) {
|
|
440
|
-
return verticalReverse ? `inset-block-start: ${pct}%` : `inset-block-end: ${pct}%`;
|
|
441
|
-
}
|
|
442
|
-
return `inset-inline-start: ${pct}%`;
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
const cls = $derived(
|
|
446
|
-
[
|
|
447
|
-
'cd-slider',
|
|
448
|
-
`cd-slider--${size}`,
|
|
449
|
-
`cd-slider--${vertical ? 'vertical' : 'horizontal'}`,
|
|
450
|
-
vertical && verticalReverse && 'cd-slider--reverse',
|
|
451
|
-
status !== 'default' && `cd-slider--${status}`,
|
|
452
|
-
disabled && 'cd-slider--disabled',
|
|
453
|
-
]
|
|
454
|
-
.filter(Boolean)
|
|
455
|
-
.join(' '),
|
|
456
|
-
);
|
|
457
|
-
|
|
458
|
-
// Track segment style: anchor + size, honoring vertical reverse.
|
|
459
|
-
const trackSegStyle = $derived.by(() => {
|
|
460
|
-
const segSize = `${trackEnd - trackStart}%`;
|
|
461
|
-
if (vertical) {
|
|
462
|
-
return verticalReverse
|
|
463
|
-
? `inset-block-start: ${trackStart}%; block-size: ${segSize}`
|
|
464
|
-
: `inset-block-end: ${trackStart}%; block-size: ${segSize}`;
|
|
465
|
-
}
|
|
466
|
-
return `inset-inline-start: ${trackStart}%; inline-size: ${segSize}`;
|
|
467
|
-
});
|
|
468
|
-
|
|
469
|
-
// trackStyle: merge user-provided custom track styles into the segment style string.
|
|
470
|
-
// In range mode trackStyle may be an array; index 0 applies to the single segment
|
|
471
|
-
// (the filled area between the two handles). Single mode uses index 0 or the object directly.
|
|
472
|
-
function getTrackStyleStr(segIndex: number): string {
|
|
473
|
-
if (!trackStyle) return '';
|
|
474
|
-
const styleObj = Array.isArray(trackStyle) ? trackStyle[segIndex] : trackStyle;
|
|
475
|
-
if (!styleObj) return '';
|
|
476
|
-
return Object.entries(styleObj).map(([k, v]) => `${k}: ${v}`).join('; ');
|
|
477
|
-
}
|
|
478
|
-
</script>
|
|
479
|
-
|
|
480
|
-
<div
|
|
481
|
-
{id}
|
|
482
|
-
class={cls}
|
|
483
|
-
class:cd-slider--vertical={vertical}
|
|
484
|
-
role="group"
|
|
485
|
-
aria-label={ariaLabelledby ? undefined : ariaLabel}
|
|
486
|
-
aria-labelledby={ariaLabelledby}
|
|
487
|
-
aria-disabled={disabled || undefined}
|
|
488
|
-
style={vertical ? `block-size: ${height}px` : undefined}
|
|
489
|
-
>
|
|
490
|
-
<div
|
|
491
|
-
class="cd-slider__rail"
|
|
492
|
-
role="presentation"
|
|
493
|
-
bind:this={railElement}
|
|
494
|
-
style={railStyle}
|
|
495
|
-
onpointerdown={handleRailPointerDown}
|
|
496
|
-
>
|
|
497
|
-
{#if included}
|
|
498
|
-
<div
|
|
499
|
-
class="cd-slider__track"
|
|
500
|
-
style={[trackSegStyle, getTrackStyleStr(0)].filter(Boolean).join('; ')}
|
|
501
|
-
></div>
|
|
502
|
-
{/if}
|
|
503
|
-
|
|
504
|
-
{#each dotValues as dv (dv)}
|
|
505
|
-
{@const pct = valueToPercent(dv)}
|
|
506
|
-
<span
|
|
507
|
-
class="cd-slider__dot"
|
|
508
|
-
class:cd-slider__dot--active={dotActive(dv)}
|
|
509
|
-
style={posStyle(pct)}
|
|
510
|
-
></span>
|
|
511
|
-
{/each}
|
|
512
|
-
|
|
513
|
-
{#each markKeys as mk (mk)}
|
|
514
|
-
{@const pct = valueToPercent(mk)}
|
|
515
|
-
<span class="cd-slider__mark" style={posStyle(pct)}>{marks?.[mk]}</span>
|
|
516
|
-
{/each}
|
|
517
|
-
|
|
518
|
-
{#each handleList as index (index)}
|
|
519
|
-
{@const hv = handleValue(index)}
|
|
520
|
-
{@const pct = valueToPercent(hv)}
|
|
521
|
-
<span
|
|
522
|
-
class="cd-slider__handle"
|
|
523
|
-
role="slider"
|
|
524
|
-
tabindex={disabled ? -1 : 0}
|
|
525
|
-
aria-label={ariaLabelledby ? undefined : ariaLabel}
|
|
526
|
-
aria-labelledby={ariaLabelledby}
|
|
527
|
-
aria-orientation={vertical ? 'vertical' : 'horizontal'}
|
|
528
|
-
aria-valuemin={handleMin(index)}
|
|
529
|
-
aria-valuemax={handleMax(index)}
|
|
530
|
-
aria-valuenow={hv}
|
|
531
|
-
aria-valuetext={ariaValueText(index)}
|
|
532
|
-
aria-disabled={disabled || undefined}
|
|
533
|
-
style={`${posStyle(pct)};${handleStyle ?? ''}`}
|
|
534
|
-
onpointerdown={(e) => handleHandlePointerDown(index, e)}
|
|
535
|
-
onkeydown={(e) => handleKeydown(index, e)}
|
|
536
|
-
onpointerenter={() => (hoverIndex = index)}
|
|
537
|
-
onpointerleave={() => (hoverIndex = null)}
|
|
538
|
-
onfocus={() => {
|
|
539
|
-
focusIndex = index;
|
|
540
|
-
onFocus?.({ index });
|
|
541
|
-
}}
|
|
542
|
-
onblur={() => {
|
|
543
|
-
focusIndex = null;
|
|
544
|
-
onBlur?.({ index });
|
|
545
|
-
}}
|
|
546
|
-
>
|
|
547
|
-
{#if tipShown(index)}
|
|
548
|
-
<span class="cd-slider__tip" role="tooltip" aria-hidden="true">{tipText(index)}</span>
|
|
549
|
-
{/if}
|
|
550
|
-
</span>
|
|
551
|
-
{/each}
|
|
552
|
-
</div>
|
|
553
|
-
</div>
|
|
554
|
-
|
|
555
|
-
<style>
|
|
556
|
-
.cd-slider {
|
|
557
|
-
position: relative;
|
|
558
|
-
display: flex;
|
|
559
|
-
align-items: center;
|
|
560
|
-
inline-size: 100%;
|
|
561
|
-
padding-block: var(--cd-spacing-2);
|
|
562
|
-
touch-action: none;
|
|
563
|
-
}
|
|
564
|
-
.cd-slider--vertical {
|
|
565
|
-
display: inline-flex;
|
|
566
|
-
inline-size: auto;
|
|
567
|
-
block-size: 200px;
|
|
568
|
-
padding-block: 0;
|
|
569
|
-
padding-inline: var(--cd-spacing-2);
|
|
570
|
-
}
|
|
571
|
-
.cd-slider__rail {
|
|
572
|
-
position: relative;
|
|
573
|
-
flex: 1 1 auto;
|
|
574
|
-
inline-size: 100%;
|
|
575
|
-
block-size: var(--cd-slider-rail-height);
|
|
576
|
-
background: var(--cd-slider-rail-bg);
|
|
577
|
-
border-radius: var(--cd-slider-radius);
|
|
578
|
-
cursor: pointer;
|
|
579
|
-
}
|
|
580
|
-
.cd-slider--vertical .cd-slider__rail {
|
|
581
|
-
inline-size: var(--cd-slider-rail-height);
|
|
582
|
-
block-size: 100%;
|
|
583
|
-
}
|
|
584
|
-
.cd-slider__track {
|
|
585
|
-
position: absolute;
|
|
586
|
-
inset-block: 0;
|
|
587
|
-
inset-inline-start: 0;
|
|
588
|
-
block-size: 100%;
|
|
589
|
-
background: var(--cd-slider-track-bg);
|
|
590
|
-
border-radius: var(--cd-slider-radius);
|
|
591
|
-
}
|
|
592
|
-
.cd-slider--vertical .cd-slider__track {
|
|
593
|
-
inset-block: auto;
|
|
594
|
-
inset-inline: 0;
|
|
595
|
-
inline-size: 100%;
|
|
596
|
-
}
|
|
597
|
-
.cd-slider__handle {
|
|
598
|
-
position: absolute;
|
|
599
|
-
inset-block-start: 50%;
|
|
600
|
-
inline-size: var(--cd-slider-handle-size);
|
|
601
|
-
block-size: var(--cd-slider-handle-size);
|
|
602
|
-
background: var(--cd-slider-handle-bg);
|
|
603
|
-
border: 2px solid var(--cd-slider-handle-border);
|
|
604
|
-
border-radius: var(--cd-radius-full);
|
|
605
|
-
transform: translate(-50%, -50%);
|
|
606
|
-
cursor: grab;
|
|
607
|
-
outline: none;
|
|
608
|
-
transition: box-shadow var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
|
|
609
|
-
}
|
|
610
|
-
.cd-slider--vertical .cd-slider__handle {
|
|
611
|
-
inset-block-start: auto;
|
|
612
|
-
inset-inline-start: 50%;
|
|
613
|
-
transform: translate(-50%, 50%);
|
|
614
|
-
}
|
|
615
|
-
/* Reverse vertical: handle anchored from the top, offset upward by half. */
|
|
616
|
-
.cd-slider--vertical.cd-slider--reverse .cd-slider__handle {
|
|
617
|
-
transform: translate(-50%, -50%);
|
|
618
|
-
}
|
|
619
|
-
.cd-slider__handle:hover {
|
|
620
|
-
box-shadow: var(--cd-shadow-1);
|
|
621
|
-
}
|
|
622
|
-
.cd-slider__handle:active {
|
|
623
|
-
cursor: grabbing;
|
|
624
|
-
}
|
|
625
|
-
.cd-slider__handle:focus-visible {
|
|
626
|
-
box-shadow: var(--cd-focus-ring);
|
|
627
|
-
}
|
|
628
|
-
/* Value bubble above the handle. */
|
|
629
|
-
.cd-slider__tip {
|
|
630
|
-
position: absolute;
|
|
631
|
-
inset-block-end: calc(100% + var(--cd-spacing-2));
|
|
632
|
-
inset-inline-start: 50%;
|
|
633
|
-
transform: translateX(-50%);
|
|
634
|
-
padding: 2px var(--cd-spacing-2);
|
|
635
|
-
background: var(--cd-color-bg-inverse, rgba(0, 0, 0, 0.85));
|
|
636
|
-
color: var(--cd-color-text-inverse, #fff);
|
|
637
|
-
font-size: var(--cd-font-size-1);
|
|
638
|
-
line-height: 1.4;
|
|
639
|
-
white-space: nowrap;
|
|
640
|
-
border-radius: var(--cd-radius-1, 4px);
|
|
641
|
-
pointer-events: none;
|
|
642
|
-
z-index: 1;
|
|
643
|
-
}
|
|
644
|
-
.cd-slider--vertical .cd-slider__tip {
|
|
645
|
-
inset-block-end: 50%;
|
|
646
|
-
inset-inline-start: calc(100% + var(--cd-spacing-2));
|
|
647
|
-
transform: translateY(50%);
|
|
648
|
-
}
|
|
649
|
-
/* Step dots. */
|
|
650
|
-
.cd-slider__dot {
|
|
651
|
-
position: absolute;
|
|
652
|
-
inset-block-start: 50%;
|
|
653
|
-
inline-size: 8px;
|
|
654
|
-
block-size: 8px;
|
|
655
|
-
background: var(--cd-color-bg-0);
|
|
656
|
-
border: 2px solid var(--cd-slider-dot-color, var(--cd-color-border));
|
|
657
|
-
border-radius: var(--cd-radius-full);
|
|
658
|
-
transform: translate(-50%, -50%);
|
|
659
|
-
pointer-events: none;
|
|
660
|
-
}
|
|
661
|
-
.cd-slider__dot--active {
|
|
662
|
-
border-color: var(--cd-slider-dot-color-active, var(--cd-color-primary));
|
|
663
|
-
}
|
|
664
|
-
.cd-slider--vertical .cd-slider__dot {
|
|
665
|
-
inset-block-start: auto;
|
|
666
|
-
inset-inline-start: 50%;
|
|
667
|
-
transform: translate(-50%, 50%);
|
|
668
|
-
}
|
|
669
|
-
.cd-slider--vertical.cd-slider--reverse .cd-slider__dot {
|
|
670
|
-
transform: translate(-50%, -50%);
|
|
671
|
-
}
|
|
672
|
-
.cd-slider__mark {
|
|
673
|
-
position: absolute;
|
|
674
|
-
inset-block-start: calc(100% + var(--cd-spacing-2));
|
|
675
|
-
transform: translateX(-50%);
|
|
676
|
-
color: var(--cd-slider-mark-color);
|
|
677
|
-
font-size: var(--cd-font-size-1);
|
|
678
|
-
white-space: nowrap;
|
|
679
|
-
}
|
|
680
|
-
.cd-slider--vertical .cd-slider__mark {
|
|
681
|
-
inset-block-start: auto;
|
|
682
|
-
inset-inline-start: calc(100% + var(--cd-spacing-2));
|
|
683
|
-
transform: translateY(50%);
|
|
684
|
-
}
|
|
685
|
-
.cd-slider--vertical.cd-slider--reverse .cd-slider__mark {
|
|
686
|
-
transform: translateY(-50%);
|
|
687
|
-
}
|
|
688
|
-
.cd-slider--disabled {
|
|
689
|
-
opacity: 0.5;
|
|
690
|
-
}
|
|
691
|
-
.cd-slider--disabled .cd-slider__rail,
|
|
692
|
-
.cd-slider--disabled .cd-slider__handle {
|
|
693
|
-
cursor: not-allowed;
|
|
694
|
-
}
|
|
695
|
-
.cd-slider--disabled .cd-slider__track {
|
|
696
|
-
background: var(--cd-color-text-3);
|
|
697
|
-
}
|
|
698
|
-
/* 校验态:已选轨道段与手柄边框改用 warning/error 色调(disabled 优先)。 */
|
|
699
|
-
.cd-slider--warning:not(.cd-slider--disabled) .cd-slider__track {
|
|
700
|
-
background: var(--cd-slider-status-warning);
|
|
701
|
-
}
|
|
702
|
-
.cd-slider--warning:not(.cd-slider--disabled) .cd-slider__handle {
|
|
703
|
-
border-color: var(--cd-slider-status-warning);
|
|
704
|
-
}
|
|
705
|
-
.cd-slider--error:not(.cd-slider--disabled) .cd-slider__track {
|
|
706
|
-
background: var(--cd-slider-status-error);
|
|
707
|
-
}
|
|
708
|
-
.cd-slider--error:not(.cd-slider--disabled) .cd-slider__handle {
|
|
709
|
-
border-color: var(--cd-slider-status-error);
|
|
710
|
-
}
|
|
711
|
-
@media (prefers-reduced-motion: reduce) {
|
|
712
|
-
.cd-slider__handle {
|
|
713
|
-
transition: none;
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
</style>
|