@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/form/Field.svelte
DELETED
|
@@ -1,492 +0,0 @@
|
|
|
1
|
-
<!--
|
|
2
|
-
Field — see specs/components/input/Form.spec.md
|
|
3
|
-
Single-field wrapper: label + required mark + error/extra text + a11y wiring.
|
|
4
|
-
Pulls field slices from the shared form context (read-only during render).
|
|
5
|
-
-->
|
|
6
|
-
<script lang="ts">
|
|
7
|
-
import type { Snippet } from 'svelte';
|
|
8
|
-
import { useId, type Rule, type ValidateTrigger } from '@chenzy-design/core';
|
|
9
|
-
import { getFormContext } from './context.js';
|
|
10
|
-
import { useLocale } from '../locale-provider/index.js';
|
|
11
|
-
|
|
12
|
-
type FieldStatus = 'default' | 'error' | 'warning';
|
|
13
|
-
|
|
14
|
-
interface ChildArgs {
|
|
15
|
-
/** Generic field value — always present, regardless of `valuePropName`. */
|
|
16
|
-
value: unknown;
|
|
17
|
-
onChange: (v: unknown) => void;
|
|
18
|
-
onBlur: () => void;
|
|
19
|
-
status: FieldStatus;
|
|
20
|
-
id: string;
|
|
21
|
-
/** id(s) of the field's error/warning/extra text, for the control's aria-describedby */
|
|
22
|
-
describedBy: string | undefined;
|
|
23
|
-
disabled: boolean;
|
|
24
|
-
/**
|
|
25
|
-
* whether this field is required (spec §138). Controls should expose it as
|
|
26
|
-
* `aria-required="true"` so the required semantic reaches screen readers —
|
|
27
|
-
* the visible star is `aria-hidden` and thus inaudible on its own.
|
|
28
|
-
*/
|
|
29
|
-
required: boolean;
|
|
30
|
-
/**
|
|
31
|
-
* Convenience alias keyed by `valuePropName` (default 'value'), carrying the
|
|
32
|
-
* same value as `value`. Lets non-`value` controls (e.g. Checkbox/Switch use
|
|
33
|
-
* `checked`) destructure `{ checked, onChange }` directly from the snippet.
|
|
34
|
-
*/
|
|
35
|
-
[key: string]: unknown;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
interface Props {
|
|
39
|
-
field: string;
|
|
40
|
-
label?: string;
|
|
41
|
-
rules?: Rule[];
|
|
42
|
-
/** field-level initial value; overrides the container's initValues (spec §4.2 L79). */
|
|
43
|
-
initValue?: unknown;
|
|
44
|
-
required?: boolean;
|
|
45
|
-
/**
|
|
46
|
-
* externally forced validate status (spec §4.2 L81). A controlled DISPLAY
|
|
47
|
-
* state only — it never feeds the internal validation engine and is never
|
|
48
|
-
* written back (red line #1). When set it takes precedence over the
|
|
49
|
-
* internally computed status for visuals/aria.
|
|
50
|
-
*/
|
|
51
|
-
validateStatus?: 'default' | 'warning' | 'error';
|
|
52
|
-
extraText?: string;
|
|
53
|
-
/**
|
|
54
|
-
* register & collect only, render no layout DOM (spec §4.2 L85 / §190). The
|
|
55
|
-
* control snippet is still rendered (so it can bind), but the label / status
|
|
56
|
-
* text / field wrapper chrome are skipped.
|
|
57
|
-
*/
|
|
58
|
-
noStyle?: boolean;
|
|
59
|
-
/** number of columns this field spans inside a grid parent / Form.Section (spec §4.2 L86). */
|
|
60
|
-
span?: number;
|
|
61
|
-
/** pure value transform applied at collect/submit time (spec §4.2 L88). */
|
|
62
|
-
transform?: (value: unknown, values: Record<string, unknown>) => unknown;
|
|
63
|
-
/**
|
|
64
|
-
* Name of the control's value prop. Default 'value'. For boolean controls
|
|
65
|
-
* such as Checkbox/Switch pass 'checked'; the snippet then exposes a
|
|
66
|
-
* `checked` alias mirroring the field value.
|
|
67
|
-
*/
|
|
68
|
-
valuePropName?: string;
|
|
69
|
-
/** names of fields this field's validation depends on (e.g. confirm → ['password']) */
|
|
70
|
-
dependencies?: string[];
|
|
71
|
-
/** field-level override of the form's validateTrigger (spec §4 L84). */
|
|
72
|
-
trigger?: ValidateTrigger | ValidateTrigger[];
|
|
73
|
-
/**
|
|
74
|
-
* 是否允许空字符串作为有效值(默认 false:空串当 undefined 处理,不触发 required 通过)。
|
|
75
|
-
* 设为 true 后空串参与 required 校验和值收集。
|
|
76
|
-
*/
|
|
77
|
-
allowEmptyString?: boolean;
|
|
78
|
-
/**
|
|
79
|
-
* 字段值在存入 formState 前的转换函数(在 Field 层执行,不同于 transform 的提交时转换)。
|
|
80
|
-
* convert 的结果回写 formState,transform 的结果仅用于提交/收集,不回写。
|
|
81
|
-
*/
|
|
82
|
-
convert?: (value: unknown) => unknown;
|
|
83
|
-
/**
|
|
84
|
-
* 组件卸载时保留字段状态(默认 false:卸载时清空字段值/错误/touched)。
|
|
85
|
-
* 设为 true 后卸载不清 formState,下次挂载时继承上次状态。
|
|
86
|
-
*/
|
|
87
|
-
keepState?: boolean;
|
|
88
|
-
children?: Snippet<[ChildArgs]>;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
let {
|
|
92
|
-
field,
|
|
93
|
-
label,
|
|
94
|
-
rules = [],
|
|
95
|
-
initValue,
|
|
96
|
-
required = false,
|
|
97
|
-
validateStatus,
|
|
98
|
-
extraText,
|
|
99
|
-
noStyle = false,
|
|
100
|
-
span,
|
|
101
|
-
transform,
|
|
102
|
-
valuePropName = 'value',
|
|
103
|
-
dependencies,
|
|
104
|
-
trigger,
|
|
105
|
-
allowEmptyString = false,
|
|
106
|
-
convert,
|
|
107
|
-
keepState = false,
|
|
108
|
-
children,
|
|
109
|
-
}: Props = $props();
|
|
110
|
-
|
|
111
|
-
const ctx = getFormContext();
|
|
112
|
-
if (!ctx) throw new Error('<Form.Field> must be used inside <Form>');
|
|
113
|
-
const { form, getFormState } = ctx;
|
|
114
|
-
|
|
115
|
-
const loc = useLocale();
|
|
116
|
-
|
|
117
|
-
const id = useId('cd-field');
|
|
118
|
-
const errorId = `${id}-error`;
|
|
119
|
-
const warningId = `${id}-warning`;
|
|
120
|
-
const extraId = `${id}-extra`;
|
|
121
|
-
|
|
122
|
-
// Register the field in the core registry (a plain Map, not Svelte-reactive),
|
|
123
|
-
// so this never feeds back into a render-read. Cleanup unregisters.
|
|
124
|
-
$effect(() => {
|
|
125
|
-
const effectiveRules = required ? [{ required: true } as Rule, ...rules] : rules;
|
|
126
|
-
const config: {
|
|
127
|
-
rules: Rule[];
|
|
128
|
-
label?: string;
|
|
129
|
-
initialValue?: unknown;
|
|
130
|
-
dependencies?: string[];
|
|
131
|
-
trigger?: ValidateTrigger | ValidateTrigger[];
|
|
132
|
-
transform?: (value: unknown, values: Record<string, unknown>) => unknown;
|
|
133
|
-
} = {
|
|
134
|
-
rules: effectiveRules,
|
|
135
|
-
};
|
|
136
|
-
if (label !== undefined) config.label = label;
|
|
137
|
-
if (initValue !== undefined) config.initialValue = initValue;
|
|
138
|
-
if (dependencies !== undefined) config.dependencies = dependencies;
|
|
139
|
-
if (trigger !== undefined) config.trigger = trigger;
|
|
140
|
-
if (transform !== undefined) config.transform = transform;
|
|
141
|
-
const unregister = form.registerField(field, config);
|
|
142
|
-
// spec §2 L26: a `mount` trigger validates once right after registration.
|
|
143
|
-
// Imperative one-shot (not a render read) so it cannot loop.
|
|
144
|
-
if (form.getFieldTrigger(field).includes('mount')) void form.validateField(field);
|
|
145
|
-
// keepState: when false (default), unregister clears field state on destroy.
|
|
146
|
-
// When true, we skip the cleanup so state persists for future mounts.
|
|
147
|
-
return keepState ? () => { /* preserve state — do not unregister */ } : unregister;
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
// Read-only slices derived from the bridged form state (render-safe getters).
|
|
151
|
-
const value = $derived(getFormState().values[field]);
|
|
152
|
-
const error = $derived(getFormState().errors[field]);
|
|
153
|
-
const warning = $derived(getFormState().warnings[field]);
|
|
154
|
-
const validating = $derived(getFormState().validating[field] === true);
|
|
155
|
-
const touched = $derived(getFormState().touched[field]);
|
|
156
|
-
|
|
157
|
-
// `validateStatus` is a controlled display override (spec §4.2 L81): it forces
|
|
158
|
-
// the visual status without touching the internal validation engine (red line
|
|
159
|
-
// #1 — never written back). When set, it wins over the computed status.
|
|
160
|
-
const forcedError = $derived(validateStatus === 'error');
|
|
161
|
-
const forcedWarning = $derived(validateStatus === 'warning');
|
|
162
|
-
const showError = $derived(forcedError || (error !== undefined && error !== ''));
|
|
163
|
-
// a warning only surfaces when there is no blocking error to show
|
|
164
|
-
const showWarning = $derived(
|
|
165
|
-
!showError && (forcedWarning || (warning !== undefined && warning !== '')),
|
|
166
|
-
);
|
|
167
|
-
const status = $derived<FieldStatus>(showError ? 'error' : showWarning ? 'warning' : 'default');
|
|
168
|
-
|
|
169
|
-
const showRequiredMark = $derived(ctx.getRequiredMark() && required);
|
|
170
|
-
const showExtra = $derived(
|
|
171
|
-
!showError && !showWarning && extraText !== undefined && extraText !== '',
|
|
172
|
-
);
|
|
173
|
-
const validatingText = $derived(loc().t('Form.validating'));
|
|
174
|
-
|
|
175
|
-
// resolved validation triggers for this field (own override → form default).
|
|
176
|
-
// Plain getters off the core registry (a non-reactive Map), read inside event
|
|
177
|
-
// handlers only — never during render, so no effect loop.
|
|
178
|
-
function triggers(): ValidateTrigger[] {
|
|
179
|
-
return form.getFieldTrigger(field);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
function handleChange(v: unknown) {
|
|
183
|
-
// allowEmptyString: treat empty string as undefined unless explicitly allowed.
|
|
184
|
-
// This normalizes '' to undefined for required validation / collection.
|
|
185
|
-
const coerced = !allowEmptyString && v === '' ? undefined : v;
|
|
186
|
-
// convert: field-level value transform (applied before storing into formState).
|
|
187
|
-
const stored = convert !== undefined ? convert(coerced) : coerced;
|
|
188
|
-
const tr = triggers();
|
|
189
|
-
// Validate on change when 'change' is an active trigger AND the field is
|
|
190
|
-
// already "active": after a blur (touched) OR while an error is showing (so
|
|
191
|
-
// typing clears a submit error). Controls like Input have no blur hook to
|
|
192
|
-
// set `touched`, so the "showing error" path keeps submit errors clearable.
|
|
193
|
-
const active = touched === true || (error !== undefined && error !== '');
|
|
194
|
-
const validate = tr.includes('change') && active;
|
|
195
|
-
form.setFieldValue(field, stored, { validate });
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
function handleBlur() {
|
|
199
|
-
form.setFieldTouched(field);
|
|
200
|
-
// only validate on blur when 'blur' is an active trigger for this field.
|
|
201
|
-
if (triggers().includes('blur')) void form.validateField(field);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
const describedBy = $derived(
|
|
205
|
-
// noStyle renders no status/extra elements, so there is nothing to point at
|
|
206
|
-
noStyle
|
|
207
|
-
? undefined
|
|
208
|
-
: showError
|
|
209
|
-
? errorId
|
|
210
|
-
: showWarning
|
|
211
|
-
? warningId
|
|
212
|
-
: showExtra
|
|
213
|
-
? extraId
|
|
214
|
-
: undefined,
|
|
215
|
-
);
|
|
216
|
-
|
|
217
|
-
const labelWidth = $derived(ctx.getLabelWidth());
|
|
218
|
-
const labelPosition = $derived(ctx.getLabelPosition());
|
|
219
|
-
const labelAlign = $derived(ctx.getLabelAlign());
|
|
220
|
-
const showValidateIcon = $derived(ctx.getShowValidateIcon());
|
|
221
|
-
const extraTextPosition = $derived(ctx.getExtraTextPosition?.() ?? 'bottom');
|
|
222
|
-
// label style: fixed width in `left` mode + text-align from labelAlign (§4 L60)
|
|
223
|
-
const labelStyle = $derived(
|
|
224
|
-
[
|
|
225
|
-
labelPosition === 'left' && labelWidth !== undefined
|
|
226
|
-
? `inline-size:${typeof labelWidth === 'number' ? `${labelWidth}px` : labelWidth}`
|
|
227
|
-
: undefined,
|
|
228
|
-
`text-align:${labelAlign}`,
|
|
229
|
-
]
|
|
230
|
-
.filter(Boolean)
|
|
231
|
-
.join(';'),
|
|
232
|
-
);
|
|
233
|
-
|
|
234
|
-
// inset:label 浮入控件,聚焦或有值时上浮变小(floating label)
|
|
235
|
-
const isInset = $derived(labelPosition === 'inset');
|
|
236
|
-
let focused = $state(false);
|
|
237
|
-
const hasValue = $derived(value !== undefined && value !== null && value !== '');
|
|
238
|
-
const labelFloated = $derived(focused || hasValue);
|
|
239
|
-
|
|
240
|
-
const cls = $derived(
|
|
241
|
-
[
|
|
242
|
-
'cd-form-field',
|
|
243
|
-
`cd-form-field--label-${labelPosition}`,
|
|
244
|
-
`cd-form-field--${status}`,
|
|
245
|
-
isInset && labelFloated && 'cd-form-field--floated',
|
|
246
|
-
]
|
|
247
|
-
.filter(Boolean)
|
|
248
|
-
.join(' '),
|
|
249
|
-
);
|
|
250
|
-
|
|
251
|
-
// `span` (spec §4.2 L86): occupy N columns of a grid parent (e.g. Form.Section).
|
|
252
|
-
// Pure inline `grid-column` — inert when the parent isn't a grid.
|
|
253
|
-
const wrapStyle = $derived(span !== undefined ? `grid-column:span ${span}` : undefined);
|
|
254
|
-
</script>
|
|
255
|
-
|
|
256
|
-
{#if noStyle}
|
|
257
|
-
<!--
|
|
258
|
-
noStyle (spec §4.2 L85 / §190): register & collect only, render no layout
|
|
259
|
-
chrome. The control snippet is still rendered so it can bind to the field;
|
|
260
|
-
label / status text / wrapper DOM are skipped. `validateStatus`/error still
|
|
261
|
-
flow into `status` so a custom control can style itself.
|
|
262
|
-
-->
|
|
263
|
-
{@render children?.({
|
|
264
|
-
value,
|
|
265
|
-
[valuePropName]: value,
|
|
266
|
-
onChange: handleChange,
|
|
267
|
-
onBlur: handleBlur,
|
|
268
|
-
status,
|
|
269
|
-
id,
|
|
270
|
-
describedBy,
|
|
271
|
-
disabled: ctx.getDisabled(),
|
|
272
|
-
required,
|
|
273
|
-
})}
|
|
274
|
-
{:else}
|
|
275
|
-
<div class={cls} data-field={field} style={wrapStyle}>
|
|
276
|
-
{#if label !== undefined && !isInset}
|
|
277
|
-
<label
|
|
278
|
-
class="cd-form-field__label cd-form-field__label--align-{labelAlign}"
|
|
279
|
-
for={id}
|
|
280
|
-
style={labelStyle}
|
|
281
|
-
>
|
|
282
|
-
{#if showRequiredMark}<span aria-hidden="true" class="cd-form-field__required">*</span>{/if}
|
|
283
|
-
<span class="cd-form-field__label-text">{label}{ctx.getColon() ? ':' : ''}</span>
|
|
284
|
-
</label>
|
|
285
|
-
{/if}
|
|
286
|
-
|
|
287
|
-
<!-- inset 时 label 浮入控件容器内;focusin/focusout 驱动上浮 (红线 #3 命令式 DOM 事件) -->
|
|
288
|
-
<!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
|
|
289
|
-
<div
|
|
290
|
-
class="cd-form-field__control"
|
|
291
|
-
aria-describedby={describedBy}
|
|
292
|
-
onfocusin={isInset ? () => (focused = true) : undefined}
|
|
293
|
-
onfocusout={isInset ? () => (focused = false) : undefined}
|
|
294
|
-
>
|
|
295
|
-
{#if label !== undefined && isInset}
|
|
296
|
-
<label class="cd-form-field__inset-label" for={id}>
|
|
297
|
-
{#if showRequiredMark}<span aria-hidden="true" class="cd-form-field__required">*</span>{/if}
|
|
298
|
-
<span class="cd-form-field__label-text">{label}</span>
|
|
299
|
-
</label>
|
|
300
|
-
{/if}
|
|
301
|
-
|
|
302
|
-
{@render children?.({
|
|
303
|
-
value,
|
|
304
|
-
// alias keyed by valuePropName (e.g. `checked`); for the default 'value'
|
|
305
|
-
// this is the same key and a no-op spread. Pure object construction —
|
|
306
|
-
// no write-back, satisfies red line #1/#2.
|
|
307
|
-
[valuePropName]: value,
|
|
308
|
-
onChange: handleChange,
|
|
309
|
-
onBlur: handleBlur,
|
|
310
|
-
status,
|
|
311
|
-
id,
|
|
312
|
-
describedBy,
|
|
313
|
-
disabled: ctx.getDisabled(),
|
|
314
|
-
required,
|
|
315
|
-
})}
|
|
316
|
-
|
|
317
|
-
{#if validating}
|
|
318
|
-
<div class="cd-form-field__validating" aria-live="polite">
|
|
319
|
-
<span class="cd-form-field__spinner" aria-hidden="true"></span>
|
|
320
|
-
<span>{validatingText}</span>
|
|
321
|
-
</div>
|
|
322
|
-
{/if}
|
|
323
|
-
|
|
324
|
-
{#if showError}
|
|
325
|
-
<div id={errorId} role="alert" class="cd-form-field__error">
|
|
326
|
-
{#if showValidateIcon}
|
|
327
|
-
<svg
|
|
328
|
-
class="cd-form-field__status-icon"
|
|
329
|
-
viewBox="0 0 16 16"
|
|
330
|
-
width="14"
|
|
331
|
-
height="14"
|
|
332
|
-
aria-hidden="true"
|
|
333
|
-
focusable="false"
|
|
334
|
-
>
|
|
335
|
-
<path
|
|
336
|
-
fill="currentColor"
|
|
337
|
-
d="M8 1a7 7 0 1 0 0 14A7 7 0 0 0 8 1Zm-.75 3.5h1.5v5h-1.5v-5ZM8 12.25a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"
|
|
338
|
-
/>
|
|
339
|
-
</svg>
|
|
340
|
-
{/if}
|
|
341
|
-
<span>{error}</span>
|
|
342
|
-
</div>
|
|
343
|
-
{:else if showWarning}
|
|
344
|
-
<div id={warningId} class="cd-form-field__warning">
|
|
345
|
-
{#if showValidateIcon}
|
|
346
|
-
<svg
|
|
347
|
-
class="cd-form-field__status-icon"
|
|
348
|
-
viewBox="0 0 16 16"
|
|
349
|
-
width="14"
|
|
350
|
-
height="14"
|
|
351
|
-
aria-hidden="true"
|
|
352
|
-
focusable="false"
|
|
353
|
-
>
|
|
354
|
-
<path
|
|
355
|
-
fill="currentColor"
|
|
356
|
-
d="M7.13 1.7a1 1 0 0 1 1.74 0l6.1 10.8A1 1 0 0 1 14.1 14H1.9a1 1 0 0 1-.87-1.5l6.1-10.8ZM7.25 6h1.5v4h-1.5V6ZM8 12.4a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"
|
|
357
|
-
/>
|
|
358
|
-
</svg>
|
|
359
|
-
{/if}
|
|
360
|
-
<span>{warning}</span>
|
|
361
|
-
</div>
|
|
362
|
-
{:else if showExtra}
|
|
363
|
-
<div id={extraId} class="cd-form-field__extra" class:cd-form-field__extra--middle={extraTextPosition === 'middle'} class:cd-form-field__extra--bottom={extraTextPosition === 'bottom'}>{extraText}</div>
|
|
364
|
-
{/if}
|
|
365
|
-
</div>
|
|
366
|
-
</div>
|
|
367
|
-
{/if}
|
|
368
|
-
|
|
369
|
-
<style>
|
|
370
|
-
.cd-form-field {
|
|
371
|
-
display: flex;
|
|
372
|
-
gap: var(--cd-form-label-gap, var(--cd-spacing-2));
|
|
373
|
-
}
|
|
374
|
-
.cd-form-field--label-top {
|
|
375
|
-
flex-direction: column;
|
|
376
|
-
}
|
|
377
|
-
.cd-form-field--label-left {
|
|
378
|
-
flex-direction: row;
|
|
379
|
-
align-items: flex-start;
|
|
380
|
-
}
|
|
381
|
-
.cd-form-field__label {
|
|
382
|
-
display: inline-flex;
|
|
383
|
-
align-items: center;
|
|
384
|
-
gap: var(--cd-spacing-1);
|
|
385
|
-
color: var(--cd-form-label-color, var(--cd-color-text-1));
|
|
386
|
-
}
|
|
387
|
-
/* labelAlign (§4 L60): justify the label's inline content within its box */
|
|
388
|
-
.cd-form-field__label--align-left {
|
|
389
|
-
justify-content: flex-start;
|
|
390
|
-
}
|
|
391
|
-
.cd-form-field__label--align-right {
|
|
392
|
-
justify-content: flex-end;
|
|
393
|
-
}
|
|
394
|
-
.cd-form-field--label-left .cd-form-field__label {
|
|
395
|
-
padding-block-start: var(--cd-spacing-1);
|
|
396
|
-
}
|
|
397
|
-
.cd-form-field__required {
|
|
398
|
-
color: var(--cd-form-required-color, var(--cd-color-danger, #e54848));
|
|
399
|
-
}
|
|
400
|
-
.cd-form-field__control {
|
|
401
|
-
display: flex;
|
|
402
|
-
flex: 1;
|
|
403
|
-
flex-direction: column;
|
|
404
|
-
gap: var(--cd-spacing-1);
|
|
405
|
-
min-inline-size: 0;
|
|
406
|
-
}
|
|
407
|
-
/* inset floating label */
|
|
408
|
-
.cd-form-field--label-inset {
|
|
409
|
-
flex-direction: column;
|
|
410
|
-
}
|
|
411
|
-
.cd-form-field--label-inset .cd-form-field__control {
|
|
412
|
-
position: relative;
|
|
413
|
-
padding-block-start: var(--cd-spacing-3);
|
|
414
|
-
}
|
|
415
|
-
.cd-form-field__inset-label {
|
|
416
|
-
position: absolute;
|
|
417
|
-
inset-block-start: 50%;
|
|
418
|
-
inset-inline-start: var(--cd-input-padding-x, var(--cd-spacing-3));
|
|
419
|
-
transform: translateY(-50%);
|
|
420
|
-
display: inline-flex;
|
|
421
|
-
align-items: center;
|
|
422
|
-
gap: var(--cd-spacing-1);
|
|
423
|
-
color: var(--cd-input-color-placeholder, var(--cd-color-text-3));
|
|
424
|
-
pointer-events: none;
|
|
425
|
-
transition:
|
|
426
|
-
transform var(--cd-motion-duration-fast) var(--cd-motion-ease-standard),
|
|
427
|
-
font-size var(--cd-motion-duration-fast) var(--cd-motion-ease-standard),
|
|
428
|
-
color var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
|
|
429
|
-
}
|
|
430
|
-
.cd-form-field--floated .cd-form-field__inset-label {
|
|
431
|
-
transform: translateY(calc(-50% - 0.85rem)) scale(0.85);
|
|
432
|
-
color: var(--cd-form-label-color, var(--cd-color-text-1));
|
|
433
|
-
}
|
|
434
|
-
@media (prefers-reduced-motion: reduce) {
|
|
435
|
-
.cd-form-field__inset-label {
|
|
436
|
-
transition: none;
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
.cd-form-field__error {
|
|
440
|
-
display: inline-flex;
|
|
441
|
-
align-items: center;
|
|
442
|
-
gap: var(--cd-spacing-1);
|
|
443
|
-
color: var(--cd-form-error-color, var(--cd-color-danger, #e54848));
|
|
444
|
-
font-size: var(--cd-form-error-font-size, var(--cd-font-size-1, 0.75rem));
|
|
445
|
-
}
|
|
446
|
-
.cd-form-field__warning {
|
|
447
|
-
display: inline-flex;
|
|
448
|
-
align-items: center;
|
|
449
|
-
gap: var(--cd-spacing-1);
|
|
450
|
-
color: var(--cd-form-warning-color, var(--cd-color-warning, #fa8c16));
|
|
451
|
-
font-size: var(--cd-form-error-font-size, var(--cd-font-size-1, 0.75rem));
|
|
452
|
-
}
|
|
453
|
-
.cd-form-field__status-icon {
|
|
454
|
-
flex: 0 0 auto;
|
|
455
|
-
}
|
|
456
|
-
.cd-form-field__extra {
|
|
457
|
-
color: var(--cd-form-extra-color, var(--cd-color-text-3));
|
|
458
|
-
font-size: var(--cd-form-error-font-size, var(--cd-font-size-1, 0.75rem));
|
|
459
|
-
}
|
|
460
|
-
.cd-form-field__extra--middle {
|
|
461
|
-
order: -1;
|
|
462
|
-
}
|
|
463
|
-
.cd-form-field__extra--bottom {
|
|
464
|
-
order: 0;
|
|
465
|
-
}
|
|
466
|
-
/* async-validation indicator (red line #3: pure-CSS spin, no JS geometry) */
|
|
467
|
-
.cd-form-field__validating {
|
|
468
|
-
display: inline-flex;
|
|
469
|
-
align-items: center;
|
|
470
|
-
gap: var(--cd-spacing-1);
|
|
471
|
-
color: var(--cd-form-extra-color, var(--cd-color-text-3));
|
|
472
|
-
font-size: var(--cd-form-error-font-size, var(--cd-font-size-1, 0.75rem));
|
|
473
|
-
}
|
|
474
|
-
.cd-form-field__spinner {
|
|
475
|
-
inline-size: 0.85em;
|
|
476
|
-
block-size: 0.85em;
|
|
477
|
-
border: 2px solid var(--cd-color-fill-2, rgba(0, 0, 0, 0.1));
|
|
478
|
-
border-block-start-color: var(--cd-color-primary, #3370ff);
|
|
479
|
-
border-radius: 50%;
|
|
480
|
-
animation: cd-form-field-spin 0.7s linear infinite;
|
|
481
|
-
}
|
|
482
|
-
@keyframes cd-form-field-spin {
|
|
483
|
-
to {
|
|
484
|
-
transform: rotate(360deg);
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
@media (prefers-reduced-motion: reduce) {
|
|
488
|
-
.cd-form-field__spinner {
|
|
489
|
-
animation-duration: 1.8s;
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
</style>
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
<!--
|
|
2
|
-
FieldArray (Form.List) — 动态字段数组:增/删/重排子表单项。
|
|
3
|
-
本地维护行标识 items({ key }[]),children snippet 渲染每行;
|
|
4
|
-
子字段用拼接键 `${name}.${item.key}.${sub}` 走普通 Field(core 扁平键天然支持校验)。
|
|
5
|
-
remove 时清理该行所有子字段值(setFieldValue undefined),避免提交残留。
|
|
6
|
-
不依赖 core 的嵌套路径支持,自包含(红线 #1:不写回 props,状态本地 $state)。
|
|
7
|
-
-->
|
|
8
|
-
<script lang="ts">
|
|
9
|
-
import { untrack, type Snippet } from 'svelte';
|
|
10
|
-
import { useId } from '@chenzy-design/core';
|
|
11
|
-
import { getFormContext } from './context.js';
|
|
12
|
-
|
|
13
|
-
interface ArrayItem {
|
|
14
|
-
/** 稳定行标识,用于拼接子字段名与 each key */
|
|
15
|
-
key: string;
|
|
16
|
-
}
|
|
17
|
-
interface ChildArgs {
|
|
18
|
-
items: ArrayItem[];
|
|
19
|
-
/** 拼接某行某子字段的完整 field 名 */
|
|
20
|
-
name: (item: ArrayItem, sub: string) => string;
|
|
21
|
-
add: () => void;
|
|
22
|
-
remove: (item: ArrayItem) => void;
|
|
23
|
-
move: (from: number, to: number) => void;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
interface Props {
|
|
27
|
-
/** 数组字段名(子字段前缀) */
|
|
28
|
-
name: string;
|
|
29
|
-
/** 初始行数 */
|
|
30
|
-
initialCount?: number;
|
|
31
|
-
children?: Snippet<[ChildArgs]>;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
let { name, initialCount = 0, children }: Props = $props();
|
|
35
|
-
|
|
36
|
-
const ctx = getFormContext();
|
|
37
|
-
if (!ctx) throw new Error('<Form.List> must be used inside <Form>');
|
|
38
|
-
const { form } = ctx;
|
|
39
|
-
|
|
40
|
-
function newKey(): string {
|
|
41
|
-
return useId(`${name}-row`);
|
|
42
|
-
}
|
|
43
|
-
function getInitial(): ArrayItem[] {
|
|
44
|
-
return Array.from({ length: Math.max(0, initialCount) }, () => ({ key: newKey() }));
|
|
45
|
-
}
|
|
46
|
-
let items = $state<ArrayItem[]>(untrack(getInitial));
|
|
47
|
-
|
|
48
|
-
function add() {
|
|
49
|
-
items = [...items, { key: newKey() }];
|
|
50
|
-
}
|
|
51
|
-
function remove(item: ArrayItem) {
|
|
52
|
-
// 清理该行所有子字段值(前缀匹配),避免提交残留
|
|
53
|
-
const prefix = `${name}.${item.key}.`;
|
|
54
|
-
const values = form.getState().values;
|
|
55
|
-
for (const k of Object.keys(values)) {
|
|
56
|
-
if (k.startsWith(prefix)) form.setFieldValue(k, undefined);
|
|
57
|
-
}
|
|
58
|
-
items = items.filter((it) => it.key !== item.key);
|
|
59
|
-
}
|
|
60
|
-
function move(from: number, to: number) {
|
|
61
|
-
if (from === to || from < 0 || to < 0 || from >= items.length || to >= items.length) return;
|
|
62
|
-
const next = [...items];
|
|
63
|
-
const [moved] = next.splice(from, 1);
|
|
64
|
-
next.splice(to, 0, moved as ArrayItem);
|
|
65
|
-
items = next;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function fieldName(item: ArrayItem, sub: string): string {
|
|
69
|
-
return `${name}.${item.key}.${sub}`;
|
|
70
|
-
}
|
|
71
|
-
</script>
|
|
72
|
-
|
|
73
|
-
<div class="cd-field-array">
|
|
74
|
-
{@render children?.({ items, name: fieldName, add, remove, move })}
|
|
75
|
-
</div>
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
// Form a11y:经 FormA11yFixture 组合 Form.Input + Form.Field 自定义控件。
|
|
2
|
-
// 验证 label 关联(<label for> ↔ 控件 id)、required → aria-required、
|
|
3
|
-
// validateStatus=error → 控件 aria-invalid、extraText/error → aria-describedby。
|
|
4
|
-
// 仅静态 ARIA + axe(不测校验交互)。
|
|
5
|
-
import { describe, it, expect } from 'vitest';
|
|
6
|
-
import { renderWithLocale, expectNoAxeViolations } from '../test-utils/a11y.js';
|
|
7
|
-
import FormA11yFixture from './FormA11yFixture.svelte';
|
|
8
|
-
|
|
9
|
-
describe('Form a11y', () => {
|
|
10
|
-
it('Form.Input:label 经 for/id 关联到 input,required → aria-required', async () => {
|
|
11
|
-
const { container } = renderWithLocale(FormA11yFixture, {});
|
|
12
|
-
const nameField = container.querySelector('[data-field="name"]');
|
|
13
|
-
expect(nameField).not.toBeNull();
|
|
14
|
-
const label = nameField?.querySelector('label');
|
|
15
|
-
const input = nameField?.querySelector('input');
|
|
16
|
-
expect(label).not.toBeNull();
|
|
17
|
-
expect(input).not.toBeNull();
|
|
18
|
-
// label[for] 精确指向控件 id(WAI-ARIA 首选关联)。
|
|
19
|
-
expect(label?.getAttribute('for')).toBe(input?.getAttribute('id'));
|
|
20
|
-
expect(input?.getAttribute('aria-required')).toBe('true');
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('Form.Field 自定义控件:validateStatus=error → aria-invalid,describedBy 关联存在的元素', async () => {
|
|
24
|
-
const { container } = renderWithLocale(FormA11yFixture, {});
|
|
25
|
-
const bioField = container.querySelector('[data-field="bio"]');
|
|
26
|
-
expect(bioField).not.toBeNull();
|
|
27
|
-
const textarea = bioField?.querySelector('textarea');
|
|
28
|
-
expect(textarea?.getAttribute('aria-invalid')).toBe('true');
|
|
29
|
-
// aria-describedby 指向实际存在的状态文本元素。
|
|
30
|
-
const describedBy = textarea?.getAttribute('aria-describedby');
|
|
31
|
-
expect(describedBy).toBeTruthy();
|
|
32
|
-
expect(container.querySelector(`#${describedBy}`)).not.toBeNull();
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
it('整个表单:无 axe violations', async () => {
|
|
36
|
-
const { container } = renderWithLocale(FormA11yFixture, {});
|
|
37
|
-
await expectNoAxeViolations(container);
|
|
38
|
-
});
|
|
39
|
-
});
|