@douyinfe/semi-ui 2.2.2 → 2.3.0-beta.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/_base/_story/a11y.jsx +6 -6
- package/_utils/hooks/usePrevFocus.ts +16 -0
- package/_utils/index.ts +4 -0
- package/anchor/_story/anchor.stories.js +1 -1
- package/anchor/index.tsx +5 -2
- package/anchor/link.tsx +29 -4
- package/autoComplete/index.tsx +28 -1
- package/avatar/_story/avatar.stories.js +4 -4
- package/avatar/avatarGroup.tsx +1 -1
- package/avatar/index.tsx +10 -4
- package/banner/index.tsx +2 -1
- package/breadcrumb/_story/breadcrumb.stories.js +22 -8
- package/breadcrumb/index.tsx +8 -1
- package/breadcrumb/item.tsx +1 -1
- package/button/Button.tsx +4 -0
- package/button/__test__/button.test.js +1 -1
- package/button/_story/button.stories.js +10 -10
- package/button/buttonGroup.tsx +4 -2
- package/button/splitButtonGroup.tsx +5 -2
- package/card/_story/card.stories.js +8 -1
- package/card/_story/card.stories.tsx +3 -0
- package/card/index.tsx +5 -2
- package/cascader/index.tsx +33 -5
- package/checkbox/_story/checkbox.stories.js +21 -14
- package/checkbox/checkbox.tsx +40 -5
- package/checkbox/checkboxGroup.tsx +30 -5
- package/checkbox/checkboxInner.tsx +25 -2
- package/collapse/index.tsx +2 -2
- package/collapse/item.tsx +15 -8
- package/collapsible/index.tsx +4 -2
- package/configProvider/_story/configProvider.stories.tsx +27 -0
- package/datePicker/datePicker.tsx +19 -0
- package/dist/css/semi.css +8 -3
- package/dist/css/semi.min.css +1 -1
- package/dist/umd/semi-ui.js +2470 -1242
- package/dist/umd/semi-ui.js.map +1 -1
- package/dist/umd/semi-ui.min.js +1 -1
- package/dist/umd/semi-ui.min.js.map +1 -1
- package/dropdown/dropdownItem.tsx +1 -1
- package/dropdown/dropdownMenu.tsx +1 -1
- package/empty/index.tsx +5 -5
- package/form/_story/FormApi/formApiDemo.jsx +3 -2
- package/form/_story/Validate/validateDemo.jsx +1 -1
- package/form/_story/demo.jsx +12 -3
- package/form/_story/form.stories.js +0 -7
- package/form/baseForm.tsx +2 -0
- package/form/errorMessage.tsx +13 -2
- package/form/hoc/withField.tsx +37 -8
- package/form/index.tsx +0 -2
- package/form/interface.ts +2 -0
- package/form/label.tsx +4 -2
- package/input/index.tsx +49 -4
- package/input/inputGroup.tsx +9 -4
- package/input/textarea.tsx +25 -6
- package/inputNumber/index.tsx +28 -1
- package/layout/Sider.tsx +6 -2
- package/layout/index.tsx +4 -3
- package/lib/cjs/_utils/hooks/usePrevFocus.d.ts +2 -0
- package/lib/cjs/_utils/hooks/usePrevFocus.js +30 -0
- package/lib/cjs/_utils/index.d.ts +1 -0
- package/lib/cjs/_utils/index.js +6 -1
- package/lib/cjs/anchor/index.d.ts +2 -0
- package/lib/cjs/anchor/index.js +6 -1
- package/lib/cjs/anchor/link.d.ts +4 -1
- package/lib/cjs/anchor/link.js +39 -5
- package/lib/cjs/autoComplete/index.d.ts +17 -0
- package/lib/cjs/autoComplete/index.js +21 -2
- package/lib/cjs/avatar/avatarGroup.js +2 -1
- package/lib/cjs/avatar/index.d.ts +4 -3
- package/lib/cjs/avatar/index.js +20 -11
- package/lib/cjs/banner/index.js +4 -2
- package/lib/cjs/breadcrumb/index.d.ts +3 -0
- package/lib/cjs/breadcrumb/index.js +10 -4
- package/lib/cjs/breadcrumb/item.js +2 -2
- package/lib/cjs/button/Button.d.ts +2 -0
- package/lib/cjs/button/Button.js +4 -2
- package/lib/cjs/button/buttonGroup.d.ts +3 -0
- package/lib/cjs/button/buttonGroup.js +8 -4
- package/lib/cjs/button/index.d.ts +1 -0
- package/lib/cjs/button/splitButtonGroup.d.ts +3 -0
- package/lib/cjs/button/splitButtonGroup.js +5 -2
- package/lib/cjs/card/index.d.ts +3 -0
- package/lib/cjs/card/index.js +3 -1
- package/lib/cjs/cascader/index.d.ts +14 -0
- package/lib/cjs/cascader/index.js +35 -7
- package/lib/cjs/checkbox/checkbox.d.ts +21 -1
- package/lib/cjs/checkbox/checkbox.js +51 -17
- package/lib/cjs/checkbox/checkboxGroup.d.ts +13 -1
- package/lib/cjs/checkbox/checkboxGroup.js +16 -3
- package/lib/cjs/checkbox/checkboxInner.d.ts +15 -0
- package/lib/cjs/checkbox/checkboxInner.js +20 -3
- package/lib/cjs/collapse/index.js +2 -1
- package/lib/cjs/collapse/item.d.ts +2 -1
- package/lib/cjs/collapse/item.js +17 -3
- package/lib/cjs/collapsible/index.d.ts +1 -0
- package/lib/cjs/collapsible/index.js +4 -2
- package/lib/cjs/datePicker/datePicker.d.ts +12 -0
- package/lib/cjs/datePicker/datePicker.js +14 -1
- package/lib/cjs/dropdown/dropdownItem.js +3 -1
- package/lib/cjs/dropdown/dropdownMenu.js +4 -1
- package/lib/cjs/empty/index.js +2 -1
- package/lib/cjs/form/baseForm.d.ts +9 -0
- package/lib/cjs/form/baseForm.js +3 -1
- package/lib/cjs/form/errorMessage.d.ts +4 -0
- package/lib/cjs/form/errorMessage.js +21 -3
- package/lib/cjs/form/field.d.ts +7 -0
- package/lib/cjs/form/hoc/withField.js +49 -16
- package/lib/cjs/form/index.d.ts +0 -1
- package/lib/cjs/form/interface.d.ts +2 -0
- package/lib/cjs/form/label.d.ts +2 -0
- package/lib/cjs/form/label.js +5 -2
- package/lib/cjs/input/index.d.ts +16 -0
- package/lib/cjs/input/index.js +51 -15
- package/lib/cjs/input/inputGroup.d.ts +2 -1
- package/lib/cjs/input/inputGroup.js +11 -1
- package/lib/cjs/input/textarea.js +12 -1
- package/lib/cjs/inputNumber/index.d.ts +8 -0
- package/lib/cjs/inputNumber/index.js +32 -2
- package/lib/cjs/layout/Sider.d.ts +4 -0
- package/lib/cjs/layout/Sider.js +4 -1
- package/lib/cjs/layout/index.js +2 -0
- package/lib/cjs/list/item.js +0 -1
- package/lib/cjs/modal/Modal.js +2 -0
- package/lib/cjs/modal/ModalContent.d.ts +3 -1
- package/lib/cjs/modal/ModalContent.js +47 -5
- package/lib/cjs/navigation/Item.d.ts +4 -2
- package/lib/cjs/navigation/Item.js +25 -5
- package/lib/cjs/navigation/SubNav.d.ts +4 -2
- package/lib/cjs/navigation/SubNav.js +8 -1
- package/lib/cjs/navigation/index.js +2 -0
- package/lib/cjs/notification/notice.d.ts +1 -1
- package/lib/cjs/notification/notice.js +32 -22
- package/lib/cjs/pagination/index.js +16 -6
- package/lib/cjs/popover/index.js +7 -3
- package/lib/cjs/progress/index.d.ts +8 -0
- package/lib/cjs/progress/index.js +42 -9
- package/lib/cjs/radio/radio.d.ts +6 -1
- package/lib/cjs/radio/radio.js +17 -5
- package/lib/cjs/radio/radioGroup.d.ts +16 -1
- package/lib/cjs/radio/radioGroup.js +18 -3
- package/lib/cjs/radio/radioInner.d.ts +6 -1
- package/lib/cjs/radio/radioInner.js +11 -3
- package/lib/cjs/rating/index.d.ts +14 -0
- package/lib/cjs/rating/index.js +14 -3
- package/lib/cjs/rating/item.d.ts +2 -0
- package/lib/cjs/rating/item.js +6 -1
- package/lib/cjs/select/index.d.ts +16 -0
- package/lib/cjs/select/index.js +65 -19
- package/lib/cjs/select/option.js +28 -22
- package/lib/cjs/sideSheet/SideSheetContent.d.ts +1 -0
- package/lib/cjs/sideSheet/SideSheetContent.js +12 -5
- package/lib/cjs/sideSheet/index.d.ts +1 -0
- package/lib/cjs/sideSheet/index.js +2 -1
- package/lib/cjs/slider/index.d.ts +2 -1
- package/lib/cjs/slider/index.js +64 -17
- package/lib/cjs/spin/icon.js +2 -4
- package/lib/cjs/steps/basicStep.d.ts +3 -0
- package/lib/cjs/steps/basicStep.js +23 -25
- package/lib/cjs/steps/basicSteps.d.ts +1 -0
- package/lib/cjs/steps/basicSteps.js +2 -1
- package/lib/cjs/steps/fillStep.d.ts +3 -0
- package/lib/cjs/steps/fillStep.js +19 -4
- package/lib/cjs/steps/fillSteps.d.ts +1 -0
- package/lib/cjs/steps/fillSteps.js +2 -1
- package/lib/cjs/steps/navStep.d.ts +3 -0
- package/lib/cjs/steps/navStep.js +22 -25
- package/lib/cjs/steps/navSteps.d.ts +1 -0
- package/lib/cjs/steps/navSteps.js +2 -1
- package/lib/cjs/switch/index.d.ts +12 -0
- package/lib/cjs/switch/index.js +19 -4
- package/lib/cjs/table/Body/BaseRow.js +35 -3
- package/lib/cjs/table/Body/index.js +9 -1
- package/lib/cjs/table/ColumnFilter.js +4 -0
- package/lib/cjs/table/ColumnSelection.d.ts +3 -0
- package/lib/cjs/table/ColumnSelection.js +6 -2
- package/lib/cjs/table/ColumnSorter.js +19 -3
- package/lib/cjs/table/CustomExpandIcon.js +7 -1
- package/lib/cjs/table/Table.d.ts +2 -0
- package/lib/cjs/table/Table.js +31 -15
- package/lib/cjs/table/TableCell.d.ts +2 -0
- package/lib/cjs/table/TableCell.js +6 -2
- package/lib/cjs/table/TableHeaderRow.js +8 -2
- package/lib/cjs/tabs/TabBar.js +11 -3
- package/lib/cjs/tabs/TabPane.js +3 -1
- package/lib/cjs/tabs/index.js +0 -1
- package/lib/cjs/tagInput/index.d.ts +4 -1
- package/lib/cjs/tagInput/index.js +29 -3
- package/lib/cjs/timePicker/TimePicker.d.ts +12 -0
- package/lib/cjs/timePicker/TimePicker.js +9 -1
- package/lib/cjs/timePicker/index.d.ts +6 -0
- package/lib/cjs/timeline/index.d.ts +1 -1
- package/lib/cjs/timeline/index.js +1 -0
- package/lib/cjs/timeline/item.js +4 -2
- package/lib/cjs/toast/toast.js +2 -0
- package/lib/cjs/tooltip/TriangleArrow.js +1 -0
- package/lib/cjs/tooltip/TriangleArrowVertical.js +1 -0
- package/lib/cjs/tooltip/index.d.ts +16 -12
- package/lib/cjs/tooltip/index.js +55 -39
- package/lib/cjs/transfer/index.js +32 -14
- package/lib/cjs/tree/index.d.ts +1 -0
- package/lib/cjs/tree/index.js +15 -6
- package/lib/cjs/tree/treeNode.d.ts +12 -4
- package/lib/cjs/tree/treeNode.js +44 -4
- package/lib/cjs/treeSelect/index.d.ts +16 -0
- package/lib/cjs/treeSelect/index.js +60 -12
- package/lib/cjs/typography/base.js +18 -7
- package/lib/cjs/typography/copyable.js +6 -1
- package/lib/cjs/upload/fileCard.js +23 -4
- package/lib/cjs/upload/index.js +19 -4
- package/lib/es/_utils/hooks/usePrevFocus.d.ts +2 -0
- package/lib/es/_utils/hooks/usePrevFocus.js +15 -0
- package/lib/es/_utils/index.d.ts +1 -0
- package/lib/es/_utils/index.js +4 -1
- package/lib/es/anchor/index.d.ts +2 -0
- package/lib/es/anchor/index.js +6 -1
- package/lib/es/anchor/link.d.ts +4 -1
- package/lib/es/anchor/link.js +38 -5
- package/lib/es/autoComplete/index.d.ts +17 -0
- package/lib/es/autoComplete/index.js +21 -2
- package/lib/es/avatar/avatarGroup.js +2 -1
- package/lib/es/avatar/index.d.ts +4 -3
- package/lib/es/avatar/index.js +20 -11
- package/lib/es/banner/index.js +4 -2
- package/lib/es/breadcrumb/index.d.ts +3 -0
- package/lib/es/breadcrumb/index.js +10 -4
- package/lib/es/breadcrumb/item.js +2 -2
- package/lib/es/button/Button.d.ts +2 -0
- package/lib/es/button/Button.js +4 -2
- package/lib/es/button/buttonGroup.d.ts +3 -0
- package/lib/es/button/buttonGroup.js +8 -4
- package/lib/es/button/index.d.ts +1 -0
- package/lib/es/button/splitButtonGroup.d.ts +3 -0
- package/lib/es/button/splitButtonGroup.js +5 -2
- package/lib/es/card/index.d.ts +3 -0
- package/lib/es/card/index.js +3 -1
- package/lib/es/cascader/index.d.ts +14 -0
- package/lib/es/cascader/index.js +35 -7
- package/lib/es/checkbox/checkbox.d.ts +21 -1
- package/lib/es/checkbox/checkbox.js +50 -17
- package/lib/es/checkbox/checkboxGroup.d.ts +13 -1
- package/lib/es/checkbox/checkboxGroup.js +18 -5
- package/lib/es/checkbox/checkboxInner.d.ts +15 -0
- package/lib/es/checkbox/checkboxInner.js +20 -3
- package/lib/es/collapse/index.js +2 -1
- package/lib/es/collapse/item.d.ts +2 -1
- package/lib/es/collapse/item.js +16 -3
- package/lib/es/collapsible/index.d.ts +1 -0
- package/lib/es/collapsible/index.js +4 -2
- package/lib/es/datePicker/datePicker.d.ts +12 -0
- package/lib/es/datePicker/datePicker.js +14 -1
- package/lib/es/dropdown/dropdownItem.js +3 -1
- package/lib/es/dropdown/dropdownMenu.js +4 -1
- package/lib/es/empty/index.js +2 -1
- package/lib/es/form/baseForm.d.ts +9 -0
- package/lib/es/form/baseForm.js +3 -1
- package/lib/es/form/errorMessage.d.ts +4 -0
- package/lib/es/form/errorMessage.js +21 -3
- package/lib/es/form/field.d.ts +7 -0
- package/lib/es/form/hoc/withField.js +48 -15
- package/lib/es/form/index.d.ts +0 -1
- package/lib/es/form/index.js +0 -1
- package/lib/es/form/interface.d.ts +2 -0
- package/lib/es/form/label.d.ts +2 -0
- package/lib/es/form/label.js +5 -2
- package/lib/es/input/index.d.ts +16 -0
- package/lib/es/input/index.js +51 -15
- package/lib/es/input/inputGroup.d.ts +2 -1
- package/lib/es/input/inputGroup.js +11 -1
- package/lib/es/input/textarea.js +12 -1
- package/lib/es/inputNumber/index.d.ts +8 -0
- package/lib/es/inputNumber/index.js +33 -2
- package/lib/es/layout/Sider.d.ts +4 -0
- package/lib/es/layout/Sider.js +4 -1
- package/lib/es/layout/index.js +2 -0
- package/lib/es/list/item.js +0 -1
- package/lib/es/modal/Modal.js +2 -0
- package/lib/es/modal/ModalContent.d.ts +3 -1
- package/lib/es/modal/ModalContent.js +46 -5
- package/lib/es/navigation/Item.d.ts +4 -2
- package/lib/es/navigation/Item.js +25 -5
- package/lib/es/navigation/SubNav.d.ts +4 -2
- package/lib/es/navigation/SubNav.js +8 -1
- package/lib/es/navigation/index.js +2 -0
- package/lib/es/notification/notice.d.ts +1 -1
- package/lib/es/notification/notice.js +33 -24
- package/lib/es/pagination/index.js +16 -6
- package/lib/es/popover/index.js +7 -3
- package/lib/es/progress/index.d.ts +8 -0
- package/lib/es/progress/index.js +42 -9
- package/lib/es/radio/radio.d.ts +6 -1
- package/lib/es/radio/radio.js +16 -5
- package/lib/es/radio/radioGroup.d.ts +16 -1
- package/lib/es/radio/radioGroup.js +18 -3
- package/lib/es/radio/radioInner.d.ts +6 -1
- package/lib/es/radio/radioInner.js +11 -3
- package/lib/es/rating/index.d.ts +14 -0
- package/lib/es/rating/index.js +14 -3
- package/lib/es/rating/item.d.ts +2 -0
- package/lib/es/rating/item.js +6 -1
- package/lib/es/select/index.d.ts +16 -0
- package/lib/es/select/index.js +63 -17
- package/lib/es/select/option.js +28 -22
- package/lib/es/sideSheet/SideSheetContent.d.ts +1 -0
- package/lib/es/sideSheet/SideSheetContent.js +12 -5
- package/lib/es/sideSheet/index.d.ts +1 -0
- package/lib/es/sideSheet/index.js +2 -1
- package/lib/es/slider/index.d.ts +2 -1
- package/lib/es/slider/index.js +63 -16
- package/lib/es/spin/icon.js +2 -4
- package/lib/es/steps/basicStep.d.ts +3 -0
- package/lib/es/steps/basicStep.js +23 -23
- package/lib/es/steps/basicSteps.d.ts +1 -0
- package/lib/es/steps/basicSteps.js +2 -1
- package/lib/es/steps/fillStep.d.ts +3 -0
- package/lib/es/steps/fillStep.js +19 -4
- package/lib/es/steps/fillSteps.d.ts +1 -0
- package/lib/es/steps/fillSteps.js +2 -1
- package/lib/es/steps/navStep.d.ts +3 -0
- package/lib/es/steps/navStep.js +22 -23
- package/lib/es/steps/navSteps.d.ts +1 -0
- package/lib/es/steps/navSteps.js +2 -1
- package/lib/es/switch/index.d.ts +12 -0
- package/lib/es/switch/index.js +19 -4
- package/lib/es/table/Body/BaseRow.js +35 -3
- package/lib/es/table/Body/index.js +9 -2
- package/lib/es/table/ColumnFilter.js +4 -0
- package/lib/es/table/ColumnSelection.d.ts +3 -0
- package/lib/es/table/ColumnSelection.js +6 -2
- package/lib/es/table/ColumnSorter.js +17 -3
- package/lib/es/table/CustomExpandIcon.js +6 -1
- package/lib/es/table/Table.d.ts +2 -0
- package/lib/es/table/Table.js +31 -15
- package/lib/es/table/TableCell.d.ts +2 -0
- package/lib/es/table/TableCell.js +6 -2
- package/lib/es/table/TableHeaderRow.js +8 -2
- package/lib/es/tabs/TabBar.js +11 -3
- package/lib/es/tabs/TabPane.js +3 -1
- package/lib/es/tabs/index.js +0 -1
- package/lib/es/tagInput/index.d.ts +4 -1
- package/lib/es/tagInput/index.js +29 -3
- package/lib/es/timePicker/TimePicker.d.ts +12 -0
- package/lib/es/timePicker/TimePicker.js +9 -1
- package/lib/es/timePicker/index.d.ts +6 -0
- package/lib/es/timeline/index.d.ts +1 -1
- package/lib/es/timeline/index.js +1 -0
- package/lib/es/timeline/item.js +4 -2
- package/lib/es/toast/toast.js +2 -0
- package/lib/es/tooltip/TriangleArrow.js +1 -0
- package/lib/es/tooltip/TriangleArrowVertical.js +1 -0
- package/lib/es/tooltip/index.d.ts +16 -12
- package/lib/es/tooltip/index.js +53 -39
- package/lib/es/transfer/index.js +32 -14
- package/lib/es/tree/index.d.ts +1 -0
- package/lib/es/tree/index.js +15 -6
- package/lib/es/tree/treeNode.d.ts +12 -4
- package/lib/es/tree/treeNode.js +44 -4
- package/lib/es/treeSelect/index.d.ts +16 -0
- package/lib/es/treeSelect/index.js +57 -10
- package/lib/es/typography/base.js +17 -7
- package/lib/es/typography/copyable.js +5 -1
- package/lib/es/upload/fileCard.js +23 -4
- package/lib/es/upload/index.js +19 -4
- package/list/item.tsx +0 -1
- package/modal/Modal.tsx +2 -0
- package/modal/ModalContent.tsx +35 -5
- package/navigation/Item.tsx +15 -0
- package/navigation/SubNav.tsx +13 -1
- package/navigation/index.tsx +1 -1
- package/notification/notice.tsx +19 -14
- package/package.json +8 -8
- package/pagination/index.tsx +9 -5
- package/popover/index.tsx +5 -0
- package/progress/_story/progress.stories.js +18 -18
- package/progress/index.tsx +58 -20
- package/radio/radio.tsx +12 -2
- package/radio/radioGroup.tsx +29 -3
- package/radio/radioInner.tsx +10 -1
- package/rating/index.tsx +19 -2
- package/rating/item.tsx +6 -0
- package/select/__test__/select.test.js +45 -0
- package/select/_story/select.stories.js +29 -0
- package/select/index.tsx +52 -4
- package/select/option.tsx +3 -0
- package/sideSheet/SideSheetContent.tsx +13 -9
- package/sideSheet/index.tsx +3 -2
- package/slider/__test__/slider.test.js +9 -0
- package/slider/_story/slider.stories.js +1 -1
- package/slider/index.tsx +44 -7
- package/spin/icon.tsx +3 -3
- package/steps/basicStep.tsx +15 -4
- package/steps/basicSteps.tsx +3 -2
- package/steps/fillStep.tsx +27 -12
- package/steps/fillSteps.tsx +2 -0
- package/steps/navStep.tsx +15 -4
- package/steps/navSteps.tsx +3 -2
- package/switch/_story/switch.stories.js +20 -19
- package/switch/_story/switch.stories.tsx +13 -13
- package/switch/index.tsx +23 -5
- package/table/Body/BaseRow.tsx +25 -1
- package/table/Body/index.tsx +7 -2
- package/table/ColumnFilter.tsx +7 -1
- package/table/ColumnSelection.tsx +4 -1
- package/table/ColumnSorter.tsx +18 -1
- package/table/CustomExpandIcon.tsx +5 -0
- package/table/Table.tsx +26 -13
- package/table/TableCell.tsx +11 -1
- package/table/TableHeaderRow.tsx +16 -2
- package/table/__test__/table.test.js +46 -0
- package/tabs/TabBar.tsx +8 -5
- package/tabs/TabPane.tsx +3 -1
- package/tabs/index.tsx +0 -1
- package/tagInput/__test__/tagInput.test.js +46 -0
- package/tagInput/_story/tagInput.stories.js +2 -2
- package/tagInput/index.tsx +31 -8
- package/timePicker/TimePicker.tsx +14 -1
- package/timeline/_story/timeline.stories.js +1 -1
- package/timeline/index.tsx +2 -2
- package/timeline/item.tsx +2 -1
- package/toast/toast.tsx +2 -0
- package/tooltip/TriangleArrow.tsx +1 -1
- package/tooltip/TriangleArrowVertical.tsx +1 -1
- package/tooltip/_story/tooltip.stories.js +562 -514
- package/tooltip/index.tsx +50 -33
- package/transfer/index.tsx +29 -25
- package/tree/_story/tree.stories.js +3 -3
- package/tree/index.tsx +10 -2
- package/tree/treeNode.tsx +46 -10
- package/treeSelect/__test__/treeMultiple.test.js +5 -0
- package/treeSelect/_story/treeSelect.stories.js +12 -0
- package/treeSelect/index.tsx +58 -7
- package/typography/base.tsx +7 -1
- package/typography/copyable.tsx +10 -1
- package/upload/fileCard.tsx +13 -15
- package/upload/index.tsx +10 -6
package/radio/radioGroup.tsx
CHANGED
|
@@ -36,6 +36,13 @@ export type RadioGroupProps = {
|
|
|
36
36
|
type?: RadioType;
|
|
37
37
|
buttonSize?: RadioGroupButtonSize;
|
|
38
38
|
prefixCls?: string;
|
|
39
|
+
'aria-label'?: React.AriaAttributes['aria-label'];
|
|
40
|
+
'aria-describedby'?: React.AriaAttributes['aria-describedby'];
|
|
41
|
+
'aria-errormessage'?: React.AriaAttributes['aria-errormessage'];
|
|
42
|
+
'aria-invalid'?: React.AriaAttributes['aria-invalid'];
|
|
43
|
+
'aria-labelledby'?: React.AriaAttributes['aria-labelledby'];
|
|
44
|
+
'aria-required'?: React.AriaAttributes['aria-required'];
|
|
45
|
+
id?: string;
|
|
39
46
|
};
|
|
40
47
|
|
|
41
48
|
export interface RadioGroupState {
|
|
@@ -57,7 +64,14 @@ class RadioGroup extends BaseComponent<RadioGroupProps, RadioGroupState> {
|
|
|
57
64
|
className: PropTypes.string,
|
|
58
65
|
style: PropTypes.object,
|
|
59
66
|
direction: PropTypes.oneOf(strings.DIRECTION_SET),
|
|
60
|
-
mode: PropTypes.oneOf(strings.MODE)
|
|
67
|
+
mode: PropTypes.oneOf(strings.MODE),
|
|
68
|
+
'aria-label': PropTypes.string,
|
|
69
|
+
'aria-describedby': PropTypes.string,
|
|
70
|
+
'aria-errormessage': PropTypes.string,
|
|
71
|
+
'aria-invalid': PropTypes.bool,
|
|
72
|
+
'aria-labelledby': PropTypes.string,
|
|
73
|
+
'aria-required': PropTypes.bool,
|
|
74
|
+
id: PropTypes.string,
|
|
61
75
|
};
|
|
62
76
|
|
|
63
77
|
static defaultProps: Partial<RadioGroupProps> = {
|
|
@@ -69,6 +83,7 @@ class RadioGroup extends BaseComponent<RadioGroupProps, RadioGroupState> {
|
|
|
69
83
|
buttonSize: 'middle'
|
|
70
84
|
};
|
|
71
85
|
|
|
86
|
+
foundation: RadioGroupFoundation;
|
|
72
87
|
constructor(props: RadioGroupProps) {
|
|
73
88
|
super(props);
|
|
74
89
|
this.state = {
|
|
@@ -121,7 +136,8 @@ class RadioGroup extends BaseComponent<RadioGroupProps, RadioGroupState> {
|
|
|
121
136
|
style,
|
|
122
137
|
direction,
|
|
123
138
|
type,
|
|
124
|
-
buttonSize
|
|
139
|
+
buttonSize,
|
|
140
|
+
id,
|
|
125
141
|
} = this.props;
|
|
126
142
|
|
|
127
143
|
const isButtonRadio = type === strings.TYPE_BUTTON;
|
|
@@ -177,7 +193,17 @@ class RadioGroup extends BaseComponent<RadioGroupProps, RadioGroupState> {
|
|
|
177
193
|
}
|
|
178
194
|
|
|
179
195
|
return (
|
|
180
|
-
<div
|
|
196
|
+
<div
|
|
197
|
+
className={prefixClsDisplay}
|
|
198
|
+
style={style}
|
|
199
|
+
id={id}
|
|
200
|
+
aria-label={this.props['aria-label']}
|
|
201
|
+
aria-invalid={this.props['aria-invalid']}
|
|
202
|
+
aria-errormessage={this.props['aria-errormessage']}
|
|
203
|
+
aria-labelledby={this.props['aria-labelledby']}
|
|
204
|
+
aria-describedby={this.props['aria-describedby']}
|
|
205
|
+
aria-required={this.props['aria-required']}
|
|
206
|
+
>
|
|
181
207
|
<Context.Provider
|
|
182
208
|
value={{
|
|
183
209
|
radioGroup: {
|
package/radio/radioInner.tsx
CHANGED
|
@@ -20,6 +20,9 @@ export interface RadioInnerProps extends BaseProps {
|
|
|
20
20
|
prefixCls?: string;
|
|
21
21
|
ref?: React.MutableRefObject<RadioInner> | ((instance: RadioInner) => void);
|
|
22
22
|
isPureCardRadioGroup?: boolean;
|
|
23
|
+
addonId?: string;
|
|
24
|
+
extraId?: string;
|
|
25
|
+
'aria-label'?: React.AriaAttributes['aria-label'];
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
interface RadioInnerState {
|
|
@@ -35,6 +38,7 @@ class RadioInner extends BaseComponent<RadioInnerProps, RadioInnerState> {
|
|
|
35
38
|
isButtonRadio: PropTypes.bool,
|
|
36
39
|
onChange: PropTypes.func,
|
|
37
40
|
mode: PropTypes.oneOf(['advanced', '']),
|
|
41
|
+
'aria-label': PropTypes.string,
|
|
38
42
|
};
|
|
39
43
|
|
|
40
44
|
static defaultProps = {
|
|
@@ -44,6 +48,7 @@ class RadioInner extends BaseComponent<RadioInnerProps, RadioInnerState> {
|
|
|
44
48
|
|
|
45
49
|
|
|
46
50
|
inputEntity!: HTMLInputElement;
|
|
51
|
+
foundation: RadioInnerFoundation;
|
|
47
52
|
constructor(props: RadioInnerProps) {
|
|
48
53
|
super(props);
|
|
49
54
|
this.state = {
|
|
@@ -92,7 +97,7 @@ class RadioInner extends BaseComponent<RadioInnerProps, RadioInnerState> {
|
|
|
92
97
|
}
|
|
93
98
|
|
|
94
99
|
render() {
|
|
95
|
-
const { disabled, mode, autoFocus, name, isButtonRadio, isPureCardRadioGroup } = this.props;
|
|
100
|
+
const { disabled, mode, autoFocus, name, isButtonRadio, isPureCardRadioGroup, addonId, extraId, 'aria-label': ariaLabel } = this.props;
|
|
96
101
|
const { checked } = this.state;
|
|
97
102
|
|
|
98
103
|
const prefix = this.props.prefixCls || css.PREFIX;
|
|
@@ -114,12 +119,16 @@ class RadioInner extends BaseComponent<RadioInnerProps, RadioInnerState> {
|
|
|
114
119
|
ref={ref => {
|
|
115
120
|
this.inputEntity = ref;
|
|
116
121
|
}}
|
|
122
|
+
// eslint-disable-next-line jsx-a11y/no-autofocus
|
|
117
123
|
autoFocus={autoFocus}
|
|
118
124
|
type={mode === 'advanced' ? 'checkbox' : 'radio'}
|
|
119
125
|
checked={Boolean(checked)}
|
|
120
126
|
disabled={disabled}
|
|
121
127
|
onChange={this.onChange}
|
|
122
128
|
name={name}
|
|
129
|
+
aria-label={ariaLabel}
|
|
130
|
+
aria-labelledby={addonId}
|
|
131
|
+
aria-describedby={extraId}
|
|
123
132
|
/>
|
|
124
133
|
<span className={inner}>{checked ? <IconRadio /> : null}</span>
|
|
125
134
|
</span>
|
package/rating/index.tsx
CHANGED
|
@@ -14,6 +14,12 @@ import '@douyinfe/semi-foundation/rating/rating.scss';
|
|
|
14
14
|
|
|
15
15
|
export { RatingItemProps } from './item';
|
|
16
16
|
export interface RatingProps {
|
|
17
|
+
'aria-describedby'?: string;
|
|
18
|
+
'aria-errormessage'?: string;
|
|
19
|
+
'aria-invalid'?: boolean;
|
|
20
|
+
'aria-label'?: string;
|
|
21
|
+
'aria-labelledby'?: string;
|
|
22
|
+
'aria-required'?: boolean;
|
|
17
23
|
disabled?: boolean;
|
|
18
24
|
value?: number;
|
|
19
25
|
defaultValue?: number;
|
|
@@ -34,6 +40,7 @@ export interface RatingProps {
|
|
|
34
40
|
autoFocus?: boolean;
|
|
35
41
|
size?: 'small' | 'default' | number;
|
|
36
42
|
tooltips?: string[];
|
|
43
|
+
id?: string;
|
|
37
44
|
}
|
|
38
45
|
|
|
39
46
|
export interface RatingState {
|
|
@@ -46,6 +53,12 @@ export interface RatingState {
|
|
|
46
53
|
export default class Rating extends BaseComponent<RatingProps, RatingState> {
|
|
47
54
|
static contextType = ConfigContext;
|
|
48
55
|
static propTypes = {
|
|
56
|
+
'aria-describedby': PropTypes.string,
|
|
57
|
+
'aria-errormessage': PropTypes.string,
|
|
58
|
+
'aria-invalid': PropTypes.bool,
|
|
59
|
+
'aria-label': PropTypes.string,
|
|
60
|
+
'aria-labelledby': PropTypes.string,
|
|
61
|
+
'aria-required': PropTypes.bool,
|
|
49
62
|
disabled: PropTypes.bool,
|
|
50
63
|
value: PropTypes.number,
|
|
51
64
|
defaultValue: PropTypes.number,
|
|
@@ -65,6 +78,7 @@ export default class Rating extends BaseComponent<RatingProps, RatingState> {
|
|
|
65
78
|
autoFocus: PropTypes.bool,
|
|
66
79
|
size: PropTypes.oneOfType([PropTypes.oneOf(strings.SIZE_SET), PropTypes.number]),
|
|
67
80
|
tooltips: PropTypes.arrayOf(PropTypes.string),
|
|
81
|
+
id: PropTypes.string,
|
|
68
82
|
};
|
|
69
83
|
|
|
70
84
|
static defaultProps = {
|
|
@@ -225,7 +239,7 @@ export default class Rating extends BaseComponent<RatingProps, RatingState> {
|
|
|
225
239
|
};
|
|
226
240
|
|
|
227
241
|
render() {
|
|
228
|
-
const { count, allowHalf, style, prefixCls, disabled, className, character, tabIndex, size, tooltips } =
|
|
242
|
+
const { count, allowHalf, style, prefixCls, disabled, className, character, tabIndex, size, tooltips, id } =
|
|
229
243
|
this.props;
|
|
230
244
|
const { value, hoverValue, focused } = this.state;
|
|
231
245
|
const itemList = [...Array(count).keys()].map(ind => {
|
|
@@ -266,6 +280,9 @@ export default class Rating extends BaseComponent<RatingProps, RatingState> {
|
|
|
266
280
|
);
|
|
267
281
|
return (
|
|
268
282
|
<ul
|
|
283
|
+
aria-label={this.props['aria-label']}
|
|
284
|
+
aria-labelledby={this.props['aria-labelledby']}
|
|
285
|
+
aria-describedby={this.props['aria-describedby']}
|
|
269
286
|
className={listCls}
|
|
270
287
|
style={style}
|
|
271
288
|
onMouseLeave={disabled ? null : this.onMouseLeave}
|
|
@@ -274,7 +291,7 @@ export default class Rating extends BaseComponent<RatingProps, RatingState> {
|
|
|
274
291
|
onBlur={disabled ? null : this.onBlur}
|
|
275
292
|
onKeyDown={disabled ? null : this.onKeyDown}
|
|
276
293
|
ref={this.saveRate as any}
|
|
277
|
-
|
|
294
|
+
id={id}
|
|
278
295
|
>
|
|
279
296
|
{itemList}
|
|
280
297
|
</ul>
|
package/rating/item.tsx
CHANGED
|
@@ -20,6 +20,7 @@ export interface RatingItemProps {
|
|
|
20
20
|
disabled: boolean;
|
|
21
21
|
count: number;
|
|
22
22
|
size: number | ArrayElement<typeof strings.SIZE_SET>;
|
|
23
|
+
'aria-describedby'?: React.AriaAttributes['aria-describedby'];
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
export default class Item extends PureComponent<RatingItemProps> {
|
|
@@ -38,6 +39,7 @@ export default class Item extends PureComponent<RatingItemProps> {
|
|
|
38
39
|
PropTypes.oneOf(strings.SIZE_SET),
|
|
39
40
|
PropTypes.number,
|
|
40
41
|
]),
|
|
42
|
+
'aria-describedby': PropTypes.string,
|
|
41
43
|
};
|
|
42
44
|
|
|
43
45
|
onHover: React.MouseEventHandler = e => {
|
|
@@ -100,6 +102,10 @@ export default class Item extends PureComponent<RatingItemProps> {
|
|
|
100
102
|
aria-checked={value > index ? 'true' : 'false'}
|
|
101
103
|
aria-posinset={index + 1}
|
|
102
104
|
aria-setsize={count}
|
|
105
|
+
aria-disabled={disabled}
|
|
106
|
+
aria-label={`Rating ${index + (isHalf ? 0.5 : 1)}`}
|
|
107
|
+
aria-labelledby={this.props['aria-describedby']} // screen reader will read labelledby instead of describedby
|
|
108
|
+
aria-describedby={this.props['aria-describedby']}
|
|
103
109
|
tabIndex={0}
|
|
104
110
|
className={`${prefixCls}-wrapper`}
|
|
105
111
|
>
|
|
@@ -1239,6 +1239,51 @@ describe('Select', () => {
|
|
|
1239
1239
|
expect(spyOnChange.calledWith(['hotsoon']));
|
|
1240
1240
|
});
|
|
1241
1241
|
|
|
1242
|
+
it('autoClearSearchValue', () => {
|
|
1243
|
+
// default usage
|
|
1244
|
+
let optionList = Array.from({ length: 100 }, (v, i) => ({ label: `option-${i}`, value: i }));
|
|
1245
|
+
|
|
1246
|
+
let props = {
|
|
1247
|
+
multiple: true,
|
|
1248
|
+
optionList: optionList,
|
|
1249
|
+
defaultOpen: true,
|
|
1250
|
+
filter: true,
|
|
1251
|
+
};
|
|
1252
|
+
let select = getSelect(props);
|
|
1253
|
+
select.find(`.${BASE_CLASS_PREFIX}-select`).simulate('click', {});
|
|
1254
|
+
let keyword = 'option';
|
|
1255
|
+
let event = { target: { value: keyword } };
|
|
1256
|
+
select.find('input').simulate('change', event);
|
|
1257
|
+
|
|
1258
|
+
let options = select.find(`.${BASE_CLASS_PREFIX}-select-option-list`).children();
|
|
1259
|
+
const nativeEvent = { nativeEvent: { stopImmediatePropagation: noop } };
|
|
1260
|
+
options.at(0).simulate('click', nativeEvent);
|
|
1261
|
+
let inputValue = select.find('input').getDOMNode().value;
|
|
1262
|
+
expect(inputValue).toEqual('');
|
|
1263
|
+
});
|
|
1264
|
+
|
|
1265
|
+
it('autoClearSearchValue = false', () => {
|
|
1266
|
+
let optionList = Array.from({ length: 100 }, (v, i) => ({ label: `option-${i}`, value: i }));
|
|
1267
|
+
|
|
1268
|
+
let props = {
|
|
1269
|
+
multiple: true,
|
|
1270
|
+
optionList: optionList,
|
|
1271
|
+
defaultOpen: true,
|
|
1272
|
+
autoClearSearchValue: false,
|
|
1273
|
+
filter: true,
|
|
1274
|
+
};
|
|
1275
|
+
let select = getSelect(props);
|
|
1276
|
+
select.find(`.${BASE_CLASS_PREFIX}-select`).simulate('click', {});
|
|
1277
|
+
let keyword = 'option';
|
|
1278
|
+
let event = { target: { value: keyword } };
|
|
1279
|
+
select.find('input').simulate('change', event);
|
|
1280
|
+
|
|
1281
|
+
let options = select.find(`.${BASE_CLASS_PREFIX}-select-option-list`).children();
|
|
1282
|
+
const nativeEvent = { nativeEvent: { stopImmediatePropagation: noop } };
|
|
1283
|
+
options.at(0).simulate('click', nativeEvent);
|
|
1284
|
+
let inputValue = select.find('input').getDOMNode().value;
|
|
1285
|
+
expect(inputValue).toEqual(keyword);
|
|
1286
|
+
});
|
|
1242
1287
|
// TODO ref selectAll \deselectAll when onChangeWithObject is true
|
|
1243
1288
|
// TODO when loading is true, do not response any keyborard event
|
|
1244
1289
|
// TODO can't remove tag when option is diabled
|
|
@@ -2875,3 +2875,32 @@ SelectInputPropsDemo.story = {
|
|
|
2875
2875
|
name: 'inputProps',
|
|
2876
2876
|
};
|
|
2877
2877
|
|
|
2878
|
+
|
|
2879
|
+
export const AutoClearSearchValue = () => {
|
|
2880
|
+
const [val, setVal] = useState(['semi1']);
|
|
2881
|
+
const optionList = [
|
|
2882
|
+
{ label: 'semi1', value: 'semi1' },
|
|
2883
|
+
{ label: 'semi2', value: 'semi2' },
|
|
2884
|
+
{ label: 'semi3', value: 'semi3' },
|
|
2885
|
+
{ label: 'semi4', value: 'semi4' },
|
|
2886
|
+
{ label: 'semi5', value: 'semi5' },
|
|
2887
|
+
{ label: 'semi6', value: 'semi6' },
|
|
2888
|
+
];
|
|
2889
|
+
|
|
2890
|
+
return (
|
|
2891
|
+
<>
|
|
2892
|
+
<h4>Controlled mode + multiple</h4>
|
|
2893
|
+
<Select style={{ width: 400 }} multiple optionList={optionList} filter value={val} onChange={value => setVal(value)} autoClearSearchValue={false}></Select>
|
|
2894
|
+
<br />
|
|
2895
|
+
<br />
|
|
2896
|
+
<h4>Uncontrolled mode + multiple</h4>
|
|
2897
|
+
<Select style={{ width: 400 }} multiple optionList={optionList} filter autoClearSearchValue={false}></Select>
|
|
2898
|
+
<h4>Uncontrolled mode + multiple + defaultValue</h4>
|
|
2899
|
+
<Select style={{ width: 400 }} multiple optionList={optionList} filter defaultValue={['semi2']} autoClearSearchValue={false}></Select>
|
|
2900
|
+
</>
|
|
2901
|
+
)
|
|
2902
|
+
}
|
|
2903
|
+
|
|
2904
|
+
SelectInputPropsDemo.story = {
|
|
2905
|
+
name: 'AutoClearSearchValue',
|
|
2906
|
+
};
|
package/select/index.tsx
CHANGED
|
@@ -85,8 +85,14 @@ export type RenderMultipleSelectedItemFn = (optionNode: Record<string, any>, mul
|
|
|
85
85
|
export type RenderSelectedItemFn = RenderSingleSelectedItemFn | RenderMultipleSelectedItemFn;
|
|
86
86
|
|
|
87
87
|
export type SelectProps = {
|
|
88
|
+
'aria-describedby'?: React.AriaAttributes['aria-describedby'];
|
|
89
|
+
'aria-errormessage'?: React.AriaAttributes['aria-errormessage'];
|
|
90
|
+
'aria-invalid'?: React.AriaAttributes['aria-invalid'];
|
|
91
|
+
'aria-labelledby'?: React.AriaAttributes['aria-labelledby'];
|
|
92
|
+
'aria-required'?: React.AriaAttributes['aria-required'];
|
|
88
93
|
id?: string;
|
|
89
94
|
autoFocus?: boolean;
|
|
95
|
+
autoClearSearchValue?: boolean;
|
|
90
96
|
arrowIcon?: React.ReactNode;
|
|
91
97
|
defaultValue?: string | number | any[] | Record<string, any>;
|
|
92
98
|
value?: string | number | any[] | Record<string, any>;
|
|
@@ -122,6 +128,7 @@ export type SelectProps = {
|
|
|
122
128
|
suffix?: React.ReactNode;
|
|
123
129
|
prefix?: React.ReactNode;
|
|
124
130
|
insetLabel?: React.ReactNode;
|
|
131
|
+
insetLabelId?: string;
|
|
125
132
|
inputProps?: Subtract<InputProps, ExcludeInputType>;
|
|
126
133
|
showClear?: boolean;
|
|
127
134
|
showArrow?: boolean;
|
|
@@ -180,7 +187,13 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
180
187
|
static OptGroup = OptionGroup;
|
|
181
188
|
|
|
182
189
|
static propTypes = {
|
|
190
|
+
'aria-describedby': PropTypes.string,
|
|
191
|
+
'aria-errormessage': PropTypes.string,
|
|
192
|
+
'aria-invalid': PropTypes.bool,
|
|
193
|
+
'aria-labelledby': PropTypes.string,
|
|
194
|
+
'aria-required': PropTypes.bool,
|
|
183
195
|
autoFocus: PropTypes.bool,
|
|
196
|
+
autoClearSearchValue: PropTypes.bool,
|
|
184
197
|
children: PropTypes.node,
|
|
185
198
|
defaultValue: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.array, PropTypes.object]),
|
|
186
199
|
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.array, PropTypes.object]),
|
|
@@ -227,6 +240,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
227
240
|
suffix: PropTypes.node,
|
|
228
241
|
prefix: PropTypes.node,
|
|
229
242
|
insetLabel: PropTypes.node,
|
|
243
|
+
insetLabelId: PropTypes.string,
|
|
230
244
|
showClear: PropTypes.bool,
|
|
231
245
|
showArrow: PropTypes.bool,
|
|
232
246
|
|
|
@@ -292,6 +306,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
292
306
|
showClear: false,
|
|
293
307
|
remote: false,
|
|
294
308
|
autoAdjustOverflow: true,
|
|
309
|
+
autoClearSearchValue: true,
|
|
295
310
|
arrowIcon: <IconChevronDown />
|
|
296
311
|
// Radio selection is different from the default renderSelectedItem for multiple selection, so it is not declared here
|
|
297
312
|
// renderSelectedItem: (optionNode) => optionNode.label,
|
|
@@ -335,6 +350,8 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
335
350
|
this.onMouseEnter = this.onMouseEnter.bind(this);
|
|
336
351
|
this.onMouseLeave = this.onMouseLeave.bind(this);
|
|
337
352
|
this.renderOption = this.renderOption.bind(this);
|
|
353
|
+
this.onKeyPress = this.onKeyPress.bind(this);
|
|
354
|
+
this.onClearBtnEnterPress = this.onClearBtnEnterPress.bind(this);
|
|
338
355
|
|
|
339
356
|
this.foundation = new SelectFoundation(this.adapter);
|
|
340
357
|
|
|
@@ -638,6 +655,10 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
638
655
|
this.foundation.handleClearClick(e as any);
|
|
639
656
|
}
|
|
640
657
|
|
|
658
|
+
onClearBtnEnterPress(e: React.KeyboardEvent) {
|
|
659
|
+
this.foundation.handleClearBtnEnterPress(e as any);
|
|
660
|
+
}
|
|
661
|
+
|
|
641
662
|
renderEmpty() {
|
|
642
663
|
return <Option empty={true} emptyContent={this.props.emptyContent} />;
|
|
643
664
|
}
|
|
@@ -717,7 +738,8 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
717
738
|
const customCreateItem = renderCreateItem(option.value, isFocused);
|
|
718
739
|
|
|
719
740
|
return (
|
|
720
|
-
|
|
741
|
+
// eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/interactive-supports-focus
|
|
742
|
+
<div role="button" aria-label="Use the input box to create an optional item" onClick={e => this.onSelect(option, optionIndex, e)} key={new Date().valueOf()}>
|
|
721
743
|
{customCreateItem}
|
|
722
744
|
</div>
|
|
723
745
|
);
|
|
@@ -783,6 +805,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
783
805
|
innerBottomSlot,
|
|
784
806
|
loading,
|
|
785
807
|
virtualize,
|
|
808
|
+
multiple,
|
|
786
809
|
} = this.props;
|
|
787
810
|
|
|
788
811
|
// Do a filter first, instead of directly judging in forEach, so that the focusIndex can correspond to
|
|
@@ -808,6 +831,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
808
831
|
style={{ maxHeight: `${maxHeight}px` }}
|
|
809
832
|
className={optionListCls}
|
|
810
833
|
role="listbox"
|
|
834
|
+
aria-multiselectable={multiple}
|
|
811
835
|
onScroll={e => this.foundation.handleListScroll(e)}
|
|
812
836
|
>
|
|
813
837
|
{innerTopSlot}
|
|
@@ -935,6 +959,10 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
935
959
|
this.foundation.handleMouseLeave(e as any);
|
|
936
960
|
}
|
|
937
961
|
|
|
962
|
+
onKeyPress(e: React.KeyboardEvent) {
|
|
963
|
+
this.foundation.handleKeyPress(e as any);
|
|
964
|
+
}
|
|
965
|
+
|
|
938
966
|
/* Processing logic when popover visible changes */
|
|
939
967
|
handlePopoverVisibleChange(status) {
|
|
940
968
|
const { virtualize } = this.props;
|
|
@@ -974,7 +1002,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
974
1002
|
}
|
|
975
1003
|
|
|
976
1004
|
renderPrefix() {
|
|
977
|
-
const { prefix, insetLabel } = this.props;
|
|
1005
|
+
const { prefix, insetLabel, insetLabelId } = this.props;
|
|
978
1006
|
const labelNode = (prefix || insetLabel) as React.ReactElement<any, any>;
|
|
979
1007
|
|
|
980
1008
|
const prefixWrapperCls = cls({
|
|
@@ -984,7 +1012,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
984
1012
|
[`${prefixcls}-prefix-icon`]: isSemiIcon(labelNode),
|
|
985
1013
|
});
|
|
986
1014
|
|
|
987
|
-
return <div className={prefixWrapperCls}>{labelNode}</div>;
|
|
1015
|
+
return <div className={prefixWrapperCls} id={insetLabelId}>{labelNode}</div>;
|
|
988
1016
|
}
|
|
989
1017
|
|
|
990
1018
|
renderSelection() {
|
|
@@ -1005,6 +1033,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
1005
1033
|
triggerRender,
|
|
1006
1034
|
arrowIcon,
|
|
1007
1035
|
} = this.props;
|
|
1036
|
+
|
|
1008
1037
|
const { selections, isOpen, keyboardEventSet, inputValue, isHovering, isFocus } = this.state;
|
|
1009
1038
|
const useCustomTrigger = typeof triggerRender === 'function';
|
|
1010
1039
|
const filterable = Boolean(filter); // filter(boolean || function)
|
|
@@ -1060,7 +1089,14 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
1060
1089
|
</Fragment>,
|
|
1061
1090
|
<Fragment key="clearicon">
|
|
1062
1091
|
{showClear ? (
|
|
1063
|
-
<div
|
|
1092
|
+
<div
|
|
1093
|
+
role="button"
|
|
1094
|
+
aria-label="Clear selected value"
|
|
1095
|
+
tabIndex={0}
|
|
1096
|
+
className={cls(`${prefixcls}-clear`)}
|
|
1097
|
+
onClick={this.onClear}
|
|
1098
|
+
onKeyPress={this.onClearBtnEnterPress}
|
|
1099
|
+
>
|
|
1064
1100
|
<IconClear />
|
|
1065
1101
|
</div>
|
|
1066
1102
|
) : arrowContent}
|
|
@@ -1072,6 +1108,17 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
1072
1108
|
const tabIndex = disabled ? null : 0;
|
|
1073
1109
|
return (
|
|
1074
1110
|
<div
|
|
1111
|
+
role="combobox"
|
|
1112
|
+
aria-disabled={disabled}
|
|
1113
|
+
aria-expanded={isOpen}
|
|
1114
|
+
aria-controls={`${prefixcls}-${this.selectOptionListID}`}
|
|
1115
|
+
aria-haspopup="listbox"
|
|
1116
|
+
aria-label="select value"
|
|
1117
|
+
aria-invalid={this.props['aria-invalid']}
|
|
1118
|
+
aria-errormessage={this.props['aria-errormessage']}
|
|
1119
|
+
aria-labelledby={this.props['aria-labelledby']}
|
|
1120
|
+
aria-describedby={this.props['aria-describedby']}
|
|
1121
|
+
aria-required={this.props['aria-required']}
|
|
1075
1122
|
className={selectionCls}
|
|
1076
1123
|
ref={ref => ((this.triggerRef as any).current = ref)}
|
|
1077
1124
|
onClick={e => this.foundation.handleClick(e)}
|
|
@@ -1082,6 +1129,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
1082
1129
|
onMouseLeave={this.onMouseLeave}
|
|
1083
1130
|
// onFocus={e => this.foundation.handleTriggerFocus(e)}
|
|
1084
1131
|
onBlur={e => this.foundation.handleTriggerBlur(e as any)}
|
|
1132
|
+
onKeyPress={this.onKeyPress}
|
|
1085
1133
|
{...keyboardEventSet}
|
|
1086
1134
|
>
|
|
1087
1135
|
{inner}
|
package/select/option.tsx
CHANGED
|
@@ -134,6 +134,7 @@ class Option extends PureComponent<OptionProps> {
|
|
|
134
134
|
}
|
|
135
135
|
};
|
|
136
136
|
return (
|
|
137
|
+
// eslint-disable-next-line jsx-a11y/interactive-supports-focus,jsx-a11y/click-events-have-key-events
|
|
137
138
|
<div
|
|
138
139
|
className={optionClassName}
|
|
139
140
|
onClick={e => {
|
|
@@ -141,6 +142,8 @@ class Option extends PureComponent<OptionProps> {
|
|
|
141
142
|
}}
|
|
142
143
|
onMouseEnter={e => onMouseEnter && onMouseEnter(e)}
|
|
143
144
|
role="option"
|
|
145
|
+
aria-selected={selected ? "true" : "false"}
|
|
146
|
+
aria-disabled={disabled ? "true" : "false"}
|
|
144
147
|
style={style}
|
|
145
148
|
>
|
|
146
149
|
{showTick ? (
|
|
@@ -10,7 +10,7 @@ let uuid = 0;
|
|
|
10
10
|
const prefixCls = cssClasses.PREFIX;
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
export interface SideSheetContentProps{
|
|
13
|
+
export interface SideSheetContentProps {
|
|
14
14
|
onClose?: (e: React.MouseEvent) => void;
|
|
15
15
|
mask?: boolean;
|
|
16
16
|
maskStyle?: CSSProperties;
|
|
@@ -24,6 +24,7 @@ export interface SideSheetContentProps{
|
|
|
24
24
|
bodyStyle?: CSSProperties;
|
|
25
25
|
className: string;
|
|
26
26
|
footer?: React.ReactNode;
|
|
27
|
+
'aria-label'?: string;
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
export default class SideSheetContent extends React.PureComponent<SideSheetContentProps> {
|
|
@@ -66,6 +67,7 @@ export default class SideSheetContent extends React.PureComponent<SideSheetConte
|
|
|
66
67
|
if (mask) {
|
|
67
68
|
return (
|
|
68
69
|
<div
|
|
70
|
+
aria-hidden={true}
|
|
69
71
|
key="mask"
|
|
70
72
|
className={`${prefixCls}-mask`}
|
|
71
73
|
style={maskStyle}
|
|
@@ -85,7 +87,7 @@ export default class SideSheetContent extends React.PureComponent<SideSheetConte
|
|
|
85
87
|
let header, closer;
|
|
86
88
|
if (title) {
|
|
87
89
|
header = (
|
|
88
|
-
<div className={`${prefixCls}-title`}>
|
|
90
|
+
<div className={`${prefixCls}-title`} aria-label={'Sidesheet title'}>
|
|
89
91
|
{this.props.title}
|
|
90
92
|
</div>
|
|
91
93
|
);
|
|
@@ -97,14 +99,14 @@ export default class SideSheetContent extends React.PureComponent<SideSheetConte
|
|
|
97
99
|
key="close-btn"
|
|
98
100
|
onClick={this.close}
|
|
99
101
|
type="tertiary"
|
|
100
|
-
icon={<IconClose
|
|
102
|
+
icon={<IconClose/>}
|
|
101
103
|
theme="borderless"
|
|
102
104
|
size="small"
|
|
103
105
|
/>
|
|
104
106
|
);
|
|
105
107
|
}
|
|
106
108
|
return (
|
|
107
|
-
<div className={`${prefixCls}-header`} style={{ ...headerStyle }}>
|
|
109
|
+
<div className={`${prefixCls}-header`} role={'heading'} style={{ ...headerStyle }}>
|
|
108
110
|
{header}
|
|
109
111
|
{closer}
|
|
110
112
|
</div>
|
|
@@ -128,20 +130,20 @@ export default class SideSheetContent extends React.PureComponent<SideSheetConte
|
|
|
128
130
|
const dialogElement = (
|
|
129
131
|
<div
|
|
130
132
|
key="dialog-element"
|
|
131
|
-
role="
|
|
133
|
+
role="dialog"
|
|
132
134
|
tabIndex={-1}
|
|
133
135
|
className={`${prefixCls}-inner ${prefixCls}-inner-wrap`}
|
|
134
136
|
// onMouseDown={this.onDialogMouseDown}
|
|
135
137
|
style={{ ...props.style, ...style }}
|
|
136
138
|
// id={this.dialogId}
|
|
137
139
|
>
|
|
138
|
-
<div className={`${prefixCls}-content`}>
|
|
140
|
+
<div className={`${prefixCls}-content`} aria-label={`Sidesheet content`}>
|
|
139
141
|
{header}
|
|
140
|
-
<div className={`${prefixCls}-body`} style={props.bodyStyle}>
|
|
142
|
+
<div className={`${prefixCls}-body`} aria-label={`Sidesheet body`} style={props.bodyStyle}>
|
|
141
143
|
{props.children}
|
|
142
144
|
</div>
|
|
143
145
|
{props.footer ? (
|
|
144
|
-
<div className={`${prefixCls}-footer`}>
|
|
146
|
+
<div className={`${prefixCls}-footer`} aria-label={`Sidesheet footer`}>
|
|
145
147
|
{props.footer}
|
|
146
148
|
</div>
|
|
147
149
|
) : null}
|
|
@@ -165,7 +167,9 @@ export default class SideSheetContent extends React.PureComponent<SideSheetConte
|
|
|
165
167
|
wrapperStyle.width = width;
|
|
166
168
|
}
|
|
167
169
|
return (
|
|
168
|
-
<div className={wrapperCls}
|
|
170
|
+
<div className={wrapperCls}
|
|
171
|
+
style={wrapperStyle}
|
|
172
|
+
aria-label={this.props['aria-label']}>
|
|
169
173
|
{this.getMaskElement()}
|
|
170
174
|
{this.getDialogElement()}
|
|
171
175
|
</div>
|
package/sideSheet/index.tsx
CHANGED
|
@@ -23,7 +23,7 @@ const defaultHeight = strings.HEIGHT;
|
|
|
23
23
|
export { SideSheetContentProps } from './SideSheetContent';
|
|
24
24
|
export { SideSheetTransitionProps } from './SideSheetTransition';
|
|
25
25
|
|
|
26
|
-
export interface SideSheetReactProps extends SideSheetProps{
|
|
26
|
+
export interface SideSheetReactProps extends SideSheetProps {
|
|
27
27
|
bodyStyle?: CSSProperties;
|
|
28
28
|
headerStyle?: CSSProperties;
|
|
29
29
|
maskStyle?: CSSProperties;
|
|
@@ -65,7 +65,8 @@ export default class SideSheet extends BaseComponent<SideSheetReactProps, SideSh
|
|
|
65
65
|
afterVisibleChange: PropTypes.func,
|
|
66
66
|
closeOnEsc: PropTypes.bool,
|
|
67
67
|
footer: PropTypes.node,
|
|
68
|
-
keepDOM: PropTypes.bool
|
|
68
|
+
keepDOM: PropTypes.bool,
|
|
69
|
+
'aria-label': PropTypes.string,
|
|
69
70
|
};
|
|
70
71
|
|
|
71
72
|
static defaultProps: SideSheetReactProps = {
|
|
@@ -137,6 +137,15 @@ describe('Slider', () => {
|
|
|
137
137
|
expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-slider-dot`)).toBe(true);
|
|
138
138
|
});
|
|
139
139
|
|
|
140
|
+
it('marks clickable', () => {
|
|
141
|
+
const STYLE = { width: 100, height: 32 }; // it is really hack to mock slider wrapper getBoundingClientRect data
|
|
142
|
+
let slider = mount(<Slider style={STYLE} marks={{ 20: '20c', 40: '40c' }} defaultValue={[0, 100]} range />);
|
|
143
|
+
expect(slider.exists(`.${BASE_CLASS_PREFIX}-slider-dot`)).toBe(true);
|
|
144
|
+
expect(slider.state('currentValue')).toEqual([0, 100])
|
|
145
|
+
slider.find(`.${BASE_CLASS_PREFIX}-slider-dot`).at(0).simulate('click', {pageX: 20 })
|
|
146
|
+
expect(slider.state('currentValue')).toEqual([20, 100])
|
|
147
|
+
});
|
|
148
|
+
|
|
140
149
|
it('when tooltipVisible is true, tooltip should show always, or should never show', () => {
|
|
141
150
|
let wrapper = mount(<Slider defaultValue={30} tooltipVisible />);
|
|
142
151
|
expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-tooltip-wrapper`)).toBe(true);
|
|
@@ -173,7 +173,7 @@ let divStyle1 = {
|
|
|
173
173
|
export const VerticalSlider = () => (
|
|
174
174
|
<div>
|
|
175
175
|
<div style={divStyle1}>
|
|
176
|
-
<Slider vertical range defaultValue={[20, 60]}></Slider>
|
|
176
|
+
<Slider vertical range defaultValue={[20, 60]} aria-label="slider test"></Slider>
|
|
177
177
|
</div>
|
|
178
178
|
</div>
|
|
179
179
|
);
|