@douyinfe/semi-ui 2.2.2 → 2.4.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/_base/_story/a11y.scss +0 -1
- package/_base/_story/index.scss +2 -5
- 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/index.tsx +6 -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 +19 -12
- package/checkbox/checkbox.tsx +40 -5
- package/checkbox/checkboxGroup.tsx +30 -5
- package/checkbox/checkboxInner.tsx +25 -2
- package/collapse/index.tsx +1 -1
- package/collapse/item.tsx +12 -7
- 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 +23 -12
- package/dist/css/semi.min.css +1 -1
- package/dist/umd/semi-ui.js +2502 -1249
- 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/dropdown/index.tsx +11 -3
- package/empty/index.tsx +4 -4
- 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 +30 -9
- package/inputNumber/__test__/inputNumber.test.js +36 -8
- package/inputNumber/index.tsx +30 -2
- 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/index.d.ts +4 -3
- package/lib/cjs/avatar/index.js +15 -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/item.d.ts +2 -1
- package/lib/cjs/collapse/item.js +12 -2
- 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/dropdown/index.d.ts +10 -3
- 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 +16 -3
- package/lib/cjs/inputNumber/index.d.ts +8 -0
- package/lib/cjs/inputNumber/index.js +35 -4
- 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/index.d.ts +4 -4
- 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 +4 -1
- 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 +3 -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 +35 -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 +14 -0
- package/lib/cjs/timePicker/TimePicker.js +11 -4
- package/lib/cjs/timePicker/index.d.ts +7 -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 +54 -5
- 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 +26 -7
- 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/index.d.ts +4 -3
- package/lib/es/avatar/index.js +15 -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/item.d.ts +2 -1
- package/lib/es/collapse/item.js +11 -2
- 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/dropdown/index.d.ts +10 -3
- 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 +16 -3
- package/lib/es/inputNumber/index.d.ts +8 -0
- package/lib/es/inputNumber/index.js +36 -4
- 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/index.d.ts +4 -4
- 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 +4 -1
- 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 +3 -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 +35 -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 +14 -0
- package/lib/es/timePicker/TimePicker.js +11 -4
- package/lib/es/timePicker/index.d.ts +7 -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 +53 -5
- 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 +26 -7
- package/lib/es/upload/index.js +19 -4
- package/list/index.tsx +5 -5
- 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 +57 -4
- package/select/option.tsx +3 -0
- package/sideSheet/SideSheetContent.tsx +6 -4
- 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 +4 -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 +30 -14
- package/table/TableCell.tsx +11 -1
- package/table/TableHeaderRow.tsx +16 -2
- package/table/__test__/table.test.js +46 -0
- package/table/_story/table.stories.js +2 -0
- package/table/_story/v2/FixedColumnsChange/index.jsx +104 -0
- package/table/_story/v2/FixedZIndex/index.jsx +87 -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 +17 -2
- package/timePicker/__test__/timePicker.test.js +34 -3
- package/timePicker/_story/timepicker.stories.js +18 -0
- 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 +51 -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 +54 -11
- 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 +14 -16
- package/upload/index.tsx +10 -6
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,13 @@ 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
|
|
743
|
+
role="button"
|
|
744
|
+
aria-label="Use the input box to create an optional item"
|
|
745
|
+
onClick={e => this.onSelect(option, optionIndex, e)}
|
|
746
|
+
key={option.key || option.label}
|
|
747
|
+
>
|
|
721
748
|
{customCreateItem}
|
|
722
749
|
</div>
|
|
723
750
|
);
|
|
@@ -783,6 +810,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
783
810
|
innerBottomSlot,
|
|
784
811
|
loading,
|
|
785
812
|
virtualize,
|
|
813
|
+
multiple,
|
|
786
814
|
} = this.props;
|
|
787
815
|
|
|
788
816
|
// Do a filter first, instead of directly judging in forEach, so that the focusIndex can correspond to
|
|
@@ -808,6 +836,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
808
836
|
style={{ maxHeight: `${maxHeight}px` }}
|
|
809
837
|
className={optionListCls}
|
|
810
838
|
role="listbox"
|
|
839
|
+
aria-multiselectable={multiple}
|
|
811
840
|
onScroll={e => this.foundation.handleListScroll(e)}
|
|
812
841
|
>
|
|
813
842
|
{innerTopSlot}
|
|
@@ -935,6 +964,10 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
935
964
|
this.foundation.handleMouseLeave(e as any);
|
|
936
965
|
}
|
|
937
966
|
|
|
967
|
+
onKeyPress(e: React.KeyboardEvent) {
|
|
968
|
+
this.foundation.handleKeyPress(e as any);
|
|
969
|
+
}
|
|
970
|
+
|
|
938
971
|
/* Processing logic when popover visible changes */
|
|
939
972
|
handlePopoverVisibleChange(status) {
|
|
940
973
|
const { virtualize } = this.props;
|
|
@@ -974,7 +1007,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
974
1007
|
}
|
|
975
1008
|
|
|
976
1009
|
renderPrefix() {
|
|
977
|
-
const { prefix, insetLabel } = this.props;
|
|
1010
|
+
const { prefix, insetLabel, insetLabelId } = this.props;
|
|
978
1011
|
const labelNode = (prefix || insetLabel) as React.ReactElement<any, any>;
|
|
979
1012
|
|
|
980
1013
|
const prefixWrapperCls = cls({
|
|
@@ -984,7 +1017,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
984
1017
|
[`${prefixcls}-prefix-icon`]: isSemiIcon(labelNode),
|
|
985
1018
|
});
|
|
986
1019
|
|
|
987
|
-
return <div className={prefixWrapperCls}>{labelNode}</div>;
|
|
1020
|
+
return <div className={prefixWrapperCls} id={insetLabelId}>{labelNode}</div>;
|
|
988
1021
|
}
|
|
989
1022
|
|
|
990
1023
|
renderSelection() {
|
|
@@ -1005,6 +1038,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
1005
1038
|
triggerRender,
|
|
1006
1039
|
arrowIcon,
|
|
1007
1040
|
} = this.props;
|
|
1041
|
+
|
|
1008
1042
|
const { selections, isOpen, keyboardEventSet, inputValue, isHovering, isFocus } = this.state;
|
|
1009
1043
|
const useCustomTrigger = typeof triggerRender === 'function';
|
|
1010
1044
|
const filterable = Boolean(filter); // filter(boolean || function)
|
|
@@ -1060,7 +1094,14 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
1060
1094
|
</Fragment>,
|
|
1061
1095
|
<Fragment key="clearicon">
|
|
1062
1096
|
{showClear ? (
|
|
1063
|
-
<div
|
|
1097
|
+
<div
|
|
1098
|
+
role="button"
|
|
1099
|
+
aria-label="Clear selected value"
|
|
1100
|
+
tabIndex={0}
|
|
1101
|
+
className={cls(`${prefixcls}-clear`)}
|
|
1102
|
+
onClick={this.onClear}
|
|
1103
|
+
onKeyPress={this.onClearBtnEnterPress}
|
|
1104
|
+
>
|
|
1064
1105
|
<IconClear />
|
|
1065
1106
|
</div>
|
|
1066
1107
|
) : arrowContent}
|
|
@@ -1072,6 +1113,17 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
1072
1113
|
const tabIndex = disabled ? null : 0;
|
|
1073
1114
|
return (
|
|
1074
1115
|
<div
|
|
1116
|
+
role="combobox"
|
|
1117
|
+
aria-disabled={disabled}
|
|
1118
|
+
aria-expanded={isOpen}
|
|
1119
|
+
aria-controls={`${prefixcls}-${this.selectOptionListID}`}
|
|
1120
|
+
aria-haspopup="listbox"
|
|
1121
|
+
aria-label="select value"
|
|
1122
|
+
aria-invalid={this.props['aria-invalid']}
|
|
1123
|
+
aria-errormessage={this.props['aria-errormessage']}
|
|
1124
|
+
aria-labelledby={this.props['aria-labelledby']}
|
|
1125
|
+
aria-describedby={this.props['aria-describedby']}
|
|
1126
|
+
aria-required={this.props['aria-required']}
|
|
1075
1127
|
className={selectionCls}
|
|
1076
1128
|
ref={ref => ((this.triggerRef as any).current = ref)}
|
|
1077
1129
|
onClick={e => this.foundation.handleClick(e)}
|
|
@@ -1082,6 +1134,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
|
|
|
1082
1134
|
onMouseLeave={this.onMouseLeave}
|
|
1083
1135
|
// onFocus={e => this.foundation.handleTriggerFocus(e)}
|
|
1084
1136
|
onBlur={e => this.foundation.handleTriggerBlur(e as any)}
|
|
1137
|
+
onKeyPress={this.onKeyPress}
|
|
1085
1138
|
{...keyboardEventSet}
|
|
1086
1139
|
>
|
|
1087
1140
|
{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}
|
|
@@ -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'} aria-level={1} style={{ ...headerStyle }}>
|
|
108
110
|
{header}
|
|
109
111
|
{closer}
|
|
110
112
|
</div>
|
|
@@ -128,7 +130,7 @@ 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}
|
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
|
);
|
package/slider/index.tsx
CHANGED
|
@@ -78,6 +78,7 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
|
|
|
78
78
|
private dragging: boolean[];
|
|
79
79
|
private eventListenerSet: Set<() => void>;
|
|
80
80
|
private chooseMovePos: 'min' | 'max';
|
|
81
|
+
foundation: SliderFoundation;
|
|
81
82
|
|
|
82
83
|
constructor(props: SliderProps) {
|
|
83
84
|
super(props);
|
|
@@ -281,7 +282,7 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
|
|
|
281
282
|
}
|
|
282
283
|
|
|
283
284
|
renderHandle = () => {
|
|
284
|
-
const { vertical, range, tooltipVisible, tipFormatter } = this.props;
|
|
285
|
+
const { vertical, range, tooltipVisible, tipFormatter, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledby, 'aria-valuetext': ariaValueText, getAriaValueText, disabled } = this.props;
|
|
285
286
|
const { chooseMovePos, isDrag, isInRenderTree } = this.state;
|
|
286
287
|
const stylePos = vertical ? 'top' : 'left';
|
|
287
288
|
const percentInfo = this.foundation.getMinAndMaxPercent(this.state.currentValue);
|
|
@@ -299,6 +300,15 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
|
|
|
299
300
|
const maxClass = cls(cssClasses.HANDLE, {
|
|
300
301
|
[`${cssClasses.HANDLE}-clicked`]: chooseMovePos === 'max' && isDrag,
|
|
301
302
|
});
|
|
303
|
+
const {min, max, currentValue} = this.state;
|
|
304
|
+
|
|
305
|
+
const commonAria = {
|
|
306
|
+
'aria-label': ariaLabel,
|
|
307
|
+
'aria-labelledby': ariaLabelledby,
|
|
308
|
+
'aria-disabled': disabled
|
|
309
|
+
};
|
|
310
|
+
vertical && Object.assign(commonAria, {'aria-orientation': 'vertical'});
|
|
311
|
+
|
|
302
312
|
const handleContents = !range ? (
|
|
303
313
|
<Tooltip
|
|
304
314
|
content={tipChildren.min}
|
|
@@ -338,6 +348,14 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
|
|
|
338
348
|
onTouchEnd={e => {
|
|
339
349
|
this.foundation.onHandleUp(e);
|
|
340
350
|
}}
|
|
351
|
+
onFocus={e => this.foundation.onFocus(e, 'min')}
|
|
352
|
+
role="slider"
|
|
353
|
+
tabIndex={0}
|
|
354
|
+
{...commonAria}
|
|
355
|
+
aria-valuenow={currentValue as number}
|
|
356
|
+
aria-valuemax={max}
|
|
357
|
+
aria-valuemin={min}
|
|
358
|
+
aria-valuetext={getAriaValueText ? getAriaValueText(currentValue as number) : ariaValueText}
|
|
341
359
|
/>
|
|
342
360
|
</Tooltip>
|
|
343
361
|
) : (
|
|
@@ -379,6 +397,14 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
|
|
|
379
397
|
onTouchEnd={e => {
|
|
380
398
|
this.foundation.onHandleUp(e);
|
|
381
399
|
}}
|
|
400
|
+
onFocus={e => this.foundation.onFocus(e, 'min')}
|
|
401
|
+
role="slider"
|
|
402
|
+
tabIndex={0}
|
|
403
|
+
{...commonAria}
|
|
404
|
+
aria-valuenow={currentValue[0]}
|
|
405
|
+
aria-valuetext={getAriaValueText ? getAriaValueText(currentValue[0]) : ariaValueText}
|
|
406
|
+
aria-valuemax={currentValue[1]}
|
|
407
|
+
aria-valuemin={min}
|
|
382
408
|
/>
|
|
383
409
|
</Tooltip>
|
|
384
410
|
<Tooltip
|
|
@@ -418,6 +444,14 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
|
|
|
418
444
|
onTouchEnd={e => {
|
|
419
445
|
this.foundation.onHandleUp(e);
|
|
420
446
|
}}
|
|
447
|
+
onFocus={e => this.foundation.onFocus(e, 'min')}
|
|
448
|
+
role="slider"
|
|
449
|
+
tabIndex={0}
|
|
450
|
+
{...commonAria}
|
|
451
|
+
aria-valuenow={currentValue[1]}
|
|
452
|
+
aria-valuetext={getAriaValueText ? getAriaValueText(currentValue[1]) : ariaValueText}
|
|
453
|
+
aria-valuemax={max}
|
|
454
|
+
aria-valuemin={currentValue[0]}
|
|
421
455
|
/>
|
|
422
456
|
</Tooltip>
|
|
423
457
|
</React.Fragment>
|
|
@@ -440,7 +474,7 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
|
|
|
440
474
|
top: range ? `${minPercent * 100}%` : 0,
|
|
441
475
|
};
|
|
442
476
|
trackStyle = included ? trackStyle : {};
|
|
443
|
-
return (
|
|
477
|
+
return (// eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
|
|
444
478
|
<div className={cssClasses.TRACK} style={trackStyle} onClick={e => this.foundation.handleWrapClick(e)}>
|
|
445
479
|
{/* {this.renderTrack} */}
|
|
446
480
|
</div>
|
|
@@ -462,6 +496,7 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
|
|
|
462
496
|
return activeResult ? (
|
|
463
497
|
<span
|
|
464
498
|
key={mark}
|
|
499
|
+
onClick={e => this.foundation.handleWrapClick(e)}
|
|
465
500
|
className={markClass}
|
|
466
501
|
style={{ [stylePos]: `calc(${markPercent * 100}% - 2px)` }}
|
|
467
502
|
/>
|
|
@@ -522,11 +557,13 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
|
|
|
522
557
|
onMouseEnter={() => this.foundation.handleWrapperEnter()}
|
|
523
558
|
onMouseLeave={() => this.foundation.handleWrapperLeave()}
|
|
524
559
|
>
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
560
|
+
{// eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
|
|
561
|
+
<div
|
|
562
|
+
className={`${prefixCls}-rail`}
|
|
563
|
+
onClick={e => this.foundation.handleWrapClick(e)}
|
|
564
|
+
style={this.props.railStyle}
|
|
565
|
+
/>
|
|
566
|
+
}
|
|
530
567
|
{this.renderTrack()}
|
|
531
568
|
{this.renderStepDot()}
|
|
532
569
|
<div>{this.renderHandle()}</div>
|
package/spin/icon.tsx
CHANGED
|
@@ -29,6 +29,8 @@ function Icon(props: IconProps = {}) {
|
|
|
29
29
|
viewBox="0 0 36 36"
|
|
30
30
|
version="1.1"
|
|
31
31
|
xmlns="http://www.w3.org/2000/svg"
|
|
32
|
+
aria-hidden
|
|
33
|
+
data-icon="spin"
|
|
32
34
|
>
|
|
33
35
|
<defs>
|
|
34
36
|
<linearGradient x1="0%" y1="100%" x2="100%" y2="100%" id={id}>
|
|
@@ -37,11 +39,10 @@ function Icon(props: IconProps = {}) {
|
|
|
37
39
|
<stop stopColor="currentColor" offset="100%" />
|
|
38
40
|
</linearGradient>
|
|
39
41
|
</defs>
|
|
40
|
-
<g
|
|
41
|
-
<rect
|
|
42
|
+
<g stroke="none" strokeWidth="1" fill="none" fillRule="evenodd">
|
|
43
|
+
<rect fillOpacity="0.01" fill="#FFFFFF" x="0" y="0" width="36" height="36" />
|
|
42
44
|
<path
|
|
43
45
|
d="M34,18 C34,9.163444 26.836556,2 18,2 C11.6597233,2 6.18078805,5.68784135 3.59122325,11.0354951"
|
|
44
|
-
id="Path"
|
|
45
46
|
stroke={`url(#${id})`}
|
|
46
47
|
strokeWidth="4"
|
|
47
48
|
strokeLinecap="round"
|